package main

import (
    "fmt"
    "time"
)

func main() {
    intChan := make(chan int, 1)
    ticker := time.NewTicker(time.Second)
    go func() {
        for _ = range ticker.C {
            select {
            case intChan <- 1:
            case intChan <- 2:
            case intChan <- 3:
            }
        }
        /*defer */
        fmt.Println("End. [sender]")
    }()
    var sum int
    for e := range intChan {
        fmt.Printf("Received: %v\n", e)
        sum += e
        if sum > 10 {
            fmt.Printf("Got: %v\n", sum)
            break
            //ticker.Stop()
        }
    }
    fmt.Println("End. [receiver]")
    //time.Sleep(10)
}

我是golang的新手。在这段代码中,我想在goroutine完成后打印一次“End。[sender]”。
我尝试使用ticker.stop()甚至time.sleep(),defer,但没有效果。
有什么问题,请给我一些想法。谢谢

最佳答案

正如documentation所说,ticker.Stop不会关闭 channel 。因此,您一定不要指望中断循环。您可以添加新的退出 channel 。

package main

import (
    "fmt"
    "time"
)

func main() {
    intChan := make(chan int, 2)
    ticker := time.NewTicker(time.Second)
    quit := make(chan bool)
    go func() {
    loop:
        for {
            select {
            case <-ticker.C:
                select {
                case intChan <- 1:
                case intChan <- 2:
                case intChan <- 3:
                }
            case <-quit:
                break loop
            }
        }
        /*defer */
        fmt.Println("End. [sender]")
        close(intChan)
    }()
    var sum int
    for e := range intChan {
        fmt.Printf("Received: %v\n", e)
        sum += e
        if sum > 10 {
            fmt.Printf("Got: %v\n", sum)
            quit <- true
            //break
            //ticker.Stop()
        }
    }
    fmt.Println("End. [receiver]")
    //time.Sleep(10)
}

关于go - 使用代码显示golang代码有什么问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44793019/

10-12 06:54