2 回答
TA贡献1824条经验 获得超8个赞
你的最后一句话:
“由于
b是指向 的指针类型Integer,因此取消引用它应该可以工作。”
停在那儿。b是不是指针类型的变量,因此,你不能解引用它。
它是接口类型的变量,示意性地是一对值和类型 (value,type),&a作为值和*Integer作为类型(博客文章反射定律,接口的表示部分)。
这是一个指针类型变量的声明*Integer:
var ip *Integer
这是一种接口类型:
var intf LessAdder
当你这样做时:
var b LessAdder = &a
发生的情况是LessAdder自动/隐式创建了一个接口值(类型),它将保存值&a(和类型*Integer)。这是一个有效的操作,因为的类型&a(这是*Integer)实现接口LessAdder:该方法集的*Integer是接口的一个超集LessAdder(在这种情况下,它们是相等的,一个接口类型的方法集为其接口)。
现在,当您调用 时b.Less(2),由于Less()具有值接收器,指针将被取消引用,并且将制作指向值的副本并作为方法的值接收器使用/传递Less()。
fmt.Println(reflect.TypeOf(b))不说谎,但它会打印出动态的类型b。的动态类型b确实是*Integer,但静态类型b是LessAdder,而静态类型决定了您可以对值做什么以及允许使用哪些运算符或方法。
TA贡献1810条经验 获得超5个赞
LessAdder被声明为具有方法Less和的接口Add。由于Add是用 的接收者声明的*Integer,所以 a*Integer可以是 a LessAdder;一个Integer不能。当你这样做时var b LessAdder = &a,它是指向a存储在接口中的指针b。
自动间接发生在对 的调用时b.Less(2),因为方法 on*Integer和方法 on 都Integer有助于 的方法集*Integer。
您不能使用,*b因为虽然b 包含*Integer,但它的静态类型是LessAdder,而不是*Integer。撇开接口的表示不谈,LessAdder不是指针类型,并且*b如果允许,则根本没有可表达的类型。
您可以使用一个类型断言访问b作为Integer *一次; b.(*Integer)是 type 的表达式*Integer,并且*b.(*Integer)是Integer. 如果 in 的值毕竟b不是 a *Integer,那么这两种方法都会导致运行时恐慌。
- 2 回答
- 0 关注
- 299 浏览
添加回答
举报
