Heim  >  Artikel  >  Backend-Entwicklung  >  Parameterübergabemechanismus für den Go-Zeigertyp

Parameterübergabemechanismus für den Go-Zeigertyp

PHPz
PHPzOriginal
2024-04-13 09:00:03350Durchsuche

Es gibt zwei Möglichkeiten, Zeigertypparameter in Go zu übergeben: Wertübergabe: Die Funktion erhält eine Kopie des Zeigers und Änderungen an der Kopie haben keinen Einfluss auf den ursprünglichen Zeiger. Referenzübergabe: Die Funktion erhält eine Referenz auf den ursprünglichen Zeiger, und Änderungen an der Referenz wirken sich auf den ursprünglichen Zeiger aus.

Parameterübergabemechanismus für den Go-Zeigertyp

Go-Mechanismus zur Übergabe von Zeigertypparametern

In Go werden Zeigertypparameter auf zwei verschiedene Arten an Funktionen übergeben: Wertübergabe und Referenzübergabe.

Wertübergabe

Wenn Sie einen Zeigerwert als Wert an eine Funktion übergeben, erhält die Funktion eine Kopie dieses Zeigers. Alle an dieser Kopie vorgenommenen Änderungen wirken sich nicht auf den ursprünglichen Zeiger aus.

Codebeispiel:

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
}

Übergabe als Referenz

Wenn Sie einer Funktion eine Zeigeradresse als Wert übergeben, erhält die Funktion eine Referenz auf den ursprünglichen Zeiger. Alle an dieser Referenz vorgenommenen Änderungen wirken sich auf den ursprünglichen Zeiger aus.

Codebeispiel:

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
}

Praktischer Fall

Im folgenden praktischen Fall verwenden wir Wertübergabe und Referenzübergabe, um eine einfache verknüpfte Liste zu implementieren.

Verknüpfte Liste mit Wertübergabe implementieren:

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
}

Verknüpfte Liste mit Referenzübergabe implementieren:

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
}

Im ersten Beispiel erstellen wir eine verknüpfte Liste mit Wertübergabe. Im zweiten Beispiel erstellen wir eine verknüpfte Liste mithilfe der Referenzübergabe. Die Ausführungsergebnisse sind die gleichen, aber bei der Referenzübergabe können wir die Reihenfolge der verknüpften Liste in der Funktion ändern.

Das obige ist der detaillierte Inhalt vonParameterübergabemechanismus für den Go-Zeigertyp. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn