如何在全局范围内将select的输出传递给select之外?

时间:2018-02-11 21:41:25

标签: select go

我无法在select语句之外传递字符串变量。

案例(简化):

我有一个同步脚本,它使用select和两个选项

  1. timeout(3秒)
  2. default使用频道更改字符串的值。
  3. 当我们检查select内的字符串结果时 - 它显示正确。

    但是一旦我们离开select语句,变量就会恢复为之前的值。

    package main
    
    import (
        "log"
        "time"
    )
    
    func main() {
        timeout := time.After(3 * time.Second)
        pollInt := time.Second
    
        var ret string = "EMPTY"
    
    OuterLoop:
        for {
            select {
            case <-timeout:
                log.Printf("[select][timeout] select timeout, break select and for loops")
                break OuterLoop
    
            default:
                log.Printf("[select][default] Processing our actions")
    
                ch := make(chan string, 1)
    
                go func(ch chan string) {
                    var res string = "NOT EMPTY"
                    ch <- res
                }(ch)
    
                select {
                case ret := <-ch:
                    log.Printf("channel has a result")
                    log.Printf("showing content of string AT THE SELECT: %v", ret)
                case <-time.After(1 * time.Second):
                    log.Printf("timeout")
    
                }
    
            }
            log.Printf("[for] Sleep for a second..")
            time.Sleep(pollInt)
        }
    
        log.Printf("Starting to do some important actions.. (regardless was previous actions success or timeout)")
        /* ... */
    
        log.Printf("showing content of string: %v", ret)
    
        if ret == "NOT EMPTY" {
            log.Printf("SCRIPT FINISHED CORRECTLY")
        } else {
            log.Printf("SCRIPT FAILED")
        }
    
    }
    

    脚本运行结果:

    2009/11/10 23:00:00 [select][default] Processing our actions
    2009/11/10 23:00:00 channel has a result
    2009/11/10 23:00:00 showing content of string AT THE SELECT: NOT EMPTY
    2009/11/10 23:00:00 [for] Sleep for a second..
    2009/11/10 23:00:01 [select][default] Processing our actions
    2009/11/10 23:00:01 channel has a result
    2009/11/10 23:00:01 showing content of string AT THE SELECT: NOT EMPTY
    2009/11/10 23:00:01 [for] Sleep for a second..
    2009/11/10 23:00:02 [select][default] Processing our actions
    2009/11/10 23:00:02 channel has a result
    2009/11/10 23:00:02 showing content of string AT THE SELECT: NOT EMPTY
    2009/11/10 23:00:02 [for] Sleep for a second..
    2009/11/10 23:00:03 [select][timeout] select timeout, break select and for loops
    2009/11/10 23:00:03 Starting to do some important actions.. (regardless was previous actions success or timeout)
    2009/11/10 23:00:03 showing content of string: EMPTY
    2009/11/10 23:00:03 SCRIPT FAILED
    

    但我希望:

    2009/11/10 23:00:00 [select][default] Processing our actions
    2009/11/10 23:00:00 channel has a result
    2009/11/10 23:00:00 showing content of string AT THE SELECT: NOT EMPTY
    2009/11/10 23:00:00 [for] Sleep for a second..
    2009/11/10 23:00:01 [select][default] Processing our actions
    2009/11/10 23:00:01 channel has a result
    2009/11/10 23:00:01 showing content of string AT THE SELECT: NOT EMPTY
    2009/11/10 23:00:01 [for] Sleep for a second..
    2009/11/10 23:00:02 [select][default] Processing our actions
    2009/11/10 23:00:02 channel has a result
    2009/11/10 23:00:02 showing content of string AT THE SELECT: NOT EMPTY
    2009/11/10 23:00:02 [for] Sleep for a second..
    2009/11/10 23:00:03 [select][timeout] select timeout, break select and for loops
    2009/11/10 23:00:03 Starting to do some important actions.. (regardless was previous actions success or timeout)
    2009/11/10 23:00:03 showing content of string: NOT EMPTY
    2009/11/10 23:00:03 SCRIPT FINISHED CORRECTLY
    

    游乐场:https://play.golang.org/p/uPKZtQQkm7p

    有什么想法吗?

0 个答案:

没有答案