«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как управлять функциями для похожих структур Go с общими полями?

Как управлять функциями для похожих структур Go с общими полями?

Опубликовано 8 ноября 2024 г.
Просматривать:625

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

Go Best Practice: управление функциями для похожих структур с общими полями

В Go часто встречаются несколько структур со схожими полями, и возникает необходимость произвести над ними одинаковые операции. Чтобы избежать повторения кода при сохранении гибкости, рассмотрите следующие стратегии:

Создание пользовательского типа для общего поля:

Если общее поле представляет собой простой тип данных ( например, строка), рассмотрите возможность определения для него специального типа. Это позволяет вам прикреплять методы к пользовательскому типу, которые затем могут использоваться любой структурой, встраивающей этот тип.

type Version string

func (v Version) PrintVersion() {
    fmt.Println("Version is", v)
}

Затем вставьте тип версии в структуры:

type Game struct {
    Name               string
    MultiplayerSupport bool
    Genre              string
    Version
}

type ERP struct {
    Name               string
    MRPSupport         bool
    SupportedDatabases []string
    Version
}

Это позволяет вам распечатать версию с помощью метода PrintVersion в поле «Версия»:

g.PrintVersion()
e.PrintVersion()

Использование отражения:

Если общее поле может быть разных типов или если вам нужна большая гибкость, вы можете использовать отражение для динамического вызова соответствующего метод. Этот подход более сложен и имеет некоторые последствия для производительности, но обеспечивает большую гибкость.

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)
}

Затем вы можете использовать функцию PrintVersion для вызова метода PrintVersion для любого объекта, реализующего интерфейс принтера:

var game Game
var erp ERP

PrintVersion(game)
PrintVersion(erp)
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3