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

将地图指向方法内的新地图会在离开方法后失去效果

将地图指向方法内的新地图会在离开方法后失去效果

Go
慕妹3242003 2022-08-30 15:06:28
此代码在 Go PlayGround 上可见:package mainimport "fmt"type MyType map[int]intfunc (x MyType) updateIt() {    newItem := make(MyType)    for i := 0; i < 3; i++ {        newItem[i] = i    }    x = newItem    fmt.Println(x)}func main() {    x := make(MyType)    x.updateIt()    fmt.Println(x)}生产:map[0:0 1:1 2:2]map[]虽然我期望:map[0:0 1:1 2:2]map[0:0 1:1 2:2]为什么?我的理解是:作为一个参数,然后创建并更改指针,使其指向。所以指向 的数据。这似乎确实是内部的情况,从第一行可以看出。但是,当在方法之后打印时,更改将丢失。x.updateIt()xnewItemxnewItemxnewItemupdateItx我是Go的新手,这对我来说是意想不到的行为,你能解释一下吗?
查看完整描述

2 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

您应该使用指针接收器:


func (x *MyType) updateIt() {

    newItem := make(MyType)

    for i := 0; i < 3; i++ {

        newItem[i] = i

    }

    *x = newItem

    fmt.Println(x)

}

游乐场:https://play.golang.org/p/K82TTjHdDgg


解释


函数“前面”的参数(所谓的接收器)的行为或多或少与普通参数相似。


想象一个这样的函数:


func updateIt(x MyType) {

    newItem := make(MyType)

    for i := 0; i < 3; i++ {

        newItem[i] = i

    }

    x = newItem

    fmt.Println(x)

}

在这里,您按值传递 x,而不是通过引用(或作为指针)传递 x。


发生的事情是x在函数内部被替换,但将其原始值保留在函数之外。通过传递指针,可以替换 x 指向的值,从而在函数外部更改 x 的值。


另见“围棋之旅,指针”:https://tour.golang.org/moretypes/1


查看完整回答
反对 回复 2022-08-30
?
婷婷同学_

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

在函数中,创建一个新映射,并将该新映射的指针分配给 。mainx


然后将该指针的值传递给函数。updateIt


然后在内部将其替换为指向您在内部创建的另一个地图的指针。然后,它会更新此新地图,而不是更新内部创建的原始地图updateItupdateItmain


这里要了解的最重要的事情是,您的程序会创建两个不同的映射。


因此,请避免创建两个映射并更新传递给函数的相同映射。updateIt


func (x MyType) updateIt() {

    for i := 0; i < 3; i++ {

        x[i] = i

    }

    fmt.Println(x)

}

https://play.golang.org/p/-MemfTv1uJV


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信