我无法在select
语句之外传递字符串变量。
案例(简化):
我有一个同步脚本,它使用select
和两个选项
timeout
(3秒)default
使用频道更改字符串的值。当我们检查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
有什么想法吗?