Go 仕様では、文字列は不変、つまり、一度作成されるとその内容は変更できないと規定されています。これは、次のコード スニペットと明らかに矛盾しています:
str := "hello" fmt.Printf("%p\n",&str) // 0x1040c128 fmt.Printf("%v\n",str) // hello ptr := &str *ptr = "world" fmt.Printf("%p\n",&str) // 0x1040c128 fmt.Printf("%v\n",str) // world
文字列が不変である場合、str に割り当てられたポインタの値を変更すると、str の値も変更されるのはなぜですか?
ここでの重要な違いは、文字列値と文字列変数の違いです。 str は文字列型の変数です。 str で代入演算子 (=) を使用すると、str が参照する文字列の値ではなく、str 変数の値が変更されます。
Go では、文字列値はリフレクトによって表されます。 StringHeader 構造体。データへのポインターとその長さが含まれます。この構造体は一度作成すると変更できません。
& 演算子は、変数の値ではなく、変数のアドレスを返します。したがって、&str は、str が参照する文字列値のアドレスではなく、str 変数のアドレスを返します。
ptr := &str ステートメントを使用すると、str 変数へのポインターが作成されます。 *ptr に新しい値を代入すると、str 変数の値は変更されますが、str が参照する文字列の値は変更されません。
Go では、文字列値は不変です。ただし、文字列変数は変更でき、変数が参照する文字列値を間接的に変更する可能性があります。
以上がGo で文字列ポインターを変更すると、不変の文字列が変更されたように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。