Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Perbezaan antara penunjuk struct dan pemindahan nilai struct dalam fungsi Golang

Perbezaan antara penunjuk struct dan pemindahan nilai struct dalam fungsi Golang

WBOY
WBOYasal
2024-05-31 19:43:59943semak imbas

Dalam Go, parameter fungsi boleh dihantar melalui nilai atau penuding. Lulus nilai memberikan salinan, dan pengubahsuaian pada salinan tidak akan menjejaskan nilai asal, hantaran penunjuk melepasi alamat, dan pengubahsuaian pada kandungan akan ditunjukkan dalam nilai asal. Dalam amalan, hantaran penunjuk boleh digunakan untuk mengoptimumkan kod, contohnya semasa mengisih kepingan. Memilih kaedah penghantaran yang betul adalah penting untuk mengoptimumkan kod anda dan meningkatkan prestasi.

Golang 函数中 struct 指针与 struct 值传递的区别

Fungsi hantaran parameter dalam Go: hantaran nilai dan hantaran penunjuk

Dalam Go, parameter fungsi boleh dihantar melalui nilai atau hantaran penunjuk. Memahami perbezaan antara dua kaedah penghantaran ini adalah penting untuk menguasai pengaturcaraan Go.

Pass-by-value

Pass-by-value bermaksud fungsi menerima salinan nilai argumen masuk. Sebarang pengubahsuaian kepada nilai parameter tidak akan menjejaskan nilai asal. Contohnya:

func changeValue(s string) {
    s = "modified"
}

func main() {
    var s = "original"
    changeValue(s)
    fmt.Println(s) //输出: original
}

Dalam fungsi changeValue, s ialah salinan jenis string. Pengubahsuaian kepada s tidak menjejaskan pembolehubah s asal dalam fungsi utama. changeValue 函数中,sstring 类型的副本。对 s 的修改不会影响 main 函数中的原始 s 变量。

指针传递

指针传递是指函数接收传入参数的地址。对参数内容的任何修改都会反映在原始变量中。例如:

func changePointer(s *string) {
    *s = "modified"
}

func main() {
    var s = "original"
    changePointer(&s)
    fmt.Println(s) //输出: modified
}

changePointer 函数中,s 是指向原始 string 变量 s 的指针。对 *s 的修改会直接修改 main 函数中的原始 s 变量。

实战案例

以下是一个利用指针传递在实际场景中进行代码优化的示例:

type Person struct {
    Name string
    Age  int
}

func sortByName(people []Person) {
    for i := 0; i < len(people)-1; i++ {
        for j := i + 1; j < len(people); j++ {
            if people[i].Name > people[j].Name {
                // 交换 people[i] 和 people[j]
                people[i], people[j] = people[j], people[i]
            }
        }
    }
}

func main() {
    people := []Person{
        {"Alice", 20},
        {"Bob", 25},
        {"Charlie", 30},
    }
    sortByName(people)
    fmt.Println(people) //输出: [{Alice 20} {Bob 25} {Charlie 30}]
}

在这个示例中,sortByName 函数接收一个 Person

Hantaran penunjuk

Hantaran penunjuk bermaksud fungsi menerima alamat parameter masuk. Sebarang pengubahsuaian kepada kandungan parameter akan ditunjukkan dalam pembolehubah asal. Contohnya:

rrreee

Dalam fungsi changePointer, s ialah penunjuk kepada string pembolehubah s asal. Pengubahsuaian kepada *s mengubah suai terus pembolehubah s asal dalam fungsi utama. 🎜🎜🎜Kes praktikal🎜🎜🎜Berikut ialah contoh menggunakan hantaran penunjuk untuk pengoptimuman kod dalam senario kehidupan sebenar: 🎜rrreee🎜Dalam contoh ini, fungsi sortByName menerima Orang Tuding pada kepingan. Dengan menghantar penunjuk, fungsi ini boleh mengubah suai secara langsung kandungan kepingan tanpa membuat salinan. Ini meningkatkan kecekapan fungsi, terutamanya apabila kepingannya besar. 🎜🎜🎜Kesimpulan🎜🎜🎜Memahami perbezaan antara passing by value dan passing by pointer adalah penting untuk menulis program Go dengan cekap. Melepasi nilai sesuai apabila salinan perlu diubah suai dan bukannya nilai asal, manakala lulus melalui penunjuk sesuai apabila nilai asal perlu diubah suai. Memilih kaedah penghantaran yang betul untuk keperluan anda boleh mengoptimumkan kod anda dan meningkatkan prestasi program anda. 🎜

Atas ialah kandungan terperinci Perbezaan antara penunjuk struct dan pemindahan nilai struct dalam fungsi Golang. 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