鍍金池/ 問答/GO/ 求教golang中 for循環(huán)的一個問題?

求教golang中 for循環(huán)的一個問題?

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
        }
    }
}

初學(xué)go,看了語法實踐了一下,應(yīng)該是理解有誤。創(chuàng)建一個go協(xié)程,10秒后向管道中輸入一個數(shù)值,然后下面循環(huán),如果從管道中獲取到數(shù)據(jù)則break。但為何運行后,到第10秒打印出數(shù)字5之后仍然每秒打印一次loop?

回答
編輯回答
清夢

break只是break了select,你這里的for是一個死循環(huán)且沒有退出條件。

2018年9月16日 08:25
編輯回答
執(zhí)念

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.

這是官方文檔,可以去看下
這些基礎(chǔ)的知識還是要打牢點

2017年8月26日 18:25
編輯回答
故人嘆
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循環(huán)加上標(biāo)簽, break的時候 跳出到指定的標(biāo)簽之外

2017年10月24日 22:20