美文网首页
Go语言之变量的初始化二

Go语言之变量的初始化二

作者: DreamKing | 来源:发表于2019-02-27 11:11 被阅读0次

    Go 语言在声明变量时,自动对变量对应的内存区域进行初始化操作。每个变量会初始化其类型的默认值(也就是说每个变量都对应着一个初始化默认值),例如:

    • 整型和浮点型变量的默认值为 0。
    • 字符串变量的默认值为空字符串。
    • 布尔型变量默认为 bool。
    • 切片、函数、指针变量的默认为 nil。

    当然,依然可以在变量声明时赋予变量一个初始值。

    变量初始化的标准格式

    var 变量名 类型 = 表达式
    

    例如,游戏中,玩家的血量初始值为100。可以这样写:

    var hp int = 100
    

    等号右边的部分在编译原理里被称做右值(rvalue)。
    下面是编译器根据右值推导变量类型完成初始化的例子。

    var attack = 40
    var defence = 20
    var damageRate float32 = 0.17
    var damage = float32(attack-defence) * damageRate
    fmt.Println(damage)
    

    代码说明如下:

    • 第 1 和 2 行,右值为整型,attack 和 defence 变量的类型为 int。
    • 第 3 行,表达式的右值中使用了 0.17。Go 语言和C语言一样,编译器会尽量提高精确度,以避免计算中的精度损失。
      默认情况下,如果不指定 damageRate 变量的类型,Go 语言编译器会将 damageRate 类型推导为 float64。由于这个例子中不需要 float64 的精度,所以强制指定类型为 float32。
    • 第 4 行,将 attack 和 defence 相减后的数值结果依然为整型,使用 float32() 将结果转换为 float32 类型,再与 float32 类型的 damageRate 相乘后,damage 类型也是 float32 类型。
      提示:damage 变量的右值是一个复杂的表达式,整个过程既有 attack 和 defence 的运算还有强制类型转换。强制类型转换会在后面的章节中介绍。
    • 第 5 行,输出 damage 的值。
      以上代码输出结果为:
    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 提供按指定协议和地址发起网络连接,这个函数有两个返回值,一个是连接对象,一个是 err 对象。如果是标准格式将会变成:

    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")
    

    上面的代码片段,编译器不会报err重复定义。

    本文学习来源于C语言中文网>Go语言教程

    相关文章

      网友评论

          本文标题:Go语言之变量的初始化二

          本文链接:https://www.haomeiwen.com/subject/qgexuqtx.html