美文网首页
go 数据类型

go 数据类型

作者: 呦丶耍脾气 | 来源:发表于2023-03-03 17:03 被阅读0次

    1.类型介绍

    Go语言中,有基本数据类型(原生数据类型)和复合数据类型(派生数据类型)。

    序号 类型和描述
    布尔型 布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true。
    数字类型 整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。
    字符串类型: 字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
    派生类型: 包括:(a) 指针类型(Pointer)(b) 数组类型(c) 结构化类(struct) (d) Channel 类型 (e) 函数类型 (f) 切片类型 (g) 接口类型(interface) (h) Map 类型

    2.值类型

    2.1 整型

    整型分两大类:

    • 有符号整型:int8、int16、int32(别名:rune)、int64、int。

    • 无符号整型:uint8(别名:byte)、uint16、uint32、uint64、uint。

    整型取值范围:

    类型 描述
    int8 有符号 8位整型 (-128 到 127)
    int16 有符号 16位整型 (-32768 到 32767)
    int32 有符号 32位整型 (-2147483648 到 2147483647)
    int64 有符号 64位整型 (-9223372036854775808 到 9223372036854775807)
    uint8 无符号 8位整型 (0 到 255)
    uint16 无符号 16位整型 (0 到 65535)
    uint32 无符号 32位整型 (0 到 4294967295)
    uint64 无符号 64位整型 (0 到 18446744073709551615)

    特殊整型

    类型 描述
    int 32位操作系统上就是int32,64位操作系统上就是int64
    uint 32位操作系统上就是uint32,64位操作系统上就是uint64
    uintptr 无符号整型,用于存放一个指针

    1.在使用 int 和 uint 类型时,不能假定它是 32 位或 64 位的整型,而是考虑 int 和 uint 可能在不同平台上的差异
    2.获取对象的长度的内建 len() 函数返回的长度可以根据不同平台的字节长度进行变化
    3.实际使用中,切片或 map 的元素数量等都可以用 int 来表示
    4.在涉及到二进制传输,读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用 int 和 uint

    可以借助 fmt 函数来将一个整数以不同进制形式展示

    package main
    
    import "fmt"
    
    func main() {
        // 定义十进制数
        var a int = 10
        fmt.Printf("%d \n", a) // 占位符 %d 表示使用十进制显示为 10
        fmt.Printf("%b \n", a) // 占位符 %b 表示使用二进制显示为 1010
        // 定义八进制数,需要以 0 开头
        var b int = 077
        fmt.Printf("%o \n", b) // 占位符 %o 表示使用八进制显示为 77
        // 定义十六进制数,需要以 0x 开头
        var c int = 0xff
        fmt.Printf("%x \n", c) // 占位符 %x 表示使用十六进制显示为 ff,小写字母显示
        fmt.Printf("%X \n", c) // 占位符 %X 表示使用十六进制显示为 FF,大写字母显示
    
    }
    

    2.2 浮点数

    浮点型表示存储的数据是实数,浮点类型分: float32float64 两种,默认是float64

    类型 字节 说明
    float32 4 32位的浮点型
    float64 8 64位的浮点型

    float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32
    float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64

    打印浮点数时,可以使用 fmt 包配合 %f
    声明使用:

    var x float32 // 声明32位浮点型
    fmt.Printf("%f\n", math.Pi) #3.141593
    fmt.Printf("%.2f\n", math.Pi) #3.14
    
    • 常量math.MaxFloat32表示float32能获取的最大值,大约是3.4×1038;
    • 常量math.SmallestNonzeroFloat32表示float32能获取的最小值,大约为1.4×10-45。
    • 常量math.MaxFloat64表示float64能获取的最大值,大约是1.8×10308;
    • 常量math.SmallestNonzeroFloat64表示float64能获取的最小值,大约为4.9×10-324。

    2.3 布尔类型

    1.布尔值的类型为bool,值是true或false,默认为false
    2.Go 语言中不允许将整型强制转换为布尔型.
    3.布尔型无法参与数值运算,也无法与其他类型进行转换

    2.4 字符串

    字符串都是采用UTF-8字符集编码。字符串是用一对双引号("")或反引号(``)括起来定义,字符串不可变,可以用 + 操作符 连接两个字符串

    声明使用:

    // 单行字符串
    s := "hello word"
    
    // 多行字符串
    
    s := `这是一个段落,
    此处的换行会原样输出。
    `
    

    字符类型有两种

    • uint8-类型字符
      go 语言中一般的英文数字字符使用 ASCII 码的一个字符,占据 8 位 bit 的内存空间,也就是常用的 byte 型
    • rune-类型字符
      go 语言中处理中文日文或者其他复合字符时,需要用到 rune 类型,rune 类型实际是一个 int32,代表一个 UTF-8 字符(Unicode编码)

    2.5 字符

    字符串中的每一个元素叫作“字符”,定义字符时使用单引号。Go语言的字符有两种,如下表:

    类型 字节 说明
    byte 1 表示UTF8字符串中的单个字节的值,别名:unit8
    rune 4 表示单个unicode字符,别名:int32

    声明使用:

    var a byte = 'a' // 注意是单引号
    var b rune = '六'
    

    2.6 数组(array)

    语法: var 数组变量名 [数组长度]T
    
    说明:
        ● 数组变量名:数组声明及使用时的变量名。
        ● 元素数量:数组的元素数量。
        可以是一个表达式,但最终通过编译期计算的结果必须是整型数值。
        也就是说,元素数量不能含有到运行时才能确认大小的数值。
        ● T可以是任意基本类型,包括T为数组本身。但类型为数组本身时,可以实现多维数组
    

    声明使用:

    var arr [3]int  //默认初始化0
    var q [3]int = [3]int{1,2,3}
    q := [...]int{1,2,3}
    q := [...]int{90:-1}//key和value的赋值方式,下表90的值为-1,数组长度为91
    

    如果在 数组的长度 位置出现的是“...”省略号,则表示数组的长度是根据初始化值的 个数来计算

    2.7 结构体(struct)

    结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。

     /* 声明结构体 */
    type 结构体名称 struct {
        属性1    类型
        属性2    类型
        ...
    }
    
    /* 使用示例 */
    type User struct {
        name    string
        age     int
    }
    
    user := new(User)
    user.name = "tom"
    user.age = 20
    
    

    结构体的初始化可以使用new关键词和var关键词,不同的是如果使用new,则返回类型是一个指针,使用var,则是结构体自身。

    3. 引用类型

    3.1 切片(slice)

    创建slice主要两种:1.基于数组创建。2.直接创建

    1.基于数组创建

      arrVar := [4]int{1, 2, 3,4} 
    
      sliceVar := arrVar[1:3]
    

    数组arrVar和sliceVar里面的地址其实是一样的,也就是说如果你改变sliceVar里面的变量,那么arrVar里面的变量也会随之改变。

    2.直接创建

    创建一个初始元素个数为5的数组切片,元素初始值为0:
    mySlice1 := make([]int, 5)
    创建一个初始元素个数为5的数组切片,元素初始值为0,并预留10个元素的存储空间:
    mySlice2 := make([]int, 5, 10)
    

    可以使用内置的make()函数来创建。事实上还是会创建一个匿名的数组,只是不需要我们来定义。

    3.2 映射(map)

    可以使用内建函数 make 也可以使用 map 关键字来定义 Map:

    /* 声明变量,默认 map 是 nil */
    var myMap map[keyType]valueType
    
    //示例1
    ages := map[string] int {
       "tom": 21,
       "anny": 18,
    }
    
    /* 使用 make 函数 */
    myMap := make(map[keyType]valueType)
    
    //示例1相当于
    ages := make(map[string]int)
    ages["tom"] = 21
    ages["anny"] = 18
    
    

    myMap是声明的变量名,keyType是对应的Key的类型,valueType是value的类型。

    3.常量

    程序编译阶段就确定下来的值,而程序在运行时则无法改变该值。在Go语言程序中,常量可定义为数值、布尔值或字符串等类型。常量定义后未被使用,不会在编译时报错。

    常量中的数据类型只可以是布尔型、数字型(整型、浮点型和复数型)和字符串。

    语法:

    const 常量名 [常量类型] = 常量值 // 常量类型可以省略
    
    const PI float32 = 3.1415
    const AGE = 100
    const Prex = "Go_"
    

    1.iota 枚举

    Go语言里面有一个关键字iota,这个关键字用来声明enum的时候采用,它默认开始值是0,每调用一次加1。,每个const分组的第一个常量被默认设置为它的0值,第二及后续的常量被默认设置为它前面那个常量的值,如果前面那个常量的值是iota,则它也被设置为iota。

    const(
        x = iota  // x == 0
        y = iota  // y == 1
        z = iota  // z == 2
        w  // 常量声明省略值时,默认和之前一个值的字面相同。这里隐式地说 w = iota,因此w == 3。其实上面y和z可同样不用"= iota"
    )
    const v = iota // 每遇到一个const关键字,iota就会重置,此时v == 0
    

    每遇到一个const关键字,iota就会重置

    4. 复数型

    默认类型是complex128(64位实数+64位虚数)。如果需要小一些的,也有complex64(32位实数+32位虚数)。复数的形式为RE+IMi,其中RE是实数部分,IM是虚数部分,而最后的i是虚数单位。

    声明使用:

    var c complex64 = 5 + 5i
    fmt.Println(c)
    

    相关文章

      网友评论

          本文标题:go 数据类型

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