在实现一个需要动态增删的form表单需求时,MVVM
的思维模式下,很容易就想到使用数组的添加和删除来实现DOM元素的动态添加和删除。
用 Go Plugin 构建模块化系统
自从 golang 1.8以后,提供了一个 Plugin 的机制使得 golang能够加载 so 动态链接库文件。
这样可以对外发布动态链接库而不需要把源码共享给对方去进行编译,还可以做到按需加载相应的插件来实现动态开启插件相应的功能。
sync.Pool缓存池中对象回收时机
为了缓解GC压力,go标准库在sync包中提供了一个Pool,但是这个Pool和我们一般意义上的Pool不太一样,主要有以下几点区别:
1.Pool无法设置大小,所以理论上只受限于系统内存大小。
2.Pool中的对象不支持自定义过期时间及策略,究其原因,Pool并不是一个Cache.
3.Pool的设计初衷是为了缓解GC压力,所以Pool中的对象会在GC开始前全部清除。
使用go-svc安全退出程序
阅读 NSQ 源码时,看到NSQ使用了 go-svc 来启动nsq的相关程序,使得在程序退出的时候可以做一些释放资源等收尾工作。
使用起来非常简单,定义一个Service,实现其 svc.Service中的接口即可。
一个时区引发的`血案`
项目中的一个单元测试,其中一个判断是比较两个时间是否相同。代码逻辑简化抽象如下:1
2
3
4
5
6
7time1:=time.Now()
xorm.engine.NewSession().Update(time1)
var time2 *time.Time
xorm.engine.NewSession().Get(&time2)
if time2.UTC().Format("2018-06-06") != time2.UTC().Format("2018-06-06"){
panic error
}
介绍一下各组件时区设置:
- mysql 默认配置,
SYSTEM
- xorm dsn 配置为
parseTime=true&loc=Asia%2FShanghai
以上代码,在本地机器上跑单元测试时无异常,能正常通过。但是,上了CI环境后,单元测试却失败了。
通过观察CI的日志和自己打印的日志,发现入库前后,这两个时间相差了8个小时,很明显,这个时间受到时区的影响了。