A ausência de recursos genéricos do Go apresenta desafios ao tentar generalizar funcionalidades. Um cenário comum é a necessidade de uma função genérica de tratamento de erros aplicável a qualquer função que retorne um valor e um erro.
O exemplo fornecido demonstra uma tentativa de criar tal função usando uma interface vazia:
func P(any interface{}, err error) (interface{}) {
if err != nil {
panic("error: " err.Error())
}
return any
}
Embora essa abordagem funcione para tratamento de erros, ela perde informações de tipo, deixando a interface resultante vazia.
Para evitar o problema de informações de tipo perdidas, considere usar a geração de código para criar implementações especializadas da função de tratamento de erros para diferentes tipos. Isso pode ser conseguido usando ferramentas como "go generate", "gengen", "genny" ou "gen".
Por exemplo, usando "gen", você pode definir um modelo:
// template.go
package main
import "fmt"
func P[T any](v T, err error) (T) {
if err != nil {
panic(fmt.Sprintf("error: %v", err))
}
return v
}
Este modelo pode ser usado para gerar implementações específicas do tipo de P():
gen generate
Isso criará implementações como:
// p_int.go
package main
func PInt(v int, err error) (int) {
if err != nil {
panic(fmt.Sprintf("error: %v", err))
}
return v
}
Ao usar essas funções geradas, as informações de tipo são preservadas e o tratamento de erros pode ser aplicado a tipos específicos perfeitamente.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3