美文网首页
Go教程第四篇:数据类型

Go教程第四篇:数据类型

作者: 大风过岗 | 来源:发表于2019-12-02 14:25 被阅读0次

    第四篇:数据类型

    这篇文章是我们的《Golang系列教程》的第四篇文章。
    下面是Go语言中的基本数据类型:

    • bool
    • Numberic Types
      • int8, int16,int32,int64,int
      • uint8,uint16,uint64,uint
      • float32,float64
      • complex64,complex128
      • byte
      • rune

    bool

    布尔类型代表了一个布尔值,它要么是true要么是false。

    package main
    
    import "fmt"
    
    func main() {
      a := true
      b := false
      fmt.Println("a:", a, "b:", b)
      c := a && b
      fmt.Println("c:", c)
      d := a || b
      fmt.Println("d:", d)
    }
    
    

    在上面的程序中,a被赋予true值,b被赋予false值。c被赋予a&&b。&&操作符只有当a和b都为true的情况下才返回
    true。因此,在本例子中,c的值是false。

    || 操作符只要a和b中有一个是true,它就返回true。在本例中,d的值是true因为a为true。
    我们将得到如下输出:

    a: true b: false
    c: false
    d: true
    
    

    有符号整数型

    • int8 :代表8为有符号整数
    • 大小 : 8位
    • 范围 : -125到127
    • int8 :代表8为有符号整数

    • 大小 : 8位

    • 范围 : -125到127

    • int16 :代表16为有符号整数

    • 大小 : 16位

    • 范围 : -32768到32767

    • int32 :代表32为有符号整数
    • 大小 : 8位
    • 范围 : -2147483648到2147483647
    • int64 :代表64为有符号整数
    • 大小 : 64位
    • 范围 : -9223372036854775808 到9223372036854775807
    • int :
      int 代表32或64位整数,具体取决于底层的平台。通常你只需要使用int来表示一个整数值即可。
      除非在某些情况下,你要指定位数。
    • 大小 :在32位系统上是32位,在64位系统上是64位。
    • 范围 :
      在32位系统上是-2147483648 to 2147483647
      在64位系统上是-9223372036854775808 to 9223372036854775807
    package main
    
    import "fmt"
    
    func main() {
        var a int = 89
        b := 95
        fmt.Println("value of a is", a, "and b is", b)
    }
    
    

    上面的程序将输出: value of a is 89 and b is 95

    在上面的程序中,a是一个int类型,b的类型是根据它的初始值推断出来的。正如我们上面所说的那样,
    int的大小在32位系统上是32位,在64位系统上是64位。我们来验证一下。

    变量的类型可以在Printf函数里面使用%T格式化分隔符打印出来。使用Go下面的unsafe包,我们可以使用Sizeof功能
    来计算变量的字节数。使用unsafe包可能有性能问题,但是就本文教程来说,我们可以使用它。

    下面的程序会输出变量a和b的数据类型和内存大小:

    package main
    
    import (
        "fmt"
        "unsafe"
    )
    
    func main() {
        var a int = 89
        b := 95
        fmt.Println("value of a is", a, "and b is", b)
        fmt.Printf("type of a is %T, size of a is %d", a, unsafe.Sizeof(a)) //type and size of a
        fmt.Printf("\ntype of b is %T, size of b is %d", b, unsafe.Sizeof(b)) //type and size of b
    }
    
    

    上面的程序将会产生如下输出:

    value of a is 89 and b is 95
    type of a is int, size of a is 4
    type of b is int, size of b is 4
    
    

    我们可以从上面的输出中推断出来,a和b的类型是int并且他们是32位(4字节)。
    如果在64位系统上运行,结果将会有所不同。在一个64位系统上,a和b占据着64位(8字节)。

    无符号型整数

    • uint8: 表示8位无符号整数

    • 大小: 0 to 255

    • uint16: 表示16位无符号整数

    • 大小: 16 bits

    • 范围: 0 to 65535

    • uint32:表示32位无符号整数

    • 大小: 32 位

    • 范围: 0 to 4294967295

    • uint64: 表示64位无符号整数

    • 大小: 64 位

    • 范围: 0 to 18446744073709551615

    • uint : 表示32位或64位无符号整数(取决于底层的平台的位数)

    • 大小 : 32 位或64位

    • 范围 :在32位系统上是 0 到 4294967295
      在64位系统上是 0 到 18446744073709551615

    • 浮点型

    • float32: 32位浮点型数字

    • float64: 64位浮点型数字

    下面这个简单的程序将展示整型和浮点类型:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        a, b := 5.67, 8.97
        fmt.Printf("type of a %T b %T\n", a, b)
        sum := a + b
        diff := a - b
        fmt.Println("sum", sum, "diff", diff)
    
        no1, no2 := 56, 89
        fmt.Println("sum", no1+no2, "diff", no1-no2)
    }
    
    

    a和b的值可以根据赋值给他们的值来推断出来。在本例中,a和b是float64(浮点值的默认类型是float64)。
    我们使a和b相加,并且把结果赋值给变量sum。同时,使a减去b,然后把差值赋值给diff变量。
    最后把sum和diff打印出来。类似的计算,我们使用no1和no2也进行一次。上面的程序将会打印:

    type of a float64 b float64
    sum 14.64 diff -3.3000000000000007
    sum 145 diff -33
    
    

    复杂类型

    • complex64 : 这是有着一个float32位实数和float32位虚数的复杂类型的数字

    • complex128 : 这是有着一个float64位实数和float64位虚数的复杂类型的数字

    使用内置函数 complex可以构造一个有着实数和虚数部分的复杂类型数字。complex函数的定义如下:

    func complex(r, i FloatType) ComplexType
    
    

    这个函数接收俩个float类型的参数,分别是实数部分和虚数部分,然后返回一个complex类型的数字。
    需要注意的是: 实数部分和虚数部分都必须要么全是float32,要么全是float64。如果实数部分和虚数部分
    都是float32,则 该函数返回的是complex64位的数字。如果实数部分和虚数部分都是float64,那么该函数返回的是
    complex128位的数字。

    复杂类型的数字也可以使用如下的快捷语法创建:

    c := 6 + 7i
    

    我们来写一个简单的程序理解一下复杂数值类型:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        c1 := complex(5, 7)
        c2 := 8 + 27i
        cadd := c1 + c2
        fmt.Println("sum:", cadd)
        cmul := c1 * c2
        fmt.Println("product:", cmul)
    }
    

    在上面的程序中,c1和c2是俩个复杂数值类型。c1的实数部分是5,虚数部分是7。c2的实数部分是8,虚数部分是27。
    把c1和c2的和赋值给cadd变量。c1和c2的乘积复制给cmul变量。该程序将输出如下:

    sum: (13+34i)
    product: (-149+191i)
    
    

    其他数值类型

    • byte 是uint8的别名

    • rune 是int32的别名

    我们将在学习字符串的时候,再对byte和rune进行详细说明。

    string 类型

    在Golang里,字符串是一系列字节的集合。好吧,你或许觉得这个定义毫无意义。
    现在,我们先假设 一个字符串是一个系列字符的集合。在单独的章节中的我们会再学习
    string的细节。

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        first := "Naveen"
        last := "Ramanathan"
        name := first +" "+ last
        fmt.Println("My name is",name)
    }
    
    

    在上面的程序中,first被赋值于"Naveen"。last被赋值于"Ramanathan"。string可以使用+号进行连接。
    firt拼接一个空格符然后在拼接last之后被赋值给name。上面的程序将会打印如下:name is Naveen Ramanathan

    类型转换

    Go对于类型的要求是非常严格和明确的,它不会自动地进行类型升级或类型转换。我们将用一个例子说明:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        i := 55      //int
        j := 67.8    //float64
        sum := i + j //int + float64 not allowed
        fmt.Println(sum)
    }
    

    在C语言里面,上面的代码是合法的。但是在go里面,这样是不行的。i是一个int类型,j是一个float64类型。
    试图对俩个不同类型的数字进行加法运算是不允许的。当你运行程序时,你能看到:

    main.go:10: invalid operation: i + j (mismatched types int and float64)

    要想修复这个问题,i和j就得是同一种数据类型。我们可以把j转换成int。类型转换的语法是: T(v),此时 就会把一个值v转换成
    类型T。

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        i := 55      //int
        j := 67.8    //float64
        sum := i + int(j) //j is converted to int
        fmt.Println(sum)
    }
    

    现在,当你运行上面的程序时,你会看到会输出122。

    在赋值时的类型转换也是同样。把某个类型的变量赋值给另一个类型的变量时,必须要进行明确的类型转换。
    接下来的程序将会解释这一点:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        i := 10
        var j float64 = float64(i) //this statement will not work without explicit conversion
        fmt.Println("j", j)
    }
    
    

    在第九行,i先是被转换成float64,然后被赋值给j。如果你试图在没有进行类型转换的情况下,把i赋值给j的话,编译器将会
    抛出一个错误。

    致谢

    感谢您百忙之中阅读本文。如果有任何反馈和问题,请您在评论区留言。

    备注

    本文系翻译之作原文博客地址

    相关文章

      网友评论

          本文标题:Go教程第四篇:数据类型

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