<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國際加速解決方案。 廣告
                ### channel goroutine運行在相同的地址空間,因此訪問共享內存必須做好同步. **goroutine奉行通過通信來共享內存, 而不是共享內存來通信**. 引用類型channel是CSP模式具體實現,用于多個goroutine通訊,其內部實現了同步,確保并發安全. ### channel類型 和map類似,channel也一個對應make創建的底層數據結構的引用. 當我們賦值一個channel或用于函數參數傳遞時,我們只是拷貝了一個channel引用,因此調用者和被調用者 將引用同一個channel對象.和其它的引用類型一樣,channel的零值也是nil . 定義一個channel時,也需要定義發送到channel的值的類型.channel可以使用內置的make()函數來創建: ~~~ make(chan Type) //等價于make(chan Type , 0) make(chan Type,capacity) ~~~ 當capacity = 0 時,channel是無緩沖阻塞讀寫的,當capacity > 0 時,channel有緩沖,是非阻塞的,直到寫滿 capacity個元素才阻塞寫入. channel通過慚怍福<-來接收和發送數據,發送和接收數據語法: ~~~ channel<-value //發送value到channel <-channe //接收并將其丟棄 x := <-channel //從channel中接收數據,并賦值給x x, ok := <-channel //功能同上,同事檢查通道是否已關閉或者是否為空 ~~~ 默認情況下,channel接收和發送數據都是阻塞的,除非另一端你已經準備好,這樣就使得goroutine同步變得 更加簡單,而不需要顯示的lock . ### 實例 ~~~ //全局變量,創建一個channel var ch = make(chan int) //打印機屬于公共資源 func printer(str string) { for _, data := range str { fmt.Printf("%c\n", data) time.Sleep(time.Second) } } func person1() { printer("hello") ch <- 1000 //給管道數據,發送 } func person2() { <-ch //從管道接收數據,如果通道沒有數據,它就會阻塞 printer("world") } func main() { //新建兩個協程,代表兩個人,2個人同時使用打印機 go person1() go person2() //不讓主協程結束 for { } } ~~~ ~~~ h e l l o w o r l d ~~~ ### 通過channel實現同步和數據交互 ~~~ func main() { ch := make(chan string) defer fmt.Println("主協程執行完畢") go func() { defer fmt.Println("子協程執行完畢") for i := 0; i < 2; i++ { fmt.Println("子協程i = ", i) time.Sleep(time.Second) } }() str := <-ch fmt.Println(str) } ~~~ 死鎖,等到子協程執行結束后,管道里面沒有人往里面寫數據.channel一直是阻塞狀態,沒有辦法往下面繼續執行了. ~~~ 子協程i = 0 子協程i = 1 fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: main.main() /Users/artisan/go/src/learn/main.go:22 +0xe6 ~~~ #### 正確做法 ~~~ func main() { ch := make(chan string) defer fmt.Println("主協程執行完畢") go func() { defer fmt.Println("子協程執行完畢") for i := 0; i < 2; i++ { fmt.Println("子協程i = ", i) time.Sleep(time.Second) } ch <- "我是子協程,工作已完畢" //子協程執行完畢后,將數據寫入管道 }() str := <-ch fmt.Println(str) } ~~~ ~~~ 子協程i = 0 子協程i = 1 子協程執行完畢 我是子協程,工作已完畢 主協程執行完畢 ~~~
                  <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>

                              哎呀哎呀视频在线观看