猿问

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

此代码在 Go PlayGround 上可见:


package main


import "fmt"


type MyType map[int]int


func (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的新手,这对我来说是意想不到的行为,你能解释一下吗?


慕妹3242003
浏览 79回答 2
2回答

慕斯709654

您应该使用指针接收器:func (x *MyType) updateIt() {&nbsp; &nbsp; newItem := make(MyType)&nbsp; &nbsp; for i := 0; i < 3; i++ {&nbsp; &nbsp; &nbsp; &nbsp; newItem[i] = i&nbsp; &nbsp; }&nbsp; &nbsp; *x = newItem&nbsp; &nbsp; fmt.Println(x)}游乐场:https://play.golang.org/p/K82TTjHdDgg解释函数“前面”的参数(所谓的接收器)的行为或多或少与普通参数相似。想象一个这样的函数:func updateIt(x MyType) {&nbsp; &nbsp; newItem := make(MyType)&nbsp; &nbsp; for i := 0; i < 3; i++ {&nbsp; &nbsp; &nbsp; &nbsp; newItem[i] = i&nbsp; &nbsp; }&nbsp; &nbsp; x = newItem&nbsp; &nbsp; fmt.Println(x)}在这里,您按值传递 x,而不是通过引用(或作为指针)传递 x。发生的事情是x在函数内部被替换,但将其原始值保留在函数之外。通过传递指针,可以替换 x 指向的值,从而在函数外部更改 x 的值。另见“围棋之旅,指针”:https://tour.golang.org/moretypes/1

婷婷同学_

在函数中,创建一个新映射,并将该新映射的指针分配给 。mainx然后将该指针的值传递给函数。updateIt然后在内部将其替换为指向您在内部创建的另一个地图的指针。然后,它会更新此新地图,而不是更新内部创建的原始地图updateItupdateItmain这里要了解的最重要的事情是,您的程序会创建两个不同的映射。因此,请避免创建两个映射并更新传递给函数的相同映射。updateItfunc (x MyType) updateIt() {&nbsp; &nbsp; for i := 0; i < 3; i++ {&nbsp; &nbsp; &nbsp; &nbsp; x[i] = i&nbsp; &nbsp; }&nbsp; &nbsp; fmt.Println(x)}https://play.golang.org/p/-MemfTv1uJV
随时随地看视频慕课网APP

相关分类

Go
我要回答