六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

Go元素的關鍵字所在--chan通道

[摘要]HTML validate是指HTML驗證。它是通過與標準HTML規則進行比較的方式,分析HTML文檔、標記出錯誤和非標準代碼的處理過程。Web頁面使用HTML進行渲染,而HTML本身采用了HTML規范作為其規則和標準。通過驗證HTML代碼穿越多重瀏覽器標準!chanchan又稱之為通道,形式類似...
HTML validate是指HTML驗證。它是通過與標準HTML規則進行比較的方式,分析HTML文檔、標記出錯誤和非標準代碼的處理過程。Web頁面使用HTML進行渲染,而HTML本身采用了HTML規范作為其規則和標準。通過驗證HTML代碼穿越多重瀏覽器標準!

chan

chan又稱之為通道,形式類似于管道,內容從一頭被送進去,從另一頭被讀取出來。下邊來介紹定義通道的方法:

var 變量名 chan dataType

定義通道時,需要指定數據類型,就是只允許這個指定數據類型的變量通過這個通道。

初始化通道

golang中在初始化通道類型變量時,可以將通道分為兩種情況,一種是帶緩沖的通道,另一種是不帶緩沖的通道。
下邊來介紹下兩種情況的初始化方法:

// 初始化不帶緩沖的通道,通道中數據類型是intvar ch1 = make(chan int)// 初始化帶10個緩沖的通道,通道中數據類型是stringvar ch2 = make(chan string,10)

還有一種寫法是,定義并初始化通道,

// 定義通道,并給通道初始化8個緩沖ch3 := make(chan int ,8)// 定義通道,并初始化為不帶緩沖通道ch4 := make(chan string)

通道賦值

對通道的讀取和寫入都可能進入阻塞狀態。

  1. 不帶緩沖的通道,在寫入時,就會發生阻塞,直到通道中信息被讀取后,才會結束阻塞。

  2. 帶緩沖的通道,每次向通道中寫入一次信息,通道長度就會加1,每成功從通道讀取一次信息,通道長度減1。如果通道長度等于通道緩沖長度時,向通道繼續寫入信息會使程序阻塞;如果通道長度小于通道緩沖長度,則向通道中寫入信息不會造成阻塞。假如通道長度是5,那么在通道沒有被讀取的情況下,向通道中第6次寫入信息時才會導致程序阻塞。

通道寫入的語法格式是:

var ch = make(chan string,10)// 將字符串”hello"寫入到通道中,通道長度加1ch <- "hello"

讀取通道

通道為空
1. 通道沒有關閉,程序會進入阻塞狀態,等到通道有信息寫入
2. 通道已經關閉,不會阻塞,返回通道中數據類型初始值(臟數據),如通道是chan int時,返回值是0,通道是chan string時,返回值是空。
通道不為空
1. 通道沒有關閉,從通道中讀取一次信息,讀取完成后,往下執行
2. 通道已被關閉,從通道中讀取一次信信,讀取完成后,往下執行

讀取通道操作:

val,ok := <-ch

使用斷言讀取通道中的值,檢查通道是否還有內容,以及判斷通道是否已經關閉,當通道中沒有信息,且通道已經關閉時,ok值為false,當通道沒有關閉,但是通道中沒有信息,程序將會阻塞,如果通道中有內容,則ok值是true。

另一種不使用斷言的方式讀取通道

val := <-ch

寫入與讀取通道

讀取不帶緩沖的通道示例方法:

package mainimport (    "fmt")func main() {    // 定義一個不帶緩沖的通道,通道中數據類型是int
    var c = make(chan int)    // 開啟一個攜程,讀取通道中的內容
    go func() {
        fmt.Println("寫入信息是:", <-c)
    }()    // 向通道中寫入數據
    c <- 1}

輸出結果:

寫入信息是: 1

當對帶緩沖的通道進行讀寫時,只要通道中數據長度不大于緩沖長度,就不會出現阻塞,但是讀取帶緩沖的通道,通道中沒有內容時,程序依然會進入阻塞狀態。所以,帶緩沖的通道,只對寫入產生影響。下邊來一個示例:

