Go 速查表
可搜索、可打印的 Go 参考——结构体、切片、映射、接口、错误封装、goroutine、channel、泛型和 go 命令行工具。免费。
Basics
10package main
Executable entry package
import ("fmt"; "os")
Import standard packages
x := 42
Short declare (inside funcs only)
var s string
Zero value: "" (0, nil, false)
const MaxRetries = 3
Typed or untyped constant
const (A = iota; B; C)
Auto-incrementing enum values
a, b = b, a
Multiple assignment / swap
_, err := doWork()
Blank identifier discards values
fmt.Println("hi"); fmt.Printf("%v\n", x)
Print values (%v = default)
fmt.Sprintf("%s-%d", name, id)
Format into a string
Types, structs & methods
10type User struct { Name string; Age int }
Struct definition
u := User{Name: "Sam", Age: 30}
Struct literal (named fields)
u.Name = "Alex"
Field access / mutation
func (u User) Label() string
Value receiver (reads only)
func (u *User) Rename(n string)
Pointer receiver (mutates)
func NewUser(n string) *User
Constructor function idiom
type Admin struct { User; Level int }
Embedding: fields promoted
type UserID int
Named type (own method set)
Name string `json:"name,omitempty"`
Struct tag for encoding
p := &User{}; p.Name = "x"
Auto-deref through pointers
Slices & maps
13s := []int{1, 2, 3}
Slice literal
s = make([]int, 0, 10)
Empty slice with capacity 10
s = append(s, 4, 5)
Append (reassign the result)
n := copy(dst, src)
Copy elements between slices
s[1:3]
Sub-slice (shares the array)
len(s), cap(s)
Length and capacity
var s []int; s = append(s, 1)
Appending to nil is fine
m := map[string]int{"a": 1}
Map literal
v, ok := m["key"]
Lookup with existence check
delete(m, "key")
Remove a key
for k, v := range m { ... }
Iterate (order is random)
slices.Contains(s, 3)
Search helper (Go 1.21+)
slices.Sort(s); maps.Keys(m)
slices / maps packages
Control flow
10for i := 0; i < n; i++ { ... }
Classic for (the only loop)
for i, v := range items { ... }
Index + value iteration
for cond { ... }
While-style loop
for { ... }
Infinite loop (break to exit)
for i := range 10 { ... }
Range over int (Go 1.22+)
if err := load(); err != nil { ... }
If with init statement
switch status { case "on": ... default: ... }
No fallthrough by default
switch { case n > 10: ... }
Condition-less switch chain
switch v := x.(type) { case int: ... }
Type switch
outer: for { break outer }
Labeled break / continue
Functions & defer
9func add(a, b int) int { return a + b }
Basic function
func load() ([]byte, error)
Multiple return values
func div(a, b int) (q int, err error)
Named return values
func sum(ns ...int) int
Variadic; call sum(s...)
defer f.Close()
Run at function exit
defer mu.Unlock() // LIFO order
Multiple defers run in reverse
counter := func() int { n++; return n }
Closure captures variables
type Handler func(w, r)
Function type declaration
apply(items, strings.ToUpper)
Functions are first-class values
Interfaces & type assertions
10type Stringer interface { String() string }
Interface: a method set
// no "implements" keyword
Satisfaction is implicit
io.Reader / io.Writer
The ubiquitous stream duo
var x any = 42
any = interface{} (anything)
s, ok := x.(string)
Type assertion (safe form)
switch v := x.(type) { case string: ... }
Branch by dynamic type
type ReadCloser interface { Reader; Closer }
Interface embedding
func Save(w io.Writer, u User) error
Accept interfaces...
func NewStore() *Store
...return concrete structs
var _ Stringer = (*User)(nil)
Compile-time conformance check
Error handling
10if err != nil { return err }
The fundamental pattern
errors.New("not found")
Simple error value
fmt.Errorf("load %s: %w", path, err)
Wrap with context (%w)
errors.Is(err, os.ErrNotExist)
Match a sentinel in the chain
var pe *fs.PathError; errors.As(err, &pe)
Extract a typed error
var ErrNotFound = errors.New("not found")
Exported sentinel error
func (e *ValidationError) Error() string
Custom error type
errors.Join(err1, err2)
Combine multiple errors
defer func() { recover() }()
Recover from a panic
panic("unreachable")
Only for programmer errors
Goroutines & channels
12go work()
Start a goroutine
ch := make(chan int)
Unbuffered (synchronous) channel
ch := make(chan int, 10)
Buffered channel
ch <- v / v := <-ch
Send / receive
close(ch); for v := range ch { ... }
Drain until closed
select { case v := <-a: ... case b <- x: ... }
Wait on multiple channels
var wg sync.WaitGroup; wg.Add(1); wg.Wait()
Wait for goroutines
defer wg.Done()
Signal completion
for job := range jobs { results <- run(job) }
Worker pool body
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
Deadline for downstream work
select { case <-ctx.Done(): return ctx.Err() }
Abort on cancellation
var mu sync.Mutex; mu.Lock(); defer mu.Unlock()
Guard shared state
Generics
9func Map[T, U any](s []T, f func(T) U) []U
Generic function
func Keys[K comparable, V any](m map[K]V) []K
comparable: map-key types
type Number interface { ~int | ~float64 }
Union constraint (~ = derived)
func Sum[T Number](ns []T) T
Use a custom constraint
type Stack[T any] struct { items []T }
Generic type
s := Stack[int]{}
Explicit instantiation
doubled := Map(nums, double)
Type args usually inferred
func Min[T cmp.Ordered](a, b T) T
cmp.Ordered: < > comparable
min(a, b), max(a, b)
Builtins since Go 1.21
Standard library gems
14strings.Split(s, ","); strings.Join(parts, "-")
Split and join
strings.Contains, HasPrefix, TrimSpace
Everyday string helpers
n, err := strconv.Atoi("42")
String → int (Itoa reverses)
time.Now(); time.Since(start)
Current time and elapsed
t.Format("2006-01-02 15:04")
Reference-date layout
time.Sleep(200 * time.Millisecond)
Pause the goroutine
data, err := os.ReadFile("cfg.json")
Read a whole file
os.WriteFile(path, data, 0o644)
Write a file with perms
os.Getenv("HOME"); filepath.Join(dir, f)
Env vars and safe paths
json.Marshal(v); json.Unmarshal(b, &v)
JSON encode / decode
resp, err := http.Get(url); defer resp.Body.Close()
HTTP client call
http.HandleFunc("/", h); http.ListenAndServe(":8080", nil)
Minimal HTTP server
slog.Info("started", "port", 8080)
Structured logging (1.21+)
sc := bufio.NewScanner(f); for sc.Scan()
Read input line by line
Testing & benchmarks
11func TestAdd(t *testing.T) { ... }
Test in *_test.go
t.Errorf("got %d, want %d", got, want)
Fail but keep running
t.Fatalf("setup failed: %v", err)
Fail and stop this test
tests := []struct{ in, want int }{...}
Table-driven test data
t.Run(tc.name, func(t *testing.T) {...})
Named subtests
t.Helper()
Blame the caller in failures
t.Parallel()
Run this test concurrently
func BenchmarkAdd(b *testing.B) { for range b.N { add(1, 2) } }
Benchmark loop
go test -bench=. -benchmem
Run benchmarks + allocations
go test -run TestAdd ./...
Run tests matching a pattern
go test -cover ./...
Coverage summary
Go CLI
11go mod init example.com/app
Start a new module
go mod tidy
Sync go.mod with imports
go get github.com/pkg/x@latest
Add / upgrade a dependency
go run .
Compile and run in one step
go build ./...
Build all packages
go test ./...
Test the whole module
go vet ./...
Static analysis for bugs
gofmt -w .
Format all source files
go install golang.org/x/tools/...@latest
Install a tool binary
GOOS=linux GOARCH=amd64 go build
Cross-compile
go doc strings.Split
Read docs in the terminal
没有条目匹配“:q”。
关于 Go 速查表
这份 Go 速查表将地道的 Go 浓缩到一个可搜索的页面上:基础知识、类型、结构体和方法、切片和映射、控制流、函数和 defer、接口和类型断言、错误处理、goroutine 和 channel、泛型、标准库精华、测试和基准测试,以及 go 命令行工具。
它聚焦于 Go 开发者查阅而非记忆的内容——删除切片元素的确切技巧、errors.Is 和 errors.As 的区别、带超时的 select 语句、表驱动测试,或者哪个 go 命令做什么——每一行都有简短的说明。
本速查表免费且在客户端运行:使用搜索框实时过滤行,通过固定目录在章节间跳转,点击即可复制任何代码片段,还可以打印页面作为编码时的参考。
如何使用 Go 速查表
- 浏览各章节,从“基础知识”和“切片和映射”到“goroutine 和 channel”和“Go 命令行”。
- 搜索关键词如 channel、defer 或 errors.Is 以实时过滤每一行。
- 需要类型语法而非命令时跳转到“接口”或“泛型”。
- 点击代码片段或其复制图标,将 Go 代码复制到剪贴板。
- 打印本速查表获取离线 Go 参考。
常见问题
十二个章节:基础知识、类型和结构体、切片和映射、控制流、函数和 defer、接口和类型断言、错误处理、goroutine 和 channel、泛型、标准库精华、测试和基准测试,以及 go 命令行。
是的。专门的章节涵盖了 goroutine、缓冲和非缓冲 channel、带超时的 select、WaitGroup、Mutex 和 context 取消。
包含——类型参数、约束、comparable 和 any 约束,以及泛型函数和类型各有专门的行。
可以。点击任何代码片段或其悬停复制图标,即可复制到剪贴板并显示简短确认。
是的,完全免费——可搜索、可打印,在浏览器中渲染,无需注册。
热门搜索
go 速查表
golang 速查表
go 语法参考
go 切片和映射
goroutine 和 channel
go 错误处理
go 命令行命令
需要帮助?
使用此工具时遇到问题?请告诉我们的团队。