Terdapat dua cara untuk menghantar parameter jenis penuding dalam Go: menghantar nilai: fungsi memperoleh salinan penuding dan perubahan pada salinan tidak menjejaskan penuding asal. Lulus dengan rujukan: Fungsi mendapatkan rujukan kepada penunjuk asal, dan perubahan pada rujukan mempengaruhi penunjuk asal.
Mekanisme lulus parameter jenis penunjuk Go
Dalam Go, parameter jenis penunjuk dihantar ke fungsi dalam dua cara berbeza: hantaran nilai dan hantaran rujukan.
Melalui nilai
Jika anda menghantar nilai penuding kepada fungsi sebagai nilai, fungsi itu akan mendapat salinan penuding. Sebarang perubahan yang dibuat pada salinan ini tidak akan menjejaskan penunjuk asal.
Contoh Kod:
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 }
Pass by Rujukan
Jika anda menghantar alamat penunjuk sebagai nilai kepada fungsi, fungsi tersebut akan mendapat rujukan kepada penunjuk asal. Sebarang perubahan yang dibuat pada rujukan ini akan menjejaskan penunjuk asal.
Contoh kod:
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 }
Kes praktikal
Dalam kes praktikal berikut, kami menggunakan hantaran nilai dan hantaran rujukan untuk melaksanakan senarai terpaut mudah.
Melaksanakan senarai terpaut menggunakan nilai lulus:
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 }
Melaksanakan senarai terpaut menggunakan rujukan lulus:
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 }
Dalam contoh pertama, kami mencipta senarai terpaut menggunakan nilai lulus. Dalam contoh kedua, kami membuat senarai terpaut menggunakan rujukan lulus. Keputusan pelaksanaan adalah sama, tetapi apabila melalui rujukan, kita boleh mengubah suai susunan senarai terpaut dalam fungsi.
Atas ialah kandungan terperinci Mekanisme lulus parameter jenis penunjuk pergi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!