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

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

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

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 <- true
}

func main() {
    runtime.GOMAXPROCS(4)
    s := &Something{number: 42}
    fmt.Printf("&s: %p\n", &s)

    s.queue = make(chan int)
    done := make(chan bool)

    go gotest(s, done)
    s.queue <- 43

    close(s.queue)
    <-done

    fmt.Printf("&s: %p\n", &s)
    fmt.Println(s.number) // Output: 43
}

このコードは次のことを示しています。構造体ポインタを値で渡します。 main 関数では、Something のインスタンスを作成し、そのインスタンスへのポインタを gotest 関数に渡します。

gotest 関数内で、構造体の数値フィールドを変更し、メッセージをそのキュー チャネルに渡します。 gotest 関数はポインタのコピーを操作するため、変更を加えても main 関数の元の構造体には影響しません。

&s 式を使用すると、実行のさまざまな段階でポインタ値を観察できます。出力は次のことを示しています。

  • getest を呼び出す前の main 関数では、s のポインター値は &s 式のポインター値と同じであり、s が実際にポインターであることを示しています。
  • getest 関数内で、&s のポインタ値は s のポインタ値と異なり、s がメイン関数のポインタのコピーであることが確認されます。 function.

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

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

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