Go调用C代码(cgo)
注释
import”C“
用C.方法调用
进入C程序后,调度器无法抢占协程,当前栈切换到C的系统栈上
cgo限制了go的跨平台特性(c的实现与平台高度耦合)
最大的好处(调用现成的C实现)
defer
方便业务的编写
底层的话调用汇编分析
开始会包装一下defer
最后会调用defer方法
思路1
堆上分配,开辟一个deferpool,每遇到defer语句,将其放入其中(放在堆上就有垃圾的问题)
思路2
1.13之后 放入栈上,函数调用完之后栈帧会被直接回收,因为栈保存信息有限,规定只有一个defer可以再栈上分配
思路3 开放编码
1.14之后
如果defer比较简单,再编译时就能确定
会直接改写代码,放在函数尾
recover panic
panic后面的fmt不会打印
panic退出时会执行自己的defer,不会执行其他(主协程)的defer
黄色代码背景说明写的有些问题
panic底层 gopanic 最后的for也是只调用自己的defer
defer 后面写个recover函数
他会让其他的协程执行,
如果涉及recover,defer会使用堆上分配(deferpool)
遇到panic ,会从deferpool取出defer语句执行
defer中调用recover,会终止panic的执行
反射
程序运行的过程中动态的获取对象的类型
对任意类型变量赋值(int变为string)
动态的调用方法
元数据就是”数据的数据“
把对象的类型表示成一个数据类型就是元数据 (Type接口 ,chan等都是实现了这个接口)源码点向下箭头可查看 reflect。Type
把对象的值表示成一个数据类型就是元数据 reflect。Value 把对象的值表示成一个结构体,就能对其做操作
编译时反射对象会被编译器转化为空接口,反射到对象时,将类型和地址还原为数据