一直有在零散的时间用go写点代码,正好借着最近比较有时间写东西的契机,给这个看着年轻,实际也已经发展10几年,并在当下众多开发领域都有不可忽视作用的语言做个介绍吧
golang 的诞生可以说是时代造就了它,它也成就了研发工具、云原生和高性能服务开发百花齐放的时代
本节主要参考文章:
Go at Google: Language Design in the Service of Software Engineering
翻译-Google 里的 Go 语言:服务于软件工程的语言设计
煎鱼-为什么要开发 Go 这门新语言?
ced by multicore processors, networked systems, massive computation clusters, and the web programming model
软件规模:千万行代码,数千程序员共同维护(言外之意就是效率太低了,语言和开发者两个层面)
编译时间太长,几分钟到几小时都有(特别讲了 C++ #include 在编译上的消耗: Dependencies in C and C++)
依赖混乱,跨语言构建麻烦
难以编写自动化工具
译者注: 结合原文之后的内容来看,最主要的两类问题就是 大规模的 C++ 项目编译时间长,以及多种语言维护成本高的问题
Robert Griesemer: 参与过谷歌 V8 引擎的开发,Sawzall 语言(谷歌内部用的日志分级打印库,之后被 go 的日志库替代)、JVM 和 strongtalk 系统(用于类型检查,现在不维护了)
Rob Pike:Unix 开发者之一,为 Unix 编写过终端,后续编写过 sam、acme 文本编辑器,再之后和 Ken Thompson 一起创造了 UTF-8
Ken Thompson: Unix 开发者之一,B语言(C语言的前身)的发明者,后面 Dennis Ritchie 基于 B 语言又开发了 C语言。1983 年 Ken 和 Dennis 一同获得了图灵奖
扩展: Russ Cox,你可以在 golang 的很多 issue 中看到他的身影,他也是go代码提交次数最多的
推荐阅读: 图灵奖历届得主、golang talk
名字: Gopher(囊地鼠)
由 Rob Pike 的妻子 Renee French 创作,官网甚至还有细节描述呢
为了解决前面说的问题,go 必须有下面的特点:
golang 版本来源: 从 1.10 到最新
本节中,笔者将结合自己平时开发过程中使用到的 go 比较核心的特性进行基本介绍,这些也是 go 和其他编程语言最不同的地方,包括 基本语法、基本指令、函数、关键字、基本类型、打包方式等
以上就是自己常接触的原生库了,可以从 go源码的src目录 更多的实现细节
golang 编程规范查漏补缺
golang-使用 go test 输出单元测试覆盖率
golang-单元测试和mock框架的介绍和推荐
golang-使用 godoc 工具编写代码注释
golang-文章翻译-go高效编程
golang-文章翻译-go常见的10种错误
vscode 使用技巧(vscode+go插件的开发环境)
Go 的官网其实是最好的学习资料,教程、博客、社区动态都有,绝对适合作为入门资料的第一位
下面说明官网中右上角各个栏目的内容
大体就是 Go 在一些通用领域的使用场景,以及在大厂的使用情况
Case Studies: 大厂的使用场景,如 Google、CloudFare、Meta、Netflix 等
Use Cases: 在云服务、网络通信、命令行工具、网页/客户端应用 和 运维和可持续开发(DevOps、SRE)领域的应用
每一个领域下都有比较流行的开源项目的推荐
Security: 如何提升自己工程的安全性,如通过 govulncheck 检查项目存在哪些已知漏洞
非常适合上手的 go tour,几乎覆盖了 go,可以说练习完所有示例就会写 go 代码了
所有官方文章: 可以挑讲原理的文章看,如 Using and understanding Go 中的 A Guide to the Go Garbage Collector 以及 References 中的 The Go Memory Model
Effective Go: 上手之后,进一步了解 go 编程风格的必读文章
std: 标准库文档
faq: 囊括了从其他语言迁到 go 语言的常见问题,也体现了 go 的设计思想
blog: go 博客,社区新动态
go 本身的源码就很好阅读,也和 go 本身语法比较简洁有关。如果你想了解 go 的基础库的原理,大可不用搜一堆博客,一点点地消化别人的总结,读go源码就是最好的学习go原理的方法
包括: sync, runtime, context, reflect,这些都是 go 的核心库
开发后台必须要掌握的就是 web 框架,当然不同公司对它的定制化也会不同,如果想从简单的入手,使用官方推荐的 gin 就行。想参考大厂实际用的,可参考国内开发者开源的 web 框架(功能比较全),如字节的 hertz、go-zero、goframe 等
gorm: 数据库 orm 库
redis: redigo
kafka: sarama
如 Kubernetes、Istio、Prometheus、Grafana 等,也能接触到当下比较流行的项目
以往我们需要用工具进行文档格式转换、爬虫、文件批量下载等场景,可能会主要以 python 项目作参考,因为它语法简单,执行方便,你需要的只是一个 python 环境
现在,拥有类似特性的 go 让我们多了一个选项,同样的需求,也可以看 go 社区有没有现成的方案。甚至 go 只需要编译好的可执行文件,更加方便
具体用哪个工具因需求而异,可以参考别人的整理,这里列几个可能比较常用的:
hugo: 博客网站生成,类似 hexo
buffalo: 快速生成 web 项目
vhs: 终端录制
pget: 并发下载
fsnotify: 系统文件监听
lux: 网站视频下载工具(不能下载需要登录才能下的超高画质)
migrate: 跨不同类型数据库迁移
golang 在国内大厂实践还是比较多的,因此国内开发者写的博客也不会缺少。本着技术的学习方法来说,这里推荐两个博主 分别对应前沿动态,和深度剖析原理
煎鱼: go 语言开发者,对 go 社区动态、新版本特性的跟踪比较及时,类似的博主还有 polarisxu
go语言设计与实现: go 原理和设计思想,这个博客对技术的思考方式值得应用到所有技术的学习上: 从为什么这么设计的问题基础上,去理解技术实现细节