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.
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!