Go语言中如何在for循环中使用局部变量与临时变量接收函数的两个返回值
解决Go中for循环初始化语句复用外部变量的问题
这确实是Go里for循环初始化语句的一个常见小细节——:=会在当前的块级作用域(也就是for循环的内部作用域)重新声明变量,哪怕你已经在外部声明过同名的a,这就导致循环里的a和外部的a完全是两个独立变量,外部的a永远保持初始值0,完全达不到你想要的效果。
要解决这个问题,关键是避免在for初始化语句里使用:=,转而使用普通的赋值运算符=,但前提是所有要赋值的变量都已经在外部声明过。这里是符合你需求的修改方案:
func TwoResults() (int, int) { return 0, 0 } func ForStructure() int { var a int // 提前声明临时变量用来接收TwoResults的另一个返回值 var b int // 使用=赋值,不会重新声明a,直接复用外部的变量 for b, a = TwoResults(); a == 0 && b == 0; { return b } return a }
为什么这个方案可行?
- 我们提前在函数作用域声明了
a和临时变量b,所以在for循环的初始化语句里使用=是合法的 - 赋值操作会直接把
TwoResults的返回值赋给已有的a(外部作用域的变量)和b,不会创建新的局部变量 - 完全避免了重复调用
TwoResults的问题,符合你的要求
如果你觉得提前声明临时变量有点啰嗦,还有另一种更紧凑的写法(本质逻辑一样):
func ForStructure() int { var a, b int for b, a = TwoResults(); a == 0 && b == 0; { return b } return a }
这样把a和b的声明合并在一起,代码更简洁,效果完全相同。
内容的提问来源于stack exchange,提问作者419SUV
相关产品推荐
相关产品推荐

