qloog
2023-12-20 08:43:07 +08:00
在 Go 语言中,全局变量是在程序生命周期内存在的单一实例。因此,如果你在 main.go 中声明一个全局变量 searchResult ,那么它对所有的请求都是同一个实例。
考虑到多个用户同时访问服务器的情况,这可能导致并发访问的问题。在并发情况下,多个 goroutine ( Go 程序中的轻量级线程)可能会同时尝试读取或写入全局变量,这可能导致竞态条件和数据不一致的问题。
为了解决这个问题,你可以考虑使用互斥锁( Mutex )或者使用 Go 语言中的通道( Channel )来确保对全局变量的访问是安全的。下面是一个简单的例子,演示如何使用互斥锁:
```go
package main
import (
"fmt"
"net/http"
"sync"
)
var (
searchResult []string
mutex sync.Mutex
)
func handleSearch(w http.ResponseWriter, r *http.Request) {
// 使用互斥锁确保对全局变量的访问是安全的
mutex.Lock()
defer mutex.Unlock()
// 这里可以对 searchResult 进行读取或写入操作
// ...
// 示例:向 searchResult 添加一个搜索结果
searchResult = append(searchResult, "Search result for "+r.URL.Query().Get("query"))
// 返回搜索结果
fmt.Fprintf(w, "Search result added: %s\n", searchResult)
}
func main() {
http.HandleFunc("/search", handleSearch)
http.ListenAndServe(":8080", nil)
}
```
在这个例子中,使用了 sync.Mutex 来保护对 searchResult 的并发访问。在 handleSearch 函数中,通过调用 mutex.Lock() 和 mutex.Unlock() 来确保在同一时刻只有一个 goroutine 能够访问 searchResult 。这样可以避免并发访问导致的问题。