不知不觉间,我居然已经八个月没有写过文章了!主要原因是这一段时间都在上班,每天下班就只想睡觉,自然没有时间写文章了。
依稀记得去年开始学 go 的时候,总是听见很多诸如“后端最好先学 Java”之类的论断,而我在过去的半年中,拿到了字节跳动、小红书、搜狐等公司的后端/全栈开发 offer,腾讯进了终面但被我主动拒掉,要是当初学的 Java,现在说不定还没开始投简历呢。
我个人认为学 go 有如下好处:
- 语法极其简单,基本不需要花多少时间在语法学习上,同时对比 Java,没有那么多非学不可的框架生态,这对于 ACM 退役选手和那些由于信息差没有很早开始准备的同学来说,是很友好的。
- go 天生就带着开源社区的基因,学 go 的同学会与 github 等开源社区打更多的交道。
- go 相对 Java 而言没那么卷,更好找工作,岗位平均薪资更高,同时一般都是比较前沿的岗位,上班体验更好。
- ……
以下是我个人总结的 go 学习路线,日后可能还会更新。对于标注“可选”的部分,可以根据自己的时间决定是否学习。
Go 安装与开发环境
首先为了能在终端正常访问 google 及 github 相关网站,请自行科学上网并开启 TUN/虚拟网卡模式。
由于大部分人在刚接触编程时肯定是使用 Windows 系统,那这里就以 Windows 举例,MacOS 和 Linux 读者可以自己搜索。
首先到 go 官方下载处下载最新版本 go 的 msi 文件:All releases – The Go Programming Language,安装过程中询问是否将 go 添加到 PATH 环境变量时,请记得勾选添加。
IDE 可以选择 Goland 或 vscode 及其类似物。在 vscode 中下载官方的 go 插件:

在终端中输入 go version ,显示以下信息则为安装完成:

若提示没有 go 命令,请检查是否将 go 正确添加到 PATH 环境变量。
在空目录下,打开终端,执行 go mod init hello :

这个命令的作用是新建一个 go 项目。命令末尾的 hello 代表这个项目的包名。在实际开发场景中,我们一般用仓库名命名,比如 github.com/AelionGo/Aelion 。
此时观察到空目录下生成了一个 go.mod 文件,内容如图:

里面展示了项目的包名和当前使用的 go 版本。在同目录下新建一个 main.go 文件,写入以下代码:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}

终端执行 go run . :

