<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 信道(channel) 信道可以想像成 Go 協程之間通信的管道。如同管道中的水會從一端流到另一端,通過使用信道,數據也可以從一端發送,在另一端接收; 所有信道都關聯了一個類型。信道只能運輸這種類型的數據,而運輸其他類型的數據都是非法的; 信道的零值為`nil`; ### channel聲明 語法: ~~~go var a chan int // 申明 a := make(chan int) // 簡潔語法 data := <- a // 讀取信道 a a <- data // 寫入信道 a ~~~ ### 死鎖 * 當Go協程給一個信道發送數據時,如果沒有其他 Go 協程來接收數據,程序就會在運行時觸發 panic,形成死鎖 * 當有Go協程等著從一個信道接收數據時,如果沒有其他的 Go 協程向該信道寫入數據,則會觸發 panic * 向容量為 2 的緩沖信道寫入 3 個字符串 ~~~go func main() { ch := make(chan string, 2) ch <- "naveen" ch <- "paul" ch <- "steve" fmt.Println(<-ch) fmt.Println(<-ch) } ~~~ ## 關閉信道和使用 for range 遍歷信道 數據發送方可以關閉信道,通知接收方這個信道不再有數據發送過來; 當從信道接收數據時,接收方可以多用一個變量來檢查信道是否已經關閉 ~~~ v, ok := <- ch ~~~ 如果成功接收信道所發送的數據,那么`ok`等于 true。而如果`ok`等于 false,說明我們試圖讀取一個關閉的通道。從關閉的信道讀取到的值會是該信道類型的零值 示例: ~~~go func producer(chnl chan int) { for i := 0; i < 10; i++ { chnl <- i } close(chnl) } func main() { ch := make(chan int) go producer(ch) for { v, ok := <-ch if ok == false { break } fmt.Println("Received ", v, ok) } } ~~~ 使用range接收信道數據 ~~~go func producer(chnl chan int) { for i := 0; i < 10; i++ { chnl <- i } close(chnl) } func main() { ch := make(chan int) go producer(ch) for v := range ch { fmt.Println("Received ",v) } } ~~~ ## future模式 ~~~ func RunTask() chan string { result := make(chan string) go func() { fmt.Println("處理異步任務。。。") time.Sleep(2 * time.Second) result <- "success" }() return result } func TestFutureTaskStudy(t *testing.T) { result := RunTask() fmt.Println("main gorouting running") fmt.Println("task result:", <-result) } ~~~ ## 關閉channel v,ok <- ch; ok為bool值,true表示正常接受;false表示同道關閉 所有的channel接收者都會在channel關閉時,立刻從阻塞等待中返回且返回狀態值為false;這個廣播機制通常被用來向多個訂閱者同時發送信號; 使用channel實現生產者消費者模式: ~~~ var wg sync.WaitGroup var messageQueue chan int = make(chan int) func ProducerMessage() { for i := 1; i <= 20; i++ { messageQueue <- i fmt.Println("生產者生產數據:", i) } close(messageQueue) wg.Done() } func ConsumerMessage1() { for { v, ok := <-messageQueue if !ok { fmt.Println("channel closed") break } fmt.Println("ConsumerMessage-1:", v) } } func ConsumerMessage2() { for { v, ok := <-messageQueue if !ok { fmt.Println("channel closed") break } fmt.Println("ConsumerMessage-2:", v) } } func TestMessageTopic(t *testing.T) { wg.Add(1) go ProducerMessage() go ConsumerMessage1() go ConsumerMessage2() wg.Wait() fmt.Println("main goroutine end") } ~~~ ***** 【知識點】 * 無緩沖信道的發送和接收過程是阻塞的 ~~~go func hello(done chan bool) { fmt.Println("hello go routine is going to sleep") time.Sleep(4 * time.Second) fmt.Println("hello go routine awake and going to write to done") done <- true } func main() { done := make(chan bool) fmt.Println("Main going to call hello go goroutine") go hello(done) <-done fmt.Println("Main received data") } ~~~
                  <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>

                              哎呀哎呀视频在线观看