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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!