Go元素的關(guān)鍵字存放的chan通道

本篇文章為大家展示了Go元素的關(guān)鍵字存放的chan通道,代碼簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站建設(shè)、成都網(wǎng)站制作與策劃設(shè)計(jì),隆德網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:隆德等地區(qū)。隆德做網(wǎng)站價(jià)格咨詢:028-86922220

HTML validate是指HTML驗(yàn)證。它是通過(guò)與標(biāo)準(zhǔn)HTML規(guī)則進(jìn)行比較的方式,分析HTML文檔、標(biāo)記出錯(cuò)誤和非標(biāo)準(zhǔn)代碼的處理過(guò)程。Web頁(yè)面使用HTML進(jìn)行渲染,而HTML本身采用了HTML規(guī)范作為其規(guī)則和標(biāo)準(zhǔn)。通過(guò)驗(yàn)證HTML代碼穿越多重瀏覽器標(biāo)準(zhǔn)!

chan

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

var 變量名 chan dataType

定義通道時(shí),需要指定數(shù)據(jù)類型,就是只允許這個(gè)指定數(shù)據(jù)類型的變量通過(guò)這個(gè)通道。

初始化通道

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

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

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

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

通道賦值

對(duì)通道的讀取和寫入都可能進(jìn)入阻塞狀態(tài)。

  1. 不帶緩沖的通道,在寫入時(shí),就會(huì)發(fā)生阻塞,直到通道中信息被讀取后,才會(huì)結(jié)束阻塞。

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

通道寫入的語(yǔ)法格式是:

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

讀取通道

通道為空
 1. 通道沒(méi)有關(guān)閉,程序會(huì)進(jìn)入阻塞狀態(tài),等到通道有信息寫入
 2. 通道已經(jīng)關(guān)閉,不會(huì)阻塞,返回通道中數(shù)據(jù)類型初始值(臟數(shù)據(jù)),如通道是chan int時(shí),返回值是0,通道是chan string時(shí),返回值是空。
 通道不為空
 1. 通道沒(méi)有關(guān)閉,從通道中讀取一次信息,讀取完成后,往下執(zhí)行
 2. 通道已被關(guān)閉,從通道中讀取一次信信,讀取完成后,往下執(zhí)行

讀取通道操作:

val,ok := <-ch

使用斷言讀取通道中的值,檢查通道是否還有內(nèi)容,以及判斷通道是否已經(jīng)關(guān)閉,當(dāng)通道中沒(méi)有信息,且通道已經(jīng)關(guān)閉時(shí),ok值為false,當(dāng)通道沒(méi)有關(guān)閉,但是通道中沒(méi)有信息,程序?qū)?huì)阻塞,如果通道中有內(nèi)容,則ok值是true。

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

val := <-ch

寫入與讀取通道

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

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

輸出結(jié)果:

寫入信息是: 1

當(dāng)對(duì)帶緩沖的通道進(jìn)行讀寫時(shí),只要通道中數(shù)據(jù)長(zhǎng)度不大于緩沖長(zhǎng)度,就不會(huì)出現(xiàn)阻塞,但是讀取帶緩沖的通道,通道中沒(méi)有內(nèi)容時(shí),程序依然會(huì)進(jìn)入阻塞狀態(tài)。所以,帶緩沖的通道,只對(duì)寫入產(chǎn)生影響。下邊來(lái)一個(gè)示例:

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

輸出信息是:

end

當(dāng)向帶3個(gè)緩沖的通道中寫入內(nèi)容時(shí),由于只寫入了3次,通道的長(zhǎng)度剛好等于緩沖的長(zhǎng)度,程序沒(méi)有阻塞,當(dāng)將 c <- 4 前邊的注釋去掉后,由于沒(méi)有程序去讀取這個(gè)通道,主程序進(jìn)入死鎖狀態(tài)而導(dǎo)致異常。

協(xié)程通信

通道類型變量的實(shí)質(zhì)上是一個(gè)地址,如下邊示例代碼:

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

輸出結(jié)果:

0xc042072080

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

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

簡(jiǎn)單的協(xié)程間通信例子:

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

輸出信息是:

待命模式:
發(fā)送命令:
命令代碼是: 8
執(zhí)行完成

上述內(nèi)容就是Go元素的關(guān)鍵字存放的chan通道,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站欄目:Go元素的關(guān)鍵字存放的chan通道
網(wǎng)頁(yè)網(wǎng)址:http://bm7419.com/article28/gejpcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、定制網(wǎng)站、動(dòng)態(tài)網(wǎng)站虛擬主機(jī)、移動(dòng)網(wǎng)站建設(shè)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)