🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Go语言在声明变量时,自动会对变量对应的内存区域进行初始化操作。每个变量会初始化其类型的默认值,例如: * 整型和浮点型变量的默认值为`0`和`0.0`; * 字符串变量的默认值为`空字符串`; * 布尔型变量的默认值为`false`; * 切片、函数、指针变量的默认值为`nil`。 当然,依然可以在变量声明时赋予变量一个初始值。 ## 1. 变量初始化的标准格式 var 变量名 类型 = 表达式 ``` var hp int = 100 ``` `hp`为`变量名`,类型为`int`,`hp`的初始值为`100` 上面的代码,`100`和`int`同为`int`类型,`int`可以认为是冗余的,因此可以进一步简化初始化的写法。 ## 2. 编译器推导类型的格式 在标准格式的基础上,将`int`省略后,编译器会尝试根据等号右边的表达式推导`hp`变量的类型。 ``` var hp = 100 ``` 等号右边的部分在编译原理里被称做右值(rvalue)。 以下是编译器根据右值推导变量类型完成初始化的例子。 ``` var attack = 40 var defence = 20 var damageRate = 0.17 var damage = float32(attack - defence) * damageRate fmt.Println(damage) // 3.4 ``` ## 3. 短变量声明并初始化 var的变量声明还有一种更为精简的写法: ``` hp := 100 ``` 这是Go语言的推导声明写法,编译器会自动根据右值类型推断出左值的对应类型。 **注意:由于使用了`:=`,而不是赋值的`=`,因此推导声明写法的左值变量必须是没有定义过的变量。若定义过,将会发生编译错误。** 若`hp`已经被声明,但依然使用`:=`时,编译器会报错: ``` // 声明hp变量 var hp int // 再次声明并赋值 hp := 100 ``` 编译报错如下: ``` no new variables on left side of := ``` 意思是:在`:=`的左边没有新变量出现,意思就是`:=`的左边变量已经被声明了。 短变量声明的形式在开发中的例子较多: ``` conn, err := net.Dial("tcp", "128.0.0.1:8080") ``` 若是标准格式将会变成 ``` var conn net.Conn var err error conn, err = net.Dial("tcp", "127.0.0.1:8080") ``` **注意:在多个短变量声明和赋值中,至少有一个新声明的变量出现在左值中,即便其他变量名可能是重复的,编译器也不会报错。如下:** ``` conn, err := net.Dial("tcp", "127.0.0.1:8080") conn2, err := net.Dial("tcp", "127.0.0.1:8080") ```