ホームページ  >  記事  >  バックエンド開発  >  Go ポインタ型パラメータ受け渡し機構

Go ポインタ型パラメータ受け渡し機構

PHPz
PHPzオリジナル
2024-04-13 09:00:03346ブラウズ

Go でポインタ型パラメータを渡すには 2 つの方法があります。 値の受け渡し: 関数はポインタのコピーを取得し、コピーへの変更は元のポインタに影響を与えません。参照渡し: 関数は元のポインターへの参照を取得し、参照への変更は元のポインターに影響を与えます。

Go ポインタ型パラメータ受け渡し機構

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 サイトの他の関連記事を参照してください。

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