当用作接口(interface)时,组合文字的地址将作为文字本身进行评估。有人可以指出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。对于将来的引用,仅链接到游乐场而不包含此处的代码是否可以接受?
最佳答案
Spec: Method sets:
因此,*cncrt
的方法集包括cncrt
的方法集。由于rx()
是cncrt
的方法集中的元素,因此它也将在*cncrt
的方法集中。这意味着cncrt
和*cncrt
类型都实现ntfc
接口(interface)。
如果您有一个指针值(*cncrt
)并在其上调用rx()
,则该指针将自动取消引用,该指针将成为rx()
方法的接收者。
在您的rtnsNtfca()
和rtnsNtfc()
函数中,将自动创建并返回ntfc
的接口(interface)值。 Go中的接口(interface)值表示为(类型;值)对(更多详细信息:The Laws of Reflection #The representation of an interface)。因此rtnsNtfca()
和rtnsNtfc()
都返回一个接口(interface)值,但是第一个保存一个类型为*cncrt
的动态值,而第二个保存一个类型为cncrt
的动态值。
您的第三个方法rtrnsCncrt()
返回一个具体类型(*cncrt
),其中不涉及任何接口(interface)包装。
注意:“相反”
Spec: Calls:
这意味着,如果您已声明rx()
具有指针接收器,并且有一个cncrt
类型的变量(注意:不是指针),那么如果它是可寻址的,您仍然可以在其上调用rx()
方法,并且该地址将自动被获取。并用作接收器。
关于go - 用作接口(interface)的复合文字的地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31790113/