至此,go 环境配置就完成了。
基础语法
go 的语法非常简单,这是 go 独特的设计哲学:大道至简。正因为 go 语法简单且语法糖极少,go 也是最适合 ai 编程的语言,多个相关测试都表明 ai 生成 go 代码的质量是所有语言中最好的。
学习基础语法大约花费一周或者两周的时间,其中重点学习以下内容:
- go 的面向对象相关设计。包括“组合优于继承”、接口的“鸭子方法”等。
- 包管理。go.mod 和 go.sum 的作用、如何将变量或方法导出,如何引用其他文件或其他目录的对象,internal 包的作用等。
- 重中之重,go 的并发模型,即 GMP 抢占式调度(CSView计算机招聘知识分享),熟练使用 goroutine 和 channel,能用 channel、select等工具实现大部分并发场景。
推荐通过 go 官方的 tour 进行学习:Go 语言之旅。
在看完 tour 后,为了更加熟悉语法,可以去刷几道 leetcode ,或者做一个小的且只涉及语法的项目:使用 Go 语言实现二叉搜索树
(可选)进阶/面试
如果你对这门语言本身很感兴趣,想要更深入的学习,可以阅读以下资料。也可以在后面的部分学完后回过头看。
通用开发技能
考虑到很多同学是像我一样,将 go 作为自己的第一门开发语言的。那么假定你目前没有任何的通用开发技能的基础,你需要学习以下内容:
- git(冲突解决、合并、变基、cherry pick等):git – the simple guide – no deep shit!
- sql:简介 – SQL教程 – 廖雪峰的官方网站
- 了解 HTTP(S) 协议,request 方法(GET, POST, PUT, PATCH, DELETE, OPTIONS)
- 了解 JWT 和 UUID。
Go 框架学习
为了开发出一个 web 应用,我们需要知道一些 http、orm 等框架如何使用。在这里我们学习最经典与基础的 gin 和 gorm 的使用。
GORM 指南 | GORM – The fantastic ORM library for Golang, aims to be developer friendly.
此处没有必要太过详细的研究文档,只需要能大概了解如何使用即可。在粗略学习后,可以开始编写你的第一个完整的 web 项目了!可以跟着这个小项目实现一下:HTTP 应用 – 地鼠文档
- HTTP 请求的完整生命周期?
- 中间件的作用?执行顺序?
- Gin 中的 Context 上下文有什么作用?
(可选)动手实现 http 框架和 orm 框架
自己动手写一个 http 框架或 orm 框架并不是特别难的事情,还有助于你更深入的理解框架原理与工作机制。
架构意识培养
当我们要自己做一个比较大型的项目,以及未来参与大型项目的开发时,理解常见的架构设计和每个常见模块的设计是很重要的。
- 项目架构(service、controller、model 等)一般如何设计?(并没有标准答案,可以了解一下不同的思想,包括 DDD 等)
- Restful API 中的 path 和 method 一般如何设计?
- 日志系统、链路追踪等模块一般怎么做?
- 配置管理有哪些方法?(配置中心、配置文件、环境变量等)
- ID 生成有哪些方法?
尝试自己设计并编写一个小型的具有真实业务场景的项目,使用 Restful API + MySQL,比如:
- 博客系统(文章 / 标签 / 评论 / 用户)
- 简单论坛(帖子 / 回复 / 点赞)
- 文件上传 + 下载服务
- TODO / 记账 / 笔记系统
(可选)分布式一致性与微服务
目前而言互联网公司的项目,为了方便协作开发、扩缩容等原因,通常使用微服务的形式开发和部署项目。
- 分布式的概念?微服务的概念?
- gRPC
- 消息队列(Kafka、RabbitMQ等)、分布式 KV(Redis、Etcd 等)在分布式项目中的作用?
- 服务发现和负载均衡有哪些实现方式?
- 分布式一致性(可以通过 MIT6.824 学习 Raft 算法)
- 限流、熔断、降级的意义?怎么实现?
把之前的项目,按照用户服务/文章服务之类的方式,拆分成微服务项目,服务间使用 gRPC 通信。
推荐框架:go-zero,作者的公众号:微服务实践。可以看到很多 go-zero 的源码带读,学习微服务情景下多个模块的设计。
相关资料:
etcd解析:https://blog.mrcroxx.com/posts/code-reading/etcdraft-made-simple/0-introduction/
mapreduce论文:https://blog.mrcroxx.com/posts/paper-reading/mapreduce-osdi04/
raft论文:https://iamczy.com/archives/369
6824lab1:https://iamczy.com/archives/354
6824lab2:https://zhuanlan.zhihu.com/p/543989771
6824lab3:https://zhuanlan.zhihu.com/p/568777696
微服务设计与思考(煎鱼):https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzUxMDI4MDc1NA==&scene=1&album_id=1488826194207752195&count=3#wechat_redirect
工程化与生产环境
- sh 脚本的编写
- Makefile 的编写
- Docker 基础,DockerFile 和 DockerCompose 的编写
- CI/CD 的基本概念
- 性能压测
- 监控(Prometheus)
为你的项目按上述知识,编写相关文件,并进行压测,使用云服务器进行部署。
简历
最终写在简历上的项目,若要称为优秀,应当满足以下条件:
- 用到了 sql、redis、mq 等,且不是为了用而用,都有相应的场景可以介绍
- 业务场景明确,且有一两个相关的亮点
- 你应当已经理解了微服务以及相关的概念,同时项目使用
以我最开始找实习时的项目为例:

这里就有 etcd、websocket、连接管理、写扩散、redis、kafka、熔断限流降级等多个点可以与面试官讨论,不至于一看就毫无亮点。
简历除了教育信息、奖项、项目经历、实习经历、专业技能以外,不宜添加其他内容。专业技能可以这样编写:


