gpt4 book ai didi

go - 为什么在 Go 中调用嵌入字段的方法时类型别名和类型的行为不同?

转载 作者:IT王子 更新时间:2023-10-29 02:07:07 24 4
gpt4 key购买 nike

go版本go1.11.2 linux/amd64

https://play.golang.org/p/kTvcsWkJeaZ

package main

type T1 struct {
}

func (T1) Hello(T1) {
}

type T2 struct {
T1
}

func (T2) Hello(T2) {
}

type T3 T2
type T4 = T2

func main() {
var v_T3 T3
v_T3.Hello(v_T3)
var v_T4 T4
v_T4.Hello(v_T4)
}

prog.go:21:12:不能在 v_T3.T1.Hello 的参数中使用 v_T3(类型 T3)作为类型 T1

第 21 行:我希望调用 v_T3.Hello 但实际调用 v_T3.T1.Hello

第23行:没关系

最佳答案

type T4 = T2

这为现有类型 T2 提供了一个附加名称 T4。它没有引入新类型。换句话说,T2 和 T4 总是可以互换的。这应该可以解释为什么 v_T4.Hello(v_T4) 调用有效。以下所有调用在类型方面都是同义词(但忽略 v_T2 和 v_T4 是不同的):

var v_T2 T2
var v_T4 T4

v_T2.Hello(v_T2)
v_T2.Hello(v_T4)
v_T4.Hello(v_T2)
v_T4.Hello(v_T4)

type T3 T2

这定义了一个不同于所有其他类型的新类型 T3。根据类型规则,T3 doesn't inherit T2's methods .但是因为它们具有相同的底层类型,所以 T3 和 T2 的字段是相同的,包括嵌入的 T1。这反过来promotes T1's methods to T3 .

关于go - 为什么在 Go 中调用嵌入字段的方法时类型别名和类型的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55409536/

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