Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mekanisme lulus parameter jenis penunjuk pergi

Mekanisme lulus parameter jenis penunjuk pergi

PHPz
PHPzasal
2024-04-13 09:00:03401semak imbas

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 pergi

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn