go - “在调用者中可见”是否意味着调用变异函数的堆栈?
问题描述
通读 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 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 中是“可见的”。
推荐阅读
- visual-studio-code - VS Code - HTML 标签包装问题
- angular - NgRx - 无限次触发减速器
- excel - 仅当相应行的数据包含文本“OPEN”时,我如何使用 SUMIF 计算列 M 中的总数?
- ansible - Ansible on a linux like OS 回答我需要回答的问题是
- c++ - cstdlib 无法使用 ::wcstombs 解决
- java - 在 Java 类中执行存储过程
- sql-server - 如何使用 azure devops 管道执行 sql 脚本
- bash - 带有 docker 命令的 Bash 脚本未通过 Crontab 运行
- c# - 自适应卡片 HTML 渲染未将复选框设置为选中
- ios - 创建自定义 SF 符号