ホームページ > バックエンド開発 > Golang > 文字列値は不変のままで、Go の文字列変数はどのようにして変更可能に見えるのでしょうか?

文字列値は不変のままで、Go の文字列変数はどのようにして変更可能に見えるのでしょうか?

Mary-Kate Olsen
リリース: 2024-12-11 08:33:10
オリジナル
665 人が閲覧しました

How Can String Variables in Go Appear Mutable While String Values Remain Immutable?

Go における不変の文字列値

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 変数のアドレスは同じままです。では、なぜこれが不変性の違反とみなされないのでしょうか?

ここでの重要な違いは、文字列値と文字列変数の違いです。 Go では、文字列値は不変ですが、文字列変数は変更可能です。 str 変数は文字列値へのポインタであり、*ptr の値を変更すると、このポインタに新しい値が割り当てられるだけです。

これを理解するには、次のアナロジーを考えてください。

図書館の本と図書カード。図書館の本は文字列値を表し、図書館カードは文字列変数を表します。同じ文字列変数に複数の文字列を代入できるのと同じように、同じ図書館カードで複数の本を借りることができます。ただし、書籍をチェックアウトすると、その内容を変更することはできません。同様に、文字列値が作成されると、その内容は変更できません。

Go の不変性により、文字列値は常に一貫性があり、信頼性が高くなります。複数の変数が同じ文字列値を参照している場合でも、1 つの変数に加えられた変更は他の変数には影響しません。これは、同時実行および分散システムにおけるデータの整合性とセキュリティを確保するために重要な機能です。

不変性により文字列値の直接変更は防止されますが、安全でないパッケージを使用するなど、これらの制限を回避する手法があります。ただし、このような行為には重大なリスクが伴うため、通常はお勧めできません。文字列の不変性の原則に従うことは、正しく堅牢な Go プログラムを作成するために不可欠です。

以上が文字列値は不変のままで、Go の文字列変数はどのようにして変更可能に見えるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート