1

Go では、文字列は C 構造体として内部的に保存されます。

struct String // This is C code (not Go)
{
  byte* str;
  int32 len;
};

次の変数があるとします。

a0 := "ap" // This is Go code
a1 := "ple"
b0 := "app"
b1 := "le"
a := a0 + a1
b := b0 + b1
c := "apple"
d := c

次に、次のコード:

fmt.Println("a == b = %t, &a == &b = %t", a == b, &a == &b)
fmt.Println("c == d = %t, &c == &d = %t", c == d, &c == &d)

出力:

a == b = true, &a == &b = false
c == d = true, &c == &d = false

文字列の値を比較し&a == &bながら、C 構造体のアドレスを比較するためです。a == b

文字列自体が同じ場所に格納されている (つまり、strC 構造体のフィールドが同じ値を持っている)かどうaかをテストする方法はありますか?bfalsecdtrue

4

2 に答える 2

-1

s がインターンされる程度stringは、Go コンパイラの実装の詳細です。現在のgcおよびgccgoコンパイラでは、同一のstringリテラルがコンパイルおよびリンク時にインターンされます。実行時に生成されるその他のstringリテラルおよびstringはインターンされません。

于 2013-07-26T20:50:06.520 に答える