Category Archives: Go

尝试Go两日感悟

以前虽然用 Go 写过一些小工具、脚本,但都没有能深入了解这门语言及其思想;恰好最近项目中有个功能相对简单的模块,原本计划使用 C++ 和 ZeroMQ 实现,所以借此机会再试一把。

这个模块的主要功能是一个作为 Broker(经纪人),监听来自客户端的 JSONRPC over HTTP 请求,经过分解,依次调用后端的一个或多个接口(基于ZeroMQ)。原先使用 C/C++ 的做法是:单线程、epoll、自定义异步状态机或协程(coroutine),这个方案的缺点也很明显:自定义异步状态机的逻辑复杂、协程的用法很不友好。

换成 Go,自然而然的用到 goroutine ,语言本身对协程的友好支持,写起来非常的自然;HTTP 服务用的是自带 Package 中的 net/http ,目前功能够用,省去了重复发明一套 HTTP 轮子;JSON 解析也ok,encoding/json也满足了需求;操作RAW Bytes使用 encoding/binary ,唯一的遗憾是这一次没有用到channel,因为与后端服务的链接时单一且纯异步的,还没有很清晰的思路如果利用channel来实现 ZeroMQ 的 Broker 模式,暂时还是使用两个 zmq.Dealer 实现了内部一个 Broker。

两天时间差不多写了1000+行代码,Golang 的优缺点:

  1. goroutine 写起来非常舒服,既有 coroutine 的轻量级,又有 thread 的便捷;
  2. 自带的Package很全面,基本能满足我目前的需求,远超STL,和QtCore差不多;
  3. 编译出来的二进制清清爽爽,就是喜欢这种静态链接,docker 绝配;
  4. interface{} 让人又爱又恨,尤其对于 JSON 的解析,但还得用reflect做检查;
  5. 语法方面需要适应,尤其是没有了OOP的支持;
  6. 源码目录结构,一开始没搞懂自己的package该如何存放,重新看文档才明白;
  7. 没有官方 IDE ,最后找了个 JetBrains PhpStorm 的插件,用着还凑活;
  8. 网上说的 goroutine 泄露暂时没遇到,可能是还没用到 channel吧;

总的来说,Go 还是非常值得尝试的,现在算是理解为什么 SRS 要用 Go 重写了。