"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como gerenciar funções para estruturas Go semelhantes com campos compartilhados?

Como gerenciar funções para estruturas Go semelhantes com campos compartilhados?

Publicado em 2024-11-08
Navegar:840

How to Manage Functions for Similar Go Structs with Shared Fields?

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)
Tutorial mais recente Mais>

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