Skip to content

Commit f5d8591

Browse files
committed
debug: go panic 场景
1 parent f3772b8 commit f5d8591

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

go-note/tricks.rst

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,21 +1027,24 @@ Go 网络请求设置 Host 不起作用
10271027
// req.Header.Set("Host", "www.example.org") // 不起作用!!! https://github.com/golang/go/issues/29865
10281028
10291029
1030-
Go panic 场景
1030+
Go panic 场景 ⚠️
10311031
--------------------------------------------------
10321032
在《Go 编程之旅》中总结了一些 panic 场景,写 go 的时候注意下,防止进程退出:
10331033

10341034
- 数组/切片越界。确保下标在数组长度范围内
1035-
- 空指针调用。比如访问一个 nil 结构体指针的成员, a.b.c 但是 b 是一个空指针就会 panic
1035+
- 空指针调用。比如访问一个 nil 结构体指针的成员, `a.b.c` 但是 b 是一个空指针就会 panic
10361036
- 过早关闭 HTTP 响应体
10371037
- 除以 0
10381038
- 向已经关闭的 channel 发送消息(或者多次close同一个 channel)
10391039
- 重复关闭 channel
10401040
- 关闭未初始化的 channel
1041-
- 未初始化 map。注意访问 map 不存在的 key 不会 panic,而是返回 map 类型对应的零值,但是不能直接赋值
1042-
- 跨协程的 panic 处理
1041+
- 跨协程的 panic 处理。main 协程中无法处理对子协程的 panic
10431042
- sync 计数为负数。
10441043
- 类型断言不匹配。`var a interface{} = 1; fmt.Println(a.(string))` 会 panic,建议用 `s,ok := a.(string)`
1044+
- 危险的 map
1045+
1046+
- 赋值之前必须用 make 创建。注意访问 map 不存在的 key 不会 panic,而是返回 map 类型对应的零值,但是不能直接声明就赋值,而是要用make创建
1047+
- 不要并发写原生 map。 需要加锁、使用 sync.Map 或者第三方并发安全的 map 比如 patrickmn/go-cache。当你声明一个全局map时,确认它是只读的
10451048

10461049
参考:
10471050

0 commit comments

Comments
 (0)