2 回答
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
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
- 2 回答
- 0 关注
- 78 浏览
添加回答
举报