Go 语言入门
Go 是 Google 开发的编译型语言,以简洁、高效和原生并发著称。
这页适合已经写过一点脚本或后端、准备正式上手 Go 的开发者。建议把它当成“从安装到项目结构再到并发与发布”的入门路线,而不是只记零散语法。
推荐上手顺序
一个比较顺的学习路径通常是:
- 先会
go run、go build、go test - 再理解模块管理与依赖下载
- 然后掌握结构体、接口、错误处理
- 最后再进入 goroutine、channel、服务端框架与部署
Go 的关键不是语法多,而是代码组织和工程习惯要尽早建立。
安装
winget install GoLang.Go
# 或
scoop install go
验证:
go version
环境配置
# 查看环境
go env
# 设置代理(国内推荐)
go env -w GOPROXY=https://goproxy.cn,direct
# 启用模块
go env -w GO111MODULE=on
项目管理
# 初始化模块
go mod init github.com/user/project
# 添加依赖
go get github.com/gin-gonic/gin
# 整理依赖
go mod tidy
# 下载依赖
go mod download
常见目录结构
小项目可以先从简单结构起步:
my-app/
go.mod
main.go
internal/
pkg/
cmd/
可以这样理解:
cmd/:应用入口,例如cmd/api、cmd/workerinternal/:只给当前项目内部使用的代码pkg/:准备对外复用、边界更稳定的公共包
如果项目还很小,不要为了“看起来专业”过度拆目录;先保持清晰,再逐步演进。
常用命令
go run main.go # 编译并运行
go build # 编译
go build -o app.exe # 指定输出名
go test ./... # 运行所有测试
go test -v -cover ./... # 详细输出 + 覆盖率
go fmt ./... # 格式化代码
go vet ./... # 静态分析
go install # 编译并安装到 GOPATH/bin
基础语法速查
package main
import "fmt"
// 变量
var name string = "Domi"
count := 42 // 短声明
// 函数
func add(a, b int) int {
return a + b
}
// 多返回值
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, fmt.Errorf("division by zero")
}
return a / b, nil
}
// 结构体
type User struct {
Name string `json:"name"`
Email string `json:"email"`
}
func (u User) String() string {
return fmt.Sprintf("%s <%s>", u.Name, u.Email)
}
// 接口
type Reader interface {
Read(p []byte) (n int, err error)
}
上面这段代码是语法速查,不代表真实项目会把变量定义、类型声明和函数都平铺在一个文件里。实际工程里更重要的是:错误处理要显式、包边界要清楚、命名要直接。
并发
// Goroutine
go func() {
fmt.Println("running in goroutine")
}()
// Channel
ch := make(chan string)
go func() { ch <- "hello" }()
msg := <-ch
// 带缓冲
ch := make(chan int, 10)
// Select
select {
case msg := <-ch1:
fmt.Println(msg)
case msg := <-ch2:
fmt.Println(msg)
case <-time.After(time.Second):
fmt.Println("timeout")
}
// WaitGroup
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
fmt.Println(id)
}(i)
}
wg.Wait()
常见误区
过早上复杂框架
Go 的标准库已经能覆盖很多 HTTP、JSON、日志、模板、测试需求。早期项目没必要一开始就堆太多框架,先把标准库用顺,后续扩展会更稳。
忽略错误处理
Go 的错误处理虽然啰嗦,但它能把失败路径显式暴露出来。不要为了“好看”把错误吞掉,尤其是 I/O、网络、数据库和并发相关逻辑。
并发写得快,收尾没处理
goroutine 起起来很容易,但真正容易出 bug 的地方是:
- 通道没人接收导致阻塞
- 忘记关闭资源
- 超时、取消和退出流程没设计
涉及网络或批处理任务时,建议尽早引入 context 作为超时和取消的统一入口。
交叉编译
# Linux
GOOS=linux GOARCH=amd64 go build -o app-linux
# macOS
GOOS=darwin GOARCH=arm64 go build -o app-mac
# Windows
GOOS=windows GOARCH=amd64 go build -o app.exe
PowerShell 中:
$env:GOOS="linux"; $env:GOARCH="amd64"; go build -o app-linux
常用库
| 库 | 说明 |
|---|---|
| Gin | HTTP Web 框架 |
| GORM | ORM |
| Cobra | CLI 框架 |
| Viper | 配置管理 |
| Zap | 高性能日志 |
构建与发布建议
- 本地开发先用
go test ./...保证基本质量 - 提交前跑
go fmt ./...与go vet ./... - 需要跨平台时,再使用
GOOS/GOARCH交叉编译 - 如果项目要容器化,可以直接把二进制打进一个很小的运行镜像里
Go 很适合做 CLI、API 服务、任务处理器和轻量守护进程;它的优势通常体现在“部署简单”和“单文件二进制”。
延伸阅读
VS Code 配置
安装 Go 扩展,会自动安装 gopls 等工具。
参考链接
- Go 官网 — 文档与 Playground
- Go by Example — 示例教程
- Effective Go — 官方最佳实践
- Go Packages — 包文档