Golang rpc服务更优雅的error处理和打印日志
服务器代码中,错误处理占据了大部分的逻辑。特别是C族语言,喜欢使用错误码,而不是异常来处理错误。 错误码比异常的优势是,性能会更好一些。抛出异常的话,因为有异常栈的展开,性能开销会大很多。 在Golang中,有一个error的接口来处理错误。
……腾飞中的个人博客
服务器代码中,错误处理占据了大部分的逻辑。特别是C族语言,喜欢使用错误码,而不是异常来处理错误。 错误码比异常的优势是,性能会更好一些。抛出异常的话,因为有异常栈的展开,性能开销会大很多。 在Golang中,有一个error的接口来处理错误。
……在我们的开发环境中,使多个golang版本并存。
大部分情况下,一个比较新的golang版本就能满足我们的日常的开发需求。 但是项目中,因为协作的原因,或者由于项目启动比较早,可能我们不同的工程需要用不同的golang版本。甚至有些工作用比较新的版本编译不了。 这时候,我们就需要让本地的开发环境支持多个golang版本。
……fdump是一个创建抓二进制包解析程序的框架。 对于自定义的二进制通信协议,在调试的时候会很困难。无论tcpdump还是wireshark抓到包都不能直接看到里面的内容。
……goenv库将环境变量的值设置到一个结构体里, 以方便使用。类似于encoding/json解析到结构体。
为了简化docker的发布,把配置从配置文件里抽取出来,设置到环境变量里。然后发布docker 容器的时候就不需要再带一个配置文件了。
……golang的交叉编译。
golang的交叉编译非常简单,只要配好对应的环境变量后再go build
就可以了。
需要配置以下的环境变量。
CGO_ENABLED
默认情况下这个变量为1。
交叉编译不支持cgo,所以需要关闭cgo。
linux/unix下为CGO_ENABLED=0
。
windows下为set CGO_ENABLED=0
。
初学golang的很多人对buffer大小为0和1的channel都不了解。
下面通过make(chan bool)
和make(chan bool, 1)
的例子说明它们的区别。
Golang不使用cgo,直接操作共享内存。
故事起源于要搭一个高性能的日志中心。当然使用了elk这一套。但是,对于logstash来说, 它主要使用的是文件日志的方式了捕捉log。而写文件日志的话会非常慢。对于实时日志要 处理滚动的日志更是这样,每次检查是否需要流动日志,然后打开日志,然后写入,然后 关闭,当然这中间可以优化。这一切都是那么慢,发起了n个系统调用,硬盘寻道等。这时 候想到了用共享内存来通信。
……