Go学习笔记 1. 数据类型

1. GO语言数据类型

在Go语言中数据类型数据类型用于声明函数和变量。不同数据类型把数据分成所需内存大小,编程时根据数据的不同大小使用不同的数据类型,起到充分利用内存的作用

1.1 Go语言的几种数据类型

  1. 布尔型 值可以为常量 true 和 false
  2. 数字类型 Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码
    • 整型
      • uint8 无符号 8 位整型 (0 到 255)
      • uint16 无符号 16 位整型 (0 到 65535)
      • uint32 无符号 32 位整型 (0 到 4294967295)
      • uint64 无符号 64 位整型 (0 到 18446744073709551615)
      • int8 有符号 8 位整型 (-128 到 127)
      • int16 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
      • int32 有符号 32 位整型 (-2147483648 到 2147483647)
      • int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
    • 浮点型
      • float32 IEEE-754 32位浮点型数
      • float64 IEEE-754 64位浮点型数
      • complex32 32 位实数和虚数
      • complex64 32 位实数和虚数
    • 其他数字类型
      • byte 类似 uint8
      • rune 类似 int32
      • uint 32 或 64 位
      • int 与 uint 一样大小
      • uintptr 无符号整型,用于存放一个指针
  3. 字符串类型 Go的字符串由单个字节连接组成,使用 utf-8 编码 标识 Unicode 文本 string 不包含内存空间,只有一个内存的地址,这样做的好处是string变得非常轻量,可以很方便的进行传递而不用担心内存拷贝。
    // src/runtime/string.go
    type stringStruct struct {
        str unsafe.Pointer //指针指向存储实际字符串的内存地址
        len int
    }
  1. 派生类型

    • 指针类型

      一个指针变量可以指向任何一个值的内存地址,它所指向的值的内存地址在 32 和 64 位机器上分别占用 4 或 8 个字节,占用字节的大小与所指向的值的大小无关。当一个指针被定义后没有分配到任何变量时,它的默认值为 nil。指针变量通常缩写为 ptr,ptr 的类型为 * T,称做 T 的指针类型,*代表指针。变量、指针和地址三者的关系是,每个变量都拥有地址,指针的值就是地址。

      Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址,在指针类型前面加上 * 号(前缀)来获取指针所指向的内容,当一个指针被定义后没有分配到任何变量时,它的值为 nil

        获取变量地址 &变量
        声明指针变量 var 变量 *类型
        指针变量赋值 指针变量 = &变量
        指针变量取值 *指针变量输出变量 指针输出地址
        空指针       输出nil 
      
    • 数组类型

      数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。

        数组声明 var 变量名称 [长度] 类型
        数组初始化 var 变量 = [长度]类型{初始化值*长度} //如果不确定长度可用...代替 [...]
        数组元素赋值 变量[下标] = 值
        数组元素取值 变量[下标]
      
    • 结构体类型

      结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,数组中只能存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。

        结构体定义 type 结构体名 struct {不同类型数据....}
        结构体创建 结构体名{对应的不同数据...}
        结构体访问 结构体.结构体数据
        结构体做数据类型 var 变量 结构体名称
        结构体指针 var 变量 *结构体
        结构体指针赋值 (*结构体).结构体数据 = 值 或 结构体.结构体数据 := 值
      
    • Channel 类型

      Channel是Go语言中比较重要的部分,经常在Go中的并发中使用。Channel可以看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。它的操作符是箭头 <- 。

        创建channel 变量 make(chan 类型,容量)
            >  chan   T        // 可以接收和发送类型为 T 的数据
            >  chan<- float64  // 只可以用来发送 float64 类型的数据
            >  <-chan int      // 只可以用来接收 int 类型的数据
      
    • 函数类型

      函数是基本的代码块,用于执行一个任务。Go 语言最少有个 main() 函数。可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务

        函数声明 func 函数名称 (传参) 返回参数 { 作用域 }
      
    • 切片类型

      Go 语言切片是对数组的抽象。Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大

        切片创建  var 变量 []类型  make([]类型, 长度)
        切片初始化  变量 := [] int {值}
        切片截取  变量 := [开始:结束]
        空切片  空切片默认为nil
        切片操作  len() 获取切片长度  cap() 获取切片最长长度  append() 向切片添加内容 copy() 赋值切片
      
    • 接口类型

      所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口

        接口定义 type 接口名称 interface { 接口内容 }
      
    • Map类型

      Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。

        创建Map var 变量 map[类型]类型 make(map[类型]类型)
      

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。