为了账号安全,请及时绑定邮箱和手机立即绑定

Golang,带有值接收器的函数的函数指针,在第二次调用时不会使用更改的接收器调用该函数

Golang,带有值接收器的函数的函数指针,在第二次调用时不会使用更改的接收器调用该函数

Go
白板的微信 2022-05-23 17:15:28
package mainimport (    "fmt")type vector struct {    x int    y int}func (u vector) add(v vector) vector {    fmt.Println("received: ", u)    u.x += v.x    u.y += v.y    return u}func main() {    vecA := vector{x: 5, y: 10}    vecB := vector{x: 6, y: 7}    fp := vecA.add // 1    vecA = fp(vecB)   // 2    fmt.Println(vecA)    vecA = fp(vecB)   // 3    fmt.Println(vecA)}/*Output:received:  {5 10}{11 17}received:  {5 10}{11 17}*/在标记1fp处,我使用add函数声明并初始化,vecA用作接收器。在标记2处,我更改了 的值vecA。现在在3处,如果我们扩展语句:fp(vecA),它变成:vecA.add(vecB)。现在我认为它应该add使用“已更改” vecA(在标记2vecA处更改)调用函数,而不是(在标记1处更改)的旧值,而是add使用“旧” vecA(在标记1处)调用函数,这从输出。为什么?虽然我找到了一种使用新的方法,vecA如下所示:package mainimport (    "fmt")type vector struct {    x int    y int}func (u *vector) add(v vector) {    fmt.Println("received: ", *u)    u.x += v.x    u.y += v.y}func main() {    vecA := &vector{x: 5, y: 10}    vecB := vector{x: 6, y: 7}    fp := vecA.add // 1    fp(vecB)   // 2    fmt.Println(*vecA)    fp(vecB)   // 3    fmt.Println(*vecA)}/*Output:received:  {5 10}{11 17}received:  {11 17}{17 24}*/
查看完整描述

2 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

现在我认为它应该使用“更改”的 vecA 调用 add 函数

不,这种想法是错误的。fp 是并且保持绑定到旧值。


查看完整回答
反对 回复 2022-05-23
?
largeQ

TA贡献2039条经验 获得超8个赞

在您的第一个示例中, fp 使用 vecA 的值,因此 vecA 发生的任何事情都不会在初始分配后反映在 fp 中。

在您的第二个示例中, fp 使用 vecA 的地址。现在您将内存位置中的 vecA 的值传递给 add func() 以便它使用更新的值。


查看完整回答
反对 回复 2022-05-23
  • 2 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号