ホームページ > バックエンド開発 > Golang > Go 構造体セッターに元の構造体を変更するためのポインターが必要なのはなぜですか?

Go 構造体セッターに元の構造体を変更するためのポインターが必要なのはなぜですか?

Patricia Arquette
リリース: 2024-12-16 04:22:12
オリジナル
385 人が閲覧しました

Why Do Go Struct Setters Need Pointers to Modify the Original Struct?

構造体セッターの使用: ポインターの重要性を理解する

Go で構造体を操作する場合、セッターを使用すると構造体のプロパティを変更できます。ただし、必要な変更が期待どおりに反映されない場合があります。これは、構造体が関数に渡される方法によるものです。

提供されたサンプル コード:

type T struct { Val string }

func (t T) SetVal(s string) {
    t.Val = s
}

func (t *T) SetVal2(s string) {
    (*t).Val = s
}
ログイン後にコピー

提供された SetVal 関数は、元の構造体を期待どおりに変更しません。構造体は値として関数に渡されます。このコピーに加えられた変更は、元の構造体には影響しません。

あるいは、SetVal2 関数は構造体へのポインターを期待し、元の構造体を変更できます。これは、Go が値によって構造体へのポインタを渡すためです。つまり、関数は元の構造体と同じメモリ位置への参照を受け取ります。

この動作を示すために、次のコードを考えてみましょう。

v := T{"abc"}
fmt.Println(v)        // {abc}
v.SetVal("pdq")
fmt.Println(v)        // {abc}
v.SetVal2("xyz")
fmt.Println(v)        // {xyz}
ログイン後にコピー

この例では、元の構造体 v は SetVal によって変更されませんが、SetVal2 によって変更されます。これは、出力の違いから明らかです。

重要なポイントは、Go で構造体にセッターを使用する場合、値による受け渡しとポインターによる受け渡しの違いを理解することが重要であるということです。ポインターを使用すると、関数で元の構造体を変更できるようになりますが、値渡しでは関数内に構造体のコピーが作成されます。

以上がGo 構造体セッターに元の構造体を変更するためのポインターが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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