我有一个代码:
var test string
func main() {
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
test = "index"
})
fmt.Println(test)
if error := http.ListenAndServe(":9001", nil); error != nil {
log.Fatal("Error!", error)
}
}
如何更改匿名函数中 test 变量的值?我会很感激的!
答案 0 :(得分:5)
HTTP处理程序 更改全局变量;但是,您不保护对全局变量的访问,因此具有竞争条件。也就是说fmt.Println(test)
在http.HandleFunc
之前运行。
我假设这是一个玩具示例:如果您想更改代码以等待更改值/等待HTTP命中,则在终止之前,您可以执行此操作:
var test string
var doneCh = make(chan bool, 1)
func main() {
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
test = "index"
select {
case doneCh <- true:
default:
}
})
go func() {
<-doneCh
fmt.Println(test)
}()
if error := http.ListenAndServe(":9001", nil); error != nil {
log.Fatal("Error!", error)
}
}
这使用一个频道来保护test
的状态。在实际代码中,它更有可能使用sync.Once
或sync.Mutex
。另外,我应该提一下(我希望你已经意识到)变异的全局状态总是在可能的情况下被避免。