Prática recomendada do Go: gerenciando funções para estruturas semelhantes com campos compartilhados
No Go, é comum encontrar várias estruturas com campos semelhantes, e há necessidade de realizar operações idênticas neles. Para evitar a repetição de código e ao mesmo tempo manter a flexibilidade, considere as seguintes estratégias:
Criando um tipo personalizado para o campo compartilhado:
Se o campo compartilhado for um tipo de dados simples ( por exemplo, string), considere definir um tipo personalizado para ele. Isso permite anexar métodos ao tipo personalizado, que pode então ser usado por qualquer estrutura que incorpore esse tipo.
type Version string
func (v Version) PrintVersion() {
fmt.Println("Version is", v)
}
Em seguida, incorpore o tipo Version nas estruturas:
type Game struct {
Name string
MultiplayerSupport bool
Genre string
Version
}
type ERP struct {
Name string
MRPSupport bool
SupportedDatabases []string
Version
}
Isso permite que você imprima a versão usando o método PrintVersion no campo Versão:
g.PrintVersion()
e.PrintVersion()
Usando reflexão:
Se o campo compartilhado puder ser de tipos diferentes ou se você quiser mais flexibilidade, poderá usar a reflexão para invocar dinamicamente o apropriado método. Essa abordagem é mais complexa e tem algumas implicações de desempenho, mas oferece maior flexibilidade.
type Printer interface {
PrintVersion() error
}
func PrintVersion(p Printer) error {
t := reflect.TypeOf(p)
method, ok := t.MethodByName("PrintVersion")
if !ok {
return fmt.Errorf("object doesn't have a PrintVersion method")
}
return method.Func.Call([]reflect.Value{reflect.ValueOf(p)})[0].Interface().(error)
}
Você pode então usar a função PrintVersion para invocar o método PrintVersion em qualquer objeto que implemente a interface Printer:
var game Game
var erp ERP
PrintVersion(game)
PrintVersion(erp)
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