1 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
看起來你可能對(duì)頻道和套路有誤解。
該行:
go change(c)
似乎表明該函數(shù)change將寫入c. 然而,它最終只是在一段時(shí)間后返回一個(gè)值。
此值 ( 2.5) 不會(huì)在任何地方收到。此外,c不會(huì)被寫入任何地方。我懷疑您打算將其2.5寫入頻道c。其語(yǔ)法如下:
c<-2.5
因此,如果您將change函數(shù)更改為:
func change(c chan float64) {
time.Sleep(2 * time.Second)
c <- 2.5
}
你不應(yīng)該再看到死鎖了。請(qǐng)注意,我不再返回 afloat64了。
我做了一個(gè)游樂場(chǎng)來確保這一點(diǎn):https ://play.golang.org/p/SgLiUmPpcAZ
更新評(píng)論
將1.1始終被通道的值覆蓋。但是,如果您想打印 prints的初始值(如評(píng)論中所述),則必須稍微更改流程并使用語(yǔ)句select:
package main
import (
"fmt"
"time"
)
func change(c chan float64) {
time.Sleep(2 * time.Second)
c <- 2.5
}
func main() {
s := 1.1
c := make(chan float64)
go change(c)
for {
select {
case s = <-c:
default:
// c isn't ready yet
}
fmt.Println(s)
time.Sleep(100 * time.Millisecond)
}
}
現(xiàn)在您有了一個(gè)select語(yǔ)句,您也可以將它與 atime.Ticker一起使用:
ticker := time.NewTicker(100 * time.Millisecond)
for {
select {
case s = <-c:
case <-ticker.C:
fmt.Println(s)
default:
// c isn't ready yet
}
}
- 1 回答
- 0 關(guān)注
- 148 瀏覽
添加回答
舉報(bào)