channel 和select的小问题

pssgo · 2018-08-29 15:53:11 · 1419 次点击

case v1, ok1 = <- ch1: 等号钱加上冒号: case v1, ok1 := <- ch1:

#7
更多评论
v,ok=<-chan

这里的ok是说c是否关闭,因为关闭之后从chan种读取数据会立即返回。

c:=make(chan int,2)
v,ok:=<-c  // 阻塞,等待从c中读取数据
// 关闭chan
close(c)
v,ok:=<-c //不会阻塞,立即返回,如果此次从chan中读取到了值,则ok为true,否则为false且v为零值
#1

@justay 问题是我的channel 没有全部接收完毕啊, chan怎么会被关闭那? 这是完整代码

package main

import (
    "fmt"
    "os"
)

func main() {
    ch1,ch2 := make(chan int, 3), make(chan int)

    go func() {
        v, ok, s := 0, false, ""
        for {
            select {
            case v, ok = <- ch1:
                s = "a"
            case v, ok = <- ch2:
                s = "b"
            }
            if ok {
                fmt.Println("v&s",v, s)
            }else {
                os.Exit(1)
            }
        }
    }()

    for i:= 1; i < 4; i++ {
        select {
        case ch1 <- i:
        case ch2 <- i:
        }
    }

    fmt.Println("send over")

    close(ch1)
    close(ch2)

    fmt.Println("ch",ch1,ch2)
    select {} // 阻塞进程
}
#2