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都有自己的内存地址;initial设法改变main中定义的p,而final不能.

任何关于为什么会是这样的解释都将不胜感激.

推荐答案

要修改指针指向的数据,必须取消对该指针的引用.取消引用运算符是*.但是,为了便于使用,GO在某些情况下会隐式插入取消引用操作.例如,number.x = 1被转换为(*number).x = 1.

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

因此,总而言之,initial函数有隐式的指针取消引用,而final没有.

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

Go相关问答推荐

Go Fiber和HTMX—HX—Trigger header被更改为HX—Trigger,这不是HTMX监听的内容

CGO Linux到Windows交叉编译中的未知类型名称

是不是有什么原因导致`Strings.EqualFold`不先进行长度比较?

戈姆:如何将一对一联系起来?

Golang在不写入磁盘的情况下为jpeg图像生成一致的哈希

如何为循环扫描的bufio scanner 设置超时?

如何根据地址和大小打印字符串

gopacket:IP-in-IP 数据包上的解码层

有没有什么方法可以在不使用 if/else 的情况下在 Golang 中处理 nil 指针?

go:embed 文件扩展名模式

gorm 获取列名

Go Fyne 禁用 HSplit 调整大小?

如何在循环中旋转图像以便在 golang 中创建 GIF?

如何在gorm中处理多个查询

使用 xml.Name 将 xml 解组为 [] struct

如何在 docker 文件中安装 golang 包?

如何解决在mac m1中运行gcc失败退出状态1?

有没有办法在golang中映射一组对象?

是否存在一个Go泛型类型约束,该约束捕获了将类型用作映射中的键的能力?

Go 错误:cannot use generic type without instantiation