欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go?select使用與底層原理講解

 更新時間:2022年07月31日 14:34:28   作者:樹獺叔叔???????  
這篇文章主要介紹了Go?select使用與底層原理講解,select是Go提供的IO多路復用機制,可以用多個cas同時監(jiān)聽多個channl的讀寫狀態(tài),相關內(nèi)容需要的朋友可以參考一下

1. select的使用

select 是 Go 提供的 IO 多路復用機制,可以用多個 case 同時監(jiān)聽多個 channl 的讀寫狀態(tài):

  • case: 可以監(jiān)聽 channl 的讀寫信號
  • default:聲明默認操作,有該字段的 select 不會阻塞
select {
case chan <-:
    // TODO
case <- chan:
    // TODO
default:
    // TODO
}

2. 底層原理

  • 每一個 case 對應的 channl 都會被封裝到一個結構體中;
  • 當?shù)谝淮螆?zhí)行到 select 時,會鎖住所有的 channl 并且,打亂 case 結構體的順序;
  • 按照打亂的順序遍歷,如果有就緒的信號,就直接走對應 case 的代碼段,之后跳出 select;
  • 如果沒有就緒的代碼段,但是有 default 字段,那就走 default 的代碼段,之后跳出 select;
  • 如果沒有 default,那就將當前 goroutine 加入所有 channl 的對應等待隊列;
  • 當某一個等待隊列就緒時,再次鎖住所有的 channl,遍歷一遍,將所有等待隊列中的 goroutine 取出,之后執(zhí)行就緒的代碼段,跳出select。

3. 數(shù)據(jù)結構

每一個 case 對應的數(shù)據(jù)結構如下:

type scase struct {
    c           *hchan         // chan
    elem        unsafe.Pointer // 讀或者寫的緩沖區(qū)地址
    kind        uint16   //case語句的類型,是default、傳值寫數(shù)據(jù)(channel <-) 還是  取值讀數(shù)據(jù)(<- channel)
    pc          uintptr // race pc (for race detector / msan)
    releasetime int64
}

4. 幾種常見 case

學習了 select 的使用與原理,我們就能更輕松地分辨不同情況下的輸出情況了。

case 1

package main

import (
  "fmt"
  "time"
)

func main() {
  chan1 := make(chan int)
  chan2 := make(chan int)
  go func() {
    chan1 <- 1
    time.Sleep(5 * time.Second)
  }()
  go func() {
    chan2 <- 1
    time.Sleep(5 * time.Second)
  }()
  select {
    case <- chan1:
      fmt.Println("chan1")
    case <- chan2:
      fmt.Println("chan2")
    default:
      fmt.Println("default")
  }
}

三種輸出都有可能。

case2

package main

import (
  "fmt"
  "time"
)
func main() {
  chan1 := make(chan int)
  chan2 := make(chan int)
  
  select {
    case <- chan1:
      fmt.Println("chan1")
    case <- chan2:
      fmt.Println("chan2")
  }
  fmt.Println("main exit.")
}

上述程序會一直阻塞。

case3

package main

import (
  "fmt"
)

func main() {
  chan1 := make(chan int)
  chan2 := make(chan int)
  
  go func() {
    close(chan1)
  }()
  go func() {
    close(chan2)
  }()
  select {
    case <- chan1:
      fmt.Println("chan1")
    case <- chan2:
      fmt.Println("chan2")
  }
  fmt.Println("main exit.")
}

隨機執(zhí)行1或者2.

case4

package main

func main() {
  select {
  }
}

對于空的 select 語句,程序會被阻塞,確切的說是當前協(xié)程被阻塞,同時 Go 自帶死鎖檢測機制,當發(fā)現(xiàn)當前協(xié)程再也沒有機會被喚醒時,則會發(fā)生 panic。所以上述程序會 panic。

到此這篇關于Go select使用與底層原理講解的文章就介紹到這了,更多相關Go select使用 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go 語言中的 http.FileSystem詳細解析

    Go 語言中的 http.FileSystem詳細解析

    在本文中,我們深入探討了 Go 語言中的 http.FileSystem 接口,并介紹了它的基本原理、使用方法以及實際應用場景,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • GoFrame框架數(shù)據(jù)校驗之校驗對象校驗結構體

    GoFrame框架數(shù)據(jù)校驗之校驗對象校驗結構體

    這篇文章主要為大家介紹了GoFrame框架數(shù)據(jù)校驗之校驗對象校驗結構體示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 我為什么喜歡Go語言(簡潔的Go語言)

    我為什么喜歡Go語言(簡潔的Go語言)

    從2000年至今,也寫了11年代碼了,期間用過VB、Delphi、C#、C++、Ruby、Python,一直在尋找一門符合自己心意和理念的語言。我很在意寫代碼時的手感和執(zhí)行的效率,所以在Go出現(xiàn)之前一直沒有找到
    2014-10-10
  • go語言實現(xiàn)銀行卡號Luhn校驗

    go語言實現(xiàn)銀行卡號Luhn校驗

    這篇文章主要為大家介紹了go語言Luhn校驗測試銀行卡號碼的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Go 語言結構實例分析

    Go 語言結構實例分析

    在本篇文章里小編給大家整理的是一篇關于Go 語言結構實例分析的相關知識點,有興趣的朋友們可以學習下。
    2021-07-07
  • Go語言字符串基礎示例詳解

    Go語言字符串基礎示例詳解

    這篇文章主要為大家介紹了Go語言字符串基礎的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-11-11
  • Go語言獲取本機邏輯CPU數(shù)量的方法

    Go語言獲取本機邏輯CPU數(shù)量的方法

    這篇文章主要介紹了Go語言獲取本機邏輯CPU數(shù)量的方法,實例分析了runtime庫的操作技巧,需要的朋友可以參考下
    2015-03-03
  • golang?對象深拷貝的常見方式及性能

    golang?對象深拷貝的常見方式及性能

    這篇文章主要介紹了golang?對象深拷貝的常見方式及性能,Go語言中所有賦值操作都是值傳遞,如果結構中不含指針,則直接賦值就是深度拷貝,文章圍繞主題展開更多相關資料,需要的小伙伴可以參考一下
    2022-06-06
  • 關于golang類型推斷和變量重聲明詳解

    關于golang類型推斷和變量重聲明詳解

    在Go語言中,類型推斷可以根據(jù)變量的初始化值自動推斷出變量的類型,而不需要顯式地聲明變量類型,變量重聲明可以在同一作用域內(nèi)重復聲明一個變量,只要其中至少一個是新的變量,本就簡單的給大家介紹一下golang類型推斷和變量重聲明,需要的朋友可以參考下
    2023-08-08
  • go語言題解LeetCode674最長連續(xù)遞增序列

    go語言題解LeetCode674最長連續(xù)遞增序列

    這篇文章主要為大家介紹了go語言題解LeetCode674最長連續(xù)遞增序列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12

最新評論