本文翻译自我的英文博客,最新修订内容可随时参考:: Go Cheatsheet
以下是整理后的 Go 语言速查表,涵盖语法、依赖管理、数据类型、常用功能等核心知识点,结构清晰便于快速查阅:
一、语法规则
- 导出规则
- 首字母大写的
const/var/func/type 可被其他包访问(类似公共成员)。
- 首字母小写为包内私有(类似私有成员)。
- 代码格式
{ 必须与语句同行(如 if condition {)。
- 语句末尾无需分号(编译器自动处理)。
- 注释
- 行注释:
// 单行注释
- 块注释:
/* 多行注释 */
- 字符串拼接:使用
+ 运算符。
- 格式化输出:
fmt.Printf("格式字符串", 值),支持 %v(默认格式)、%+v(带字段名)等。
二、依赖管理
1. 环境变量
go env
2. 工具对比
| 工具 | 特点 |
|---|
| go get | 下载第三方库到 GOPATH/src,依赖版本单一,易冲突 |
| go vendor | 将依赖复制到项目 vendor 目录,冗余但隔离,仍存在版本问题 |
| go module | Go 1.11+ 推荐方案,通过 go.mod 管理版本,支持多版本共存 |
3. go module 常用命令
go mod init [模块名]
go mod tidy
go mod download
4. 依赖代理
GOPROXY='https://proxy.golang.org,direct'
三、数据类型
1. 基础类型默认值
| 类型 | 默认值 |
|---|
| 数值类型 | 0 |
| 字符串 | "" |
| 布尔类型 | false |
| 指针/切片/映射等 | nil |
2. nil 适用类型
var (
ptr *int
slc []int
m map[string]int
ch chan int
fn func()
err error
)
3. 值类型 vs 引用类型
| 类型 | 存储方式 | 复制行为 | 常见类型 |
|---|
| 值类型 | 直接存储值 | 复制值(地址不同) | 整型、浮点型、字符串、数组 |
| 引用类型 | 存储值的地址 | 复制地址(共享数据) | 指针、切片、映射、通道、函数、接口、结构体指针 |
四、变量与常量
1. 变量声明
var name string = "value"
var a, b int = 1, 2
x := 10
s := "hello"
var (
user = "admin"
pass = "123456"
)
2. 常量与 iota
const Pi = 3.1415926
const (
A = iota
B
C = 100
D
E = iota
)
五、运算符
| 运算符 | 说明 | 示例 |
|---|
& | 取地址 | ptr := &x |
* | 解引用(指针取值) | val := *ptr |
<- | 通道发送/接收数据 | ch <- value |
:= | 简短变量声明 | x := 20 |
六、流程控制
1. if 语句
if num := 9; num < 0 {
fmt.Println("负数")
} else if num < 10 {
fmt.Println("个位数")
} else {
fmt.Println("多位数")
}
2. switch 语句
switch {
case age < 18:
fmt.Println("未成年")
case age < 60:
fmt.Println("成年")
default:
fmt.Println("老年")
}
switch v := x.(type) {
case int:
fmt.Printf("x 是 int,值为 %d\n", v)
case string:
fmt.Printf("x 是 string,值为 %s\n", v)
}
3. for 循环
for i := 0; i < 5; i++ {
fmt.Println(i)
}
nums := []int{1, 2, 3}
for idx, val := range nums {
fmt.Printf("索引 %d,值 %d\n", idx, val)
}
m := map[string]int{"a": 1, "b": 2}
for key, value := range m {
fmt.Printf("key: %s,value: %d\n", key, value)
}
4. select 语句(通道监听)
select {
case msg := <-ch1:
fmt.Println("ch1:", msg)
case ch2 <- "hello":
fmt.Println("ch2 发送成功")
default:
fmt.Println("无操作")
}
七、复合类型
1. 数组(固定长度)
var arr [3]int = [3]int{1, 2, 3}
fmt.Println(arr[0])
2. 切片(动态数组)
slc := make([]int, 5, 10)
slc = []int{1, 2, 3}
slc = append(slc, 4)
copy(dst, src)
fmt.Println(len(slc))
fmt.Println(cap(slc))
3. 映射(键值对)
m := make(map[string]int)
m["one"] = 1
val, ok := m["two"]
delete(m, "one")
fmt.Println(len(m))
八、函数与闭包
1. 函数声明
func add(a, b int) (int, error) {
return a + b, nil
}
func sum(nums ...int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
sum(1, 2, 3)
sum([]int{1, 2, 3}...)
2. 闭包(匿名函数)
func counter() func() int {
count := 0
return func() int {
count++
return count
}
}
c := counter()
fmt.Println(c())
fmt.Println(c())
3. defer 语句(延迟执行)
func main() {
defer fmt.Println(" deferred")
fmt.Println("main")
}
九、指针与结构体
1. 指针操作
x := 10
ptr := &x
*ptr = 20
fmt.Println(x)
2. 结构体
type User struct {
Name string `json:"name"`
Age int
}
func (u User) GetName() string {
return u.Name
}
func (u *User) SetAge(age int) {
u.Age = age
}
u := User{"Alice", 20}
u.SetAge(21)
十、错误处理
1. 错误接口
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("除数不能为零")
}
return a / b, nil
}
result, err := divide(10, 0)
if err != nil {
fmt.Println("错误:", err)
return
}
2. panic 与 recover(处理运行时错误)
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("恢复:", r)
}
}()
panic("运行时错误")
}
十一、常用标准库
1. 字符串操作(strings)
import "strings"
s := "hello world"
strings.Contains(s, "world")
strings.Split(s, " ")
strings.ToUpper(s)
2. JSON 编解码(encoding/json)
type Data struct {
Name string `json:"name"`
Age int `json:"age"`
}
data := Data{"Alice", 30}
jsonData, _ := json.Marshal(data)
fmt.Println(string(jsonData))
var result Data
json.Unmarshal(jsonData, &result)
3. 时间处理(time)
now := time.Now()
fmt.Println(now.Format("2006-01-02 15:04:05"))
duration := time.Hour * 2
fmt.Println(duration.Minutes())
4. 系统交互(os/exec)
import "os/exec"
cmd := exec.Command("ls", "-l")
output, _ := cmd.CombinedOutput()
fmt.Println(string(output))
十二、关键概念速记
| 概念 | 要点 |
|---|
| 导出规则 | 首字母大写可被其他包访问,小写为包内私有 |
| 切片 vs 数组 | 切片是动态数组(长度可变),数组长度固定 |
| 值类型复制 | 复制值本身,新变量与原变量地址不同(如 int, string) |
| 引用类型复制 | 复制地址,新旧变量共享数据(如 slice, map) |
| defer 执行顺序 | 按声明逆序执行(FILO),常用于资源清理(如关闭文件、释放锁) |
| 接口断言 | 使用 x.(type) 或 switch 判断接口具体类型,避免运行时错误 |
如需进一步了解某个知识点(如并发模式、性能优化等),欢迎随时提问!完整内容请参考 Go Cheatsheet 获取最新修订。