인터페이스는 현지화되어 있으며, Skill 소개와 설명 문서는 선택한 언어로 AI가 자동 번역합니다. 코드·명령어·경로·전문 용어는 원문을 유지하며 원작자 문서가 우선합니다.
Skills 둘러보기
배포 및 운영 · SKILL.md

go

go

Use when writing Go/Golang code — goroutines/channels concurrency, net/http web servers, database/sql, generics (1.18+), module management, testing and benchmarking. Go: the language powering Docker, Kubernetes, and cloud-native infrastructure.

Independent GitHub snapshot · Automated classification · Original documentation governs

Skill 문서

GitHub

name: go description: "Use when writing Go/Golang code — goroutines/channels concurrency, net/http web servers, database/sql, generics (1.18+), module management, testing and benchmarking. Go: the language powering Docker, Kubernetes, and cloud-native infrastructure." tags:

  • go
  • golang
  • backend
  • concurrency
  • cloud-native
  • compiled
  • static-typed
  • server
  • cli

官网: https://go.dev/

项目地址: https://github.com/golang/go

官方文档: https://go.dev/doc/

Go by Example: https://gobyexample.com/

Effective Go: https://go.dev/doc/effective_go

许可证: BSD-3-Clause | 最新稳定版: go1.27.1(2026-09,见 go.dev/dl)

概述

Go 是由 Robert Griesemer、Rob Pike 和 Ken Thompson 于 2007 年在 Google 发起的编程语言,2009 年首次公开发布,2012 年发布 Go 1.0。核心设计目标:简洁、高效、安全、并发优先、工程化。

特性说明
静态类型 + 编译型无运行时解释开销,编译为单文件原生机器码
垃圾回收并发三色标记清除 GC,亚毫秒级 STW
内置并发goroutine(轻量线程,2KB 初始栈)+ channel(CSP 模型)
快速编译增量编译 + 包缓存,大型项目秒级构建
丰富标准库net/http、database/sql、encoding/json、context 等开箱即用
统一代码风格gofmt 内置格式化,无风格争议
模块系统Go Modules(go.mod),语义版本控制
泛型Go 1.18+ 支持类型参数
工具链testing、benchmark、pprof、race detector 内置

版本里程碑

版本年份关键特性
1.02012首个稳定版
1.72016context 正式入标准库
1.112018Go Modules 引入
1.132019error wrapping(%w)
1.182022泛型、模糊测试、workspace(go.work)
1.212023slices/maps 标准库、log/slog、atomic 类型、cmp.Ordered
1.222024循环变量每次迭代新作用域、增强 ServeMux 路由
1.232024range over func(迭代器函数)、unique 包
1.242025泛型类型别名、Swiss Table map 优化、weak 指针
1.262026GC 默认启用新算法、工具链增强

环境准备

安装

# macOS
brew install go

# Linux(官方二进制)
wget https://go.dev/dl/go1.27.1.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.27.1.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin

# Windows
winget install Golang.go

环境变量

go env GOROOT          # Go 安装目录
go env GOPATH          # Go 工作区(默认 ~/go)
go env GOPROXY         # 模块代理(国内推荐 https://goproxy.cn)
go env GOSUMDB         # 校验数据库(默认 sum.golang.org)
go env GO111MODULE     # 模块模式(on,Go 1.22+ 默认)

# 国内加速
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GOSUMDB=sum.golang.google.cn

IDE 推荐

  • VS Code + gopls(免费,推荐)
  • GoLand(JetBrains,商业)
  • Neovim + gopls(终端流)

基础语法、方法与接口、并发、错误处理与泛型的完整讲解见 reference/language-basics.md 包管理与工程化、标准库速查、Web 开发、数据库与测试的完整内容见 reference/stdlib-web-db.md

典型工作流

构建一个包含数据库和中间件的 Go REST API 服务

# 1. 初始化模块
go mod init example.com/myapi

# 2. 添加依赖
go get github.com/go-chi/chi/v5
go get github.com/go-sql-driver/mysql
go get github.com/redis/go-redis/v9
// 3. cmd/api/main.go
package main

import (
    "log"
    "net/http"
    "github.com/go-chi/chi/v5"
    "github.com/go-chi/chi/v5/middleware"
)

func main() {
    r := chi.NewRouter()

    // 中间件
    r.Use(middleware.Logger)
    r.Use(middleware.Recoverer)
    r.Use(middleware.Timeout(30 * time.Second))

    // 路由
    r.Get("/health", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte(`{"status":"ok"}`))
    })

    r.Route("/api/users", func(r chi.Router) {
        r.Get("/", listUsers)
        r.Post("/", createUser)
        r.Get("/{id}", getUser)
    })

    log.Println("Server on :8080")
    log.Fatal(http.ListenAndServe(":8080", r))
}
# 4. 运行
go run ./cmd/api

AI 使用建议

  1. 优先用标准库:Go 标准库覆盖面广(net/http、database/sql、encoding/json)。评估第三方依赖前先检查标准库。
  2. 错误必须处理:Go 没有 try/catch。每个 error 返回值都必须检查,避免 _ 忽略。
  3. 用 context 传播取消:所有 I/O 操作应接受 context.Context 参数,支持超时和取消。
  4. goroutine 防泄漏:确保每个 goroutine 都有退出路径(channel 关闭 / context 取消 / done 信号)。
  5. 先写测试:table-driven 测试是 Go 社区标准实践。
  6. gofmt 是强制的:永远不要手动调格式,交给 gofmt/goimports。
  7. 用 golangci-lint:集成 staticcheck、go vet、unused 等多类静态检查。
  8. 接口定义在消费方:Go 风格是消费者定义接口(interface),而非提供者。
  9. 结构体对齐:字段按大小降序排列可减少 struct 内存占用(对齐填充)。

常见问题

陷阱说明解决方案
切片共享底层数组s2 := s1[2:5] 后修改 s2 影响 s1用 copy() 创建独立副本
循环变量捕获(Go <1.22)闭包捕获的循环变量引用同一地址Go 1.22+ 已修复;旧版传参 func(i int)
nil 接口不等于 nilvar p *T; var i error = p; i != nil检查 if p == nil 而非接口
nil map 写入 panicvar m map[string]int; m["a"]=1 panic先 m = make(map[string]int)
defer 在循环中大量 defer 堆积不执行提取为函数或立即调用
map 并发写 panic多 goroutine 同时写同一 map用 sync.Map 或加锁
浮点数比较0.1 + 0.2 != 0.3使用 tolerance 比较

参考资源

저장한 Skills