GO的短变量声明

2,394 阅读2分钟

是什么

hello :="hello"

短变量声明(short variable declaration)是golang中声明变量的一种方式,是golang特有的语法,相比 var hello="hello"的声明方式,可以少写一个 var,能稍微减少代码量

特点

1. 可以重复声明

一般强类型语言的变量都不允许重复声明,在golang中使用var重复声明变量同样会抛出错误

package main
import "fmt"
func main() {
	var a = 100
	var a = 200
	fmt.Println(a)
}

编译时报错:a redeclared in this block

使用短变量声明时候:

// example1:
package main
import "fmt"
func main() {
	a, c := 100, 200
	fmt.Println(&a) // 0xc000014090
	a, d := 200, 300
	fmt.Println(a, c, d) // 100,200,300
	fmt.Println(&a)      // 0xc000014090
}

// 编译通过
// 编译时报错: no new variables on left side of :=

// example2: 
package main
import "fmt"
func main() {
	a, c := 100, 200
	fmt.Println(&a) // 0xc000014090
	a, d := 200, 300
	fmt.Println(a, c, d) // 100,200,300
	fmt.Println(&a)      // 0xc000014090
}
// 编译通过

example1 和 example2 中 变量a都被声明了两次,但只有example2可以编译通过。可以看到重复声明有效的前提是声明语句左边至少有一个是新变量。

同时特别注意,被重复声明的变量并没有创建多次, 只是将新的值赋予原来的变量it just assigns a new value to the original )。example2 中 变量a的内存地址始终是同一个

同时还要注意只有在同一作用域才是重复声明,如果在不同作用域声明相同变量名,则是创建新的变量

package main
import "fmt"

func main() { // 作用域1
	a, b := 100, 200 
	if true { // 作用域2
		a, c := 300, 400
		fmt.Println(a, c)  // 300,400
	}
	fmt.Println(a, b) // 100,200 

上述 变量a 在两个不同作用域,是完全两个不同的变量

2. 只能声明在局部作用域内

不能声明在全局作用域,只能声明在局部作用域,包括函数内部,if,for,switch 语句中

func main() {
	for i := 0; i < 100; i++ {
		fmt.Println(i)
	}

	if ok := true; ok {
			fmt.Println(ok)
		}
}

参考:

[Short variable declarations](https://golang.org/ref/spec#Short_variable_declarations)