我是Go新手,正在研究它的接口特性。當在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或用戶定義的結構)相同的狀態。 – Volker