变量

寒江蓑笠翁大约 6 分钟

变量

变量是用于保存一个值的存储位置,允许其存储的值在运行时动态的变化。除了指针类型,每声明一个变量,都会为其分配一块内存以存储对应类型的值,前往参考手册-变量open in new window以查看更多细节。


声明

变量的声明会用到var关键字,格式为var 变量名 类型名,变量名的命名规则遵守标识符的命名规则,一些例子如下

var intNum int
var str string
var char byte

当要声明多个相同类型的变量时,可以只写一次类型

var numA, numB, numC int

当要声明多个不同类型的变量时,可以使用()进行包裹,可以存在多个()

var (
	name    string
	age     int
	address string
)

var (
	school string
	class int
) 

一个变量如果只是声明而不赋值,那么变量存储的值就是对应类型的零值。


赋值

赋值会用到运算符=,例如

var name string
name = "jack"

也可以声明的时候直接赋值

var name string = "jack"

或者这样也可以

var name string
var age int
name, age = "jack", 1

第二种方式每次都要指定类型,可以使用官方提供的语法糖:短变量初始化,可以省略掉var关键字和后置类型,具体是什么类型交给编译器自行推断。

name := "jack" // 字符串类型的变量。

不过需要注意的是,短变量初始化不能使用nil,因为nil不属于任何类型,编译器无法推断其类型。

name := nil // 无法通过编译

短变量声明也可以批量初始化

name, age := "jack", 1

在Go中,如果想要交换两个变量的值,不需要使用指针,可以使用=直接进行交换,语法上看起来非常直观,例子如下

num1, num2 := 25, 36
nam1, num2 = num2, num1

三个变量也是同样如此

num1, num2, num3 := 25, 36, 49
nam1, num2, num3  = num3, num2, num1

由于在函数内部存在未使用的变量会无法通过编译,但有些变量又确实用不到,这个时候就可以使用匿名变量_,使用_来表示该变量可以忽略,例如

a, b, _ := 1, 2 3

注意

当变量的作用域为函数内部时,如果创建了一个新的变量但没有任何地方调用该变量,那么这样的代码将会无法通过编译,例如在演示赋值时的代码例子

package main

func main() {
	var name string
	var age int
	name, age = "jack", 1
}

编译器输出错误信息

main.go:4:6: name declared but not used
main.go:5:6: age declared but not used

当导入了包却不调用也是同样无法通过编译


但是当变量的作用域为整个包时,不在一个函数内部,那么就允许该变量未被使用,只需要将上述代码的声明位置移动一下

package main

var name string
var age int

func main() {
   name, age = "jack", 1
}

修改后的代码就可以通过编译。


短变量声明的时候有一个注意点,当使用短变量给一个已经存在的变量重复声明时会无法通过编译

a := 1
a := 2
fmt.Println(a)

编译会报错

no new variables on left side of :=

意思就是:=符号左边没有新变量,那么稍微修改下。

a := 1
a, b := 2, 3
fmt.Println(a, b)

输出为

2 3

所以结论就是,当使用短变量声明时,不能重复声明已存在的元素,除非同时声明新的变量,否则无法通过编译。