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

Можно ли заменить встроенные структуры для наследства метода в Go?

Опубликовано в 2025-02-06
Просматривать:433

  Can Embedded Structs Be Replaced for Method Inheritance in Go?

встроенные структуры и метод наследия

есть ли альтернатива внедренных структурам для наследственных методов?

встроенные структуры

в Go, внедрение структуры позволяет вам получить доступ к полям и методам встроенной структуры Как будто они были частью содержащей структуры. Это мощная функция, которую можно использовать для создания наследства между типами.

gotcha

, когда вы внедряете структуру, набор методов встроенной структуры не является автоматически продвигается до содержащей структуры. Чтобы продвигать методы, встроенная структура должна быть анонимной.

Method Promotion

Метод Продвижение - это языковая функция, которая позволяет методам из анонимной встроенной структуры, как если бы Это были методы содержащей структуры. Это достигается путем следования этим правилам:

, если у анонимного поля есть тип t, пропагандируемые методы имеют приемники типа t и *t.
  • , если у анонимного поля есть тип *t , продвигаемые методы имеют приемники типа T или *t.
example

рассмотрите следующий код:

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