2012-11-22 60 views
112

我只是通過Go tour,我對指針和接口感到困惑。爲什麼這個Go代碼不能編譯?爲什麼我不能將* Struct分配給*接口?

package main 

type Interface interface {} 

type Struct struct {} 

func main() { 
    var ps *Struct 
    var pi *Interface 
    pi = ps 

    _, _ = pi, ps 
} 

即如果StructInterface,爲什麼不是*Struct是一個*Interface

該錯誤消息我得到的是:

prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment: 
     *Interface is pointer to interface, not interface 
+1

參見http://stackoverflow.com/q/20874798/260805 – Ztyx

+0

它看起來像接口可以表現得像隱含的指針... – Victor

+0

可能我建議充實用'FUNC主(){ \t變種PS * STRUCT =新(結構) \t變種PI *接口 \t變種i界面 \t I = PS \t PI您的遊樂場=&I \t fmt.Printf(「%v,%v,%v \ n」,* ps,pi,&i) \t i = * ps \t fmt.Printf(「%v,%v,%v \ n」 ps,pi,i) \t _,_,_ = i,pi,ps }'並作出自己的結論 – Victor

回答

150

當你有一個實現接口的結構時,指向該結構的指針也會自動實現該接口。這就是爲什麼你在函數原型中從來沒有*SomeInterface,因爲這不會在SomeInterface中增加任何內容,並且在變量聲明中不需要這種類型(請參閱this related question)。

接口值不是具體結構的值(因爲它具有可變大小,這是不可能的),但它是一種指針(更精確地指向結構和指針指向類型的指針)。拉斯考克斯描述它恰好here

接口值被表示爲一個雙字對賦予指針 到關於存儲在接口的類型和一個指向 相關聯的數據的信息。

enter image description here

這就是爲什麼Interface,而不是*Interface是正確的類型容納一個指針來實現Interface一個結構。

所以你必須簡單地使用

var pi Interface 
+7

好的,我認爲這對我有意義。我只是想知道爲什麼(在這種情況下),說'var pi * Interface'不僅僅是編譯時錯誤。 –

+1

我進入更多的細節來解釋它。請參閱編輯。我建議閱讀我鏈接到的Russ Cox的文章。 –

+0

@SimonNickerson:指向不同類型的指針是不可互換的。如果是的話,你可以使用接口指針來覆蓋指向任何實現該接口的任何類型值的東西,這顯然不是很好 – newacct

3

這也許是你的意思:

package main 

type Interface interface{} 

type Struct struct{} 

func main() { 
     var ps *Struct 
     var pi *Interface 
     pi = new(Interface) 
     *pi = ps 

     _, _ = pi, ps 
} 

編譯OK。另見here

相關問題