go语言基础学习十一

go的interface怎么实现的?#

空接口#



type eface struct {
    _type *_type    // 类型元数据
    data  unsafe.Pointer // 数据指针
}

  1. _type:存放类型信息(大小、对齐、类型名称、反射信息)
  2. data:存放实际数据的指针,指向具体类型的内存地址

非空接口#



type iface struct {
    tab  *itab      // 接口+实体类型映射表(核心)
    data unsafe.Pointer // 数据指针,同eface
}

  1. itab:接口+实体类型映射表,包含方法指针数组、类型信息等


type itab struct {
    inter *interfacetype // 接口类型(方法列表)
    _type *_type         // 具体实现类型
    hash  uint32         // _type哈希,用于类型断言快速匹配
    _     [4]byte
    fun   [1]uintptr     // 实现接口的方法地址数组(变长)
}

  1. inter:接口自身定义的所有方法签名
  2. _type:具体实现类型的类型信息
  3. hash:_type哈希,用于类型断言快速匹配
  4. fun:实现接口的方法地址数组,变长,根据接口定义的方法数量动态分配

进程被kill,如何保证所有goroutine顺利退出#



//goroutine监听SIGKILL信号,一旦接收到SIGKILL,则立刻退出。可采用select方法。
var wg = &sync.WaitGroup{}

func main() {
        wg.Add(1)

        go func() {
                c1 := make(chan os.Signal, 1)
                signal.Notify(c1, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
                fmt.Printf("goroutine 1 receive a signal : %v\n\n", <-c1)
                wg.Done()
        }()

        wg.Wait()
        fmt.Printf("all groutine done!\n")
}

Go语言支持哪些数据类型#

基础类型#

  1. 布尔类型 bool
  2. 整数类型 int、uint、int8、uint8、int16、uint16、int32、uint32、int64、uint64
  3. 浮点数类型 float32、float64
  4. 字符串类型 string
  5. 复数类型 complex64、complex128

复合类型#

  1. 数组类型 [n]T
  2. 结构体类型 struct

引用类型#

  1. 切片类型 []T
  2. 映射类型 map[K]V
  3. 通道类型 chan T
  4. 指针类型 *T

函数类型#