Golang 中国
package main

import "fmt"

func main() {
    messages := make(chan string)
    signals := make(chan bool)

    select {
    case msg := <-messages:
        fmt.Println("received message", msg)
    default:
        fmt.Println("no message received")
    }

    msg := "hi"
    select {
    case messages <- msg:
        fmt.Println("sent message", msg)
    default:
        fmt.Println("no message sent")
    }

    select {
    case msg := <-messages:
        fmt.Println("received message", msg)
    case sig := <-signals:
        fmt.Println("received signal", sig)
    default:
        fmt.Println("no activity")
    }
}

fising 于 2014-10-03 12:04 修改
5 回复
fising
#1 fising • 2014-10-03 12:05

第一个select的输出,能看明白。第二第三有点不明白了。

snake117
#2 snake117 • 2014-10-03 12:17

肯定都是default的输出了,你这同一个线程,通道还没有缓冲,难道还能执行通道吗?

stevewang
#3 stevewang • 2014-10-03 14:27

显然都是走default分支。第二第三个select哪里不明白?

fising
#4 fising • 2014-10-03 18:01

第一个,尝试从一个空的channel 读取数据,肯定是读不到,所以走 default

第二个,msg 和 通道 messages 都是 ready 的,怎么还走到 default 去了?

fising
#5 fising • 2014-10-03 18:09

......

以前一直认为 make(chan string)make(chan string, 1) 效果是一样的

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。