试着用WaitGroup来理解go func

时间:2017-06-14 23:30:22

标签: go

我有以下代码https://play.golang.org/p/9jPlypO4d-

package main
import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    c := make(chan int)
    go func() {
            defer wg.Done()
            for {
                    if <-c == -1 {
                            fmt.Print(":")
                            return
                    }

                    fmt.Print(".")
                    time.Sleep(time.Second)
            }

    }()

    c <- 0
    time.Sleep(time.Second * 5)
    c <- -1
    wg.Wait()
}

我想知道为什么只打印了一个.?不应该像4或5吗?

1 个答案:

答案 0 :(得分:3)

if <-c == -1将阻止,直到频道中有内容为止。所以,第一个值是0,它得到它,打印出一个.,睡眠一秒钟(在goroutine外面睡觉5秒),然后它阻塞直到它获得下一个值。然后它返回。

读取通道而不阻塞(我知道)的唯一方法是使用带有默认情况的select语句。

go func() {
    defer wg.Done()
    for {
        select {
        case x, ok := <-c:
            if ok && x == -1 {
                fmt.Print(":")
                return
            }
        default:
            fmt.Print(".")
        }

        time.Sleep(time.Second)
    }

}()

https://play.golang.org/p/nOG_hfih4D