登录
首页 >  Golang >  Go问答

close 后执行的操作要解释一下

来源:stackoverflow

时间:2024-03-07 15:48:18 290浏览 收藏

大家好,今天本人给大家带来文章《close 后执行的操作要解释一下》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

我无法理解这个程序 for select,所以我需要帮助来解释这个程序的顺序,

    done := make(chan interface{})
    go func() {
        time.Sleep(5 * time.Second)
        close(done)
    }()
    workcount := 0
loop:
    for {
        select {
        case <-done:
            break loop
        default:
        }
        workcount++
        fmt.Println(workcount)
        time.Sleep(1 * time.Second)
    }
    fmt.Printf("Achieved %v cycles of work before signalled to stop \n", workcount)

解决方案


// our communication channel is created
    done := make(chan interface{})

    // run this function as goroutine
    go func() {
        // wait/sleep 5 seconds
        time.sleep(5 * time.second)

        // close our communication channel
        close(done)
    }()

    // initialize workcount with 0
    workcount := 0

loop:
    // loop
    for {
        // read channel data
        select {
        // if channel is closed break this loop, break = stop!
        case <-done:
            break loop

        // default do nothing
        default:
        }

        // if our channel doesn't send anything, just add +1 to workcount
        workcount++

        // print workcount
        fmt.println(workcount)

        // wait 1 second before we run this loop again
        time.sleep(1 * time.second)
    }

    // so workcount is 5, cuz our goroutine will send term signal after 5 seconds
    fmt.printf("achieved %v cycles of work before signalled to stop \n", workcount)

解决这个问题的更简洁的方法是

package main

import (
    "fmt"
    "time"
)

func main() {
    // sends after 5 seconds to this channel https://golang.org/pkg/time/#after
    timeout := time.after(5 * time.second)

    // sends each second to this channel https://golang.org/pkg/time/#tick
    tick := time.tick(1 * time.second)

    // our workcount var
    workcount := 0

    // for infinite
    for {
        // waits for data on each channel
        select {
        // fired if time.after wrote in timeout
        case <-timeout:
            fmt.printf("achieved %v cycles of work before signalled to stop \n", workcount)
            return
        // fired if time.tick wrote in tick
        case <-tick:
            workcount++
            fmt.println(workcount)
        }
    }
}

您在主函数中运行代码,因此我们需要返回。我们将使用 return 修复此代码

package main

import (
    "fmt"
    "time"
)

func main() {
    // Our communication channel is created
    done := make(chan interface{})

    // run this function as goroutine
    go func() {
        // wait/sleep 5 seconds
        time.Sleep(5 * time.Second)

        // close our communication channel
        close(done)
    }()

    // initialize workcount with 0
    workcount := 0

    // loop
    for {
        // read channel data
        select {
        // if channel is closed break this loop, break = stop!
        case <-done:
            fmt.Printf("Achieved %v cycles of work before signalled to stop \n", workcount)
            return

        // default do nothing
        default:
        }

        // if our channel doesn't send anything, just add +1 to workcount
        workcount++

        // print workcount
        fmt.Println(workcount)

        // wait 1 second before we run this loop again
        time.Sleep(1 * time.Second)
    }
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

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