Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Pengubahsuaian Penunjuk dalam Fungsi Go Kadang-kadang Tidak Menjejaskan Nilai Asal?

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

Susan Sarandon
Susan Sarandonasal
2024-10-27 11:30:30747semak imbas

 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>

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>

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>

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!

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