第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

go教程選擇語句

go教程選擇語句

Go
江戶川亂折騰 2021-12-07 14:57:40
我正在處理 tour.golang.org 上的示例,但遇到了這段我不太明白的代碼:package mainimport "fmt"func fibonacci(c, quit chan int) {    x, y := 0, 1    for {        select {        case c <- x: // case: send x to channel c?            x, y = y, x+y        case <-quit: // case: receive from channel quit?            fmt.Println("quit")            return        }    }}func main() {    c := make(chan int)    quit := make(chan int)    go func() { // when does this get called?        for i := 0; i < 10; i++ {            fmt.Println(<-c)        }        quit <- 0    }()    fibonacci(c, quit)}我了解通道如何工作的基礎(chǔ)知識,但我不明白上面的 select 語句是如何工作的。教程上的解釋說:“select 語句讓 goroutine 等待多個(gè)通信操作。select 阻塞,直到它的一個(gè) case 可以運(yùn)行,然后它執(zhí)行那個(gè) case。如果多個(gè) case 準(zhǔn)備好了,它會隨機(jī)選擇一個(gè)?!钡沁@些案件是如何執(zhí)行的呢?據(jù)我所知,他們說:案例:將 x 發(fā)送到通道 c案例:從退出接收我想我明白第二個(gè)只有在退出有一個(gè)值時(shí)才執(zhí)行,這是稍后在 go func() 中完成的。但是第一個(gè)案例檢查的是什么?此外,在 go func() 中,我們顯然是從 c 打印值,但此時(shí) c 不應(yīng)該有任何內(nèi)容嗎?我能想到的唯一解釋是 go func() 在調(diào)用 fibonacci() 之后以某種方式執(zhí)行。我猜這是一個(gè)我也不完全理解的 goroutine,它看起來很神奇。如果有人可以通過此代碼并告訴我它在做什么,我將不勝感激。
查看完整描述

3 回答

?
守著一只汪

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊

請記住,通道會阻塞,因此 select 語句如下:


select {

case c <- x: // if I can send to c

    // update my variables

    x, y = y, x+y

case <-quit: // If I can receive from quit then I'm supposed to exit

    fmt.Println("quit")

    return

}

沒有default案例意味著“如果我不能發(fā)送到 c 并且我不能從退出中讀取,直到我可以為止。”


然后在你的主進(jìn)程中,你分離出另一個(gè)讀取c結(jié)果的函數(shù)


for i:=0; i<10; i++ {

    fmt.Println(<-c)  // read in from c

}

quit <- 0  // send to quit to kill the main process.

這里的關(guān)鍵是要記住通道會阻塞,并且您正在使用兩個(gè)無緩沖通道。使用go分拆第二個(gè)功能可以讓您消費(fèi),c所以fibonacci將繼續(xù)。


Goroutines 是所謂的“綠色線程”。使用關(guān)鍵字啟動函數(shù)調(diào)用go會將其分拆為一個(gè)獨(dú)立于主執(zhí)行線運(yùn)行的新進(jìn)程。從本質(zhì)上說,main()和go func() ...同時(shí)運(yùn)行!這很重要,因?yàn)槲覀冊诖舜a中使用了生產(chǎn)者/消費(fèi)者模式。


fibonacci產(chǎn)生值并將它們發(fā)送到c,從 main 產(chǎn)生的匿名 goroutine 消耗來自的值c并處理它們(在這種情況下,“處理它們”只是意味著打印到屏幕上)。我們不能簡單地產(chǎn)生所有的值然后消費(fèi)它們,因?yàn)閏會阻塞。此外fibonacci將永遠(yuǎn)產(chǎn)生更多的值(或直到整數(shù)溢出),因此即使您有一個(gè)具有無限長緩沖區(qū)的魔術(shù)通道,它也永遠(yuǎn)不會到達(dá)消費(fèi)者。


查看完整回答
反對 回復(fù) 2021-12-07
?
莫回?zé)o

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊

理解這個(gè)代碼示例有兩個(gè)關(guān)鍵點(diǎn):

首先,讓我們回顧一下無緩沖通道的工作原理。從文檔

如果通道未緩沖,則發(fā)送方會阻塞,直到接收方收到該值。

請注意,在代碼示例兩個(gè)通道,c并且quit是無緩沖。

其次,當(dāng)我們使用go關(guān)鍵字啟動一個(gè)新的 goroutine 時(shí),執(zhí)行將與其他例程并行發(fā)生。因此,在本例中,我們同時(shí)運(yùn)行兩個(gè)走程序:常規(guī)的啟動func main(),并開始了例行go func()...內(nèi)func main()。

我在這里添加了一些內(nèi)聯(lián)注釋,這應(yīng)該會使事情更清楚: package main import "fmt"

func fibonacci(c, quit chan int) {

    x, y := 0, 1

    for { // this is equivalent to a while loop, without a stop condition

        select {

        case c <- x: // when we can send to channel c, and because c is unbuffered, we can only send to channel c when someone tries to receive from it

            x, y = y, x+y

        case <-quit: // when we can receive from channel quit, and because quit is unbuffered, we can only receive from channel quit when someone tries to send to it

            fmt.Println("quit")

            return

        }

    }

}


func main() {

    c := make(chan int)

    quit := make(chan int)

    go func() { // this runs in another goroutine, separate from the main goroutine

        for i := 0; i < 10; i++ {

            fmt.Println(<-c)

        }

        quit <- 0

    }()

    fibonacci(c, quit) // this doesn't start with the go keyword, so it will run on the go routine started by func main()

}


查看完整回答
反對 回復(fù) 2021-12-07
?
楊魅力

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊

你已經(jīng)明白了。

在 go func() 中,我們顯然是從 c 打印值,但是 c 中不應(yīng)該有任何內(nèi)容嗎?我能想到的唯一解釋是 go func() 在調(diào)用 fibonacci() 之后以某種方式執(zhí)行。我猜這是一個(gè) goroutine

是的, go 關(guān)鍵字啟動了一個(gè) goroutine,所以func()將與fibonacci(c, quit) 同時(shí)運(yùn)行。從 Println 中的通道接收只是阻塞,直到有東西要接收


查看完整回答
反對 回復(fù) 2021-12-07
  • 3 回答
  • 0 關(guān)注
  • 192 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號