美文网首页
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