The HTTP handler does change your global variable; however you don't protect access to the global variable and thus have a race condition. That is to say fmt.Println(test)
runs before your http.HandleFunc
.
I'm assuming this is a toy example: If you want to change your code to wait for the value to be changed / wait for an HTTP hit, before terminating, then you could do this:
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)
}
}
This uses a channel to guard the state of test
. In real code it would be more likely to use sync.Once
or sync.Mutex
. Also, I should mention (and I hope you already realize) mutating global state is always something to be avoided when possible.