开发者社区 问答 正文

go定义的map不想改变,又被莫名改变了值

package main

import "fmt"

func update(i map[string]string) map[string]string {
	i["name"]="tom"
	return i
}
func main()  {
	item:=make(map[string]string)
	item["name"]="jyd"
	item["address"]="sh"

	item2:=item
	fmt.Println(update(item2))
	fmt.Println(item)
}

运行结果

map[address:sh name:tom]
map[address:sh name:tom]

我预计item是不会被改变的,改变的只有item2,目前都改了

展开
收起
水果黄瓜 2021-10-24 09:22:52 411 分享 版权
阿里云 AI 助理回答

在Go语言中,map是一种引用类型。当你将一个map赋值给另一个变量时,你实际上是复制了map的引用,而不是创建了一个新的map副本。这意味着原始map和它的副本(通过赋值操作获得的新变量)都指向同一个底层数据结构。因此,当你通过item2修改map时,由于itemitem2共享同一份数据,所以对item2的修改也会反映到item上。

如果你希望在函数内部修改一个map,并且不影响外部的原始map,你需要在函数内创建一个新的map来存储修改后的结果,而不是直接修改传入的map引用。下面是一个修改版的代码示例:

package main

import "fmt"

func update(i map[string]string) map[string]string {
	// 创建一个新的map来避免修改原始map
	newMap := make(map[string]string)
	for k, v := range i {
		newMap[k] = v
	}
	newMap["name"] = "tom"
	return newMap
}

func main() {
	item := make(map[string]string)
	item["name"] = "jyd"
	item["address"] = "sh"

	item2 := update(item)
	fmt.Println(item2)
	fmt.Println(item)
}

这段代码中,update函数现在会创建一个新的map newMap,并复制i的内容到这个新map中,然后再修改newMap的"name"键。这样,在main函数中打印itemitem2时,你会看到预期的结果:item2中的"name"被修改为"tom",而item保持不变。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: