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 式を使用すると、実行のさまざまな段階でポインタ値を観察できます。出力は次のことを示しています。
この動作は、引数が関数のスコープにコピーされる Go の値渡しセマンティクスと一致しています。したがって、元の構造体を変更したい場合は、構造体自体ではなく、その構造体へのポインタを渡す必要があります。
以上がGo の値渡しセマンティクスは構造体ポインターの操作にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。