go中发生panic的场景
数组/切片越界
数组/切片越界
// 数组/切片越界 lst := []string{"a", "b", "c"} fmt.Println(lst[0:20])
空指针调用。比如访问一个 nil 结构体指针的成员
// 空指针调用: 访问一个 nil 结构体指针的成员 var s *Student fmt.Println(s.Name)
过早关闭 HTTP 响应体
url := "https://www.baidu.com" method := "GET" client := &http.Client{} req, err := http.NewRequest(method, url, nil) if err != nil { fmt.Println(err) return } res, err := client.Do(req) if err != nil { fmt.Println(err) return } // TODO (不加defer)过早关闭HTTP响应体 defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } fmt.Println(string(body))
除以 0
// 除数为0 fmt.Println(100 / 0) // rand.Intn方法:如果里面的参数 <=0 的话,会panic rand.Seed(time.Now().UnixNano()) fmt.Println(rand.Intn(0))
向已经关闭的 channel 发送消息
ch := make(chan int) // no-cached channel go func() { // 子goroutine中向channel中存放值 ch <- 1 close(ch) }() // 主 goroutine 接收channel的值 x := <-ch fmt.Println("x: ", x) // TODO // 像已关闭的channel发送消息 ch <- 2
重复关闭 channel
ch := make(chan int) // no-cached channel go func() { // 子goroutine中向channel中存放值 ch <- 1 close(ch) }() // 主 goroutine 接收channel的值 x := <-ch fmt.Println("x: ", x) // TODO 重复关闭channel close(ch)
关闭未初始化的 channel
// 关闭未初始化的channel var ch chan int close(ch)
未初始化 map。注意访问 map 不存在的 key 不会 panic,而是返回 map 类型对应的零值,但是不能直接赋值
var m1 map[string]interface{} fmt.Println(m1["name"]) // 直接取值不会panic m1["age"] = 22
跨协程的 panic 处理
sync 计数为负数
类型断言不匹配
// 断言类型不匹配 var a interface{} = 1 fmt.Println(a.(string))
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: