2012-05-09 10 views
3

2つの変数がGoで同じインスタンスを参照しているかどうかを確認するにはどうすればよいですか?より具体的には、一方の変数の値への突然変異は、他方の変数の値にも影響する。Pythonの "is"演算子のGoに相当するものは何ですか?

はさらに質問を絞り込むには:

a is b 
+2

質問にはかなりの解釈があります。 Goには、型にポインタや他のデータへの内部参照が含まれる場合があります。あなたは特定のケースに興味がありますか? – Sonia

答えて

3

Pythonでは、すべて値はオブジェクトへの参照(つまりポインタ)です。オブジェクト自体を値として取得することはできません。 is演算子は、ポインターの等価性のためのポインターである2つの値を比較します。 ==オペレータは、指し示されたオブジェクトの等価性のために、そのようなポインタを2つ比較する。

Goでは少し複雑です。 Goには、ポインタ以外のポインタ型(ブール型、数値型、文字列、配列、スライス、構造体、関数、インタフェース、マップ、チャネル)もあります。ポインタ以外の型のポインタの等価性を求めるのは意味がありません。 (それはどういう意味でしょうか?)

したがって、Pythonと同等の状況を得るには、すべての変数をポインタの後ろに置きましょう。すべての変数はポインタです。 (多くのGoライブラリには、ポインタ型を作成する "New"関数の慣例があり、メソッドはポインタ型でも動作するので、これはその規約と互換性があります)abがポインタの場合a == b Goでは2つのポインタがポインタの等しいかどうかを比較します。比較可能な場合は、*a == *bを使用して基礎となる値を比較することができます。

Goには、スライス、マップ、関数、およびチャネルのような非ポインタ参照型もいくつかあります。チャネルが同じチャネルかどうかについては、==を使用してチャネルを比較できます。ただし、スライス、マップ、および関数は比較できません。反射を使っても可能です。

+0

コンパイラは、重複した割り当てを排除するための最適化を行っているようです。したがって、隣接するコード行で2つの構造体を正確に同じにすると、コンパイラは実際には同じメモリに2つのポインタを与えます)それは私のテストを破った。また、いくつかのテストライブラリは、assert.Equal(p1、p2)が同じテストを破ったassert.True(p1 == p2)と同じではないので、根本的な値(証言)としてポインタを比較するようです... – Eloff

3

EDIT:2つの変数はCPythonのあたり「である」演算子を満たすだろうというとき、私が決定するであろうどのように私はあなたが望むものについてはよく分かりません。それが変数の等しいかどうか、または可変の値のアイデンティティについてです。この答えは、2番目の答えです(「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) 

C == Bその変更CAの十分条件は、の場合には、BA

+0

これは、インターフェイス、スライス、地図などの参照タイプでは機能しますか? –

0

を変化させます非インターフェイス型および非関数型の場合、ポインタを比較して同等かどうかを判断することができます。非ポインタ型はインスタンスを共有できません(OTOH)。

関連する問題