当用作接口时,复合文字的地址被评估为文字本身。有人可以指出参考规范中处理此问题的部分吗?package mainimport "fmt"type ntfc interface { rx() int}type cncrt struct { x int}func (c cncrt) rx() int{ return c.x}func rtrnsNtfca() ntfc { return &cncrt{3}}func rtrnsNtfc() ntfc { return cncrt{3}}func rtrnsCncrt() *cncrt { return &cncrt{3}}func main() { fmt.Println(rtrnsNtfca().rx()) fmt.Println(rtrnsNtfc().rx()) fmt.Println(rtrnsCncrt().rx())}也在这里。对于将来的参考,是否可以只链接到操场而不在此处包含代码?
1 回答
阿波罗的战车
TA贡献1862条经验 获得超6个赞
规格:方法集:
一个类型可能有一个与之关联的方法集。接口类型的方法集就是它的接口。任何其他类型的方法集T由所有声明为接收者类型的方法组成T。对应指针类型 *T的方法集是所有用receiver *Tor声明T的方法的集合(也就是包含了的方法集T)。
因此 的方法集*cncrt包括 的方法集cncrt。由于rx()是cncrt的方法集的元素,因此它也将是 in*cncrt的方法集。这意味着cncrt和*cncrt类型都实现了ntfc接口。
如果您有一个指针值 ( *cncrt) 并调用rx()它,则该指针将自动取消引用,该指针将成为该rx()方法的接收者。
在您的rtnsNtfca()和rtnsNtfc()函数中,ntfc将自动创建并返回一个接口值。Go 中的接口值表示为 (type;value) 对(更多详细信息:反射定律#接口的表示)。因此,无论rtnsNtfca()与rtnsNtfc()返回一个接口值,但第一个持有类型的动态值*cncrt和后者之一成立类型的动态值cncrt。
并且您的第三个方法rtrnsCncrt()返回一个具体类型 ( *cncrt),那里不涉及接口包装。
注意:“反过来”
规格: 调用:
Ifx是可寻址的并且&x的方法集包含m,x.m()是 的简写(&x).m()。
这意味着如果你声明rx()了一个指针接收器,并且你有一个类型的变量cncrt(注意:不是指针),rx()如果它是可寻址的,你仍然可以调用它的方法,并且地址将被自动获取并用作收件人。
- 1 回答
- 0 关注
- 159 浏览
添加回答
举报
0/150
提交
取消