变量声明和定义
使用关键词 var或自动推导。 在一个作用域内,一个变量的声明只能出现一次;定义可零次可声明的同时定义。
只声明
声明单个变量
var a int
声明多个同类型的变量
var a,b,c int
声明一组非同类型变量,
var (
str string
avg, sum int
)
不同于C和C++ 未初始化的变量值为内存历史值,go未初始化的变量,系统会自动赋予该类型的零值。
变量零值
值类型
bool 的零值为 false 整数的零值为 0 浮点数的零值为 0.0 string 的零值为 空字符串 “”
引用类型(pointer, function, interface, slice, channel, map)的零值为 nil 聚合类型(array, struct)的零值为每个字段都是该类型对应的零值
声明的同时定义
单个变量
var a int = 1
多个同类型的变量
var a, b string = "hello", "world"
一组非同类型变量
var (
str string = "test"
avg, sum int = 1, 2
)
变量类型自动推导,由于变量声明的同时定义,编译器可以通过定义的值自动推导出变量的类型,可以省略声明中的变量类型,
基本语法:var 变量名 = 变量值;例如:
var c, d, e = 1, 3.5, "hello" // 类型:int float64 string
简略语法:变量名 := 变量值;例如:
a, b, c := 1, true, "message" // 类型:int, bool, string
自动推导问题
有些写法可能会出现异议,导致go编译器无法推导出来,例如:
数组 正确写法
a := []int{1,2,3}
写成
a := {1,2,3} 或者 a := []{1,2,3}
简略语法支持忽略已声明变量,推导部分变量,导致代码误导用户,不要这样书写代码,如下:
var intVal int
intVal :=1 //这时候会产生编译错误
intVal,intVal1 := 1,2 // 此时不会产生编译错误,因为有声明新的变量
简略语法只能在局部变量使用,全局变量使用会报错,编译错误信息如下:
non-declaration statement outside function body
变量使用
a = 1
fmt.Printf("%d\n", a)
特殊变量
匿名变量
作用:屏蔽掉函数相应返回值,并且不能被使用。 写法:_
_, _, a := test()
常量
常量是一种特殊的变量,限制变量为只读,值定义后不能更改。 从功能角度看,常量是编译器实现的保证变量值不被修改的机制。
普通用法
声明定义
常量的声明定义方式和变量是类似的,变量的声明定义方式常量都能使用,不同点如下:
常量使用const,变量使用var。 常用不支持变量自动推导的简单模式,因为不加const,自动推导无法判断是变量还是常量。
常量的值需要在声明时一同定义,如果未定义会报错,如下:
const a int //编译错误
使用
const a = 1
fmt.Printf("%d\n", a)
特殊用法
go语言未定义额外的关键词来表示枚举,采用const来定义枚举类型。 定义枚举时,常量值可以不定义,如下:
const {
a = 1 + 1
b //编译正常
c //编译正常
}
常量值未定义时,常量的值为上一个已定义常量值的表达式;因此:
上一个例子中b和c都等于 1 + 1。 若a的值未给出,则编译报错,值未定义。
iota 常量计数器
iota:每个作用域独立的常量计数器。 iota 既可以在常量普通用法中使用,也可以在常量表示枚举时使用;但是在普通常量定义中使用和表示枚举时使用规则不一致,一般只使用在表示枚举时。
普通使用,定义常量
const b int = 1
const c int = iota
fmt.Println(b, c)
* 结果:1 0
* 结论:第一个声明的常量所在的行,iota 将会被置为 0,然后在每一个有常量声明时加一。
特殊使用,定义枚举
const (
a = 1
b = iota
)
fmt.Println(a, b)
* 结果:1 1
* 结论:任意行使用到iota,则第一行 iota 将会被置为 0,然后每一行加一。
注意:枚举类型中,iota是每行加一,下面的例子容易出错。
const (
AA, BB = iota + 1, iota + 2
CC, DD
)
* AA,BB 的值为:0 + 1, 0 + 2;CC, DD 的值为: 1 + 1, 1 + 2
常量限制
由于常量的限制作用是编译器实现的,编译器只能处理基础数据类型,因此常量的值仅支持基础类型,例如:字符串,字符,整型,浮点,布尔。