<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 * 一般用來不同的groutine之間傳遞數據 * 帶緩沖的信道可被用作信號量,例如限制吞吐量 * channel存在3種狀態: * nil : 未初始化的狀態,只進行了聲明,或者手動賦值為nil * active : 正常的channel,可讀或者可寫 * closed : 已關閉,(千萬不要誤認為關閉channel后,channel的值是nil, 關閉的channel不能發送, 但可以接收) * channel 用來進行多個goroutine通信的,可以設置緩存大小,在未被填滿前不會發生阻塞(默認為0,無緩沖) * 無緩沖的信道是一批數據一進一出, 有緩沖的信道則是一個一個存儲,然后一起流出去 * select 可以處理一個或多個 channel 的發送與接收 * channel用來控制速率的,例如通信兩端的速率 * channel關閉時, 不能進行發送操作, 但可以進行接收操作(在關閉通道時, 應該由發送方來控制) > ### 例子一(channel的三種形式) ~~~ go package main import ( "fmt" "time" ) func Number(ch chan int) { for i := 0; i < 10; i++ { ch <- i fmt.Println(i) } } func main() { //size = 0 有保證 : 一個無緩沖的channel給你保證被發送的信號已經被接收(因為信號接收發生在信號發送完成之前) //ch := make(chan int) //size = 1 延遲保證 : 一個 size = 1 的有緩沖 channel 提供延遲保證。它可以保證先前發送的信號已經被接收(因為第一個接收信號,發生在第二個完成的發送信號之前) //ch := make(chan int, 1) //size > 1 無保證 : 一個 size > 1 的有緩沖的 channel 不會保證發送的信號已經被接收。因為信號發送發生在信號接送完成之前。 ch := make(chan int, 3) go Number(ch) go func() { for i := 0; i < 10; i++ { <-ch time.Sleep(time.Second * 2) } }() //防止主線程過快結束 time.Sleep(time.Second * 30) } ~~~ > ### 例子二(select 處理多個channel) * 如果沒有默認分支, 在不滿足條件下會一直阻塞 ~~~ go package main import ( "fmt" "time" ) func Number(ch chan int) { for i := 0; i < 10; i++ { ch <- i } } func main() { ch1 := make(chan int, 1) ch2 := make(chan int, 2) ch3 := make(chan int, 3) go func() { Number(ch1) }() go func() { Number(ch2) }() go func() { Number(ch3) }() go func() { for { select { case num1 := <-ch1: fmt.Println("----TODO1-----", num1) time.Sleep(time.Second * 2) case num2 := <-ch2: fmt.Println("----TODO2-----", num2) time.Sleep(time.Second * 2) case num3 := <-ch3: fmt.Println("----TODO3-----", num3) time.Sleep(time.Second * 2) } } }() time.Sleep(time.Second * 70) } ~~~ > ### 例子三: 單向channel ~~~ go ch1 := make(chan<- int, 5) ch2 := make(<-chan int, 5) ~~~ > ### 例子四: 有序輸出 ~~~ go package main import ( "fmt" ) func main() { //如何有序輸出 /* for i := 0; i < 10; i++ { go func() { fmt.Println(i) }() } */ /* for i := 0; i < 10; i++ { go func(n int) { fmt.Println(n) }(i) } */ ch := make(chan int) go func() { for i := 0; i < 10; i++ { ch <- i } }() for { select { case n := <-ch: fmt.Println(n) default: } } } ~~~
                  <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>

                              哎呀哎呀视频在线观看