初级会员
  • 第 52254 位会员
  • yaxiaomu
  • 2020-04-28 10:17:48
  • Offline
  • 20 46

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • ### 自问自答二波 ``` package main import ( "fmt" "sync" "time" ) func main() { c := make(chan string) var wg sync.WaitGroup wg.Add(2) go func() { c <- "world" defer wg.Done() }() go func() { defer wg.Done() time.Sleep(1 * time.Second) fmt.Println("hello " + <-c) }() wg.Wait() } ```
  • ### 自问自答一波 ``` package main import ( "fmt" "sync" ) func main() { var ( c chan string sth string sy chan bool wg sync.WaitGroup ) c = make(chan string) sy = make(chan bool) wg.Add(2) go func() { sth = "hello\n" // 到这里sth已经赋值,需要阻塞从c中取数据,因为需要先赋值后打印打印sth【hello】, sy <- true //sy通道消息被接收后,然后像c通道写入,然后这里打印world fmt.Println(<-c) wg.Done() }() go func() { <-sy //赋值sth后 hello后打印h然后把world写入到c channel fmt.Printf(sth) c <- "world" wg.Done() }() wg.Wait() } ```
  • #8 @lpflpf 嗯,理解了,这两个没有必然关系,我是先入为主了。
  • #7 @zhengkeyu 嗯,谢谢回复~
  • 评论了主题 select中的break和return
    2楼 @ysh_77 谢谢回复,很详细。我再补充点注释。 ``` package main import ( "fmt" "time" ) var ch = make(chan int, 100) func main() { ch <- 98 ch <- 99 testBreakScope() fmt.Println("main 函数执行结束") time.Sleep(3 * time.Second) } func testBreakScope() { var counter int defer func() { fmt.Println("func testBreakScope 结束") }() ticker := time.NewTicker(10 * time.Nanosecond) for { counter++ fmt.Println("for 中执行第", counter, " 次") select { case i := <-ch: fmt.Println("1===命中第一个case,值为:", i, " 触发select里的break") break //这里是针对select,还会执行到select之外的内容 case <-ticker.C: fmt.Println("3===计时器到期执行case,触发select里的return") return //这里是针对整个函数,只会执行defer中的内容 } fmt.Println("select已经退出,触发select外的break ") break //这里是针对for,还会执行到for之外的内容 } fmt.Println(" 跳出for第", counter, "次") } ```