- 整数和浮点变量的默认值为0和0.0。
- 字符串变量的默认值为空字符串。
- 布尔变量的默认值是 bool。
- 切片、函数和指针变量的默认值是 nil。
当然,你也可以在声明变量时指定一个初始值。
复习C语言
在C语言中,当声明一个变量时,该变量对应的内存区域并没有被清理。此时,变量的值可能完全不可预测。在用C语言声明时,开发人员需要熟悉初始化操作,稍有不慎就会导致意想不到的结果。
“探探探”、“探探探”这些只有网上程序员才能理解的词的由来,源于C/C++中变量默认不初始化的事实。
微软的VC编译器用十六进制0xCC填充未初始化的堆栈空间,用0xCD填充未初始化的堆空间。 0xCCCC和0xCDCD分别对应日语GB2312编码字符“hot”和“tune”。
变量初始化的标准形式
var 変数名 型 = 初期値
例如,在游戏中,玩家的初始生命值为100。你可以写:
var hp int = 100 这段代码中,hp是一个变量名,类型为int,hp的初始值为100。
上面代码中,100和int都是int类型,int可以认为是冗余信息,所以初始化可以进一步简化。
编译格式
基于标准形式,省略 int 后,编译器尝试根据等号右侧的表达式推断 hp 变量的类型。
変数hpを100に設定する。 等号右边的部分在编译理论中称为右值。
下面是编译器根据右值推断出的变量类型完成初始化的示例。
var attack = 40
var defence = 20
var damageRate float32 = 0.17
var damage = float32(attack-defence) * damageRate
fmt.Println(damage) 代码说明如下:
- 第 1 行和第 2 行中,右值是整数,攻击变量和防御变量都是 int 类型。
- 在第三行中,0.17 用作表达式的右值。由于Go语言与C语言类似,编译器会尽力提高计算的精度,以避免精度损失。因此,如果这里不指定damageRate变量的类型,Go语言编译器会将damageRate类型推断为float64。我们这里不需要float64精度,所以我们需要强制将类型指定为float32。 。
- 第四行,攻击力和防御力相减的结果仍然是一个整数,所以如果使用float32()将其转换为float32类型并乘以float32类型damageRate,则伤害类型也将是一个float32 类型。
提示:损坏变量的右值是一个复杂的表达式,整个过程涉及攻击和防御操作以及所需的类型转换。所需的类型转换将在后面的章节中介绍。
- 第5行输出伤害值。
上述代码的输出是:
3.4

还有一种更简洁的方法来声明 var 变量。例如:
hp := 100
这是Go语言编写的推导语句,编译器根据右值的类型自动推断出对应左值的类型。
注意:推导语句中写入的左值变量必须是未定义变量,因为
:==用于赋值。定义它会导致编译错误。
如果使用:= ,即使声明了 hp,编译器也会报告错误。这是代码:
// 変数hpを宣言する
var hp int
// 再度宣言して値を割り当てる
hp := 10 编译错误是:
no new variables on left side of :=
这意味着“:=”左边没有出现新的变量,并且意味着“:=”左边的变量已经被声明了。
开发中的简短变量声明形式的示例是:
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")
// 変数 conn と err を宣言する
// 127.0.0.1:8080 に TCP 接続を行う conn を宣言する
// 接続エラーが発生した場合に err にエラー内容を格納する 因此,在开发中更常使用较短形式的变量声明和初始化。
注意:对于多个短变量声明和赋值,左值中至少出现一个新声明的变量。如果重复声明其他变量名,编译器不会报告错误。这是代码:
conn、err := net.Dial("tcp", "127.0.0.1:8080")
conn2、err := net.Dial("tcp", "127.0.0.1:8080") 上面的代码片段中,即使重复定义,编译器也不会报错。




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

