2012-05-09 73 views
3

如何確定2個變量是否指向Go中的相同實例?更具體地說,對一個變量值的變異也會影響另一個變量的值。Python的「is」運算符的Go等價物是什麼?

要進一步細化的問題:我將如何確定什麼時候兩個變量將滿足「是」每CPython的運營商:

a is b 
+2

這個問題是相當多的解釋。 Go有一些情況,其中一個類型可能包含指向其他數據的指針或內部引用。你對某個具體案例感興趣嗎? – Sonia

回答

3

在Python中,全部值是對象的引用(即指針)。你永遠不能把對象本身當作一個值。 is運算符比較指針相等的兩個值,它們是指針;而==運算符會比較兩個這樣的指針,以使指向的對象相等。

在Go中,它有點複雜。 Go有指針,以及其他非指針類型(布爾型,數字類型,字符串,數組,切片,結構,函數,接口,地圖,通道)。要求非指針類型的指針相等沒有意義。 (這是什麼意思?它會完成什麼?)

所以爲了讓我們把所有的值放在指針後面,所以所有的變量都是指針。 (在許多Go庫中有一個創建指針類型的「新」函數的約定,並且這些方法也對指針類型進行操作;所以這與該約定兼容。)然後(如果ab是指針)a == b在Go中將比較兩個指針相等的指針;如果它們具有可比性,則可以使用*a == *b比較基礎值。

Go還有幾個非指針參考類型:切片,地圖,函數和通道。頻道可以使用==來比較它們是否是相同的頻道。但是,切片,地圖和函數無法進行比較;儘管可能使用反射。

+0

編譯器似乎有一些優化來消除重複的分配,所以如果你在相鄰的代碼行中分配兩個完全相同的結構,編譯器實際上可以給你兩個指向相同內存的指針(可能只有當你不修改它們時)它打破了我的考驗。還有一些測試庫似乎比較指針作爲基礎值(證明),所以assert.Equal(p1,p2)不同於assert.True(p1 == p2),這打破了相同的測試... – Eloff

3

編輯:我不知道你想要什麼。如果是關於變量的相等性或變量值的身份。這個答案是第二個答案(「2個變量指的是相同的實例」值)。如果我誤解了,我會刪除這個答案。

==是你想要的,我想。

如果a和b的類型是指針,那麼a==b意味着a和b是指向相同值的指針。

以下程序打印false

package main 

import "fmt" 

type test struct { 
    a int 
} 

func main() { 

    b := &test{2} 
    c := &test{2} 
    fmt.Println(c == b) 

} 

雖然這種打印true

b := &test{2} 
    c := b 
    fmt.Println(c == b) 

Ç== b爲針對更改CA的充分條件改變BA

+0

這將工作的參考類型像接口,切片,地圖等? –

0

在的情況下,非接口和非函數類型,可以比較指針是否相等。非指針類型不能共享實例OTOH。

相關問題