7.1. Go 语法速查表
7.1.1. 变量声明
// 完整声明
var name string = "Go"
// 类型推断
var name = "Go"
// 短声明(只能在函数内)
name := "Go"
// 多变量声明
var a, b, c int
x, y := 1, 2
// 常量
const Pi = 3.14159
const (
StatusOK = 200
StatusNotFound = 404
)
// iota 枚举
const (
Sunday = iota // 0
Monday // 1
Tuesday // 2
)
7.1.2. 基本类型
// 数值类型
int, int8, int16, int32, int64
uint, uint8, uint16, uint32, uint64
float32, float64
complex64, complex128
// 其他
bool
string
byte // uint8 别名
rune // int32 别名,表示 Unicode 码点
// 零值
数值: 0
布尔: false
字符串: ""
指针/切片/map/channel/函数/接口: nil
7.1.3. 控制结构
// if
if x > 0 {
// ...
} else if x < 0 {
// ...
} else {
// ...
}
// if 带初始化
if v := compute(); v > 0 {
// v 的作用域仅在 if 块内
}
// for
for i := 0; i < 10; i++ { }
// while 风格
for condition { }
// 无限循环
for { }
// range
for i, v := range slice { }
for k, v := range map { }
for i, c := range "string" { } // c 是 rune
// switch
switch x {
case 1:
// 自动 break
case 2, 3:
// 多值匹配
default:
// 默认
}
// switch 无表达式
switch {
case x > 0:
// ...
case x < 0:
// ...
}
// type switch
switch v := i.(type) {
case int:
// v 是 int
case string:
// v 是 string
}
7.1.4. 函数
// 基本函数
func add(a, b int) int {
return a + b
}
// 多返回值
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
// 命名返回值
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
// 可变参数
func sum(nums ...int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
// 闭包
func counter() func() int {
count := 0
return func() int {
count++
return count
}
}
// defer
func readFile(name string) {
f, _ := os.Open(name)
defer f.Close() // 函数返回时执行
// 使用 f
}
7.1.5. 结构体
// 定义
type Person struct {
Name string
Age int
}
// 创建
p1 := Person{Name: "Alice", Age: 30}
p2 := Person{"Bob", 25}
p3 := new(Person) // *Person
// 匿名结构体
point := struct {
X, Y int
}{10, 20}
// 嵌入
type Employee struct {
Person // 嵌入 Person
Salary float64
}
// 方法
func (p Person) Greet() string {
return "Hello, " + p.Name
}
func (p *Person) SetAge(age int) {
p.Age = age
}
7.1.6. 接口
// 定义
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
// 组合接口
type ReadWriter interface {
Reader
Writer
}
// 空接口
var any interface{}
any = 42
any = "hello"
// 类型断言
s, ok := any.(string)
if ok {
fmt.Println(s)
}
7.1.7. 切片
// 创建
s1 := []int{1, 2, 3}
s2 := make([]int, 5) // len=5, cap=5
s3 := make([]int, 0, 10) // len=0, cap=10
// 追加
s1 = append(s1, 4, 5)
s1 = append(s1, s2...) // 追加另一个切片
// 切片操作
s := []int{0, 1, 2, 3, 4}
s[1:3] // [1, 2]
s[:3] // [0, 1, 2]
s[2:] // [2, 3, 4]
s[:] // [0, 1, 2, 3, 4]
// 复制
dst := make([]int, len(src))
copy(dst, src)
// 删除元素
s = append(s[:i], s[i+1:]...)
7.1.8. Map
// 创建
m1 := map[string]int{"a": 1, "b": 2}
m2 := make(map[string]int)
// 操作
m["key"] = value // 设置
v := m["key"] // 获取
v, ok := m["key"] // 检查是否存在
delete(m, "key") // 删除
len(m) // 长度
// 遍历
for k, v := range m {
fmt.Println(k, v)
}
7.1.9. Channel
// 创建
ch := make(chan int) // 无缓冲
ch := make(chan int, 10) // 有缓冲
// 操作
ch <- value // 发送
v := <-ch // 接收
v, ok := <-ch // 检查是否关闭
close(ch) // 关闭
// select
select {
case v := <-ch1:
// ...
case ch2 <- x:
// ...
case <-time.After(time.Second):
// 超时
default:
// 非阻塞
}
7.1.10. 错误处理
// 检查错误
if err != nil {
return err
}
// 创建错误
err := errors.New("something went wrong")
err := fmt.Errorf("failed to process %s: %w", name, originalErr)
// 错误包装 (Go 1.13+)
if errors.Is(err, os.ErrNotExist) { }
var pathErr *os.PathError
if errors.As(err, &pathErr) { }
// panic/recover
func safeCall() (err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("panic: %v", r)
}
}()
panic("oops")
}
7.1.11. 并发
// Goroutine
go func() {
// 并发执行
}()
// WaitGroup
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
// ...
}()
wg.Wait()
// Mutex
var mu sync.Mutex
mu.Lock()
defer mu.Unlock()
// Once
var once sync.Once
once.Do(func() {
// 只执行一次
})
// Context
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
7.1.12. 常用包
import (
"fmt" // 格式化 I/O
"os" // 操作系统功能
"io" // I/O 原语
"strings" // 字符串操作
"strconv" // 类型转换
"time" // 时间
"encoding/json" // JSON
"net/http" // HTTP
"context" // 上下文
"sync" // 同步原语
)