zhcn 编程语言 Golang 非公開: 初始化Go语言变量

初始化Go语言变量

正如上一节“ Go语言中的变量声明”中提到的,当Go语言声明一个变量时,它会自动初始化该变量对应的内存区域。每个变量都使用其类型的默认值进行初始化。例如:

  • 整数和浮点变量的默认值为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") 

上面的代码片段中,即使重复定义,编译器也不会报错。

《初始化Go语言变量》浅显易懂的讲解!您必须观看的最佳 2 个视频

Go言語とは?|プログラミング言語のGo言語について3分でわかりやすく解説します【プログラミング初心者向け】
https://www.youtube.com/watch?v=3zfzBuDl6M4&pp=ygUhIEdv6KiA6Kqe5aSJ5pWw44Gu5Yid5pyf5YyWJmhsPUpB
【Go言語 超入門コース】07.データ型 |変数に入れるデータの種類のことです【プログラミング初心者向け入門講座】
https://www.youtube.com/watch?v=9xhYPu0PruY&pp=ygUhIEdv6KiA6Kqe5aSJ5pWw44Gu5Yid5pyf5YyWJmhsPUpB
正如上一节“ Go语言中的变量声明”中提到的,当Go语言声明一个变量时,它会自动初始化该变量对应的内存区域。每个变量都使用其类型的默认值进行初始化。例如:

  • 整数和浮点变量的默认值为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") 

上面的代码片段中,即使重复定义,编译器也不会报错。

《初始化Go语言变量》浅显易懂的讲解!您必须观看的最佳 2 个视频

Go言語とは?|プログラミング言語のGo言語について3分でわかりやすく解説します【プログラミング初心者向け】
https://www.youtube.com/watch?v=3zfzBuDl6M4&pp=ygUhIEdv6KiA6Kqe5aSJ5pWw44Gu5Yid5pyf5YyWJmhsPUpB
【Go言語 超入門コース】07.データ型 |変数に入れるデータの種類のことです【プログラミング初心者向け入門講座】
https://www.youtube.com/watch?v=9xhYPu0PruY&pp=ygUhIEdv6KiA6Kqe5aSJ5pWw44Gu5Yid5pyf5YyWJmhsPUpB