一直纠结 for 循环变量的作用域问题,go 语言圣经是说明但是说的有些生涩,查询了菜鸟教程,但是发现菜鸟教程中没有提及。随即便自己写了一个测试
GO版本:1.17.3
测试一:循环体内创建,测试外部是否能够生效
package main
import "fmt"
func main(){
test1()
}
func test1(){
for i := 0; i < 2; i++ {
var a string
a = "a"
fmt.Printf(a)
}
fmt.Printf(a)
}
测试二:函数内创建变量,循环体内创建同名变量
package main
import "fmt"
func main(){
test2()
}
func test2(){
var a string
a = "test"
for i := 0; i < 2; i++ {
var a string
a = "a"
fmt.Printf(a)
}
fmt.Printf(a)
}
这里比较有意思的地方是:两个变量都能正常使用,并且互不影响
测试三:基于第二个测试,我们尝试将函数中的 a 设置为不同类型
package main
import "fmt"
func main(){
test3()
}
func test3(){
var a int
for i := 0; i < 2; i++ {
var a string
a = "a"
fmt.Printf(a)
}
fmt.Printf(a)
}
结论:
- for 循环内创建的变量只能在循环体中使用
- 如果 for 循环体中创建的变量,父作用域中已经存在,那么变量类型则必须形同,否则将报错。
- for 循环体中创建的变量和父作用域的同名变量互不干涉
|