Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menentukan sama ada penuding diluluskan sebagai hujah fungsi sedang diubah suai, atau jika salinan sedang diubah suai?

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

WBOY
WBOYke hadapan
2024-02-06 10:15:11988semak imbas

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}
}

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam