大家好,我是极客老墨。这是本教程的第一篇,我们讲介绍 Go 语言的发展历史,并完成安装、运行 HelloWorld 程序。

Go 语言是最近几年发展最快、最火热的编程语言之一,由 Google 公司出品,其学习成本低、天生支持高并发、语法简洁高效、强大的标准库以及日益丰富的生态特性等使得其非常适合开发后端服务程序,并逐渐挑战着 Java 在服务端编程语言中的领导地位。

Go语言的诞生

Go 语言的前身被认为是一种名为 Limbo 的编程语言,它是由 Unix 之父、C语言之父 肯·汤普逊(Ken Thompson) 和 丹尼斯·里奇(Dennis Ritchie) 这两位计算机灵魂人物领衔并在一个名为 Plan 9 的操作系统研究项目中发明的。

Go语言起源于2007年,当时还是身在 Google 的 Plan 9 项目原班人马在业余时间编写完成的,后来 Google 意识到了 Go 的巨大潜力并全力支持这个项目。Go 在2009年11月正式对外开放,并在2012年3月28日发布了第一个正式版本。

Go 语言的主要开发者有 肯·汤普逊(Ken Thompson)罗布·派克(Rob Pike)罗伯特·格里泽默(Robert Griesemer)等,每一位都是赫赫有名的大师级人物:

  • 肯·汤普逊:与丹尼斯·里奇在贝尔实验室发明了Unix操作系统,以及用于该系统的 C编程语言

Ken Thompson (left) and Dennis Ritchie (right)

  • 罗布·派克:Unix小组成员,参与了Unix后续的Plan 9和Inferno操作系统,同时也是Limbo语言和Go语言共同的发明者
  • 罗伯特·格里泽默:协助制作Java的HotSpot编译器和Chrome浏览器的JavaScript引擎V8,Go语言的共同创造者

Go的特点

Go 始于 2007 年 9 月,当时 Robert Griesemer、Ken Thompson 和我开始讨论一种新语言,以解决我们和 Google 的同事在日常工作中面临的工程挑战。

当我们在 2009 年 11 月首次向公众发布 Go 时,我们不知道该语言是否会被广泛采用,或者它是否会影响未来的语言。回顾 2020 年,Go 在两个方面都取得了成功:它在 Google 内外广泛使用,其网络并发和软件工程方法对其他语言及其工具产生了显著影响。

事实证明,Go 的影响范围比我们预期的要广泛得多。它在行业中的增长是惊人的,它为谷歌的许多项目提供了动力。

—— Rob Pike

以上是 Go 语言的创造者之一的 Rob Pike 谈及 Go 发展情况的原话。如其所言,Go 正在以惊人的速度发展着,你可以在这里详细了解正在使用 Go 的一些公司和使用案例。

Go的应用场景

Go 语言凭借其高性能、高并发的特性,已经在各个领域得到了广泛应用。老墨给大家列举一些最具代表性的应用场景和知名项目:

1. 云原生与容器技术

这是 Go 最成功的领域,几乎所有云原生的核心项目都是用 Go 写的:

  • Docker:容器技术的代名词,彻底改变了应用部署方式
  • Kubernetes (K8s):Google 开源的容器编排平台,已成为云原生事实标准
  • Prometheus:云原生监控系统,CNCF 毕业项目
  • Etcd:分布式键值存储,Kubernetes 的核心组件
  • Helm:Kubernetes 的包管理工具
  • Istio:服务网格(Service Mesh)的代表项目

2. 微服务与 API 开发

Go 的高并发特性使其成为微服务开发的首选:

  • gRPC:Google 开源的高性能 RPC 框架
  • Gin:最流行的 Go Web 框架之一,性能极高
  • Echo:轻量级高性能 Web 框架
  • Go-kit:微服务工具集
  • Kratos:B站开源的微服务框架

