context
前言:context 用来控制各个goroutine的生命周期
1 context接口说明
context接口只有四个方法,如下:
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key interface{}) interface{}
}
1 Deadline(): 返回context的生命截止时间,表明到deadline这个时间点context就会被cancel了, ok代表的是这个ctx是否被设置了截止时间
2 Done(): 是一个只读的通道,当ctx被取消的时候,调用Done()方法是可读的(实际是当ctx被cancel时会生成一个关闭的chan,关闭的chan是可以读取的,读到nil),通常通过select 监听Done(), 判断ctx是否已经被取消了
如:
select {
case <- ctx.Done():
default:
}
3 Err() 如果ctx被取消了,Err()会返回取消原因
4 Value() 通过key 获取ctx保存的value值
2 context生成方法
1 生成parent ctx
func Background() Context {
return background
}
func TODO() Context {
return todo
}
2 衍生子ctx
func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
func WithValue(parent Context, key, val interface{}) Context
1 WithCancel: 衍生一个可以被cancel的ctx, 调用cancel()时,就会取消整个ctx链,Done()就会可读
2 WithDeadline: 衍生一个在deadline这个时间点自动被取消的ctx
3 WithTimeout: 衍生一个经过timeout时间后,被取消的ctx
4 WithValue: 往ctx中传值
unsafe
1 unsafe包简介
unsafe包顾名思义,是非安全的,是面向编译器的一个包,使用它要特别小心,unsafe包可以绕过Go的内存机制,对内存进行读写;
2 unsafe包的主要函数
1 SizeOf 函数-》 返回一个类型占用的内存大小,是类型占用的字节数,不是该类型存储的内容大小,go里面的int和int64都是用8个字节存储;
b := true
i8 := int8(111)
i16 := int16(11)
i32 := int32(111111111)
i64 := int64(1)
i := 1
s := "s"
fmt.Println(unsafe.Sizeof(b))
fmt.Println(unsafe.Sizeof(i8))
fmt.Println(unsafe.Sizeof(i16))
fmt.Println(unsafe.Sizeof(i32))
fmt.Println(unsafe.Sizeof(i64))
fmt.Println(unsafe.Sizeof(i))
fmt.Println(unsafe.Sizeof(s))
1
1
2
4
8
8
16
2 Alignof() -> 返回类型的对齐值
3 Offsetof() -> 只适用于struct结构体中的字段相对于结构体的内存位置偏移量。结构体的第一个字段的偏移量都是0.
4 unsafe包用法
4.1 指针类型转换
4.2 修改结构体未导出字段
5 unsafe.Pointer的4个规则
任何指针都可以转换为unsafe.Pointer
unsafe.Pointer可以转换为任何指针
uintptr可以转换为unsafe.Pointer
unsafe.Pointer可以转换为uintptr
详情:
[https://www.flysnow.org/2017/07/06/go-in-action-unsafe-pointer.html]
https://www.jianshu.com/p/c394436ec9e5
网友评论