变量
变量
变量是用于保存一个值的存储位置,允许其存储的值在运行时动态的变化。除了指针类型,每声明一个变量,都会为其分配一块内存以存储对应类型的值,前往参考手册-变量以查看更多细节。
声明
变量的声明会用到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
所以结论就是,当使用短变量声明时,不能重复声明已存在的元素,除非同时声明新的变量,否则无法通过编译。