<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 為什么需要管道 1. 主線程在等待所有goroutine全部完成的時間很難確定,比如設置10秒僅僅是估算 2. 如果主線程休眠時間長了,會加長等待時間;如果等待時間短了,可能還有goroutine處于工作狀態,這時也會隨主線程的退出而小灰 3. 通過全局變量加鎖來實現通訊,也并不利用多個協程對全局變量的讀寫操作 ## 管道介紹 1. channel本質是一個數據結果-隊列 2. 數據是先進先出 3. 線程安全,多goroutine訪問時,不需要加鎖,就是說channel本身就是線程安全的 4. channel是有類型的,一個string的channel只能存放string類型數據 ## 管道基本使用 ``` var 變量名 chan 數據類型 var intChan chan int var mapChan chan map[int]string var perChan chan Person var perChan1 chan *Person ``` 1. channel是引用類型 2. channel必須初始化才能寫入數據,即make后才能使用 3. 管道是有類型的,只能寫入對應類型的數據 ## 管道讀寫特性 1. 默認是可讀可寫 2. 聲明為只寫 `var chan2 chan<- int` 3. 聲明為只讀 `var chan3 <chan int` 4. 應用場景,函數內防止誤操作 ## 示例代碼 ``` package main import ( "fmt" ) func main() { var intChan chan int intChan = make(chan int, 3) //容量為3 int類型 ? ? fmt.Printf("incChan的值=%v\\n", intChan) //地址 //向channel寫入數據,寫入的數據量不能超過管道的容量(cap) intChan <- 10 num := 211 ? ? intChan <- num ? ? fmt.Printf("channel len=%v cap=%v\\n", len(intChan), cap(intChan)) //len=2 cap=3 //從管道中讀取數據 num2 := <-intChan ? ? fmt.Printf("num2=%v channel len=%v cap=%v\\n", num2, len(intChan), cap(intChan)) //len=1 cap=3 //在沒有使用協程的情況下,如果管道數據已經全部取出,再取會報告deadlock num3 := <-intChan num4 := <-intChan ? ? fmt.Printf("num3=%v num4=%v", num3, num4) } ``` ![](https://img.kancloud.cn/a7/d3/a7d39340bfd77e4bc843094f6b579c54_397x165.png) ## interface chan 取出的時候需要類型斷言,否則可以打印輸出,但是無法獲取內部的元素 ## 關閉管道 使用內置函數`close`,關閉后無法寫入數據,但能讀取數據 ## 遍歷管道 for-range,不能使用普通的for ``` for v := range intChan2{ //沒有下標index } ``` 1. 在遍歷時,如果channel沒有關閉,則會出現deadlock錯誤 2. 在遍歷時,如果channel已經關閉,則會正常遍歷數據,遍歷完后,退出遍歷
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看