Go 语言的数据类型
Golang 的 rune 类型
// int32的别名,几乎在所有方面等同于int32 // 它用来区分字符值和整数值(就是用在字符串)
byte 等同于int8,常用来处理ascii字符
rune 等同于int32,常用来处理unicode或utf-8字符
Golang 的 string 类型
//获取字符个数 len([]rune(str)) utf8.RuneCountInString(str)
Golang 的 channel 类型
使用 make 创建有无缓冲区的管道 ch1 := make(channel string,5)
使用场景:消息传递、同步异步、并发控制、结果汇总
type hchan struct {
qcount uint // 环形队列长度,即已有元素个数 ¥
dataqsiz uint // 环形队列容量,即可容纳元素个数 ¥
buf unsafe.Pointer // 环形队列地址(底层使用数组实现)¥
elemsize uint16 // 元素大小
closed uint32 // 标识关闭状态(关闭时会唤醒队列里的 channel)
elemtype *_type // 元素类型
sendx uint // 下一次写下标位置
recvx uint // 下一次读下标位置
recvq waitq // 读等待队列(阻塞时加到这个队列)¥
sendq waitq // 写等待队列(阻塞时加到这个队列)¥
lock mutex // 互斥锁 ¥
}
阻塞场景
panic 场景
问题:channel 底层是怎么实现的?
Golang 的 slice 类型
type slice struct {
array unsafe.Pointer // 指向底层数组
len int // 切片长度
cap int // 底层数组容量
}
Go语言中的 slice 陷阱:如何避免常见的错误
Golang 的 Map 类型
Golang 数据类型的特点
数组:
切片:
切片持有对底层数组的引用,如果你将一个切片赋值给另一个,二者都将引用同一个数组(如果函数接受一个切片参数,对切片的元素所做的改动,对于调用者是可见的,好比是传递了一个底层数组的指针)
字典:
和切片类似,map持有对底层数据结构的引用。如果将map传递给函数,其对map的内容做了改变,则这 些改变对于调用者是可见的。
Golang 使用 defer 技巧
用于延迟函数的调用,常用于释放锁或其他资源
Golang panic 介绍
对于一些危险的操作,比如数组越界,会抛出 panic,提前结束程序执行,panic 的退出方式相对于 os.Exit() 比较优雅,支持使用 defer 和 recover 解决 panic
Golang recover 介绍
Go 变量作用域
花括号来控制变量的作用域,花括号中的变量是单独的作用域,同名变量会覆盖外层
Golang 控制结构
select 的特点
golang 提供的多路 I/O 复用机制 和 linux 的 select 机制类似