我有一个代码:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
如何在匿名函数中更改测试变量的值?我会很感激的!
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)
}
}
Run Code Online (Sandbox Code Playgroud)
这使用一个通道来保护状态test.在实际代码中,它更有可能使用sync.Once或sync.Mutex.另外,我应该提到(我希望你已经意识到)变异全局状态总是在可能的情况下被避免.
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |