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,目前都改了
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Go语言中,map是一种引用类型。当你将一个map赋值给另一个变量时,你实际上是复制了map的引用,而不是创建了一个新的map副本。这意味着原始map和它的副本(通过赋值操作获得的新变量)都指向同一个底层数据结构。因此,当你通过item2
修改map时,由于item
和item2
共享同一份数据,所以对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
函数中打印item
和item2
时,你会看到预期的结果:item2
中的"name"被修改为"tom",而item
保持不变。