package mainimport (    "fmt")func main() {    var c = make(chan int, 3)
    c <- 1
    c <- 2
    c <- 3
    //c <- 4
    fmt.Println("end")
}

輸出信息是:

end

當向帶3個緩沖的通道中寫入內容時,由于只寫入了3次,通道的長度剛好等于緩沖的長度,程序沒有阻塞,當將 c <- 4 前邊的注釋去掉后,由于沒有程序去讀取這個通道,主程序進入死鎖狀態而導致異常。

協程通信

通道類型變量的實質上是一個地址,如下邊示例代碼:

package mainimport (    "fmt")func main() {    var c = make(chan int, 3)
    fmt.Println(c)
}

輸出結果:

0xc042072080

所以,當通道類型變量當做參數傳入函數后,在函數中可以直接對通道中的值進行修改。雖然chan類型變量是一個地址,但是golang不允許使用取值操作符( * )來操作chan類型變量。但是如果你先對chan類型變量使用取地址操作符(&),然后再使用取值操作符(*),這種操作方法還是可以正常運行的,但是這意義不大,除非你的目的是在函數調用中,重新定義一個chan類型變量替換原來的變量。

chan的這些特性,可以很好的實現協程之間的同步功能。不帶緩沖的通道,是一種零容忍的等待,可以實現強制同步;帶緩沖的通道,是有一定量容忍度的等待,可以實現允許有一定時間差的同步。

簡單的協程間通信例子:

package mainimport (    "fmt"
    "time")func main() {    var c = make(chan int)    go func() {
        fmt.Println("待命模式:")        // 讀取通道時產生阻塞,等待其他協程向通道寫入信息
        fmt.Println("命令代碼是:", <-c)
    }()    go func() {        // 延時3秒,向通道中寫入信息
        time.Sleep(time.Second * 3)
        fmt.Println("發送命令:")
        c <- 8
        close(c)
    }()
    time.Sleep(time.Second * 5)
    fmt.Println("執行完成")
}

輸出信息是:

待命模式:
發送命令:
命令代碼是: 8
執行完成

相關推薦:

HTML validate HTML驗證_HTML/Xhtml_網頁制作

HTML技巧匯編_CSS/HTML

以上就是Go元素的關鍵字所在--chan通道的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。




主站蜘蛛池模板: 四虎成人免费影院网址 | 日韩在线2020专区 | 综合婷婷丁香 | 人人爱人人看 | 亚洲香蕉综合在人在线视看 | 亚洲狠狠婷婷综合久久久久图片 | 亚洲产在线精品第一站不卡 | 午夜影视在线观看 | 我要看黄色一级毛片 | 天天噜噜揉揉狠狠夜夜 | 午夜影院美女 | 午夜免费啪在线观看视频网站 | 亚洲五月六月丁香激情 | 天天影视色香欲综合网天天录日日录 | 欧美午夜影院 | 青春草在线| 又爽又黄又无遮挡的视频在线观看 | 息与子外出中文字幕 | 亚洲第一区二区快射影院 | 欲色网站| 一二三四在线手机观看视频 | 色天使久久综合给合久久97色 | 伊人中文字幕 | 在线播放亚洲精品富二代91 | 亚洲一区二区影视 | 亚洲成av人影片在线观看 | 在线播放侵犯高傲女教师希崎 | 青娱乐在线视频观看 | 天天干在线免费视频 | 亚洲天堂在线观看完整版 | 一级做α爰片久久毛片 | 在线观看欧美视频 | 色吊丝国产永久免费网址 | 人妖欧美一区二区三区四区 | 碰91精品国产91久久婷婷 | 亚洲综合激情网 | 亚洲另类电击调教在线观看 | 天天色综合图片 | 天天干夜夜谢 | 青娱乐精品 | 天天做天天爱夜夜爽女人爽宅 |