gpt4 book ai didi

go - 了解 Go 中的嵌入

转载 作者:IT王子 更新时间:2023-10-29 01:50:28 26 4
gpt4 key购买 nike

我正在尝试理解 Google Go 的嵌入机制(作为子类化的替代方法)。下面是一个简单的程序,总结了我的方法问题:

package main

import "fmt"

type Person struct {
Name string
}

func (p *Person) Talk() {
fmt.Println("Hi, my name is Person")
}

func (p *Person) TalkVia() {
fmt.Println("TalkVia ->")
p.Talk()
}

type Android struct {
Person
}

func (p *Android) Talk() {
fmt.Println("Hi, my name is Android")
}

func main() {
fmt.Println("Person")
p := new(Person)
p.Talk()
p.TalkVia()

fmt.Println("Android")
a := new(Android)
a.Talk()
a.TalkVia()
}

输出是:

Person
Hi, my name is Person
TalkVia ->
Hi, my name is Person
Android
Hi, my name is Android
TalkVia ->
Hi, my name is Person

但如果我正在子类化(使用另一种语言),输出将是:

Person
Hi, my name is Person
TalkVia ->
Hi, my name is Person
Android
Hi, my name is Android
TalkVia ->
Hi, my name is Android

有没有办法通过 google go 嵌入(不是接口(interface))实现最后的输出?

最佳答案

没有。嵌入是单向的。嵌入有点太独特了,不能仅仅称之为“语法糖”——它可以用来满足接口(interface)。 Android应该满足接口(interface)

type TalkViaer interface {
TalkVia()
}

因为它嵌入了一个人。但是,从本质上讲,您必须记住,嵌入只是一种非常聪明的方式,可以访问结构的成员。没有更多或更少。当 p 被传递到 TalkVia 时,它会得到一个 Person,因为那个人没有它的所有者的概念,所以它不能引用它的所有者。

您可以通过在 Person 中保留一些所有者变量来解决这个问题,但嵌入不是继承。根本没有“ super ”或“扩展器”或类似的概念。这只是为结构体提供特定方法集的一种非常方便的方式。


编辑:也许需要多解释一下。但只是一点点。

type Android struct {
P person
}

我们都同意如果我执行 a := Android{} 然后执行 a.P.TalkVia() 它不会调用任何 Android 方法,对吗?即使那是 Java 或 C++,也没有意义,因为它是成员。

嵌入仍然只是一个成员。它只是Android拥有的一段数据,不多也不少。在句法层面,它将所有方法赋予 Android,但它仍然只是一个成员,您无法更改它。

关于go - 了解 Go 中的嵌入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23050408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com