Go のオブジェクトの値の受け渡しを理解する
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") fmt.Printf("Address of s: %p\n", &s) for num := range s.queue { fmt.Printf("Value received: %d\n", num) s.number = num } done <- true } func main() { runtime.GOMAXPROCS(4) s := new(Something) fmt.Printf("Address of s in main: %p\n", &s) s.queue = make(chan int) done := make(chan bool) go gotest(s, done) // Passing a pointer to gotest s.queue <- 42 close(s.queue) <-done fmt.Printf("Address of s in main: %p\n", &s) fmt.Printf("Final value of s.number: %d\n", s.number) }
出力:
Address of s in main: 0x4930d4 from gotest: Address of s: 0x4974d8 Value received: 42 Address of s in main: 0x4930d4 Final value of s.number: 42
この中で例:
結論:
Go では、通り過ぎることの違いを理解することが重要です値を指定し、ポインタを渡します。関数の外でオブジェクトに変更を加える必要がある場合は、オブジェクトへのポインタを引数として渡します。ただし、印刷目的の場合は、ポインター値に関する混乱を避けるために、println(&s) を使用する代わりに fmt パッケージを使用することをお勧めします。
以上がGo の値渡しメカニズムは関数内のオブジェクトの変更にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。