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

Raz*_*zip 1 go

我有一个代码:

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)

如何在匿名函数中更改测试变量的值?我会很感激的!

voi*_*gic 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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