Appearance
Go 开源练手项目推荐
1. 马丸子
首先我表示,go 语言的练手项目不应该是 K8s、Docker 这种,K8s 现有代码接近 50 万行!!这怎么练手?????蹭流量也不应该这么不负责任吧
我还是推荐一些 500 行至 3000 行的项目用来练手,比如极客兔兔那个系列就是很好的例子!
同时,作者推出一个 tiny 系列:tinyrpc、tinybalancer、redis-tools 等。每个系列的代码约 1 千行左右,可以帮助 gopher 深入学习 go 语言,之后会陆续发链接和地址
1.1. Redis-Tools
redis-tools 聚合了后端小伙伴常见的工具集,它有以下特性:
- 分布式锁、自旋锁;
- 原子命令 compare and swap;
- 原子命令 compare and deleteredis-tools;
代码量极少,学习它,开发者可以得到以下收获:
- 代码简洁规范;
- redis lua 脚本实现;
- redis 分布式锁的正确实现;
1.2. TinyRPC
TinyRPC 是基于 Go 语言标准库 net/rpc 扩展的远程过程调用框架,它具有以下特性:
- 基于 TCP 传输层协议;
- 支持多种压缩格式:gzip、snappy、zlib;
- 基于二进制的 Protocol Buffer 序列化协议:具有协议编码小及高扩展性和跨平台性;
- 支持生成工具:TinyRPC 提供的 protoc-gen-tinyrpc 插件可以帮助开发者快速定义自己的服务;
TinyRPC 的源代码仅有一千行左右,通过学习 TinyRPC,开发者可以得到以下收获:
- 代码简洁规范;
- 涵盖大多数 Go 语言基础用法和高级特性;
- 单元测试编写技巧;
- TCP 流中处理数据包的技巧;
- RPC 框架的设计理念;
1.3. TinyBalancer
TinyBalancer 是基于 Go 语言标准库 net/http/httputil 扩展的反向代理负载均衡器,它支持以下特性:
- 支持 http 以及 https 协议;
- 支持七种负载均衡算法,分别是:round-robin、random、power of 2 random choice、consistent hash、consistent hash with bounded、ip-hash、least-load;
- 支持心跳检测,故障恢复;
TinyBalancer 的源代码仅有一千行左右,通过学习 TinyBalancer,开发者可以得到以下收获:
- 深入理解负载均衡算法;
- 代码简洁规范用;
- Go 语言设计反向代理的技巧;
- 单元测试编写技巧;
- 工厂设计模式在 go 语言中的应用;
1.4. TinyWeb(开发中,后续会更新)
除了开源项目,作者对 Go 语言进阶的同学有以下一些小指点!
1.5. 单元测试(重点在用,有兴趣看看源码,很短)
作为一名合格的开发者,当然少不了单元测试的编写,一般在工作中,对 Go 语言代码进行单元测试时通常会使用的两个框架:
- Go 语言断言库:GitHub - stretchr/testify;
- Go 语言接口测试库:GitHub - golang/mock;
这两个库会在工作中经常遇到!对单元测试很重要!重要的话说三遍!!!
1.6. HTTP
Go 语言本身提供的标准库非常强大!通过标准库也可以写出优美的 Restful 接口。官方推荐的 web 学习教程:Learn Web Programming in Go by Examples,很短很短,一个小时就能看完!
其中这个教程中的路由、Session 会话相关的库选择了 Google 开发的:
这两个库都非常迷你精巧,也符合 Go 语言的初衷。(重点在用,有兴趣看看源码,mux 和 sessions 的源码都在一两千行左右)
1.7. 关系型数据库(会用即可)
如果开发者在实际开发过程中,比较喜欢写纯 SQL 语句或者对性能敏感度较高的话,作者建议选择 sqlx 库,这个库对 Go 语言标准库中的 sql 进行了二次封装。
如果比较喜欢使用 ORM 框架,作者推荐选择 GORM 库。
gorm 的文章非常详细,有兴趣的可以看看:GORM Guides。
1.8. RPC(会用即可)
这时,你还想学点微服务相关的,首先强烈推荐 grpc-go!!gRPC。
grpc 是 google 推出的,基于 http2.0 和 protocol buffer 协议的远程过程调用框架。
其次,有兴趣的话你可以看看它的生态,grpc-ecosystem,这个生态合辑包含监控、限流、日志等等,堪比哆啦 A 梦的小肚兜!!
1.9. 序列化协议(有兴趣可以看看 Protocol buffer 的编码原理)
关于序列化协议,web 常用的文本序列化协议就是 JSON 了,二进制序列化协议多数为 Protocol buffer:
- Protocol buffer 的指南:Language Guide - proto3;
- API 官方文档:Protocol Buffer Basics: Go;
1.10. Go 语言代码规也是非常非常重要的东西
uber 的 Go 语言的代码规范:uber-go/guide,至今是很多 Go 语言开发团队的典范!强烈推荐熟读一遍。
中文翻译版:GitHub - xxjwxc/uber_go_guide_cn。
1.11. 深入原理(不喜欢八股文的可以跳过)
如果你想面试来 BAT 上班,除了后端必备的东西,Go 语言的八股文给大家来一打!!
可以看看左老师的:Go 语言设计与实现。
敲重点!!!!!
有空再看看 Go 语言的内存逃逸分析:Go 中的内存逃逸分析 - SegmentFault 思否
2. 极客兔兔
Go 语言简明教程 和 Go Test 简明教程 快速入门。
进阶推荐 Go 语言高性能编程。
进步最快的方式是找一些经典的开源库学习,这样能够最快地学到 Go 语言在实际中是如何应用的。推荐 GitHub - geektutu/7days-golang 这个项目,每次花七天时间模仿一个经典库的实现。这些库的代码规模一般比较大,因此选取了最重要的特性,拆分为 7 天实现,每天的代码都是独立文件夹保存的,每个子项目代码规模均在 500 行左右,非常适合进一步学习。目前已经实现:
2.1. Gee:模仿 gin 实现的 Web 框架
第一天:前置知识(http.Handler 接口) 第二天:上下文设计(Context) 第三天:Tire 树路由(Router) 第四天:分组控制(Group) 第五天:中间件(Middleware) 第六天:HTML 模板(Template) 第七天:错误恢复(Panic Recover)
2.2. GeeCache:模仿 groupcache 实现的分布式缓存
第一天:LRU 缓存淘汰策略 第二天:单机并发缓存 第三天:HTTP 服务端 第四天:一致性哈希(Hash) 第五天:分布式节点 第六天:防止缓存击穿 第七天:使用 Protobuf 通信
2.3. GeeORM:模仿 gorm 实现的 ORM 框架
第一天:database/sql 基础 第二天:对象表结构映射 第三天:记录新增和查询 第四天:链式操作与更新删除 第五天:实现钩子(Hooks) 第六天:支持事务(Transaction) 第七天:数据库迁移(Migrate)
2.4. GeeRPC:模仿 net/rpc 实现的 RPC 框架
第一天 - 服务端与消息编码 第二天 - 支持并发与异步的客户端 第三天 - 服务注册(service register) 第四天 - 超时处理(timeout) 第五天 - 支持 HTTP 协议 第六天 - 负载均衡(load balance) 第七天 - 服务发现与注册中心(registry)
2.5. Wasm:Go Webassembly 的一些 demo
示例一:Hello World | GitHub - geektutu/hello-world 示例二:注册函数 | GitHub - geektutu/register-functions 示例三:操作 DOM | GitHub - geektutu/manipulate-dom 示例四:回调函数 | GitHub - geektutu/callback
未完待续...