美文网首页
go常用包——context/unsafe

go常用包——context/unsafe

作者: chase_lwf | 来源:发表于2020-08-09 21:05 被阅读0次

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

相关文章

网友评论

      本文标题:go常用包——context/unsafe

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