变量初始化
# 变量初始化
# 变量初始化的标准格式
var 变量名 类型 = 表达式
1
eg: 游戏中,玩家的血量初始值为100。可以这样写:
var hp int = 100 // hp 为变量名,类型为 int,hp 的初始值为 100。
1
100 和 int 同为 int 类型,int 可以认为是冗余信息
,因此可以进一步简化初始化的写法。
# 编译器推导类型的格式
将 int 省略后,编译器会尝试根据等号右边的表达式推导 hp 变量的类型。
var hp = 100
1
等号右边的部分在编译原理里被称做右值(rvalue
)
例子
var attack = 40
var defence = 20
var damageRate float32 = 0.17
var damage = float32(attack-defence) * damageRate
fmt.Println(damage)
1
2
3
4
5
2
3
4
5
# 短变量声明并初始化
var
的变量声明还有一种更为精简的写法,例如:
hp := 100
1
这是Go语言的推导声明写法,编译器会自动根据右值类型推断出左值的对应类型。
注意:由于使用了
:=
,而不是赋值的=
,因此推导声明写法的左值变量必须是没有定义过的变量。若定义过,将会发生编译错误。
如果 hp
已经被声明过,但依然使用:=
时编译器会报错,代码如下:
// 声明 hp 变量
var hp int
// 再次声明并赋值
hp := 10 // 报错: no new variables on left side of := (在“:=”的左边没有新变量出现,意思就是“:=”的左边变量已经被声明了。)
1
2
3
4
2
3
4
短变量声明的形式在开发中的例子较多,比如:
conn, err := net.Dial("tcp","127.0.0.1:8080")
// net.Dial 提供按指定协议和地址发起网络连接,这个函数有两个返回值,一个是连接对象(conn),一个是错误对象(err)。如果是标准格式将会变成:
var conn net.Conn
var err error
conn, err = net.Dial("tcp", "127.0.0.1:8080")
1
2
3
4
5
2
3
4
5
注意:在多个短变量声明和赋值中,至少有一个新声明的变量出现在左值中,即便其他变量名可能是重复声明的,编译器也不会报错,代码如下:
// 下面的代码片段,编译器不会报 err 重复定义。
conn, err := net.Dial("tcp", "127.0.0.1:8080")
conn2, err := net.Dial("tcp", "127.0.0.1:8080")
1
2
3
2
3