2つの変数がGoの同じインスタンスを参照しているかどうかを確認するにはどうすればよいですか?より具体的には、一方の変数の値への変更は、もう一方の変数の値にも影響を及ぼします。
質問をさらに洗練するために:2つの変数がCPythonごとに「is」演算子を満たす場合をどのように決定しますか?
a is b
Pythonでは、すべての値はオブジェクトへの参照(つまりポインター)です。オブジェクト自体を値として取得することはできません。演算子はis
、ポインターが等しいかどうかについて、ポインターである2つの値を比較します。一方、==
演算子は、ポイントされたオブジェクトが等しいかどうかについて、そのような2つのポインターを比較します。
Goでは、もう少し複雑です。Goには、ポインター、およびその他の非ポインター型(ブール、数値型、文字列、配列、スライス、構造体、関数、インターフェイス、マップ、チャネル)があります。非ポインター型のポインターの同等性を要求することは意味がありません。(それはどういう意味ですか?それは何を達成しますか?)
したがって、Pythonと同等の状況にするために、すべての値をポインターの後ろに置き、すべての変数がポインターになるようにします。(多くのGoライブラリには、ポインタ型を作成する「New」関数の規則があります。メソッドはポインタ型でも動作するため、これはその規則と互換性があります。)次に、Goで(a
およびb
がポインタの場合)a == b
そのような2つのポインターを比較して、ポインターが等しいかどうかを確認します。*a == *b
基礎となる値が比較可能な場合は、それらを比較するために使用できます。
Goには、スライス、マップ、関数、チャネルなど、いくつかの非ポインター参照型もあります。==
チャネルは、同じチャネルであるかどうかを使用して比較できます。ただし、スライス、マップ、および関数を比較することはできません。ただし、リフレクションを使用することは可能かもしれません。
編集:私はあなたが何を望んでいるのかわかりません。変数の同等性または変数値の同一性に関するものである場合。この答えは2番目のものです(「2つの変数は値の同じインスタンスを参照します」)。誤解した場合は、この回答を削除します。
==
あなたが望むものだと思います。
aとbのタイプがポインターの場合、aa==b
と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を変更するための十分な条件です。
非インターフェース型と非関数型の場合、ポインターが等しいかどうかを比較することができます。非ポインタ型はインスタンスを共有できません、OTOH。