1 回答
TA贡献1831条经验 获得超9个赞
看起来你可能对频道和套路有误解。
该行:
go change(c)
似乎表明该函数change将写入c. 然而,它最终只是在一段时间后返回一个值。
此值 ( 2.5) 不会在任何地方收到。此外,c不会被写入任何地方。我怀疑您打算将其2.5写入频道c。其语法如下:
c<-2.5
因此,如果您将change函数更改为:
func change(c chan float64) {
time.Sleep(2 * time.Second)
c <- 2.5
}
你不应该再看到死锁了。请注意,我不再返回 afloat64了。
我做了一个游乐场来确保这一点:https ://play.golang.org/p/SgLiUmPpcAZ
更新评论
将1.1始终被通道的值覆盖。但是,如果您想打印 prints的初始值(如评论中所述),则必须稍微更改流程并使用语句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)
}
}
现在您有了一个select语句,您也可以将它与 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 关注
- 123 浏览
添加回答
举报