【发布时间】:2015-09-12 23:29:45
【问题描述】:
我是 Go 新手,正在研究它的界面功能。
代码如下:
package main
import (
"fmt"
"reflect"
)
type Integer int
func (a Integer) Less(b Integer) bool {
return a < b
}
func (a *Integer) Add(b Integer) {
*a += b
}
type LessAdder interface {
Less(b Integer) bool
Add(b Integer)
}
var a Integer = 1
var b LessAdder = &a
func main() {
fmt.Println(reflect.TypeOf(b))
fmt.Println(b.Less(2))
b.Add(a)
fmt.Println(a)
}
它会输出以下内容:
*main.Integer
true
2
嗯,这很好用。
重点是:
var b LessAdder = &a 是如何工作的。指针自动解引用发生在此处,还是在 b 调用成员方法时发生?
输出 *main.Integer 告诉我们 b 是指向类型 Integer 的指针,因此是第二种情况。
然后棘手的事情来了:
当我在代码中添加fmt.Pringln(*b) 时,编译器出现错误:
demo/demo1
./demo1.go:31: invalid indirect of b (type LessAdder)
这让我很困惑。 由于b 是指向Integer 的指针类型,因此取消引用它应该可以工作。但为什么不呢?
【问题讨论】:
-
除了 icza 所说的:接口是 Go 中的 类型,它们不是语法糖或神奇的包装器。接口类型与 int32 或用户定义的结构等内置类型具有相同的状态。