ホームページ >バックエンド開発 >Golang >Go の値渡しメカニズムは関数内のオブジェクトの変更にどのような影響を与えますか?

Go の値渡しメカニズムは関数内のオブジェクトの変更にどのような影響を与えますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-02 13:56:10378ブラウズ

How Does Go's Pass-by-Value Mechanism Affect Object Modification in Functions?

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

この中で例:

  • getest 関数は、引数として Something オブジェクトへのポインタを受け取ります。
  • gotest 関数が呼び出されるとき、s へのポインタのコピーが渡されます。 s 自体のコピー。
  • gotest 関数内では、s のアドレスは main 関数内の s のアドレスとは異なります。これにより、オブジェクト自体ではなく、ポインターが渡されたことが確認されます。
  • ポインターを使用しているため、getest 関数内で s に加えられた変更は、main 関数内の元の s オブジェクトに影響します。

結論:

Go では、通り過ぎることの違いを理解することが重要です値を指定し、ポインタを渡します。関数の外でオブジェクトに変更を加える必要がある場合は、オブジェクトへのポインタを引数として渡します。ただし、印刷目的の場合は、ポインター値に関する混乱を避けるために、println(&s) を使用する代わりに fmt パッケージを使用することをお勧めします。

以上がGo の値渡しメカニズムは関数内のオブジェクトの変更にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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