Go语言的timeout和select随机问题

663280439 · · 4536 次点击
我想这样应该能清晰说明你想要证明的问题了: <iframe style="border:1px solid" src="https://wide.b3log.org/playground/aa049199d5efd71cb331a75cddf66ef2.go?embed=true" width="100%" height="600"></iframe>
#5
更多评论
<a href="/user/Unknown" title="@Unknown">@Unknown</a> <a href="/user/88250" title="@88250">@88250</a>
#1
这个程序 有问题,你的 case 的 else 部分永远得不到执行。所以 根本不能证明什么。给你加上 close(ch1);close(ch2)就可以了 ```go package main import &#34;fmt&#34; import &#34;time&#34; func main() { //定义两个字符串类型的channel ch1, ch2 := make(chan string, 0), make(chan string, 0) //启用goruntine不断从两个channel中读取数据 go func() { fmt.Println(&#34;start&#34;) time.Sleep(5 * time.Second) fmt.Println(&#34;wait&#34;) time.Sleep(2 * time.Second) //i := 1 for { // fmt.Println(i) // i++ select { case v, ok := &lt;-ch1: if ok { fmt.Println(ok, v) } else { fmt.Println(&#34;!!!!&#34;) } case v, ok := &lt;-ch2: if ok { fmt.Println(ok, v) } else { fmt.Println(&#34;~~~~&#34;) } } } }() time.Sleep(2 * time.Second) ch1 &lt;- &#34;cccc&#34; ch2 &lt;- &#34;dddd&#34; close(ch1) close(ch2) time.Sleep(1 * time.Second) fmt.Println(&#34;end&#34;) } ```
#2