中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

沿河| 金乡县| 弥渡县| 射阳县| 虞城县| 新绛县| 禹州市| 宜黄县| 民乐县| 武冈市| 元江| 化州市| 新疆| 渭源县| 汉源县| 怀来县| 龙泉市| 巨野县| 广元市| 岑巩县| 方山县| 荥经县| 托克托县| 湖南省| 靖安县| 汝城县| 武功县| 合肥市| 玉溪市| 耿马| 揭阳市| 鸡东县| 平泉县| 堆龙德庆县| 济南市| 东乡| 古蔺县| 安平县| 灵山县| 广宗县| 项城市|