多个Go协程是否会干扰同一函数内的变量?
Go协程调用同一函数时的局部变量隔离问题
核心结论
每个协程调用函数时,都会创建该函数的独立栈帧,函数内的局部变量完全隔离,不存在共享情况,直接使用是安全的。
针对示例代码的具体解释
func main() { go func1(1) go func1(2) } func func1(a int) { something := a // do something }
- 启动的两个协程各自拥有
func1的独立执行上下文,something是func1内部的局部变量,每个协程里的something都是自己栈帧里的独立实例。 - 两个协程之间完全不会干扰对方的变量,哪怕执行顺序混乱,各自的
something值只会是传入的参数(1或2),不会出现意外变化。
额外说明
只有当函数内的变量引用了共享资源(比如全局变量、多个协程共同访问的堆内存对象等)时,才需要考虑并发安全问题。单纯使用函数内部声明的局部变量,在协程调用时不存在任何安全风险。
内容的提问来源于stack exchange,提问作者Divyanshu Juneja
相关产品推荐
相关产品推荐

