使用ticker,golang代码有什么问题

时间:2017-06-28 03:12:09

标签: go channel ticker

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的新人。在这段代码中,我想要打印&#34;结束。 [发送方]&#34;一旦goroutine结束了。 我尝试使用ticker.stop(),甚至是time.sleep(),延迟,但没有效果。 它有什么问题,请给我一些想法。谢谢

1 个答案:

答案 0 :(得分:2)

正如documentation所说,ticker.Stop并不关闭频道。所以你不能指望break-loop。您可以为退出添加新频道。

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