大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
Go 是什么
这一课你将能做到
- 说清楚 Go 解决什么问题、适合哪些场景,以及它和 Java/Node 的核心区别
- 完成 Go 1.22+ 环境安装,用
go version命令验证成功 - 编写、运行、编译第一个 Go 程序,并逐行解释它的结构
为什么要学
Go(又名 Golang,因为官网域名是 golang.org)是 Google 在 2009 年开源的编译型语言。设计哲学很明确:在开发效率和运行性能之间取中点——写起来像 Python 一样简洁,跑起来接近 C 的速度。
Docker、Kubernetes、etcd、Prometheus、CockroachDB 全是 Go 写的;国内字节跳动、腾讯、B 站、七牛云的大量后端服务也在用 Go。如今 Go 已经是云原生领域事实上的标准语言。
三句话定位:
- 对比 Java:Go 编译后是一个自包含的二进制文件,不依赖 JVM,拷到服务器就能跑;语法只有 25 个关键字,没有继承、没有注解、没有异常。
- 对比 Python:静态类型 + 编译型,性能高出一到两个数量级,部署不用装解释器。
- 对比 Node.js:goroutine 是真正的并行执行,能吃满多核,而不是单线程事件循环。
对初学者还有一个隐藏好处:语法面极小、标准库统一,能把注意力逼到「解决问题」而不是「语言特性」上。
先建立图像
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
终端运行:
$ go run hello.go
Hello, Go!
这个不到 10 行的文件,包含了 Go 程序的全部骨架:包声明 → 导入 → main 函数。以后写的每一个 Go 服务、每一个 CLI 工具,都是这个结构的放大版。
跟着做
步骤 1:安装 Go
- 打开 https://go.dev/dl/ (国内可用 https://golang.google.cn/dl/ ),下载对应操作系统的安装包,选 1.22 以上版本。
- Windows 双击
.msi,macOS 双击.pkg,Linux 解压到/usr/local并把/usr/local/go/bin加入PATH。 - 打开新终端验证:
$ go version
go version go1.22.5 windows/amd64
能看到版本号,安装就成功了。
步骤 2:配置国内模块代理(可选但强烈建议)
Go 下载第三方依赖默认访问国外服务器,国内经常超时。执行一次即可全局生效:
$ go env -w GOPROXY=https://goproxy.cn,direct
步骤 3:编辑器
VS Code 安装官方 Go 扩展(发布者 Go Team at Google),首次打开 .go 文件时右下角会提示安装工具链,全部同意即可。保存时自动格式化、报错即时提示,开箱即用。
步骤 4:写第一个程序
新建文件夹 hello,在其中创建 hello.go:
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
逐行拆解:
| 代码 | 含义 |
|---|---|
package main | 声明本文件属于 main 包。可执行程序必须有且仅有一个 main 包 |
import "fmt" | 导入标准库 fmt(format),提供格式化输出 |
func main() | 程序入口,从这里开始执行 |
fmt.Println(...) | 打印一行并换行 |
步骤 5:运行与编译
$ go run hello.go # 编译到临时目录并立刻运行,开发时用
$ go build hello.go # 编译出可执行文件 hello.exe(Windows)或 hello(Linux/macOS)
go build 产出的文件不依赖任何运行时,直接执行即可。再试试交叉编译——在 Windows 上产出 Linux 可执行文件:
$ $env:GOOS="linux"; $env:GOARCH="amd64"; go build -o hello hello.go
生成的 hello 文件扔到任意 x86_64 Linux 服务器就能跑,这是 Go 部署体验碾压其他语言的地方。
步骤 6:体验 gofmt
Go 是少数「格式化只有一种写法」的语言。把代码故意写乱(多余空格、错误缩进),然后执行:
$ gofmt -w hello.go
所有 Go 开发者、所有项目的代码格式完全一致,代码评审永远不会为缩进和括号吵架。
讲清楚要点
- Go 是编译型静态语言:写错类型在编译期就报错。
go run只是「编译 + 运行」一步到位,不是解释执行。 - 入口是固定的:可执行程序的入口是
package main中的func main(),参数和返回值都不能带。 - 不需要写分号:词法分析器会自动在行尾插入分号,所以左大括号
{必须和语句同行——这是语法要求,不是风格偏好。 - 强制统一格式:gofmt 是唯一标准,没有 Prettier 之争。
- 单二进制 + 交叉编译:
GOOS/GOARCH两个环境变量切换目标平台,产物零依赖。
你可能会懵的地方
-
Go 和 Golang 是一回事吗? 是。语言名叫 Go,因为 go.org 域名被占用了,官网用了 golang.org,社区才常叫 Golang。命令行工具都叫
go。 -
Go 有类和继承吗? 没有 class,没有继承。Go 用「结构体 + 方法 + 接口」组合出面向对象的能力,是「组合优于继承」的设计,第 4 课细讲。
-
GOPATH 是什么?还需要配置吗? Go 1.11 之前依赖都塞在 GOPATH 里,现在已被 go modules 取代。日常开发不需要手动配置 GOPATH,项目放任意目录都行。
-
为什么
go run感觉很慢? 因为它每次都在真实编译并做完整的静态检查。等程序变大后,go run的「慢」恰恰是帮你把错误挡在运行之前。 -
学 Go 前需要会 C 或 Java 吗? 不需要。Go 语法量小,零基础直接学完全可行;有其他语言经验的人通常一周内就能写出生产级代码。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
文件第一行写 package hello 然后直接 go run | 缺 main 包,无法生成可执行程序 | 入口文件必须是 package main 且含 func main() |
{ 换到下一行 | Go 自动补分号导致语法错误 | 左大括号必须与语句同行 |
| 手动在行尾加分号 | 没必要,gofmt 会删掉 | 依赖自动分号机制 |
把 go run 理解成解释执行 | 误解运行模型 | go run = 编译到临时目录 + 运行 |
| 照着老教程用 GOPATH 建项目 | 已过时 | 用 go modules:go mod init |
卡点急救
go命令找不到:安装后重开终端;仍不行就把C:\Program Files\Go\bin(或/usr/local/go/bin)手动加入 PATH。go get/go mod download超时:执行go env -w GOPROXY=https://goproxy.cn,direct换国内代理。- 编译出的 exe 被杀毒软件删除:把项目目录加入白名单,或用
go build -o app.exe指定输出名。
面试常问
-
Go 的主要特点?为什么选 Go? 编译型静态语言;语法极简(25 个关键字);原生 goroutine 并发,轻量到单机可开百万级;编译快、产物是零依赖单二进制;标准库覆盖网络/加密/测试,部署运维成本低。适用场景:高并发后端服务、云原生基础设施、CLI 工具。
-
Go 和 Java 的核心区别? 无 JVM,编译为原生机器码;无继承无异常,用组合和 error 值;goroutine 协程模型对比线程模型;部署方式完全不同(单文件对比 fat jar + 运行时)。
-
goroutine 是什么?(概念级) Go 运行时调度的轻量级「用户态线程」,初始栈约 2KB,创建/切换成本远低于操作系统线程,是 Go 高并发的基石,第 6 课展开。
自测三问
- Go 程序的入口函数必须满足哪两个条件?
go run和go build分别适合什么场景?- 如何把程序交叉编译成 Linux 可执行文件?
小结一句话
Go 用极简语法 + 编译期安全 + 原生并发 + 零依赖部署,拿下后端与云原生开发的最高性价比;环境装好、hello world 跑通,你就有了继续的一切。
延伸
- A Tour of Go(官方交互教程,浏览器里直接写 Go)
- Go 标准库文档索引
- 下一课:基础语法与类型——变量、零值、常量、iota 与控制流,把地基打实。