go语言中channel疑惑

  1. 《Go memory model》中的定义:A receive from an unbuffered channel happens before the send on that channel completes.
    这句话怎么理解?

  2. 为何channel关闭之后case:<-ch:……分支一直执行

func main() {
    ch := make(chan string)
    go sendData(ch)
    go recvData(ch)
    time.Sleep(2*1e9)
}

func sendData(ch chan  string)  {
    time.Sleep(1e9)
    close(ch)
}

func recvData(ch chan string)  {
    for {
        select {
        case <-ch:
            fmt.Println("Closed")
        default:
            fmt.Println("ing")
            time.Sleep(1e8)
        }
    }
}

而使用

func recvData(ch chan string)  {
    for {
        select {
        case <-ch:
            fmt.Println("Closed")
            select{}
        default:
            fmt.Println("ing")
            time.Sleep(1e8)
        }
    }
}

case:<-ch:……分支只会执行一次。

阅读 3.7k
2 个回答
新手上路,请多包涵
case <-ch:
    fmt.Println("Closed")
    select{}

收到ch关闭事件,select{}执行这句的时候,会阻塞协成,知道主进程执行完退出。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题