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")
```
- 1.Go语言前景
- 2.Go语言环境搭建
- 3.Go语言的基本语法
- 3.1变量
- 3.1.1变量声明
- 3.1.2变量初始化
- 3.1.3多个变量同时赋值
- 3.1.4匿名变量
- 3.1.5变量的作用域
- 3.1.6整型
- 3.1.7浮点类型
- 3.1.8复数
- 3.1.9bool类型
- 3.1.10字符串
- 3.1.11字符类型
- 3.1.12类型转换
- 3.2常量
- 3.1.1const关键字
- 3.2.2模拟枚举
- 4.Go语言的流程控制
- 4.2循环结构
- 4.3键值循环
- 4.4switch语句
- 4.5goto语句
- 4.6break语句
- 4.7continue语句
- 5.Go语言的函数
- 5.1函数声明
- 5.2函数变量
- 5.3函数类型实现接口
- 5.4闭包
- 5.5可变参数
- 5.6defer(延迟执行语句)
- 5.7处理运行时错误
- 5.8宕机(panic)
- 5.9宕机恢复(recover)
- 5.10Test功能测试函数
- 6.Go语言的内置容器
- 6.1数组
- 6.2切片
- 6.3map
- 6.4sync.Map
- 6.5list
- 6.6range
- 7.Go语言的结构体
- 8.Go语言的接口
- 9.Go语言的常用内置包
- 10.Go语言的并发
- 11.Go语言的文件I/O操作
- 12.Go语言的网络编程
- 13.Go语言的反射
- 14.Go语言的数据库编程
- 15.Go语言密码学算法
- 16.Go语言的gin框架
- 17.Go语言的网络爬虫
- 18.Go语言的编译和工具链