最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

通道

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

以下是搜索出來的解釋:

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

圖:goroutine 與 channel 的通信

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

如何創(chuàng)建通道

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

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

比如,我們可以這樣寫:

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

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

ch2 := make(chan interface{})

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

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

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

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

通道變量名 <- 值

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

// 1. 給ch1通道傳值0
ch1 <- 0
// 2. 給ch2通道傳字符串,實際可以穿任意對象,因為前面聲明了是interface對象
ch2 <- "hello, mars醬"

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

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

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

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

data := <- ch1

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

data, ok := <- ch1

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

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

還有個奇葩的寫法:

<- ch1

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

通道的例子

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

// author: mars醬
func Test_chanTest(t *testing.T) {
	// 1. 創(chuàng)建一個通道
	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
		}
	}
}

運行的結(jié)果:

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

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

相關(guān)文章

  • go語言中嵌套結(jié)構(gòu)體的實現(xiàn)

    go語言中嵌套結(jié)構(gòu)體的實現(xiàn)

    在Go語言中,嵌套結(jié)構(gòu)體可定義為一個結(jié)構(gòu)體內(nèi)包含另一個結(jié)構(gòu)體,嵌套可以是值嵌套或指針嵌套,兩者在內(nèi)存分配和修改影響上有顯著區(qū)別,本文就來詳細的介紹一下,感興趣的可以了解一下
    2024-09-09
  • 手把手帶你走進Go語言之語法基礎(chǔ)解析

    手把手帶你走進Go語言之語法基礎(chǔ)解析

    這篇文章主要介紹了手把手帶你走進Go語言之語法基礎(chǔ),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • golang新手們?nèi)菀追傅?個錯誤總結(jié)

    golang新手們?nèi)菀追傅?個錯誤總結(jié)

    這篇文章主要給大家介紹了關(guān)于golang新手們?nèi)菀追傅?個錯誤,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Win7環(huán)境下搭建Go開發(fā)環(huán)境(基于VSCode編輯器)

    Win7環(huán)境下搭建Go開發(fā)環(huán)境(基于VSCode編輯器)

    這篇文章主要介紹了Win7環(huán)境下搭建Go開發(fā)環(huán)境(基于VSCode編輯器),需要的朋友可以參考下
    2017-02-02
  • Golang中常見的三種并發(fā)控制方式使用小結(jié)

    Golang中常見的三種并發(fā)控制方式使用小結(jié)

    這篇文章主要為大家詳細介紹了如何對goroutine并發(fā)行為的控制,在Go中最常見的有三種方式:sync.WaitGroup、channel和Context,下面我們就來看看他們的具體使用吧
    2024-01-01
  • 高效封禁:利用Go封裝功能,提升封禁操作效率

    高效封禁:利用Go封裝功能,提升封禁操作效率

    在網(wǎng)絡(luò)安全領(lǐng)域,封禁操作是一項重要的任務(wù),用于阻止惡意行為和保護系統(tǒng)安全,而利用Go語言封裝功能可以提升封禁操作的效率,Go語言具有高效的并發(fā)性能和簡潔的語法,使得開發(fā)者可以快速構(gòu)建高性能的封禁系統(tǒng),
    2023-10-10
  • Go語句與表達式案例手冊深度解析

    Go語句與表達式案例手冊深度解析

    這篇文章主要為大家介紹了Go語句與表達式案例手冊深度解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Golang Gin框架實現(xiàn)文件下載功能的示例代碼

    Golang Gin框架實現(xiàn)文件下載功能的示例代碼

    本文主要介紹了Golang Gin框架實現(xiàn)文件下載功能的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Go語言kafka生產(chǎn)消費消息實例搬磚

    Go語言kafka生產(chǎn)消費消息實例搬磚

    這篇文章主要為大家介紹了Go語言kafka生產(chǎn)消費消息的實例搬磚,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • golang中new與make的區(qū)別講解

    golang中new與make的區(qū)別講解

    new只能開辟單個空間,不能為引用類型開辟多個空間,并且new是對類型進行內(nèi)存的開辟,返回一個指向該內(nèi)存空間的指針類型,如果使用new去初始化引用數(shù)據(jù)類型,不是很合適(當然,new一個對象還是可以的),因此就需要用到另一個內(nèi)置函數(shù)make,需要的朋友可以參考下
    2023-01-01

最新評論

龙门县| 海伦市| 资阳市| 井冈山市| 化德县| 永福县| 宁蒗| 深圳市| 罗城| 濮阳县| 曲阜市| 丰原市| 温州市| 遂平县| 灵山县| 青冈县| 汽车| 吴桥县| 尖扎县| 平昌县| 蒙自县| 龙海市| 肥城市| 黑山县| 娄底市| 灵寿县| 治多县| 博兴县| 西乌| 红桥区| 马关县| 桐庐县| 康乐县| 岳阳市| 堆龙德庆县| 新源县| 会东县| 射阳县| 石渠县| 攀枝花市| 英超|