2016-12-09 14 views
-1

是否有可能獲得對接口值的引用而不會反覆出現 ?如果不是,爲什麼不呢?如何獲取對接口值的引用

我曾嘗試:

package foo 

type Foo struct { 
    a, b int 
} 

func f(x interface{}) { 
    var foo *Foo = &x.(Foo) 
    foo.a = 2 
} 

func g(foo Foo) { 
    f(foo) 
} 

,但它失敗:

./test.go:8: cannot take the address of x.(Foo) 
+3

你不能。接口中的值不可尋址。如果你需要一個指針,在界面中放一個指針。 – JimB

+2

正如JimB指出的那樣,它不可尋址。界面值包含原件的副本,所以沒有意義。請參閱相關/可能重複的問題:[類型的結構方法,滿足接口](http://stackoverflow.com/questions/41015114/types-of-go-struct-methods-that-satisfy-an-interface/41016448 #41016448) – icza

+0

@icza。你真的幫助我不去理解 –

回答

1

要清除你的疑惑,如果你去的意思斷言

狀態的事實或信仰信心十足並且有力地

在你的例子中x.(Foo)只是一個類型聲明它不是一個對象,所以你不能得到它的地址。

所以在運行時,當該對象將例如被創建

var c interface{} = 5 
d := c.(int) 
fmt.Println("Hello", c, d) // Hello 5 5 

它僅斷言

斷言c不是零,並且保存在c的值是int類型

所以它沒有任何物理實體在內存中,但在運行時d將被分配內存基於斷言類型和比con c的帳篷將被複制到該位置。

所以,你可以這樣做

var c interface{} = 5 
d := &c 
fmt.Println("Hello", (*d).(int)) // hello 5 

希望我清除你的困惑。