dongmubi4375 2017-06-28 03:12
浏览 11
已采纳

使用代码显示golang代码有什么问题

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
", e)
        sum += e
        if sum > 10 {
            fmt.Printf("Got: %v
", sum)
            break
            //ticker.Stop()
        }
    }
    fmt.Println("End. [receiver]")
    //time.Sleep(10)
}

I'm new in golang. In this code, I want print "End. [sender]" once when the goroutine is over. I try to use ticker.stop(), or even time.sleep(), defer , but no effect. What's wrong with it, please give me some idea. thanks

  • 写回答

1条回答 默认 最新

  • donglin1192 2017-06-28 06:11
    关注

    As documentation says, ticker.Stop doesn't close channel. So you must not expect break-loop. You can add new channel for quit.

    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
    ", e)
            sum += e
            if sum > 10 {
                fmt.Printf("Got: %v
    ", sum)
                quit <- true
                //break
                //ticker.Stop()
            }
        }
        fmt.Println("End. [receiver]")
        //time.Sleep(10)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?