当用作接口时,复合文字的地址将作为文字本身进行评估。有人可以指出ref spec处理这个问题的部分吗?
package main
import "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())
}
另外here。对于将来的参考,是否可以直接链接到操场而不包含代码?
答案 0 :(得分:2)
类型可能具有与之关联的方法集。 interface type的方法集是其接口。任何其他类型
T
的方法集由声明为接收器类型T
的所有methods组成。相应pointer type*T
的方法集是使用receiver*T
或T
声明的所有方法的集合(也就是说,它还包含{{1}的方法集}})。
因此T
的方法集包含*cncrt
方法集。由于cncrt
是rx()
方法集的元素,因此它也将位于cncrt
的方法集中。这意味着*cncrt
和cncrt
类型都实现了*cncrt
接口。
如果你有一个指针值(ntfc
)并在其上调用*cncrt
,则指针将自动被解引用,这将是rx()
方法的接收者。
在rx()
和rtnsNtfca()
函数中,将自动创建并返回rtnsNtfc()
的接口值。 Go中的接口值表示为(type; value)对(更多详细信息:The Laws of Reflection #The representation of an interface)。因此,ntfc
和rtnsNtfca()
都会返回一个接口值,但第一个包含rtnsNtfc()
类型的动态值,后一个包含类型*cncrt
的动态值。< / p>
你的第三个方法cncrt
返回一个具体的类型(rtrnsCncrt()
),那里没有涉及的界面包装。
注意:“反过来”
如果
*cncrt
为addressable且x
的方法集包含&x
,则m
是x.m()
的简写。
这意味着如果你声明(&x).m()
有一个指针接收器,并且你有一个rx()
类型的变量(注意:不是指针),你仍然可以调用cncrt
它是可寻址的方法,地址将被自动采用并用作接收器。