Mekanisme lulus parameter jenis penunjuk pergi

PHPz
Lepaskan: 2024-04-13 09:00:03
asal
405 orang telah melayarinya

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan