Go学习笔记 1. 数据类型
1. GO语言数据类型
在Go语言中数据类型数据类型用于声明函数和变量。不同数据类型把数据分成所需内存大小,编程时根据数据的不同大小使用不同的数据类型,起到充分利用内存的作用
1.1 Go语言的几种数据类型
- 布尔型 值可以为常量 true 和 false
- 数字类型 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 无符号整型,用于存放一个指针
- 整型
- 字符串类型 Go的字符串由单个字节连接组成,使用 utf-8 编码 标识 Unicode 文本 string 不包含内存空间,只有一个内存的地址,这样做的好处是string变得非常轻量,可以很方便的进行传递而不用担心内存拷贝。
// src/runtime/string.go
type stringStruct struct {
str unsafe.Pointer //指针指向存储实际字符串的内存地址
len int
}
派生类型
指针类型
一个指针变量可以指向任何一个值的内存地址,它所指向的值的内存地址在 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 国际许可协议 进行许可。