go语言基础学习十一
go的interface怎么实现的?#
空接口#
type eface struct {
_type *_type // 类型元数据
data unsafe.Pointer // 数据指针
}
- _type:存放类型信息(大小、对齐、类型名称、反射信息)
- data:存放实际数据的指针,指向具体类型的内存地址
非空接口#
type iface struct {
tab *itab // 接口+实体类型映射表(核心)
data unsafe.Pointer // 数据指针,同eface
}
- itab:接口+实体类型映射表,包含方法指针数组、类型信息等
type itab struct {
inter *interfacetype // 接口类型(方法列表)
_type *_type // 具体实现类型
hash uint32 // _type哈希,用于类型断言快速匹配
_ [4]byte
fun [1]uintptr // 实现接口的方法地址数组(变长)
}
- inter:接口自身定义的所有方法签名
- _type:具体实现类型的类型信息
- hash:_type哈希,用于类型断言快速匹配
- 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语言支持哪些数据类型#
基础类型#
- 布尔类型 bool
- 整数类型 int、uint、int8、uint8、int16、uint16、int32、uint32、int64、uint64
- 浮点数类型 float32、float64
- 字符串类型 string
- 复数类型 complex64、complex128
复合类型#
- 数组类型 [n]T
- 结构体类型 struct
引用类型#
- 切片类型 []T
- 映射类型 map[K]V
- 通道类型 chan T
- 指针类型 *T
函数类型#
原创
go-11
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法