全部文章

Go 语言入门

Go 安装配置、常用命令、项目结构、并发编程与交叉编译

目录 18 节

Go 语言入门

Go 是 Google 开发的编译型语言,以简洁、高效和原生并发著称。

这页适合已经写过一点脚本或后端、准备正式上手 Go 的开发者。建议把它当成“从安装到项目结构再到并发与发布”的入门路线,而不是只记零散语法。

推荐上手顺序

一个比较顺的学习路径通常是:

  1. 先会 go rungo buildgo test
  2. 再理解模块管理与依赖下载
  3. 然后掌握结构体、接口、错误处理
  4. 最后再进入 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/apicmd/worker
  • internal/:只给当前项目内部使用的代码
  • 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

常用库

说明
GinHTTP Web 框架
GORMORM
CobraCLI 框架
Viper配置管理
Zap高性能日志

构建与发布建议

  • 本地开发先用 go test ./... 保证基本质量
  • 提交前跑 go fmt ./...go vet ./...
  • 需要跨平台时,再使用 GOOS / GOARCH 交叉编译
  • 如果项目要容器化,可以直接把二进制打进一个很小的运行镜像里

Go 很适合做 CLI、API 服务、任务处理器和轻量守护进程;它的优势通常体现在“部署简单”和“单文件二进制”。

延伸阅读

VS Code 配置

安装 Go 扩展,会自动安装 gopls 等工具。

参考链接

阅读建议
  • - 先读标题和摘要,再结合目录决定从哪个章节开始精读。
  • - 看到具体命令、配置或步骤时,尽量在自己的环境里同步验证。
  • - 如果你只是快速查资料,可先看目录和相关文档,再决定是否深入全文。
适合谁看
  • - 希望把零散经验整理成长期可复用工作流的人
  • - 想先建立认知,再决定是否深入实践的人
  • - 希望阅读时顺手建立自己的操作清单或收藏体系的人
执行前检查
  • - 先浏览标题、摘要和目录,带着问题阅读会更高效
  • - 顺手记录真正对你有用的命令、链接和注意事项,避免重复搜索
  • - 如果页面里提到相关文档,尽量一起打开对照,效果通常更完整
同类内容
← 上一篇GitHub Actions 入门