首页 > 解决方案 > “在调用者中可见”是否意味着调用变异函数的堆栈?

问题描述

通读 Effective Go 文档,我有点难以理解以下语句的含义。

If you pass a map to a function that changes the contents of the map, the changes will be visible in the caller.

我理解这对引用/指针的更改意味着什么的要点将反映在函数本身之外。我不明白的是“在调用者中可见”。不是 100% 这个词的意思。调用者是调用改变地图的函数的堆栈吗?

标签: go

解决方案


Go map 是指向底层数据结构的指针,因此如果将 map 传递给函数,则将指针传递给该 map。这意味着调用者和被调用函数正在共享该数据结构的实例。对该结构所做的任何更改都可以被其他函数读取,因此它们是“可见的”。因此,如果您有:

func f(m map[string]string,ch chan struct{}) {
   m["x"]="a"
   ch<-struct{}
}

func g() {
m:=map[string]string{}
ch:=make(chan struct{})
go func() {
   // Do stuff with m
   <-ch
   fmt.Println(m["x"])
}()
f(m,ch)

你有一个 goroutine 并且同时f使用同一个 map,并且所做的更改f在 goroutine 中是“可见的”。


推荐阅读