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

一文帶你掌握Golang基礎(chǔ)之通道

 更新時(shí)間:2023年05月05日 11:09:12   作者:Mars醬  
在Java中,多線程之間的通信方式有哪些?記得嗎?Java多線程間通信的解決方案有很多種,比如:synchronized。在go中,就一種:通道,文中介紹的非常詳細(xì),感興趣的同學(xué)可以參考下

前言

在Java中,多線程之間的通信方式有哪些?記得嗎?Java多線程間通信的解決方案有很多種,比如:synchronized。使用鎖來防止資源亂來,一人一個(gè)按順序來,要么使用JDK提供的原子對象,那些Atomic關(guān)鍵字開頭的對象,比如:AtomicInteger,這樣可以在多個(gè)線程中讀寫值的時(shí)候保證是安全的,還有很多其他的方式,在go中,就一種:通道

通道

go的通道我根據(jù)java的理解,它就是用來解決線程之間通信的東西,go里面的關(guān)鍵字叫channels

以下是搜索出來的解釋:

go語言提倡使用通信的方法代替共享內(nèi)存,當(dāng)一個(gè)資源需要在 goroutine 之間共享時(shí),通道在 goroutine 之間架起了一個(gè)管道,并提供了確保同步交換數(shù)據(jù)的機(jī)制。聲明通道時(shí),需要指定將要被共享的數(shù)據(jù)的類型。可以通過通道共享內(nèi)置類型、命名類型、結(jié)構(gòu)類型和引用類型的值或者指針。這里通信的方法就是使用通道(channel),如下圖所示:

圖:goroutine 與 channel 的通信

是不是和java的線程安全對象是類似?或者說是隊(duì)列?總之你可以按照你自己經(jīng)驗(yàn)去理解。

如何創(chuàng)建通道

go提供了創(chuàng)建通道的語法:

通道變量名 := make(chan 數(shù)據(jù)類型)

比如,我們可以這樣寫:

// 創(chuàng)建一個(gè)int型的通道
ch1 := make(chan int)

還可以創(chuàng)建一個(gè)接口類型通道,比如:

ch2 := make(chan interface{})

還能創(chuàng)建一個(gè)結(jié)構(gòu)體的通道,比如:

// 創(chuàng)建一個(gè)User結(jié)構(gòu)體的通道,這個(gè)通道是個(gè)指針通道
ch3 := make(chan *User)

向通道發(fā)送數(shù)據(jù)

go向通道發(fā)送數(shù)據(jù)語法非常簡單:

通道變量名 <- 值

 我們向上面三個(gè)通道名發(fā)送數(shù)據(jù),可以寫成:

// 1. 給ch1通道傳值0
ch1 <- 0
// 2. 給ch2通道傳字符串,實(shí)際可以穿任意對象,因?yàn)榍懊媛暶髁耸莍nterface對象
ch2 <- "hello, mars醬"

// 創(chuàng)建一個(gè)userInfo結(jié)構(gòu)體并初始化值
userInfo := User{
	1, "mars醬",
}
// 3. 發(fā)送一個(gè)結(jié)構(gòu)體到通道ch3中
ch3 <- &userInfo

以上代碼是無法運(yùn)行的,因?yàn)間o的通道有個(gè)規(guī)矩,發(fā)送和接收必須成對出現(xiàn),不信邪的可以驗(yàn)證一下。

從通道接收數(shù)據(jù)

go從通道中接收數(shù)據(jù)的語法也簡單:

data := <- ch1

這個(gè)語句是個(gè)阻塞語句,只有當(dāng)data接收到了值,才會執(zhí)行后續(xù)的,非阻塞的這樣寫:

data, ok := <- ch1

data:接收的數(shù)據(jù),如果沒有接收到,data為0。data為0取決于之前make通道的時(shí)候,ch1是個(gè)int型通道,如果是其他類型,這個(gè)data也應(yīng)該是其他類型對象;

ok:boolean類型的值,表示是否接收到數(shù)據(jù)

還有個(gè)奇葩的寫法:

<- ch1

這樣寫就表示通道里有啥都與我無關(guān),忽略掉了。

通道的例子

一個(gè)倒數(shù)的例子,通過通道去實(shí)現(xiàn)一下:

