亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Channel 怎么在Golang中使用

發布時間:2021-06-16 15:00:49 來源:億速云 閱讀:138 作者:Leah 欄目:編程語言

本篇文章為大家展示了Channel 怎么在Golang中使用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

channel 是干什么的

意義:channel 是用來通信的

實際上:(數據拷貝了一份,并通過 channel 傳遞,本質就是個隊列)

channel 應該用在什么地方

核心:需要通信的地方

例如以下場景:

  • 通知廣播

  • 交換數據

  • 顯式同步

  • 并發控制

  • ...

記住!channel 不是用來實現鎖機制的,雖然有些地方可以用它來實現類似讀寫鎖,保護臨界區的功能,但不要這么用!

channel 用例實現

超時控制

// 利用 time.After 實現
func main() {
  done := do()
  select {
  case <-done:
    // logic
  case <-time.After(3 * time.Second):
    // timeout
  }
}

func do() <-chan struct{} {
  done := make(chan struct{})
  go func() {
    // do something
    // ...
    done <- struct{}{}
  }()
  return done
}

取最快的結果

比較常見的一個場景是重試,第一個請求在指定超時時間內沒有返回結果,這時重試第二次,取兩次中最快返回的結果使用。
超時控制在上面有,下面代碼部分就簡單實現調用多次了。

func main() {
  ret := make(chan string, 3)
  for i := 0; i < cap(ret); i++ {
    go call(ret)
  }
    fmt.Println(<-ret)
}

func call(ret chan<- string) {
  // do something
  // ...
  ret <- "result"
}

限制最大并發數

// 最大并發數為 2
limits := make(chan struct{}, 2)
for i := 0; i < 10; i++ {
  go func() {
    // 緩沖區滿了就會阻塞在這
    limits <- struct{}{}
    do()
    <-limits
  }()
}

for...range 優先

for ... range c { do } 這種寫法相當于 if _, ok := <-c; ok { do }

func main() {
  c := make(chan int, 20)
  go func() {
    for i := 0; i < 10; i++ {
      c <- i
    }
    close(c)
  }()
  // 當 c 被關閉后,取完里面的元素就會跳出循環
  for x := range c {
    fmt.Println(x)
  }
}

多個 goroutine 同步響應

利用 close 廣播

func main() {
  c := make(chan struct{})
  for i := 0; i < 5; i++ {
    go do(c)
  }
  close(c)
}

func do(c <-chan struct{}) {
  // 會阻塞直到收到 close
  <-c
  fmt.Println("hello")
}

非阻塞的 select

select 本身是阻塞的,當所有分支都不滿足就會一直阻塞,如果想不阻塞,那么一個什么都不干的 default 分支是最好的選擇

select {
case <-done:
  return
default:  
}

for{select{}} 終止

盡量不要用 break label 形式,而是把終止循環的條件放到 for 條件里來實現

for ok {
  select {
  case ch <- 0:
  case <-done:
    ok = false
  }
}

channel 特性

基礎特性

操作值為 nil 的 channel被關閉的 channel正常的 channel
closepanicpanic成功關閉
c<-永遠阻塞panic阻塞或成功發送
<-c永遠阻塞永遠不阻塞阻塞或成功接收

happens-before 特性

  1. 無緩沖時,接收 happens-before 發送

  2. 任何情況下,發送 happens-before 接收

  3. close happens-before 接收

上述內容就是Channel 怎么在Golang中使用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

竹溪县| 日土县| 永川市| 洱源县| 德江县| 夏邑县| 凉城县| 灵台县| 福安市| 乌拉特中旗| 崇礼县| 黑水县| 石河子市| 德昌县| 大田县| 宁南县| 南木林县| 桃园市| 新竹县| 兴化市| 星子县| 桃江县| 慈利县| 锦屏县| 津市市| 建阳市| 上虞市| 娄烦县| 木里| 雷波县| 南丰县| 南通市| 泾源县| 华亭县| 武汉市| 承德市| 鹤庆县| 鞍山市| 仁寿县| 包头市| 广丰县|