<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Go出現panic的場景

      概述

      go中發生panic的場景:
      - 數組/切片越界
      - 空指針調用。比如訪問一個 nil 結構體指針的成員
      - 過早關閉 HTTP 響應體
      - 除以 0
      - 向已經關閉的 channel 發送消息
      - 重復關閉 channel
      - 關閉未初始化的 channel
      - 未初始化 map。注意訪問 map 不存在的 key 不會 panic,而是返回 map 類型對應的零值,但是不能直接賦值
      - 跨協程的 panic 處理
      - sync 計數為負數。
      - 類型斷言不匹配。`var a interface{} = 1; fmt.Println(a.(string))` 會 panic,建議用 `s,ok := a.(string)`

      代碼

      package a_panics
      
      import (
          "fmt"
          "math/rand"
          "testing"
          "time"
      )
      
      type Student struct {
          Name string
          Age  int
      }
      
      func TestP0(t *testing.T) {
          // 空指針調用: 訪問一個 nil 結構體指針的成員
          var s *Student
          fmt.Println(s.Name)
      }
      
      func TestP1(t *testing.T) {
      
          // 除數為0
          fmt.Println(100 / 0)
      
          // rand.Intn方法:如果里面的參數 <=0 的話,會panic
          rand.Seed(time.Now().UnixNano())
          fmt.Println(rand.Intn(0))
      
          // 數組/切片越界
          lst := []string{"whw", "naruto", "sasuke"}
          fmt.Println(lst[0:22])
      
          // 為初始化map
          var m1 map[string]interface{}
          fmt.Println(m1["name"]) // 直接取值不會panic
          m1["age"] = 22
          /*
              // 下面這樣可以
              m1 := make(map[string]interface{}, 0)
              m1["age"] = 22
          */
      
          // 斷言類型不匹配
          var a interface{} = 1
          fmt.Println(a.(string))
          /*
              // 建議這樣寫:
              s,ok := a.(string)
              fmt.Println("ok: ", ok, "s: ", s)
          */
      
      }

      ~~~

      package a_panics
      
      import (
          "fmt"
          "io/ioutil"
          "net/http"
          "testing"
      )
      
      func TestHttpBody(t *testing.T) {
      
          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))
      }

      ~~~

      package a_panics
      
      import "fmt"
      
      import "testing"
      
      func TestChannel0(t *testing.T) {
      
          //ch := make(chan int)
          // 關閉未初始化的channel
          var ch chan int
          close(ch)
      
      }
      
      func TestChannel1(t *testing.T) {
      
          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
      }
      
      func TestChannel2(t *testing.T) {
      
          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)
      }

      ~~~

      package a_panics
      
      import (
          "fmt"
          "testing"
      )
      
      func test(){
      
          defer func(){
              // 捕獲異常
              if err := recover(); err != nil{
                  fmt.Println("errFromFunc:test", err)
              }
          }()
      
          var m1 map[string]interface{}
          m1["age"] = 22
      }
      
      func sayHello(){
          fmt.Println("hello!")
      }
      
      func TestP4(t *testing.T){
      
          go test()
          go sayHello()
      
      }

       

      posted on 2021-11-21 19:07  江湖乄夜雨  閱讀(1528)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 国产中文字幕精品免费 | 一本色道久久加勒比综合 | 午夜成人无码免费看网站| 色综合久久一区二区三区| 国产欧美日韩精品丝袜高跟鞋| 人妻夜夜爽天天爽一区| 欧美做受视频播放| 日韩一区二区三区av在线| 99久久免费精品色老| 国产在线中文字幕精品| 日韩不卡无码精品一区高清视频 | 国产精品无码a∨麻豆| 99久久激情国产精品| 婷婷精品国产亚洲av在线观看| 国产成人亚洲综合91精品| 国产成人精品无码专区| 日韩av色一区二区三区| 国产盗摄xxxx视频xxxx| 免费又大粗又爽又黄少妇毛片| 熟女人妻精品一区二区视频| 国产日产欧产系列| 国产老头多毛Gay老年男| 偷看少妇自慰xxxx| 福利一区二区不卡国产| 国产国拍精品av在线观看| 理论片午午伦夜理片久久| 成年站免费网站看v片在线| 成人影片一区免费观看| 亚洲精品自产拍在线观看动漫| 免费观看全黄做爰大片| 国内自拍偷拍一区二区三区| 免费国产高清在线精品一区| 视频一区视频二区卡通动漫 | 在线看国产精品自拍内射| 精品亚洲男人一区二区三区| 水蜜桃视频在线观看免费18| 亚洲无码在线免费观看| 国产精品日韩中文字幕| 荃湾区| 日本高清视频网站www| 麻豆成人传媒一区二区|