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

  1. 下载MSI安装包:go.dev

  2. 安装(自动配置PATH)

  3. 验证: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工具链完整,单一命令完成大部分任务。