:= 操作符
通常:
函数体内使用 := 重复声明同名变量,是不允许的: ``
疑惑:
但是今天发现一段代码,如下这样重复声明变量,却编译通过并成功执行: ``
代码:
var x int
func Test_var(t *testing.T) {
fmt.Println(x, &x)
x = 1
fmt.Println(x, &x)
var x int
fmt.Println(x, &x)
x = 1
fmt.Println(x, &x)
x, y := 2, "???"
fmt.Println(x, &x, y)
}
输出:
0 0x892640
1 0x892640
0 0xc042033a88
1 0xc042033a88
2 0xc042033a88 ???
结论:
Go 语言程序中全局变量与局部变量名称可以相同,但是函数内的局部变量会被优先考虑。
只存在同名全局变量,声明同名局部变量时,会新申请新地址。:=就不会为全局变量赋值,新建局部变量。
存在同名局部变量,声明同名局部变量时,不会新申请新地址。:=就会为局部变量赋值。
通常:
函数体内使用 := 重复声明同名变量,是不允许的: ``
疑惑:
但是今天发现一段代码,如下这样重复声明变量,却编译通过并成功执行: ``
代码:
var x int
func Test_var(t *testing.T) {
fmt.Println(x, &x)
x = 1
fmt.Println(x, &x)
var x int
fmt.Println(x, &x)
x = 1
fmt.Println(x, &x)
x, y := 2, "???"
fmt.Println(x, &x, y)
}
输出:
0 0x892640
1 0x892640
0 0xc042033a88
1 0xc042033a88
2 0xc042033a88 ???
结论:
Go 语言程序中全局变量与局部变量名称可以相同,但是函数内的局部变量会被优先考虑。
只存在同名全局变量,声明同名局部变量时,会新申请新地址。:=就不会为全局变量赋值,新建局部变量。
存在同名局部变量,声明同名局部变量时,不会新申请新地址。:=就会为局部变量赋值。