为什么可以将引用类型分配给不满足的接口[golang]
我发现值类型和引用类型之间的接口可满足性令人困惑。我仍然不知道它在golang是如何工作的。考虑一下这个程序:为什么可以将引用类型分配给不满足的接口[golang],go,Go,我发现值类型和引用类型之间的接口可满足性令人困惑。我仍然不知道它在golang是如何工作的。考虑一下这个程序: type Counter1 int type Counter2 int func (c Counter1) String() string { } func (c *Counter2) String() string { } func main() { var c1 Counter1 var c2 Counter2 var i1 fmt.Stringe
type Counter1 int
type Counter2 int
func (c Counter1) String() string {
}
func (c *Counter2) String() string {
}
func main() {
var c1 Counter1
var c2 Counter2
var i1 fmt.Stringer = &c1 // assignment 1
var i2 fmt.Stringer = c2 // assignment 2
}
然而,作业1有效,但作业2无效。我希望它们都不起作用:类型Counter1满足fmt.Stringer,而类型*Counter1不满足。So&c1不应分配给i1;类型Counter2不满足fmt。Stringer但是类型*Counter2满足,所以c2不应该分配给i2,实际上它不能。这个测试项目的结果对我来说毫无意义。我认为这可能是某种语法糖,go编译器会自动在引用类型和值类型之间进行转换。然而,下面的测试代码让我更加困惑:
type Test interface {
f()
g()
}
func (c Counter1) f() {
}
func (c *Counter1) g() {
}
func receiveTest(t Test) {
}
func main() {
......
var c3 Counter1
var p3 Test = &c3 // works
receiveTest(&c3) // works
receiveTest(c3) // doesn't work
}
类型*Counter1和类型Counter1均不满足接口测试。然而,第一个和第二个任务仍然有效。这对我来说毫无意义
在Go中,选择器表达式(x.f
)表示值x
(或有时*x
)的字段或方法f
)
基本上,在Go中,如果方法上有指针接收器,则不必编写&object.method()
,只需编写object.method()
因为接口在Go中是隐式的,只要对象本身不是指针,那么满足接口的方法是否有指针接收器并不重要,它们仍然会被用来满足它
因此,在您的示例中,Counter1
结构可以同时调用f()
和g()
方法,但是*Counter1
只能调用g()
方法