如何确定作为函数参数传递的指针是否正在被修改,或者副本是否正在被修改?

ЯДP*_*ГФИ 3 pointers go

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}
}
Run Code Online (Sandbox Code Playgroud)

为什么initial函数修改指针,而final函数修改指针的副本?

initialfinal函数参数都指向pin的内存地址maininitial能改变p,却不final能改变。

任何解释为什么会出现这种情况将不胜感激。

Hym*_*sco 5

要修改指针指向的数据,必须取消引用该指针。解引用运算符是*。然而,为了方便使用,Go 在某些情况下会隐式插入解引用操作。例如,number.x = 1被翻译为(*number).x = 1.

这种隐式翻译可能会令人困惑,但您应该看到,如果翻译没有发生,那么表达式number.x = 1将毫无意义,因为number是指针类型并且指针没有字段。

综上所述,该initial函数具有隐式指针取消引用,而 while 则final没有。

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