встроенные структуры и метод наследия
есть ли альтернатива внедренных структурам для наследственных методов?
встроенные структуры
в Go, внедрение структуры позволяет вам получить доступ к полям и методам встроенной структуры Как будто они были частью содержащей структуры. Это мощная функция, которую можно использовать для создания наследства между типами.
gotcha
, когда вы внедряете структуру, набор методов встроенной структуры не является автоматически продвигается до содержащей структуры. Чтобы продвигать методы, встроенная структура должна быть анонимной.
Method Promotion
Метод Продвижение - это языковая функция, которая позволяет методам из анонимной встроенной структуры, как если бы Это были методы содержащей структуры. Это достигается путем следования этим правилам:
, если у анонимного поля есть тип t, пропагандируемые методы имеют приемники типа t и *t.
рассмотрите следующий код:
type props карта [String] интерфейс {} func (p ops) getString (string ключа) string { вернуть p [ключ]. (строка) } Тип узла struct { Реквизит } func main () { Узел: = Node {"test": "foo"} fmt.println (node.getString ("test")) // Выход: foo }
type Props map[string]interface{}
func (p Props) GetString(key string) string {
return p[key].(string)
}
type Node struct {
Props
}
func main() {
node := Node{"test": "foo"}
fmt.Println(node.GetString("test")) // Output: foo
}
пример
Вот альтернативная реализация Использование приемника указателя:
type props map [string] интерфейс {} func (p *props) getString (string ключа) string { вернуть p [ключ]. (строка) } Тип узла struct { Реквизит } func main () { Node: = & node {props {"test": "foo"}} fmt.println (node.getString ("test")) // Выход: foo }
В этом примере мы используем приемник указателя для метода GetString. Это позволяет нам получить доступ к полям и методам базовой структуры PROPS без необходимости его внедрения.
Заключение
type Props map[string]interface{}
func (p *Props) GetString(key string) string {
return p[key].(string)
}
type Node struct {
Props
}
func main() {
node := &Node{Props{"test": "foo"}}
fmt.Println(node.GetString("test")) // Output: foo
}
] Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3