Mengapa Pengubahsuaian Penunjuk dalam Fungsi Go Kadang-kadang Tidak Menjejaskan Nilai Asal?

Susan Sarandon
Lepaskan: 2024-10-27 11:30:30
asal
746 orang telah melayarinya

 Why Does Pointer Modification in Go Functions Sometimes Not Affect the Original Value?

Pengubahsuaian Penunjuk dalam Go, Memahami Perbezaan

Dalam Go, apabila menghantar penunjuk kepada fungsi, kami biasanya berhasrat untuk mengubah suai nilai ditunjuk oleh penunjuk itu. Biasanya, ini boleh dicapai melalui penyahrujukan, seperti yang digambarkan dalam kod berikut:

<code class="go">type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    *p = Test{4}
}</code>
Salin selepas log masuk

Walau bagaimanapun, mungkin terdapat keadaan di mana nilai struct yang ditunjuk oleh penuding yang diluluskan kekal tidak berubah, walaupun selepas pengubahsuaiannya dalam fungsi. Untuk memahami sebab ini berlaku, mari kita periksa coretan kod yang diubah suai:

<code class="go">type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 2
}

func f(p *Test) {
    // Attempt to modify the pointer value
    p = &Test{4}
}</code>
Salin selepas log masuk

Coretan kod ini cuba mengubah suai nilai penunjuk p, tetapi gagal menukar nilai struct yang asalnya ditunjuk. Sebabnya ialah tugasan p = &Test{4} dalam fungsi f() hanya mengubah suai nilai pembolehubah tempatan p.

Di dalam fungsi f(), p dianggap sebagai pembolehubah tempatan , dan memberikan nilai baharu kepadanya tidak menjejaskan nilai penuding yang dihantar daripada fungsi main(). Akibatnya, struct yang ditunjuk oleh p kekal tidak berubah, dicerminkan dalam nilai i.Value yang tidak berubah apabila dicetak.

Sebaliknya, kod berikut menunjukkan pendekatan yang betul untuk mengubah suai nilai struct:

<code class="go">type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    p.Value = 4
}</code>
Salin selepas log masuk

Dalam kod ini, p.Value = 4 secara langsung mengubah suai medan Nilai bagi struct yang ditunjuk oleh p. Ini menghasilkan pengubahsuaian yang diingini bagi nilai struct, yang ditunjukkan dalam nilai kemas kini i.Value apabila dicetak.

Perlu diperhatikan bahawa memberikan nilai baharu kepada penuding itu sendiri (seperti dalam p = &Test{ 4}) mempunyai kesan yang berbeza. Tugasan ini akan mencipta penuding baharu yang menunjuk kepada struct baharu, tetapi tidak akan menjejaskan nilai struct yang ditunjuk oleh penuding asal yang diluluskan daripada fungsi main().

Atas ialah kandungan terperinci Mengapa Pengubahsuaian Penunjuk dalam Fungsi Go Kadang-kadang Tidak Menjejaskan Nilai Asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!