3. 数据库与存储

  • TiDB:PingCAP 开源的分布式数据库,兼容 MySQL 协议
  • CockroachDB:分布式 SQL 数据库
  • InfluxDB:时序数据库
  • Minio:对象存储服务,兼容 S3 API
  • Dgraph:分布式图数据库

4. DevOps 与工具链

  • Terraform:基础设施即代码(IaC)工具
  • Consul:服务发现与配置管理
  • Vault:密钥管理工具
  • Drone:持续集成/持续部署(CI/CD)平台
  • Hugo:静态网站生成器(老墨的博客就是用 Hugo 搭建的)

5. 区块链

  • Ethereum (Go-Ethereum):以太坊的 Go 语言实现
  • Hyperledger Fabric:企业级区块链平台
  • Cosmos:区块链互操作性平台

6. 网络代理与负载均衡

  • Caddy:现代化的 Web 服务器,自动 HTTPS
  • Traefik:云原生边缘路由器
  • Frp:内网穿透工具
  • V2Ray:网络代理工具

7. 知名公司的应用

  • Google:Go 的创造者,内部大量使用 Go
  • 腾讯:微信后台、腾讯云等核心业务
  • 阿里巴巴:淘宝、支付宝的部分服务
  • 字节跳动:抖音、今日头条的后端服务
  • B站:大量微服务使用 Go 开发
  • 滴滴:核心业务系统
  • 美团:外卖、酒旅等业务
  • 小米:小米云、IoT 平台
  • Uber:核心微服务
  • Netflix:部分后端服务
  • Dropbox:从 Python 迁移到 Go,性能提升显著
  • Cloudflare:边缘计算服务
  • GitHub:部分后端服务

8. 为什么这些项目选择 Go?

老墨总结了几个关键原因:

  1. 高并发性能:原生支持 goroutine,轻松处理百万级并发
  2. 部署简单:编译成单一二进制文件,无需依赖,跨平台部署
  3. 开发效率高:语法简洁,标准库强大,开发速度快
  4. 性能接近 C:静态编译,性能优秀,适合高性能场景
  5. 生态成熟:云原生生态完善,工具链丰富
  6. 团队协作友好:代码风格统一,易于维护

Go 解决了使用 C 语言所面临的种种难题,大大提高了开发效率,而性能却与 C 语言差不多。Go 语言的特性还包括:

  • Go 是一门编译执行的静态类型语言,具有强大的内置类型
  • Go 天生具备自动垃圾回收机制,无须担心内存泄漏导致的程序崩溃
  • Go 天生具备高并发,使用 goroutine 可以更简单的进行并发编程
  • Go 支持匿名函数和闭包,函数也是一种类型,这使得其具有脚本语言一样更强大的特性
  • Go 支持函数返回多个值
  • Go 提供灵活的面向对象的特性,使用复合代替继承,使用松散耦合的接口实现方式,更加灵活和强大
  • Go 支持泛型(1.18新特性)、反射、指针、错误处理等等语言级特性
  • Go 天生支持模块化编程

配置Go开发环境

要开始学习 Go,我们需要先安装 Go 开发环境。Go 目前的最新版本为 1.18,提供了泛型的支持。你可以在官网下载安装包,然后一步步安装即可,安装过程不再详述。更多关于Go1.18版本发行说明可以看这里

安装完成后,在控制台查看 go 的版本信息:

1$ go version
2go version go1.18.2 darwin/amd64

输出版本信息表示安装成功。

在开发 Go 项目时,经常会使用到别人开发好的包,这就需要用到 Go 的包管理。由于国内访问受限,我们需要配置一个 GO_PROXY 环境变量来启用代理,这里我用的 https://goproxy.cn

1export GOPROXY=https://goproxy.cn,direct

如果需要指定 Go 的工作目录,如下载的包的存储位置、编译后的可执行文件的位置等,则还需要配置 GOPATH 环境变量,默认指向的是用户目录下的go文件夹,如我的在 /Users/sam/go/

现在,环境已经配置完成,我们可以来编写代码了。

Go命令行工具

