这段代码的输出是什么?为什么?

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")
    }
}

共 5 个回复


fising

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

# 0

snake117

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

# 1

stevewang

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

# 2

fising

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

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

# 3

fising

......

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

# 4