2 回答
TA贡献1811条经验 获得超4个赞
你引用:
x.f
表示最浅深度的字段或方法T
引文指的是深度。深度的“定义”是:
选择器可以表示类型的
f
字段或方法,也可以指的嵌套嵌入字段的字段或方法。遍历到达的嵌入字段的数量称为它的深度。中声明的字段或方法的深度为零。在嵌入字段in中声明的字段或方法的深度是in的深度加一。f
T
f
T
f
T
f
T
f
A
T
f
A
关键是嵌入。您的结构不嵌入单一类型。所以根据定义, your的深度T.M
为零。
您的t
变量是类型*T
(即表达式的类型&T{}
,它采用结构复合文字的地址:它生成一个指向用文字值初始化的唯一变量的指针)。
并引用规范:方法值:
与选择器一样,使用指针对具有值接收器的非接口方法的引用将自动取消对该指针的引用:
pt.Mv
相当于(*pt).Mv
。
t.M
是对非接口方法 的引用T.M
,并且由于t
是指针,因此它将自动取消引用:(*t).M()
。
现在让我们看一个例子,其中“最浅深度”确实很重要。
type T struct{}
func (t T) M() { fmt.Println("T.M()") }
type T2 struct {
T // Embed T
}
func (t T2) M() { fmt.Println("T2.M()") }
func main() {
var t T = T{}
var t2 T2 = T2{T: t}
t2.M()
}
在main()我们调用t2.M(). 由于T2嵌入T,这可以指T2.T.Mand T2.M。但由于 的 深度T2.T.M是1, 的 深度T2.M是0,T2.M处于 中最浅的深度T2,因此t2.M将表示T2.M且 not ,因此上面的示例打印(在Go PlaygroundT2.T.M上尝试):
T2.M()
- 2 回答
- 0 关注
- 125 浏览
添加回答
举报