免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

如何使用Go語(yǔ)言簡(jiǎn)單模擬Python的生成器-創(chuàng)新互聯(lián)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何使用Go語(yǔ)言簡(jiǎn)單模擬Python的生成器,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

成都創(chuàng)新互聯(lián)咨詢電話:13518219792,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),成都創(chuàng)新互聯(lián)網(wǎng)頁(yè)制作領(lǐng)域十多年,包括成都小攪拌車等多個(gè)領(lǐng)域擁有豐富的營(yíng)銷推廣經(jīng)驗(yàn),選擇成都創(chuàng)新互聯(lián),為企業(yè)錦上添花。
def demo_input_and_output():
  input = yield 'what is the input?'
  yield 'input is: %s' % input

gen = demo_input_and_output()
print(gen.next())
print(gen.send(42))

這段代碼演示了 python generator 的功能??梢钥吹?yield 同時(shí)做了兩個(gè)操作,一個(gè)是往外發(fā)數(shù)據(jù) "waht is the input",同時(shí)做的操作是往里收數(shù)據(jù) input。而且這個(gè)接收數(shù)據(jù)的操作是一個(gè)阻塞的操作,如果外部沒(méi)有調(diào)用 next() (也就是往里傳遞None),或者調(diào)用send(42)(也就是往里傳遞42這個(gè)值),那么這個(gè)阻塞的操作就會(huì)一直等待下去。

也就是說(shuō) python 的 generator 自帶了一個(gè)對(duì)外通信的 channel,用于收發(fā)消息。用 go 模擬 python 的 generator 的話寫起來(lái)就是這樣的

復(fù)制代碼 代碼如下:

package main

import "fmt"

func demoInputAndOutput(channel chan string) {
    channel <- "what is my input?"
    input := <- channel
    channel <- fmt.Sprintf("input is: %s", input)
}

func main() {
    channel := make(chan string)
    go demoInputAndOutput(channel)
    fmt.Println(<- channel)
    channel <- "42"
    fmt.Println(<- channel)
}

這段代碼和 python 版本基本上等價(jià)。隱含的 channel 在 go 版本里變成顯式的了。yield 變成了 channel <- 操作,同時(shí)立馬做了一個(gè) <- channel 的阻塞讀操作。這也就是 yield 的本質(zhì)吧。

go 的 channel 也可以當(dāng)成 iterator 被 for 循環(huán)使用:

復(fù)制代碼 代碼如下:

package main

import "fmt"

func someGenerator() <-chan string {
    channel := make(chan string)
    go func() {
        channel <- "a"
        fmt.Println("after a")
        channel <- "c"
        fmt.Println("after c")
        channel <- "b"
        fmt.Println("after b")
        close(channel)
    }()
    return channel
}

func main() {
    channel := someGenerator()
    for val := range channel {
        fmt.Println(val)
    }
}

和 python 的 yield 不同,這里的 channel <- 不等價(jià)于 yield,它會(huì)往下執(zhí)行直到阻塞。效果是

復(fù)制代碼 代碼如下:

after a
a
c
after c
after b
b

這和預(yù)期的順序不一樣。這里沒(méi)有把 after a after c after b 都打印出來(lái)是因?yàn)?channel 默認(rèn)只有一個(gè)元素的buffer,所以寫入了一個(gè)就阻塞了。如果增大 buffer,那么就有效果了

復(fù)制代碼 代碼如下:

make(chan string, 10)

輸出變成了:

after a
after c
after b
a
c
b

可見(jiàn) goroutine 就好象一個(gè)獨(dú)立的線程一樣自己和自己玩去了,不用等待被執(zhí)行。如果要模擬 yield 就要加上顯示的同步操作(從 channel 里阻塞讀取信號(hào)):

復(fù)制代碼 代碼如下:

package main

import "fmt"

func someGenerator() chan string {
    channel := make(chan string)
    go func() {
        channel <- "a"
        <- channel
        fmt.Println("after a")
        channel <- "c"
        <- channel
        fmt.Println("after c")
        channel <- "b"
        <- channel
        fmt.Println("after b")
        close(channel)
    }()
    return channel
}

func main() {
    channel := someGenerator()
    for val := range channel {
        fmt.Println(val)
        channel <- ""
    }
}

輸出的結(jié)果就是

a
after a
c
after c
b
after b

到這里我們可以看到,python 的 generator 就好象是 golang 的 goroutine 帶了一個(gè)無(wú)buffer的channel。這樣導(dǎo)致每次yield一個(gè)值,都會(huì)產(chǎn)生一次協(xié)程上下文切換。雖然協(xié)程上下文切換很廉價(jià),但是也不是沒(méi)有成本。像 goroutine 的 buffered channel 這樣的設(shè)計(jì),可以讓一個(gè) goroutine 一次性多產(chǎn)生一些輸出再阻塞等待,而不是產(chǎn)生一個(gè)輸出就阻塞等待一下,再產(chǎn)生另外一個(gè)輸出。golang rocks!

上述就是小編為大家分享的如何使用Go語(yǔ)言簡(jiǎn)單模擬Python的生成器了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

分享名稱:如何使用Go語(yǔ)言簡(jiǎn)單模擬Python的生成器-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://m.newbst.com/article32/dggdsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名云服務(wù)器、全網(wǎng)營(yíng)銷推廣、移動(dòng)網(wǎng)站建設(shè)、建站公司、動(dòng)態(tài)網(wǎng)站

廣告

聲明:本網(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)站建設(shè)