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

时间:2014-04-17 16:32:15

标签: 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)
    }
}

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

1 个答案:

答案 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.Oncesync.Mutex。另外,我应该提一下(我希望你已经意识到)变异的全局状态总是在可能的情况下被避免。