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

Golang?channel為什么不會阻塞的原因詳解

 更新時間:2022年07月29日 08:40:44   作者:燒麥?212  
這篇文章主要為大家介紹了Golang?channel為什么不會阻塞的原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

最近在學通道channel,發(fā)現(xiàn)一個簡單的demo:

package main
import "fmt"
func main() {
    chanInt := make(chan int)
    go func() {
        chanInt <- 100
    }()
    res := <-chanInt
    fmt.Println(res)
}

輸出結果是100,這個沒有問題。但是之前在學goroutine的時候有看到過一個例子:

package main
import "fmt"
func hello() {
    fmt.Println("Hello Goroutine!")
}
func main() {
    go hello() // 啟動另外一個goroutine去執(zhí)行hello函數(shù)
    fmt.Println("main goroutine done!")
}

這個例子輸出的只有:main goroutine done! 并沒有Hello Goroutine!

看過解釋:在程序啟動時,Go程序就會為main()函數(shù)創(chuàng)建一個默認的goroutine。當main()函數(shù)返回的時候該goroutine就結束了,所有在main()函數(shù)中啟動的goroutine會一同結束

那么這個解釋放到第一個例子為什么不適用了?

ps:我得理解是:運行到res := <-chanInt這句會阻塞,直到協(xié)程寫入通道后,就馬上讀取,繼續(xù)執(zhí)行打印語句。不知道理解的對不對?

然后就是關于阻塞的情況,比如我把第一個例子改一下:

package main
import (
    "fmt"
    "time"
)
func main() {
    chanInt := make(chan int)
    go func() {
        chanInt &lt;- 100
    }()
    time.Sleep(10 * time.Second)
    res := &lt;-chanInt
    fmt.Println(res)
}

多了time.Sleep(10 * time.Second)等待10秒鐘,10秒后輸出100,這個沒有問題。

然后再看一個例子:

func main() {
    chanInt := make(chan int)
    chanInt &lt;- 100
    res := &lt;-chanInt
    fmt.Println(res)
}

這個例子就會死鎖,阻塞在chanInt <- 100這句,發(fā)現(xiàn)沒有接收者所以死鎖了,這邊不理解的是:睡眠10秒的時候,在這10秒里面為什么不會造成死鎖?而最后一個例子一運行馬上報死鎖?更多關于Golang channel不會阻塞的資料請關注腳本之家其它相關文章!

相關文章

  • Golang map如何生成有序的json數(shù)據(jù)詳解

    Golang map如何生成有序的json數(shù)據(jù)詳解

    最近在學習Golang,發(fā)現(xiàn)了一個問題,覺著有必要給大家總結下,下面這篇文章主要給大家介紹了關于Golang map如何生成有序json數(shù)據(jù)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友們下面來一起看看吧。
    2017-07-07
  • Golang并發(fā)編程之Channel詳解

    Golang并發(fā)編程之Channel詳解

    傳統(tǒng)的并發(fā)編程模型是基于線程和共享內存的同步訪問控制的,共享數(shù)據(jù)受鎖的保護,使用線程安全的數(shù)據(jù)結構會使得這更加容易。本文將詳細介紹Golang并發(fā)編程中的Channel,,需要的朋友可以參考下
    2023-05-05
  • Go實現(xiàn)文件分片上傳

    Go實現(xiàn)文件分片上傳

    這篇文章主要為大家詳細介紹了Go實現(xiàn)文件分片上傳,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Golang原生rpc(rpc服務端源碼解讀)

    Golang原生rpc(rpc服務端源碼解讀)

    本文主要介紹了Golang原生rpc(rpc服務端源碼解讀),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • 淺析Go語言中的同步與異步處理

    淺析Go語言中的同步與異步處理

    在開發(fā)過程中,當需要同時處理多個操作時,開發(fā)者經(jīng)常面臨同步和異步兩種處理方式的選擇,下面小編就來和大家詳細介紹一下Go語言中的同步與異步處理吧
    2023-11-11
  • Golang內存模型教科書級講解

    Golang內存模型教科書級講解

    go官方介紹go內存模型的時候說:探究在什么條件下,goroutine?在讀取一個變量的值的時,能夠看到其它?goroutine?對這個變量進行的寫的結果,Go內存模型規(guī)定了一些條件,在這些條件下,在一個goroutine中讀取變量返回的值能夠確保是另一個goroutine中對該變量寫入的值
    2023-03-03
  • Go語言循環(huán)遍歷含有中文的字符串的方法小結

    Go語言循環(huán)遍歷含有中文的字符串的方法小結

    這篇文章主要介紹了Go語言循環(huán)遍歷含有中文的字符串的幾種方法,文章通過代碼示例講解的非常詳細,具有一定的參考價值,感興趣的小伙伴跟著小編一起來看看吧
    2023-07-07
  • 詳解Golang如何比較兩個slice是否相等

    詳解Golang如何比較兩個slice是否相等

    開發(fā)中常會遇到需要比較兩個slice包含的元素是否完全相等的情況,我們通常會通過兩種方法去比較切片是否相等。這里通過幾個示例來看一下這兩種方法,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助
    2022-11-11
  • golang struct, map, json之間的相互轉換

    golang struct, map, json之間的相互轉換

    本文用于記錄我在 golang 學習階段遇到的類型轉換問題,針對的是 json 、map、struct 之間相互轉換的問題,感興趣的可以了解一下
    2021-06-06
  • go格式“占位符”輸入輸出 類似python的input

    go格式“占位符”輸入輸出 類似python的input

    這篇文章主要介紹了go格式“占位符”, 輸入輸出,類似python的input,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04

最新評論