01-Go环境搭建
Go语言简介
Go由Google于2009年发布,Robert Griesemer、Rob Pike、Ken Thompson设计。静态类型、编译型语言,天生支持并发。
设计目标
编译速度快:大型项目秒级编译
并发原生支持:goroutine和channel
内存安全:自动垃圾回收,无指针运算
简洁语法:25个关键字,学习曲线平缓
高效执行:接近C的性能
应用场景
云原生基础设施:
Docker、Kubernetes容器编排
etcd、Consul服务发现
Prometheus监控系统
Web后端:
微服务API
高并发Web服务器
RESTful/gRPC服务
DevOps工具:
命令行工具(Cobra、urfave/cli)
部署脚本
监控代理
网络编程:
代理服务器
负载均衡器
VPN、隧道工具
区块链:
Ethereum Go客户端(Geth)
Hyperledger Fabric
语言特点
优势:
编译快,执行快(静态链接,单一可执行文件)
并发简单(goroutine比线程轻量1000倍)
内存安全(GC,无手动管理)
部署简单(单一二进制文件,无依赖)
标准库强大(HTTP、JSON、加密等)
劣势:
泛型支持晚(Go 1.18才引入)
错误处理冗余(if err != nil到处可见)
包管理演进(GOPATH → vendor → Go Modules)
缺少传统OOP(无继承、类)
安装Go
Linux
# 下载
wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz
# 解压到/usr/local
sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz
# 配置环境变量(~/.bashrc或~/.zshrc)
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
# 验证
go version
macOS
# Homebrew
brew install go
# 验证
go version
# 环境变量(~/.zshrc)
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
Windows
下载MSI安装包:go.dev
安装(自动配置PATH)
验证:
go version
环境配置
GOPATH结构(Go 1.11之前)
$GOPATH/
├── bin/ # 可执行文件
├── pkg/ # 编译包缓存
└── src/ # 源代码
└── github.com/
└── username/
└── project/
Go Modules(Go 1.11+,推荐)
# 初始化模块
go mod init github.com/username/project
# 生成go.mod
module github.com/username/project
go 1.21
require (
github.com/gin-gonic/gin v1.9.0
)
# 添加依赖
go get github.com/gin-gonic/gin
# 整理依赖
go mod tidy
# 下载依赖
go mod download
# 查看依赖图
go mod graph
# vendor目录(可选)
go mod vendor
Hello World
基本程序
// main.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
# 运行
go run main.go
# 编译
go build main.go
./main
# 编译并安装到$GOPATH/bin
go install main.go
包和导入
// math/add.go
package math
func Add(a, b int) int { // 大写字母开头=导出(public)
return a + b
}
func subtract(a, b int) int { // 小写=未导出(private)
return a - b
}
// main.go
package main
import (
"fmt"
"myproject/math" // 导入本地包
"github.com/gin-gonic/gin" // 导入第三方包
)
func main() {
result := math.Add(3, 4)
fmt.Println(result)
}
开发工具
VS Code
轻量级,Go支持优秀。
必装插件:
Go(官方插件)
配置(settings.json):
{
"go.useLanguageServer": true,
"go.lintTool": "golangci-lint",
"go.lintOnSave": "workspace",
"go.formatTool": "goimports",
"editor.formatOnSave": true,
"go.testFlags": ["-v"],
"go.coverOnSave": true
}
GoLand
JetBrains专业Go IDE。
特性:
智能补全
重构工具
调试器
测试集成
数据库工具
Vim/Neovim
轻量高效,vim-go插件强大。
" 安装vim-go
Plug 'fatih/vim-go'
" 常用命令
:GoRun " 运行
:GoBuild " 编译
:GoTest " 测试
:GoCoverage " 覆盖率
:GoDoc " 文档
:GoFmt " 格式化
Go工具链
go命令
# 运行
go run main.go
# 编译
go build # 当前目录
go build -o myapp # 指定输出名
go build -ldflags="-s -w" # 减小二进制大小
# 安装
go install github.com/user/tool@latest
# 获取依赖
go get github.com/gin-gonic/gin
go get -u # 更新依赖
# 测试
go test # 当前包
go test ./... # 所有包
go test -v # 详细输出
go test -cover # 覆盖率
go test -bench=. # 基准测试
# 格式化
go fmt ./... # 格式化所有文件
gofmt -w main.go # 写入文件
# 代码检查
go vet ./... # 静态分析
# 文档
go doc fmt.Println
go doc -all fmt
# 清理
go clean
go clean -modcache # 清理模块缓存
第三方工具
# goimports:自动管理导入
go install golang.org/x/tools/cmd/goimports@latest
goimports -w main.go
# golangci-lint:综合代码检查
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
golangci-lint run
# delve:调试器
go install github.com/go-delve/delve/cmd/dlv@latest
dlv debug main.go
# air:热重载
go install github.com/cosmtrek/air@latest
air
# godoc:本地文档服务器
go install golang.org/x/tools/cmd/godoc@latest
godoc -http=:6060
项目结构
标准布局
myproject/
├── go.mod # 模块定义
├── go.sum # 依赖校验
├── main.go # 程序入口
├── cmd/ # 可执行文件
│ └── server/
│ └── main.go
├── internal/ # 私有代码(不可导入)
│ ├── config/
│ └── service/
├── pkg/ # 可导入的库代码
│ └── utils/
├── api/ # API定义
│ └── proto/
├── web/ # Web资源
│ ├── static/
│ └── templates/
├── configs/ # 配置文件
├── scripts/ # 脚本
├── docs/ # 文档
├── test/ # 额外测试
└── vendor/ # 依赖(可选)
编译和交叉编译
编译选项
# 基本编译
go build main.go
# 优化二进制大小
go build -ldflags="-s -w" main.go
# -s:去除符号表
# -w:去除调试信息
# 静态链接(不依赖动态库)
CGO_ENABLED=0 go build -a -installsuffix cgo main.go
# 设置版本信息
go build -ldflags="-X main.version=1.0.0" main.go
交叉编译
# Linux
GOOS=linux GOARCH=amd64 go build main.go
# Windows
GOOS=windows GOARCH=amd64 go build -o app.exe main.go
# macOS
GOOS=darwin GOARCH=amd64 go build main.go
# ARM
GOOS=linux GOARCH=arm64 go build main.go
# 查看支持的平台
go tool dist list
代码规范
命名约定
// 包名:小写,单个单词
package server
// 导出标识符:大写开头
type User struct {}
func NewUser() *User {}
const MaxSize = 100
// 未导出:小写开头
func processData() {}
var count int
// 缩写:保持一致
// URL, HTTP(全大写)或url, http(全小写)
func GetHTTPClient() {} // ✓
func GetHttpClient() {} // ✗
// 接口:通常以er结尾
type Reader interface {}
type Writer interface {}
// 变量:驼峰命名
var userName string
var maxRetryCount int
代码风格
// gofmt自动格式化,无争议
// 缩进:tab
if condition {
statement
}
// 大括号:K&R风格(强制)
func example() { // ✓
// ...
}
func example() // ✗ 编译错误
{
// ...
}
// 注释:包、导出类型、导出函数必须有文档注释
// Package math provides mathematical functions.
package math
// Add returns the sum of a and b.
func Add(a, b int) int {
return a + b
}
性能分析
pprof
import (
"net/http"
_ "net/http/pprof"
)
func main() {
go func() {
http.ListenAndServe("localhost:6060", nil)
}()
// 程序逻辑
}
# CPU profile
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
# 内存profile
go tool pprof http://localhost:6060/debug/pprof/heap
# goroutine
go tool pprof http://localhost:6060/debug/pprof/goroutine
# 分析二进制
go test -cpuprofile=cpu.prof -bench=.
go tool pprof cpu.prof
Benchmark
// benchmark测试
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(3, 4)
}
}
// 运行
// go test -bench=. -benchmem
// 输出:ns/op(纳秒/操作)、B/op(字节/操作)、allocs/op(分配次数/操作)
常用命令速查
go version # Go版本
go env # 环境变量
go run # 运行
go build # 编译
go install # 编译+安装
go get # 下载依赖
go test # 测试
go fmt # 格式化
go vet # 静态检查
go doc # 文档
go mod init # 初始化模块
go mod tidy # 整理依赖
go mod download # 下载依赖
go mod vendor # 创建vendor
go clean # 清理
go generate # 代码生成
go list # 列出包
核心: Go工具链完整,单一命令完成大部分任务。