Go语言在声明变量时,自动对变量对应的内存区域进行初始化操作。
每个变量会初始化其类型的默认值:
- 整型和浮点型变量的默认值为 0 和 0.0。
- 字符串变量的默认值为空字符串。
- 布尔型变量默认为 bool。
- 切片、函数、指针变量的默认为nil。
初始化格式:
标准格式
- var 变量名 类型 = 表达式;
编译器推导类型的格式
- var 变量名 = 表达式; 将类型省略后,编译器会尝试根据等号右边的表达式推导变量的类型
短变量声明并初始化
- 变量名 := 表达式; 编译器会自动根据右值类型推断出左值的对应类型,由于使用了:=,而不是赋值的=,因此推导声明写法的左值变量必须是没有定义过的变量。若定义过,将会发生编译错误。
var attack = 40
var defence = 20
var damageRate float32 = 0.17
var damage = float32(attack-defence) * damageRate
fmt.Println(damage)
第 1 和 2 行,右值为整型,attack 和 defence 变量的类型为 int。
第 3 行,表达式的右值中使用了 0.17。由于Go语言和C语言一样,编译器会尽量提高精确度,以避免计算中的精度损失。所以这里如果不指定 damageRate 变量的类型,Go语言编译器会将 damageRate 类型推导为 float64,我们这里不需要 float64 的精度,所以需要强制指定类型为 float32。
第 4 行,将 attack 和 defence 相减后的数值结果依然为整型,使用 float32() 将结果转换为 float32 类型,再与 float32 类型的 damageRate 相乘后,damage 类型也是 float32 类型。
多变量声明:
//类型相同多个变量, 非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3
var vname1, vname2, vname3 = v1, v2, v3 // 和 python 很像,不需要显示声明类型,自动推断
vname1, vname2, vname3 := v1, v2, v3 // 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误
// 这种因式分解关键字的写法一般用于声明全局变量
var (
vname1 v_type1
vname2 v_type2
)
多重赋值时,变量的左值和右值按从左到右的顺序赋值。
type IntSlice []int
func (p IntSlice) Len() int { return len(p) }
func (p IntSlice) Less(i, j int) bool { return p[i] < p[j] }
func (p IntSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
第 1 行,将 IntSlice 声明为 []int 类型。
第 3 行,为 IntSlice 类型编写一个 Len 方法,提供切片的长度。
第 4 行,根据提供的 i、j 元素索引,获取元素后进行比较,返回比较结果。
第 5 行,根据提供的 i、j 元素索引,交换两个元素的值。