Go入门

Go日志实践

Go文档查询

GOPROXY 代理

如果有有一些库拉不下来又没有自己的代理,可以试试

export GOPROXY=https://goproxy.io

Web/RPC框架

  • gin
  • grpc

个人推荐使用 gin,当然你可以参考一下 star 选择别的框架

微服务

微服务框架:

微服务代码示例:

单元测试(unittest)

GoMock框架使用指南 如何写出优雅的 golang 代码

静态语言编写单测相比动态语言要难一些,动态语言中比如 python 可以很容易用 mock.patch 来做属性/方法替换。 但是静态语言不行,一般难点在于如何去模拟外部依赖(比如数据库/rpc请求,redis 请求等):

  • 接口(go 推荐面向接口编程,否则你很难使用 gomock 来编写单测)
  • mysql: 如何 mock 数据库请求。使用 sqlmock,或者编写 dao 层 interface,然后 mock 这个dao层接口
  • http: 使用 httpmock 来模拟请求返回值
  • redis: 这里我试了下 miniredis 比较好用,基于 go 实现,无需真实的 redis server

也有一种方式在单测环境加入真实的db 和redis(比如 docker),然后单测读取测试环境的数据库来操作。 这样的好处是可以不使用各种 mock 库,直接操作真实的 mysql,测试代码写起来也更方便。

以下是一些单测相关的库:

  • testing: 内置库
  • github.com/stretchr/testify/assert: 用来做断言 assert 方便
  • gomock(mockgen): 静态语言难以像动态语言直接属性替换,所以一般我们基于接口编写代码,然后可以生成接口 mock
  • sqlmock: 如果依赖了数据库 mysql 等,可以使用 sqlmock 模拟数据库返回内容。(或者就在测试环境用真实的 mysql,测试完清理插入的测试数据)
  • httpmock: 用来 mock 调 http 请求
  • github.com/alicebob/miniredis 可以用来 mock redis,无需启动真实的 resdis server。试了下非常好用,也不用使用 mock 和真实的 redis 了。个人强烈推荐
  • bouk/monkey: 通过替换函数指针的方式修改任意函数的实现,如果以上都无法满足需求,可以用这种比较 hack 的方式。可能需要禁止编译器内联优化 go test -gcflask=-l ./...

参考:

Go 断点调试器dlv

# 搜索函数,打断点,如果有同名函数的时候比较有用
funcs FuncName

# 打断点断点
b main.main

# go get -u github.com/derekparker/delve/cmd/dlv
dlv debug main.go

# 加上命令行参数
# https://github.com/go-delve/delve/issues/562
dlv debug ./cmd/unit-assignment-cli/main.go -- server

Go Debug 调试工具

Go 开发关键技术指南

Go List import

# https://pmcgrath.net/how-to-get-golang-package-import-list
go list -f '{{range $imp := .Imports}}{{printf "%s\n" $imp}}{{end}}' | sort
go list -f '{{range $dep := .Deps}}{{printf "%s\n" $dep}}{{end}}' | xargs go list -f '{{if not .Standard}}{{.ImportPath}}{{end}}'

Go 常用框架(工具)

技术选型一般选择接口稳定,更新快,生态相对成熟,star 数量较高,用户广泛的库,坑少一点。 前后分离时代用 gin 之类的框架写app后台还是挺快的,但是感觉做并发不高的内部后台业务还是用脚本python/php之类的更快。 以下第三方库均可以通过 google + 关键词搜索到,同一行尽量按照流行程度从前往后列举,默认都是 github 上的包(只写了仓库后缀)。

  • web/rpc框架: gin, grpc, beego
  • 参数验证:go-playground/validator, bytedance/go-tagexpr
  • json处理转换:go-simplejson/mapstructure
  • 配置解析: viper(兼容很多格式)
  • mysql orm: gorm, xorm, sqlx
  • redis: go-redis, redigo
  • Kafka: Shopify/sarama
  • Elasticsearch: olivere/elastic, elastic/elasticsearch
  • mongodb: mongodb/mongo-go-driver
  • id生成器: rx/xid, satori/go.uuid, bwmarrin/snowflake
  • cache(in memory): patrickmn/go-cache
  • 并发/协程池(star 数排序):
  • 异步任务框架: machinery, gocelery
  • 定时任务:robfig/cron, ouiqiang/gocron
  • 熔断:hystrix-go, eapache/go-resiliency, cep21/circuit
  • 限流: ulule/limiter, didip/tollbooth
  • 日志: logrus, zap, mumberjack
  • 调试:go-spew/dlv
  • 图片处理:h2non/imaginary
  • 网络编程:fatih/pool
  • 表格:go-echarts
  • 转换工具:
  • 热编译工具:gowatch
  • 静态检查:golangci-lint
  • 网络代理:goproxy
  • 命令行: cobra
  • 字符串处理工具:huandu/xstrings

工具:

博客:

Go Profiler

Go 反射

Go源码阅读

../_images/gocode阅读.png