# Go 速查

以下片段默认位于 main 包内，按需导入对应包。

## 变量与常量

短声明符号在函数内使用，包级别只能用变量声明；常量配合自增枚举能生成一组连续值，比手写数字清晰。未使用的局部变量和导入包都会直接编译报错，别留死代码。

```go
const ( A = iota; B; C )
```

## 结构体与方法

用组合代替继承；方法接收者分值与指针两种，需要修改原字段时必须用指针接收者。结构体字段首字母大写才对包外可见，小写只在包内访问，别指望反射绕过。

```go
type User struct { ID int }
```

## 接口

接口隐式实现，只要方法集匹配就算实现，推荐定义只有一个方法的小接口。空接口取值用类型断言或类型分支还原具体类型，断言记得接第二个返回值判断成功与否。

```go
var v any = 42
```

## goroutine 与 channel

go 启动轻量协程，通道负责通信；写完要关闭，读侧用 range 自动结束，select 配合定时器做超时控制。无缓冲通道会阻塞到接收方就绪，排查死锁先确认收发是否配对。

```go
ch := make(chan int, 2)
```

## error 处理

错误是普通值，显式返回并逐层判断；用包装动词保留原始错误，之后还能用标准库的判断函数追溯，别拿字符串内容做比较，上下文能省掉大量排查时间。

```go
if err != nil { return err }
```

## defer

defer 在函数返回前按后进先出执行，常用于关闭文件、释放锁，也能配合恢复函数兜住崩溃。注意循环里别堆积 defer，它们要到函数结束才真正执行，容易攒出一堆连接。

```go
defer fmt.Println("done")
```
