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

Go語言單向通道的實現

 更新時間:2023年04月04日 11:04:54   作者:C語言中文網  
本文主要介紹了Go語言單向通道的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Go語言的類型系統(tǒng)提供了單方向的 channel 類型,顧名思義,單向 channel 就是只能用于寫入或者只能用于讀取數據。當然 channel 本身必然是同時支持讀寫的,否則根本沒法用。

假如一個 channel 真的只能讀取數據,那么它肯定只會是空的,因為你沒機會往里面寫數據。同理,如果一個 channel 只允許寫入數據,即使寫進去了,也沒有絲毫意義,因為沒有辦法讀取到里面的數據。所謂的單向 channel 概念,其實只是對 channel 的一種使用限制。

單向通道的聲明格式

我們在將一個 channel 變量傳遞到一個函數時,可以通過將其指定為單向 channel 變量,從而限制該函數中可以對此 channel 的操作,比如只能往這個 channel 中寫入數據,或者只能從這個 channel 讀取數據。

單向 channel 變量的聲明非常簡單,只能寫入數據的通道類型為chan<-,只能讀取數據的通道類型為<-chan,格式如下:

var 通道實例 chan<- 元素類型    // 只能寫入數據的通道
var 通道實例 <-chan 元素類型    // 只能讀取數據的通道

  • 元素類型:通道包含的元素類型。
  • 通道實例:聲明的通道變量。

單向通道的使用例子

示例代碼如下:

ch := make(chan int)
// 聲明一個只能寫入數據的通道類型, 并賦值為ch
var chSendOnly chan<- int = ch
//聲明一個只能讀取數據的通道類型, 并賦值為ch
var chRecvOnly <-chan int = ch

上面的例子中,chSendOnly 只能寫入數據,如果嘗試讀取數據,將會出現如下報錯:

invalid operation: <-chSendOnly (receive from send-only type chan<- int)

同理,chRecvOnly 也是不能寫入數據的。

當然,使用 make 創(chuàng)建通道時,也可以創(chuàng)建一個只寫入或只讀取的通道:

ch := make(<-chan int)
var chReadOnly <-chan int = ch
<-chReadOnly

上面代碼編譯正常,運行也是正確的。但是,一個不能寫入數據只能讀取的通道是毫無意義的。

 time包中的單向通道

time 包中的計時器會返回一個 timer 實例,代碼如下:

timer := time.NewTimer(time.Second)

timer的Timer類型定義如下:

type Timer struct {
    C <-chan Time
    r runtimeTimer
}

第 2 行中 C 通道的類型就是一種只能讀取的單向通道。如果此處不進行通道方向約束,一旦外部向通道寫入數據,將會造成其他使用到計時器的地方邏輯產生混亂。

因此,單向通道有利于代碼接口的嚴謹性。

關閉 channel

關閉 channel 非常簡單,直接使用Go語言內置的 close() 函數即可:

close(ch)

在介紹了如何關閉 channel 之后,我們就多了一個問題:如何判斷一個 channel 是否已經被關閉?我們可以在讀取的時候使用多重返回值的方式:

x, ok := <-ch

這個用法與 map 中的按鍵獲取 value 的過程比較類似,只需要看第二個 bool 返回值即可,如果返回值是 false 則表示 ch 已經被關閉。

到此這篇關于Go語言單向通道的實現的文章就介紹到這了,更多相關Go語言單向通道內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • gorm FirstOrCreate和受影響的行數實例

    gorm FirstOrCreate和受影響的行數實例

    這篇文章主要介紹了gorm FirstOrCreate和受影響的行數實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 詳解Go語言變量作用域

    詳解Go語言變量作用域

    這篇文章主要介紹了Go 語言變量作用域的相關資料,幫助大家更好的理解和學習使用go語言,感興趣的朋友可以了解下
    2021-03-03
  • 淺談Go語言多態(tài)的實現與interface使用

    淺談Go語言多態(tài)的實現與interface使用

    如果大家系統(tǒng)的學過C++、Java等語言以及面向對象的話,相信應該對多態(tài)不會陌生。多態(tài)是面向對象范疇當中經常使用并且非常好用的一個功能,它主要是用在強類型語言當中,像是Python這樣的弱類型語言,變量的類型可以隨意變化,也沒有任何限制,其實區(qū)別不是很大
    2021-06-06
  • 深入了解Golang的map增量擴容

    深入了解Golang的map增量擴容

    這篇文章主要介紹了深入了解Golang的map增量擴容,擴容的主要目的是為了縮短map容器的響應時間。增量擴容的本質其實就是將總的擴容時間分攤到了每一次hash操作上,更多相關內容需要的小伙伴可以參考一下
    2022-06-06
  • Go語言自定義包構建自己的編程工具庫

    Go語言自定義包構建自己的編程工具庫

    Go 語言的強大不僅體現在其內置功能上,還在于其支持自定義包,這為開發(fā)者提供了極大的靈活性和可擴展性,本文將深入介紹如何創(chuàng)建、使用和管理自定義包,探索 Go 語言包的奧秘,打造屬于你的編程工具庫
    2023-11-11
  • 一文帶你深入理解Go語言中的sync.Cond

    一文帶你深入理解Go語言中的sync.Cond

    sync.Cond?表示的是條件變量,它是一種同步機制,用來協(xié)調多個?goroutine?之間的同步。本文將通過示例為大家介紹Go語言中sync.Cond的使用,需要的可以參考一下
    2023-01-01
  • go語言環(huán)境搭建簡述

    go語言環(huán)境搭建簡述

    本文簡單記錄了下go語言環(huán)境的搭建流程,給小伙伴們一個參考,希望大家能夠喜歡。
    2015-01-01
  • 一文詳解Golang中的匿名變量

    一文詳解Golang中的匿名變量

    匿名變量是一種特殊類型的變量,可以簡化代碼并提高可讀性,本文將為大家詳細介紹一下golang中匿名變量的定義、特性和使用方法,需要的可以參考下
    2023-09-09
  • Golang中時間格式化的實現詳解

    Golang中時間格式化的實現詳解

    這篇文章主要為大家詳細介紹了Go語言中進行時間進行格式化的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-09-09
  • Go語言寫入字符串到文件的方法

    Go語言寫入字符串到文件的方法

    這篇文章主要介紹了Go語言寫入字符串到文件的方法,實例分析了Go語言操作字符串及文本的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02

最新評論