ホームページ バックエンド開発 Golang Go でポインタを介して文字列の値を変更してもメモリ アドレスが変更されないのはなぜですか?

Go でポインタを介して文字列の値を変更してもメモリ アドレスが変更されないのはなぜですか?

Dec 13, 2024 am 07:33 AM

Why Does Changing a String's Value via a Pointer in Go Not Change Its Memory Address?

不変の文字列値とポインタ アドレス

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  
ログイン後にコピー

予想に反して、「world」を逆参照ポインター *ptr に割り当てた後、&str のアドレスは変更されません。

この現象を理解するには、この文脈における「不変性」が何を意味するのかを理解する必要があります。 Go の文字列値は不変ですが、それを保持する変数は不変です。コード サンプルでは、​​str は文字列型の変数であり、その値は変更できます。

文字列値 "hello" 自体は不変です。 「world」を str に代入しても「hello」は変更されず、単に str 変数の値が「world」に変更されるだけです。この変更は、値の設定方法 (直接かポインタ経由か) には依存しません。

不変の文字列値により、プログラム全体で共有文字列の一貫性が保たれます。たとえば、関数が文字列引数を受け取った場合、その関数内でその値を変更することはできません。したがって、同じ文字列値の後続の print ステートメントは、常に予期した結果を生成します。

内部的に、文字列値は、reflect.StringHeader 構造体によって表されます。これらの構造体には、UTF-8 でエンコードされたテキストの値とそのバイト長へのポインターが格納されます。このデータにはアクセスできないため、直接変更できません。さらに、文字列値にインデックスを付けたり、新しい値を割り当てたりすることはできません。

Go 仕様では文字列値の不変性が保証されていますが、unsafe パッケージを使用するとこれらの保証が無効になる可能性があります。ただし、これを行うと、言語仕様によって提供される保護と安全性が放棄されます。

以上がGo でポインタを介して文字列の値を変更してもメモリ アドレスが変更されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

Beegoフレームワークのページ間で短期情報転送を実装する方法は?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

Goでユニットテストをどのように書きますか? Goでユニットテストをどのように書きますか? Mar 21, 2025 pm 06:34 PM

Goでユニットテストをどのように書きますか?

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

Go言語でファイルを便利に書く方法は?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

See all articles