【发布时间】:2016-09-15 11:46:31
【问题描述】:
我发现值类型和引用类型之间的接口可满足性令人困惑。我仍然无法弄清楚它在 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.Stringer = &c1 // assignment 1
var i2 fmt.Stringer = c2 // assignment 2
}
但是作业 1 有效,但作业 2 无效。我预计它们都不起作用:类型 Counter1 满足 fmt.Stringer 但类型 *Counter1 不满足。所以 &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 类型都不满足接口 Test。但是第一个和第二个任务仍然有效。这对我来说没有意义。
【问题讨论】:
标签: go