Go语言 如何确定作为函数参数传递的指针是被修改还是副本被修改?

jq6vz3qz  于 2023-01-06  发布在  Go
关注(0)|答案(2)|浏览(143)
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}
}

为什么initial函数修改指针,而final函数修改指针的副本?
initialfinal的函数参数都指向pmain中的内存地址; initial设法更改p,而final不能。
任何解释,以便为什么是这种情况将不胜感激。

5gfr0r5j

5gfr0r5j1#

要修改指针所指向的数据,必须解引用该指针,解引用操作符是*,但是为了方便使用,Go语言在某些情况下会隐式地插入解引用操作,例如number.x = 1被翻译成(*number).x = 1
这种隐式转换可能会引起混淆,但是您应该看到,如果没有发生这种转换,那么表达式number.x = 1将毫无意义,因为number是一种指针类型,并且指针没有字段。
总之,initial函数具有隐式指针解引用,而final没有。
如果您将final更改为显式且正确地取消引用*number = Numbers{2, 2},那么它也将更改p

siotufzp

siotufzp2#

initial函数作用于传递的指针,该指针指向main中分配的变量。所有更改都在main中分配的对象上执行。
final函数接收相同的指针作为参数,但是它将指针赋给另一个Numbers示例。main中的对象永远不会改变。
这两个函数都不涉及复制。

相关问题