Go でポインタ型パラメータを渡すには 2 つの方法があります。 値の受け渡し: 関数はポインタのコピーを取得し、コピーへの変更は元のポインタに影響を与えません。参照渡し: 関数は元のポインターへの参照を取得し、参照への変更は元のポインターに影響を与えます。
Go ポインタ型パラメータ受け渡しメカニズム
Go では、ポインタ型パラメータは 2 つの異なる方法で関数に渡されます。値と参照渡し。
値の受け渡し
ポインタ値を値として関数に渡すと、関数はポインタのコピーを取得します。このコピーに加えられた変更は、元のポインターには影響しません。
コード例:
package main import "fmt" func changeValue(ptr *int) { *ptr = 10 } func main() { ptr := new(int) *ptr = 5 fmt.Println(*ptr) // 输出: 5 changeValue(ptr) fmt.Println(*ptr) // 输出: 5 }
参照渡し
ポインタ アドレスを値として関数に渡す場合、関数は生のポインターへの参照を取得します。この参照に加えられた変更は、元のポインタに影響します。
コード例:
package main import "fmt" func changePointer(ptr **int) { *ptr = new(int) **ptr = 10 } func main() { ptr := new(int) *ptr = 5 fmt.Println(*ptr) // 输出: 5 changePointer(&ptr) fmt.Println(*ptr) // 输出: 10 }
実際のケース
次の実際のケースでは、値の受け渡しと参照の受け渡しを使用します。単純なリンク リストを実装します。
値渡しを使用したリンク リストの実装:
type Node struct { value int next *Node } func createList(values []int) *Node { head := &Node{value: values[0]} current := head for _, v := range values[1:] { next := &Node{value: v} current.next = next current = next } return head } func printList(head *Node) { for current := head; current != nil; current = current.next { fmt.Printf("%d ", current.value) } fmt.Println() } func main() { values := []int{1, 2, 3, 4, 5} head := createList(values) printList(head) // 输出: 1 2 3 4 5 }
参照渡しを使用したリンク リストの実装:
type Node struct { value int next **Node } func createList(values []int) *Node { head := &Node{value: values[0]} current := head for _, v := range values[1:] { next := &Node{value: v} *current.next = next current = next } return head } func printList(head *Node) { for current := head; current != nil; current = *current.next { fmt.Printf("%d ", current.value) } fmt.Println() } func main() { values := []int{1, 2, 3, 4, 5} head := createList(values) printList(head) // 输出: 1 2 3 4 5 }
最初の例では、値の受け渡しを使用してリンク リストを作成します。 2 番目の例では、参照渡しを使用してリンク リストを作成します。実行結果は同じですが、参照渡しの場合、関数内のリンクリストの順序を変更できます。
以上がGo ポインタ型パラメータ受け渡し機構の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。