goroutine/channel(2)

package main

import "fmt"

func main() {

    dataChan := make(chan int, 5)
    syncChan1 := make(chan struct{}, 1)
    syncChan2 := make(chan struct{}, 2)

    //演示接收操作
    go func() {
        <- syncChan1
        for {
            if elem, ok := <- dataChan; ok {
                fmt.Printf("Received: %d [receiver]\n", elem)
            } else {
                break
            }
        }
        fmt.Println("Done. [receiver]")
        syncChan2 <- struct{}{}
    }()

    //演示發(fā)送操作
    go func() {
        for i := 0; i < 5; i++ {
            dataChan <- i
            fmt.Printf("Sent: %d [sender]\n", i)
        }
        close(dataChan)
        syncChan1 <- struct{}{}
        fmt.Println("Done. [sender]")
        syncChan2 <- struct{}{}
    }()

    <-syncChan2
    <-syncChan2

}

輸出:
Sent: 0 [sender]
Sent: 1 [sender]
Sent: 2 [sender]
Sent: 3 [sender]
Sent: 4 [sender]
Done. [sender]
Received: 0 [receiver]
Received: 1 [receiver]
Received: 2 [receiver]
Received: 3 [receiver]
Received: 4 [receiver]
Done. [receiver]

創(chuàng)新互聯(lián)于2013年成立,先為徐州等服務(wù)建站,徐州等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為徐州企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

Process finished with exit code 0

調(diào)用close函數(shù)可以關(guān)閉一個(gè)通道。但是,這樣做的時(shí)候一定要特別注意:試圖向一個(gè)已經(jīng)關(guān)閉的通道發(fā)送元素時(shí),會(huì)讓發(fā)送操作引起運(yùn)行時(shí)恐慌。因此,你總是應(yīng)該保證安全的前提下關(guān)閉通道。這會(huì)設(shè)計(jì)到一些技巧,比如for語(yǔ)句和select語(yǔ)句。無(wú)論怎樣都不應(yīng)該在接收端關(guān)閉通道。因?yàn)樵诮邮斩送ǔo(wú)法判斷發(fā)送端是否還會(huì)向該通道發(fā)送元素。另一方面,在發(fā)送端關(guān)閉通道一般不會(huì)對(duì)接收端的接收操作產(chǎn)生什么影響。如果通道在被關(guān)閉時(shí)其中仍然有元素,你依然可以接收表達(dá)式取出,并根據(jù)該表達(dá)式的第二個(gè)結(jié)果判斷通道是否已無(wú)元素可取。
上面的例子:在發(fā)送方,我在向通道dataChan發(fā)送完所有元素并關(guān)閉通道后,才告知接收方開始接收。雖然通道已經(jīng)關(guān)閉,但是對(duì)接收操作并無(wú)影響,接收方依然可以在接收完所有元素后自行結(jié)束。
最后還有兩點(diǎn)要注意:
1.對(duì)弈同一個(gè)通道,僅允許關(guān)閉一次,對(duì)通道的重復(fù)關(guān)閉會(huì)引發(fā)運(yùn)行恐慌。
2.在調(diào)用close函數(shù)時(shí),你需要把代表欲關(guān)閉的那個(gè)通道的變量作為參數(shù)傳入。如果此時(shí)該變量的值為nil,就會(huì)引發(fā)運(yùn)行時(shí)恐慌

單向channel:
一個(gè)只進(jìn)步出的通道沒有任何意義。其實(shí),單項(xiàng)通道應(yīng)由雙向通道變換而來(lái),我們可以用這種變換來(lái)約束程序?qū)νǖ赖氖褂梅绞剑?/p>

新聞標(biāo)題:goroutine/channel(2)
分享地址:http://bm7419.com/article10/iihgdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)ChatGPT、小程序開發(fā)、網(wǎng)站排名、網(wǎng)站維護(hù)

廣告

聲明:本網(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)

網(wǎng)站托管運(yùn)營(yíng)