关于select的无法退出的问题

anysoc · 2015-07-22 16:42:17 · 2578 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2015-07-22 16:42:17 的主题,其中的信息可能已经有所发展或是发生改变。

想实现一个主程序在监听多个channel的练习。如下,我理解只输出一次就会退出,但是实际上,似乎跑了个死循环,问题出在哪里?

package main

import (
        "fmt"
        "time"
)

func put(c chan<- string, msg string) {
        time.Sleep(time.Second * 1)
        //for i := 1; i < 10; i++ {
        c <- msg
        //}
        close(c)
}

func main() {
        c1 := make(chan string)
        c2 := make(chan string)

        go put(c1, "c1 echoing")
        go put(c2, "c2 echoing")

        for {
                select {
                case <-c1:
                        fmt.Println("c1 echoing")
                case <-c2:
                        fmt.Println("c2 echoing")
                }
        }
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2578 次点击  
加入收藏 微博
1 回复  |  直到 2015-07-23 00:20:18
brucelandor
brucelandor · #1 · 10年之前

把select外面的for去掉,或者在每个case下面加一个break。 之所以会死循环,是因为put把channel关掉了。而从关闭的channel读取数据,读到的是类型的默认零值。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传