// author: mars醬
func Test_chanTest(t *testing.T) {
	// 1. 創(chuàng)建一個(gè)通道
	ch1 := make(chan int)
	// 2. 啟動goroutine并發(fā)
	go func() {
		// 從5 到 0
		for i := 5; i >= 0; i-- {
			// 3. 發(fā)送給通道
			ch1 <- i
			// 發(fā)完后等1秒
			time.Sleep(time.Second)
		}
	}()
	// 4. 循環(huán)接收通道數(shù)據(jù)
	for data := range ch1 {
		fmt.Println(data)
		if data == 0 {
			break
		}
	}
}

運(yùn)行的結(jié)果:

發(fā)射火箭的倒數(shù)計(jì)時(shí)就是這樣吧~

以上就是一文帶你掌握Golang基礎(chǔ)之通道的詳細(xì)內(nèi)容,更多關(guān)于Golang通道的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言同步與異步執(zhí)行多個(gè)任務(wù)封裝詳解(Runner和RunnerAsync)

    Go語言同步與異步執(zhí)行多個(gè)任務(wù)封裝詳解(Runner和RunnerAsync)

    這篇文章主要給大家介紹了關(guān)于Go語言同步與異步執(zhí)行多個(gè)任務(wù)封裝(Runner和RunnerAsync)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Go語言實(shí)現(xiàn)常見限流算法的示例代碼

    Go語言實(shí)現(xiàn)常見限流算法的示例代碼

    計(jì)數(shù)器、滑動窗口、漏斗算法、令牌桶算法是我們常見的幾個(gè)限流算法,本文將依次用Go語言實(shí)現(xiàn)這幾個(gè)限流算法,感興趣的可以了解一下
    2023-05-05
  • Go語言中三種不同md5計(jì)算方式的性能比較

    Go語言中三種不同md5計(jì)算方式的性能比較

    md5計(jì)算在我們?nèi)粘9ぷ鞯臅r(shí)候經(jīng)常能遇到,下面這篇文章主要介紹了Go語言中三種不同md5計(jì)算方式的性能比較,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-01-01
  • golang package time的用法具體詳解

    golang package time的用法具體詳解

    本篇文章主要介紹了golang package time的用法具體詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • Golang文件讀寫操作詳情

    Golang文件讀寫操作詳情

    這篇文章主要介紹了Golang文件讀寫操作詳情,文件是數(shù)據(jù)源(保存數(shù)據(jù)的地方)的一種,文件最主要的作用就是保存數(shù)據(jù),文件在程序中是以流的形式來操作的,更多詳細(xì)內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • Golang中map數(shù)據(jù)類型的使用方法

    Golang中map數(shù)據(jù)類型的使用方法

    這篇文章主要介紹了Golang中map數(shù)據(jù)類型的使用方法,文章圍繞主題展開詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-09-09
  • 特殊字符的json序列化總結(jié)大全

    特殊字符的json序列化總結(jié)大全

    這篇文章主要給大家介紹了關(guān)于特殊字符的json序列化的相關(guān)資料,通過示例代碼分別給大家介紹了關(guān)于python 、 rust 、 java 和golang對特殊字符的json序列化操作,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 優(yōu)雅使用GoFrame共享變量Context示例詳解

    優(yōu)雅使用GoFrame共享變量Context示例詳解

    這篇文章主要為大家介紹了優(yōu)雅使用GoFrame共享變量Context示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go?mod?tidy報(bào)錯(cuò):zip:?not?a?valid?zip?file解決辦法

    go?mod?tidy報(bào)錯(cuò):zip:?not?a?valid?zip?file解決辦法

    這篇文章主要給大家介紹了關(guān)于go?mod?tidy報(bào)錯(cuò):zip:?not?a?valid?zip?file的解決辦法,go mod是進(jìn)行代碼管理,這錯(cuò)誤是因?yàn)楸镜胤种Ш瓦h(yuǎn)程分支沖突,本文通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • golang?gorm開發(fā)架構(gòu)及寫插件示例

    golang?gorm開發(fā)架構(gòu)及寫插件示例

    這篇文章主要為大家介紹了golang?gorm開發(fā)架構(gòu)及寫插件的詳細(xì)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04

最新評論