go - 在指针方法接收器中重新分配

标签 go

我对指针方法接收器和非指针方法接收器的理解是第一个可以在方法中修改,下一个不能。

所以,下面的工作完全符合我的预期。

type student struct {
    name string
    age  int
}

func (s *student) update() {
    s.name = "unknown"
    s.age = 0
}

func main() {
    s := student{"hongseok", 13}
    fmt.Println(s)

    s.update()
    fmt.Println(s)
}

它打印hongseok/13unknown/0

但是,我想通过重新分配立即替换更新方法中的整个 s。所以,我刚刚更改了如下更新方法。

func (s *student) update() {
    s = &student{"unknown", 0}
}

并且它不会更改 main 方法中的 s 并打印双 hongseok/13

func (s *student) update() {
    *s = student{"unknown", 0}
}

以上更改解决了问题。

我认为没有语义差异。我错过了什么?

最佳答案

在第一个例子中:

func (s *student) update() {
    s = &student{"unknown", 0}
}

您正在为 s 分配一个全新的“指针值”,并且新的 *s 指向一个新的 student 值。变量 s 的范围仅限于方法主体,因此返回后没有副作用。

在第二个例子中

func (s *student) update() {
    *s = student{"unknown", 0}
}

您正在取消引用 s,并将 *s 的值更改为指向新的 student 值,或者换句话说,您在 s 指向的地址处放置了一个新的 student 值。

关于go - 在指针方法接收器中重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38105543/

相关文章:

go - gRPC 设置有问题。获取间歇性 RPC 不可用错误

mysql - 为选择查询传递可变参数

go - 设置 gorilla mux 子路由器

go - 多个 goroutines 在一个 channel 上有选择地监听

object - 具有多种返回类型的接口(interface)方法

go - 如何使用Golang进入FTP的被动模式?

Gorm 发现结构体的字段无效

amazon-web-services - client.Timeout 在等待 header 时超出

go - 在完成时将 channel 结果添加到队列的更惯用的方法

string - 查找字符串中子字符串的索引,指定起始索引