求教golang中 for循环的一个问题?

package main

import (
    "time"
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    mc := make(chan int)
    go func(mcc chan int, wgg sync.WaitGroup){
        wgg.Add(+1)
        defer wgg.Done()
        time.Sleep(10 * time.Second)
        mcc <- 5
    }(mc, wg)
    wg.Wait()

    for {
        fmt.Println("loop")
        time.Sleep(1000 * time.Millisecond)
        select{
        case data := <- mc:
            fmt.Println(data)
            break
        default:
            continue
        }
    }
}

初学go,看了语法实践了一下,应该是理解有误。创建一个go协程,10秒后向管道中输入一个数值,然后下面循环,如果从管道中获取到数据则break。但为何运行后,到第10秒打印出数字5之后仍然每秒打印一次loop?

阅读 4.1k
3 个回答

case的break 改为return
还有一些其他方式
https://golang.org/ref/spec#B...

A "break" statement terminates execution of the innermost "for", "switch", or "select" statement within the same function.

这是官方文档,可以去看下
这些基础的知识还是要打牢点

break只是break了select,你这里的for是一个死循环且没有退出条件。

package main

import (
    "time"
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    mc := make(chan int)
    go func(mcc chan int, wgg sync.WaitGroup){
        wgg.Add(+1)
        defer wgg.Done()
        time.Sleep(10 * time.Second)
        mcc <- 5
    }(mc, wg)
    wg.Wait()
    loop:
        for {
            fmt.Println("loop")
            time.Sleep(1000 * time.Millisecond)
            select{
            case data := <- mc:
                fmt.Println(data)
                break loop
            default:
                continue
            }
        }
}

给for循环加上标签, break的时候 跳出到指定的标签之外

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