命令行输入 go -h 可以看到go的帮助文档:

 1~ go -h
 2Go is a tool for managing Go source code.
 3
 4Usage:
 5
 6	go <command> [arguments]
 7
 8The commands are:
 9
10	bug         start a bug report
11	build       compile packages and dependencies
12	clean       remove object files and cached files
13	doc         show documentation for package or symbol
14	env         print Go environment information
15	fix         update packages to use new APIs
16	fmt         gofmt (reformat) package sources
17	generate    generate Go files by processing source
18	get         add dependencies to current module and install them
19	install     compile and install packages and dependencies
20	list        list packages or modules
21	mod         module maintenance
22	work        workspace maintenance
23	run         compile and run Go program
24	test        test packages
25	tool        run specified go tool
26	version     print Go version
27	vet         report likely mistakes in packages
28
29……

对于每一个命令,可以输入 go help 命令 查看更详细的说明。几个比较常用的命令:

  • go version: 查看当前go版本信息
  • go build: 编译项目,后边可以指定要编译的文件,会在当前命令下输出编译后的可执行文件
  • go clean: 清除当前目录或工程生成的可执行文件和缓存文件
  • go env: 输出当前Go的环境信息
  • go test: 执行go的测试文件,测试文件名以 _test 结尾,如 “user_test.go”
  • go get: 从网络下载go的依赖库文件(第三方包)并安装到当前模块
  • go run: 直接运行go源文件,而不会生成可执行文件

开发工具

初学 Go 其实对开发工具并没有太高的要求,诸如 Vs Code、Sublime Text这样的文本工具再配上 Go 命令行工具就足够了。

开发项目时,我们就需要专业的IDE了,当然还是首选 Jetbrains 公司出品的 GoLand

GoLand IDE

第一个Go程序

接下来,我们使用 Goland IDE来编写第一个 Go 程序。新建一个 go-guide 的工程,新建一个 01-hello 的文件夹,然后新建一个 hello_world.go 的文件,内容如下:

1package main
2
3import "fmt"
4
5func main() {
6	fmt.Println("Hello, world!")
7}

代码说明:

  1. 定义一个名为 main 的包
  2. 导入标准库中的 fmt
  3. 定义 main 方法
  4. 使用 fmt 包的 Println 函数在控制台打印一句话

与其他编程语言开篇一样,这里我们定义了一个函数来输出 hello, world!。通过程序可以看出:

  • Go中不需要像java一样每行以 ; 结束,除非一行编写多个语句才需要用到它
  • Go中使用 package 关键字定义包,使用 import 关键字导入包,这点与java相同
  • Go中使用 func 关键字定义函数,main 方法为整个程序执行入口

现在,我们可以直接使用 GoLand 运行这个程序,可以看到程序正确输出了结果。另外,我们可以在控制台进入源码所在目录,然后执行 go build hello_world.go 来编译程序,然后在当前目录输出了一个 hello_world 可执行文件,直接执行它可以看到正确输出了结果。当然,也可以使用 go run hello_world.go 直接运行而不用产生可执行文件:

1$ go build hello_world.go
2$ ./hello_world
3Hello, world!
4$ go clean
5$ go build hello_world.go
6Hello, world!

使用 GVM 来管理多个版本的 Go

开发中经常遇到这种情况:老项目用 Go 1.20,新项目想用 Go 1.26 体验泛型新特性,频繁装卸版本太麻烦。

这时候就可以使用 GVM(Go Version Manager),类似 Node.js 的 nvm,可以轻松管理多个 Go 版本。

原版 GVM 仅支持 Linux 和 macOS,Windows 可以使用其他替代工具。这里以老墨的 macOS 为例演示 GVM 的安装和使用。

⚠️ 注意: GVM 目前维护不是很活跃,但不影响它的功能,老墨使用了多年,觉得小巧好用,如果您有更好的工具推荐,欢迎评论留言给我。

安装 GVM

1# 安装 GVM(需要 curl)
2bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
3
4# 或者使用 Homebrew(macOS)
5brew install gvm

