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