gpt4 book ai didi

go - 如何从 Go 中的匿名函数访问全局变量?

转载 作者:IT王子 更新时间:2023-10-29 01:53:18 28 4
gpt4 key购买 nike

我有一个代码:

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变量的值?我将不胜感激!

最佳答案

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)
}
}

这使用一个 channel 来保护 test 的状态。在实际代码中,更有可能使用 sync.Oncesync.Mutex .另外,我应该提一下(我希望你已经意识到)改变全局状态总是要尽可能避免的事情。

关于go - 如何从 Go 中的匿名函数访问全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23138688/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com