安装完成后,需要把 GVM 加入环境变量:

1# 添加到 ~/.bashrc 或 ~/.zshrc
2echo '[[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm"' >> ~/.bashrc
3source ~/.bashrc

常用命令

 1# 安装指定版本
 2gvm install go1.24.0
 3
 4# 安装最新版本
 5gvm install go1.26
 6
 7# 列出已安装的版本
 8gvm list
 9
10# 切换版本(当前 shell)
11gvm use go1.24.0
12
13# 切换版本(全局)
14gvm use go1.24.0 --default
15
16# 删除版本
17gvm uninstall go1.23.0
18
19# 查看当前版本
20go version

⚠️ 小坑: 这里有个坑,安装高版本的 Go 时,会依赖你当前使用 Go 版本,如果太低则安装失败,说明版本跨度太大,此时你需要查看错误日志,降低安装的版本。比如:

1go tool dist: go1.24.0 does not meet the minimum bootstrap requirement of go1.24.6 or later

日志已经清楚的告诉你需要安装 go1.24.6 后才可以安装 go1.26.0

为什么用 GVM?

  1. 测试兼容性:项目需要支持多个 Go 版本,用 GVM 快速切换测试
  2. 体验新特性:Go 每年发布两个大版本,新特性值得尝试
  3. 隔离环境:不同项目用不同版本,互不干扰
  4. 回退方便:新版本有问题,立即切回旧版本

国内用户注意

GVM 从官方下载 Go 源码可能比较慢,可以配置国内镜像:

1export GOPROXY=https://goproxy.cn,direct
2export GO111MODULE=on

或者使用 gvm-binaries 镜像:

1gvm install go1.24.0 -B

老墨建议:日常开发用稳定版本(Go 1.24),学习新特性用最新版本(Go 1.26),用 GVM 在两者之间自由切换。

老墨总结

Go是一门发展迅猛的编程语言,不仅是因为它出自大厂、计算机泰斗级大师之手,其诸多特性使得其正在被越来越多的开发者使用。本文简单介绍了 Go 的发展和一些特性,并从一个入门示例认识了 Go 程序的结构,接下来,我们再来一一深入学习。

老墨总结本篇文章的 5 个关键点:

  1. Go 出身名门:由 Unix 之父 Ken Thompson 和 C 语言之父 Dennis Ritchie 等大师创造,起点就很高
  2. 发展迅猛:从 2009 年开源至今,已成为云原生时代的首选语言,Kubernetes、Docker、Prometheus 等明星项目都是 Go 写的
  3. 特性鲜明:静态编译、天生并发、垃圾回收、语法简洁,这四大特性让 Go 在后端开发领域独树一帜
  4. 生态成熟:从 1.18 版本开始支持泛型,生态日益丰富,Go 1.23 已经是生产环境的主流版本
  5. 入门简单:语法简洁,标准库强大,IDE 支持完善,是新手入门后端开发的绝佳选择

实战建议

老墨当年学习 Go 的时候,踩过不少坑,这里给大家几点建议:

1. 版本选择

  • 生产环境:建议使用 Go 1.24 版本,稳定可靠
  • 学习环境:可以直接使用最新版本 Go 1.26,体验最新特性
  • 企业项目:如果公司有版本要求,优先遵循公司规范

2. 开发环境配置

  • 代理配置:国内用户一定要配置 GOPROXY=https://goproxy.cn,direct,否则下载依赖会非常慢
  • GOPATH:虽然 Go 1.11 后推荐使用 Go Modules,但了解 GOPATH 的概念有助于理解 Go 的包管理机制
  • 环境变量:建议在 .bashrc.zshrc 中永久配置,避免每次重启终端都要重新设置

3. IDE 选择

  • 初学者:推荐使用 VS Code + Go 扩展,轻量级,配置简单
  • 专业开发:推荐使用 GoLand,功能强大,智能提示和重构支持完善
  • 命令行爱好者:可以使用 Vim/Neovim + vim-go 插件,体验极客开发方式

