知识点
string类型底层是[]byte函数所有参数都是值传递
- 接口实现使用
duck type概念- 即实现了某接口的所有方法的结构就是该接口类型
- 因此接口的实现不依赖于接口,可能你冥冥中实现了某个接口,只要不对该接口有显式调用,你就不必知道你这个接口的调用
- 更倾向于想成为什么接口就要实现什么方法
v.(type)断言可以用于swicth类型
1 | switch t := v.(type) { |
os.Exit不会调用defer函数且不会输出调用栈使用
recover时应考虑是否为系统出错,防止服务成为僵尸服务向关闭的通道发送数据会导致panic,从关闭的通道读取数据会读取类型零值,通道由生产者关闭
读写buffer已满通道均会阻塞
格式化字符串可以使用诸如
%[1]v表示使用第一个格式化参数,并格式化为对象取值sync.Pool对象缓存,会在GC后清除缓存sync.Once单例模式,能够确保对象只被new一次go test -v -cover输出覆盖率go test -bench=[bench function] -benchmem性能测试,使用testing.B测试性能反射编程
- 通过字段名称直接获取字段值
1
reflect.ValueOf(v).FieldByName("fieldName")
- 通过标签获取字段值
1
2field, _ := reflect.TypeOf(v).FieldByName("aFieldName")
field.Tag.Get("fieldTag")- 使用如下方法调用方法函数
1
2var functionParam interface{}
reflect.ValueOf(v).MethodByName("aFunc").Call([]reflect.Value{reflect.ValueOf(functionParam)})不安全编程
unsafePipe-Filter 架构模式
- 通过
Filter串连架构流程 - 各个
Fielter通过输入输出串连传递数据
- 通过
Micro-Kernal 架构模式
- 易扩展,通过插件扩展功能
- 错误隔离,内核只包含通用的处理逻辑,插件的错误不会影响主体逻辑