context&interface

tags: go
@烩面 27/03/2026

关于GO

context

context实际上是一个接口,提供了四种方法 Done(),Deadline(),Err(),Value(),可以在一个请求链路中,优雅地传递取消信号,超时,和截止日期,并且携带一些范围内的键值对数据

context主要解决三个问题:超时取消,请求信号传播,请求级数据传递

  • 当超时发生时,所有子操作都会收到通知,立刻退出
  • 可以传递请求级的原数据,比如用户id等

查找

context的查找是链式的,当前层级没有需要的key,就调用parent.Value()继续往上查找,这个过程会一直递归直到找到对应的key或者返回nil

取消

context的取消主要是通过channel关闭实现的,有三种方法

  • 超时取消:调用定时器,超时自动cancel
  • 主动取消:创建的时候返回一个cancel函数,调用就会关闭done channel,所有的调用这个context的groutine都可以通过done方法获得通知
  • 级联取消:父context被取消的时候,下面的所有子context也会被取消

interface

interface包括动态类型和动态值 eface是不带方法的interface得实现,包含数据指针和类型指针

type eface struct {
    _type *_type
    data  unsafe.Pointer
}

iface是带接口的interface实现

type iface struct {
    tab  *itab
    data unsafe.Pointer
}

包含itab和data,itab存储了接口类型,具体类型,方法表,方法表是个函数指针数组,保存了该实现方法所有接口方法的地址

类型转换和类型断言的区别

类型转换:T(Value)是在编译期确定的强制转换,转换前后的✌️类型要互相兼容 类型断言:Value.(T)是运行期的动态检查,从接口中提取具体类型

  • 类型转换在编译期保证成功,而类型断言在编译期有可能失败
  • 类型转换底层是简单的数据结构转换,而类型断言涉及到底层接口类型
  • 使用场景不同,类型转换用户字符串,数字之间互相转换,类型断言用于接口编程

应用

  • 依赖注入:通过定义接口抽象,让高层代码不依赖具体实现
  • 类型断言和反射配合使用:orm