4. 学习路径建议

  • 第一周:熟悉语法,写完 Hello World 和基础练习题
  • 第二周:掌握并发编程,理解 goroutine 和 channel
  • 第三周:学习标准库和网络编程
  • 第四周:开始实战项目,比如一个 Web API

5. 常见误区

  • 不要死记硬背:Go 语法简洁,不需要背,多写几遍自然就记住了
  • 不要急于求成:并发编程是 Go 的精髓,但不要一开始就追求高并发,先把基础打牢
  • 不要忽视测试:Go 的测试支持非常好,从第一个程序开始就要养成写测试的习惯
  • 不要闭门造车:多看优秀项目的源码,比如 Go 标准库源码,质量非常高

练习题

学完这篇文章后,大家可以尝试完成以下练习题来巩固所学知识:

练习题 1:环境验证(⭐)

完成 Go 开发环境的配置,并在终端执行以下命令,将输出截图发送到公众号「极客老墨」后台:

1# 查看 Go 版本
2go version
3
4# 查看 Go 环境信息
5go env GOPROXY GOROOT GOPATH
6
7# 运行你的第一个 Go 程序
8go run hello_world.go

练习题 2:程序结构分析(⭐)

创建一个新的 Go 文件 program_structure.go,包含以下内容:

 1package main
 2
 3import "fmt"
 4
 5func main() {
 6    fmt.Println("Go 程序结构说明")
 7    fmt.Println("================")
 8    fmt.Println("1. package main - 定义包名")
 9    fmt.Println("2. import \"fmt\" - 导入包")
10    fmt.Println("3. func main() - 主函数入口")
11    fmt.Println("4. fmt.Println - 调用函数")
12}

运行程序并理解每一行代码的作用。

练习题 3:命令行参数(⭐⭐)

编写一个程序 args_demo.go,接收命令行参数并输出:

 1package main
 2
 3import (
 4    "fmt"
 5    "os"
 6)
 7
 8func main() {
 9    // 获取命令行参数
10    args := os.Args
11
12    // 输出参数个数和内容
13    fmt.Printf("参数个数: %d\n", len(args)-1)
14    fmt.Printf("程序名称: %s\n", args[0])
15    fmt.Println("参数列表:")
16    for i, arg := range args[1:] {
17        fmt.Printf("  参数 %d: %s\n", i+1, arg)
18    }
19}

运行程序并传入几个参数测试。

练习题 4:Go 命令实践(⭐⭐)

使用 Go 命令行工具完成以下任务:

  1. 使用 go build 编译练习题 2 和 3 的程序
  2. 使用 go clean 清除编译产物
  3. 使用 go run 直接运行程序
  4. 使用 go doc fmt Println 查看函数文档
  5. 使用 go list -m all 查看当前模块的依赖

将每个命令的输出记录下来,理解它们的作用。

练习题 5:探索 Go(⭐⭐⭐)

使用 go help 命令探索 Go 的命令行工具,尝试以下命令并写出你的理解:

 1# 查看所有命令
 2go help
 3
 4# 查看特定命令的帮助
 5go help build
 6go help run
 7go help test
 8go help mod
 9
10# 探索你不熟悉的命令
11go help <command>

尝试 3 个你之前没用过的命令,并写一段话说明它们的作用。

思考题

  1. 为什么 Google 要创造 Go 语言? 它要解决什么问题?
  2. Go 和 Java、C++ 相比,有什么优势和劣势?
  3. 为什么 Go 被称为"云原生时代的语言"?
  4. Go 的创始人之一 Rob Pike 说 Go 的影响比预期更广泛,你觉得原因是什么?

评论区秀出你的想法,大家一起讨论!


极客老墨,继续折腾!

如果有任何问题,欢迎在评论区留言或关注公众号「极客老墨」交流。

本文示例代码在 go-tutorial-code/01-intro


相关阅读