登录
首页 >  Golang >  Go问答

代码、管道和不断循环

来源:stackoverflow

时间:2024-02-26 19:42:20 362浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《代码、管道和不断循环》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我正在尝试从频道获取信息,但看起来我的代码在 go 例程之后没有运行。 我的两个例程都在工作,第一个例程收集信息,最后一个例程正在观察填充,如果填充结束,第二个例程将停止两个例程 我如何获取信息并在例程之后运行代码?或者也许有任何正确的方式来获取信息?

func main() {
    watcher, _ := winlog.NewWinLogWatcher()
    watcher.SubscribeFromBeginning("Application", `*`)
    i := 0
    c := make(chan bool)
    go func() {
        for {
            if flag == true {
                return
            }
            select {
            case evt := <-watcher.Event():
                i+=1
                var event Event
                data := []byte(evt.Xml)
                _ = xml.Unmarshal(data, &event)
                Events = append(Events, event)
            case err := <-watcher.Error():
                break
            }
        }
    }()

    go func() {
        for {
            if flag == true {
                break
            }
            if I == 0 || I != i {
                I = i
            }
            time.Sleep(time.Millisecond * 100)
            if i == I && flag == false{
                flag = true
            }
            time.Sleep(time.Millisecond * 10)
        }
    }()
    <-c
    // *** i cant print this info ***
    time.Sleep(10*time.Millisecond)
    fmt.Println(`Events counter:`, len(Events))
}

解决方案


从通道 <-c 读取是阻塞操作。

由于您没有写入此通道,因此您会在从通道读取数据后阻止进一步的操作。

您可以使用sync.waitgroup

wg := &sync.WaitGroup{}
wg.Add(1)
go func () {
    defer wg.Done()
    ...
}
wg.Wait()

到这里,我们也就讲完了《代码、管道和不断循环》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>