ホームページ >バックエンド開発 >Golang >Go の値渡しセマンティクスは構造体ポインターの操作にどのような影響を与えますか?

Go の値渡しセマンティクスは構造体ポインターの操作にどのような影響を与えますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-03 15:55:121094ブラウズ

How Do Go's Pass-by-Value Semantics Affect Struct Pointer Manipulation?

Go でのオブジェクト ポインター値の検査

Go では、関数の引数は値によって渡されます。つまり、関数内の引数に加えられた変更は元の引数には影響しません。関数外の値。構造体が参照によって渡されることが予想されるため、これは構造体を扱うときに混乱を招く可能性があります。

これがどのように機能するかを理解するには、次のコード スニペットを検討してください。

package main

import (
    "fmt"
    "runtime"
)

type Something struct {
    number int
    queue  chan int
}

func gotest(s *Something, done chan bool) {
    fmt.Printf("from gotest:\n&s: %p\n", &s)
    for num := range s.queue {
        fmt.Println(num)
        s.number = num
    }
    done <p>このコードは次のことを示しています。構造体ポインタを値で渡します。 main 関数では、Something のインスタンスを作成し、そのインスタンスへのポインタを gotest 関数に渡します。</p><p>gotest 関数内で、構造体の数値フィールドを変更し、メッセージをそのキュー チャネルに渡します。 gotest 関数はポインタのコピーを操作するため、変更を加えても main 関数の元の構造体には影響しません。</p><p>&s 式を使用すると、実行のさまざまな段階でポインタ値を観察できます。出力は次のことを示しています。</p>
  • getest を呼び出す前の main 関数では、s のポインター値は &s 式のポインター値と同じであり、s が実際にポインターであることを示しています。
  • getest 関数内で、&s のポインタ値は s のポインタ値と異なり、s がメイン関数のポインタのコピーであることが確認されます。 function.

この動作は、引数が関数のスコープにコピーされる Go の値渡しセマンティクスと一致しています。したがって、元の構造体を変更したい場合は、構造体自体ではなく、その構造体へのポインタを渡す必要があります。

以上がGo の値渡しセマンティクスは構造体ポインターの操作にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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