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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 什么是channel 如果說goroutine是Go語言程序的并發體的話,那么channels則是它們之間的通信機制。一個channel是一個通信機制,**它可以讓一個goroutine通過它給另一個goroutine發送值信息**。每個channel都有一個特殊的類型,也就是channels可發送數據的類型。一個可以發送int類型數據的channel一般寫為chan int。 ## channel是引用類型 和map類似,channel也對應一個make創建的底層數據結構的引用。當我們復制一個channel或用于函數參數傳遞時,我們只是拷貝了一個channel引用,因此調用者和被調用者將引用同一個channel對象。和其它的引用類型一樣,channel的零值也是nil。 ## channel比較 兩個相同類型的channel可以使用==運算符比較。如果兩個channel引用的是相同的對象,那么比較的結果為真。一個channel也可以和nil進行比較。 ## channel操作符 一個channel有發送和接受兩個主要操作,都是通信行為。一個發送語句將一個值從一個goroutine通過channel發送到另一個執行接收操作的goroutine。發送和接收兩個操作都使用`<-`運算符。在發送語句中,`<-`運算符分割channel和要發送的值。在接收語句中,`<-`運算符寫在channel對象之前。一個不使用接收結果的接收操作也是合法的。 ``` <- ch1 //不使用channel中的值,是合法的 ``` ## 基于channel的兩個重要方面 1. 基于channels發送消息有兩個重要方面。首先每個消息都有一個值,但是有時候通訊的事實和發生的時刻也同樣重要。當我們更希望強調通訊發生的時刻時,我們將它稱為**消息事件**。 2. 有些消息事件并不攜帶額外的信息,它僅僅是用作兩個goroutine之間的同步,這時候我們可以用`struct{}`空結構體作為channels元素的類型,雖然也可以使用bool或int類型實現同樣的功能,`done <- 1`語句也比`done <- struct{}{}`更短。 ## close close函數用于關閉channel,往已經關閉的channel中發送數據會引起panic. 但是從已經關閉的channel中接受數據不會產生panic,而是會接收到已經發送的數據,如果沒有數據,就會接收到零值. 試圖重復關閉一個channel將導致panic異常,試圖關閉一個nil值的channel也將導致panic異常。關閉一個channels還會觸發一個廣播機制. ## range 在使用range來接收channel的值的時候,如果沒有close掉channel的話,range是不會自己跳出的. ~~~ ch := make(chan int) go func() { for i := 0; i < 5; i++ { ch <- i time.Sleep(time.Second) } close(ch) }() for { x := <-ch fmt.Println(x) } //for { // x, ok := <-ch // if !ok { // break // } // fmt.Println(x) //} ~~~ 結果: ``` 0 1 2 3 4 0 0 0 0 ... ```
                  <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>

                              哎呀哎呀视频在线观看