Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan hujah fungsi yang lulus dalam Go?

Bagaimana untuk menggunakan hujah fungsi yang lulus dalam Go?

WBOY
WBOYasal
2023-05-11 17:00:331901semak imbas

Go ialah bahasa pengaturcaraan yang ditaip kuat, dan parameter fungsinya diluluskan mengikut nilai. Ini bermakna apabila anda menghantar parameter kepada fungsi, anda sebenarnya membuat salinan nilai parameter dan menghantar nilai itu kepada fungsi untuk diproses. Oleh itu, apabila menggunakan parameter fungsi lulus dalam Go, anda perlu memberi perhatian kepada perkara berikut:

  1. Perbezaan antara jenis nilai dan jenis rujukan

Dalam Go, dalam tambahan kepada jenis data asas Kecuali untuk jenis nilai, semua jenis data adalah jenis rujukan. Apabila data jenis nilai diluluskan sebagai parameter fungsi, salinan nilai akan dihantar ke fungsi manakala apabila data jenis rujukan diluluskan sebagai parameter fungsi, alamat data dalam memori akan dihantar.

Sebagai contoh, mari kita lihat proses lulus parameter bagi jenis nilai dan jenis rujukan masing-masing:

package main

import "fmt"

func main() {
    // 值类型参数传递
    var a = 10
    fmt.Println("Before call func: ", a) // 输出 10

    changeByVal(a)

    fmt.Println("After call func: ", a) // 输出 10

    // 引用类型参数传递
    var b = []int{1, 2, 3}
    fmt.Println("Before call func: ", b) // 输出 [1 2 3]

    changeByRef(b)

    fmt.Println("After call func: ", b) // 输出 [4 5]
}

// 值类型参数传递
func changeByVal(num int) {
    num = 100
}

// 引用类型参数传递
func changeByRef(arr []int) {
    arr[0] = 4
    arr[1] = 5
}

Kita dapat melihat bahawa dalam kes parameter jenis nilai lulus, walaupun parameter jenis nilai diluluskan di dalam fungsi, Nilai parameter diubah suai kepada 100, tetapi pembolehubah luaran masih tidak terjejas. Dalam kes lulus parameter jenis rujukan, parameter diubah suai di dalam fungsi, dan data sebenar di luar fungsi juga terjejas.

  1. Melalui parameter jenis penunjuk

Apabila kita ingin menukar data jenis rujukan, kita boleh menggunakan hantaran parameter jenis penunjuk. Penunjuk ialah jenis data yang menyimpan alamat pembolehubah, yang juga dihantar oleh nilai dalam Go.

Kita boleh menggunakan & operator untuk mendapatkan alamat pembolehubah, dan operator * untuk mendapatkan data yang disimpan dalam alamat tersebut.

Contohnya:

package main

import "fmt"

func main() {
    var a = 10
    var b *int

    b = &a

    fmt.Println("Before call func: ", a) // 输出 10

    changeByPtr(b)

    fmt.Println("After call func: ", a) // 输出 100
}

func changeByPtr(num *int) {
    *num = 100
}

Kita boleh mendapati bahawa data yang ditunjuk oleh penunjuk (pembolehubah asal a) diubah suai di dalam fungsi, dan data luaran sebenar juga terjejas.

  1. Gunakan... untuk mewakili parameter panjang berubah-ubah

Jika fungsi kami perlu menerima parameter panjang berubah-ubah, kami juga boleh menggunakan... untuk mewakilinya. Sintaks ini serupa dengan args dan kwargs dalam Python.

Contohnya:

package main

import "fmt"

func main() {
    printNames("John", "Alice", "Bob")
}

func printNames(names ...string) {
    for _, name := range names {
        fmt.Println(name)
    }
}

Dalam contoh ini, kami mentakrifkan fungsi printNames dengan parameter panjang berubah-ubah, dan jenis parameter yang diterima ialah rentetan. Di dalam fungsi itu, kami menggunakan julat untuk melelaran melalui semua parameter dan mengeluarkan nilainya satu demi satu.

Ringkasan

Dalam Go, parameter fungsi dihantar mengikut nilai, jadi anda perlu memberi perhatian kepada perbezaan antara jenis nilai dan jenis rujukan. Apabila anda perlu mengubah suai data jenis rujukan, anda boleh menggunakan hantaran parameter jenis penunjuk. Selain itu, kita juga boleh menggunakan... untuk mewakili parameter panjang berubah-ubah, menjadikannya lebih mudah untuk fungsi menerima parameter panjang berubah-ubah.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan hujah fungsi yang lulus dalam Go?. 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