Bagaimana untuk menentukan sama ada penuding diluluskan sebagai hujah fungsi sedang diubah suai, atau jika salinan sedang diubah suai?

WBOY
Lepaskan: 2024-02-06 10:15:11
ke hadapan
1015 orang telah melayarinya

Bagaimana untuk menentukan sama ada penuding diluluskan sebagai hujah fungsi sedang diubah suai, atau jika salinan sedang diubah suai?

Isi soalan

package main

import (
    "fmt"
)

type Numbers struct {
    x int
    y int
}

func initial(number *Numbers) {
    number.x = 1
    number.y = 1
}

func final(number *Numbers) {
    number = &Numbers{2, 2}
}

func main() {
    p := Numbers{0, 0}
    fmt.Println(p) //Prints {0 0}

    initial(&p)
    fmt.Println(p) //Prints {1 1}

    final(&p)
    fmt.Println(p) //Expected to print {2, 2} but prints {1, 1}
}
Salin selepas log masuk

Mengapa fungsi initial 函数修改指针,而 final mengubah suai salinan penunjuk?

initialfinal的函数参数都指向pmain中的内存地址; initial 能够更改 p,而 final tak boleh.

Sebarang penjelasan mengapa ini berlaku amatlah dihargai.


Jawapan betul


Untuk mengubah suai data yang ditunjukkan oleh penunjuk, penunjuk mesti dinyahrujuk. Pengendali dereference ialah *。然而,为了方便使用,Go 在某些情况下会隐式插入解引用操作。例如,number.x = 1 被转换为 (*number).x = 1.

Terjemahan tersirat ini boleh mengelirukan, tetapi anda harus melihat bahawa jika terjemahan tidak berlaku, maka ungkapan number.x = 1 将毫无意义,因为 number adalah jenis penunjuk dan penunjuk tidak mempunyai medan.

Ringkasnya, initial 函数具有隐式指针解引用,而 final tidak.

Jika anda mahu final 更改为显式且正确地取消引用,*number = Numbers{2, 2},那么它也会更改 p.

Atas ialah kandungan terperinci Bagaimana untuk menentukan sama ada penuding diluluskan sebagai hujah fungsi sedang diubah suai, atau jika salinan sedang diubah suai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!