您好,登錄后才能下訂單哦!
今天小編給大家分享一下Go語言怎么使用goroutine及通道實現(xiàn)并發(fā)的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
通道的接收同樣使用"<-"操作符;
使用通道接收數(shù)據(jù)的特性如下:
通道的發(fā)送和接收操作在不同的兩個goroutine間進行,由于通道中的數(shù)據(jù)在沒有接收方接收時會持續(xù)阻塞,所以通道的接收必定在另外一個goroutine中進行;
如果在接收方接收時,通道中沒有發(fā)送方發(fā)送數(shù)據(jù),則接收方也會發(fā)生阻塞,直到發(fā)送方發(fā)送消息為止;
通道一次只能接收一個元素數(shù)據(jù);
通道的數(shù)據(jù)接收有四種寫法,接下來一一進行介紹
阻塞模式在接收數(shù)據(jù)時,將接收變量作為"<-"操作符的左值,格式如下:
data := <-ch
執(zhí)行該語句時將會阻塞,直到接收到數(shù)據(jù)并賦值給data變量
在使用非阻塞方式從通道接收數(shù)據(jù)時,語句不會發(fā)生阻塞,格式如下
data, ok := <-ch
data:接收到的數(shù)據(jù),在未接收到數(shù)據(jù)時data為通道類型的零值
ok:是否接收到數(shù)據(jù)
非阻塞的通道接收方法,可能造成高的CPU占用,因此使用非常少,如果需要實現(xiàn)接收超時檢測,則需要配合select和計時器進行;
寫法如下:
<-ch
使用上面的這種寫法,會發(fā)生阻塞,直到接收到消息,但是通道在接收到數(shù)據(jù)后會將其忽略掉;這個方式實際上只是通過通道在goroutine間阻塞收發(fā),從而實現(xiàn)并發(fā)同步;
使用通道做并發(fā)同步的示例如下圖所示:
通道的數(shù)據(jù)接收可以借用for-range語句進行多個元素的接收操作,格式如下:
for data := range ch{ }
通道ch是可以被遍歷的,遍歷的結(jié)果就是接收到的數(shù)據(jù),數(shù)據(jù)類型就是通道的數(shù)據(jù)類型,通過for遍歷獲得的變量只有一個,即上面例子中的data;
遍歷通道數(shù)據(jù)的示例如下圖所示:
通道可以在兩個goroutine之間通過傳遞一個指定類型的值來同步運行和通訊,操作符"<-"用于指定通道的方向、發(fā)送和接收,如果未指定方向,則為雙向通道;
ch <- v 把v發(fā)送到通道ch中
v := <-ch 從ch接收數(shù)據(jù),并把值賦給v
下面列舉一個示例通過兩個goroutine計算數(shù)字之和,如下圖所示:
以上就是“Go語言怎么使用goroutine及通道實現(xiàn)并發(fā)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。