go 里面的全局变量对于不同的访问,是一样的吗 ? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
hanguofu

go 里面的全局变量对于不同的访问,是一样的吗 ?

  •  
  •   hanguofu 2023 年 12 月 20 日 2612 次点击
    这是一个创建于 857 天前的主题,其中的信息可能已经有所发展或是发生改变。
    本人初学 :D ,写了一个简单的 web server , 请教一个简单的问题:

    在 main.go 开头有一个全局变量 ( 例如 :var search_result := [] string ) ,用于保存用户最新的搜索结果,请问如果不同的人同时访问这个 server ,搜索不同的内容,都是保存在这个全局变量里面。那么这个全局变量对于这些不同的用户来说,是否分别存在着和这些访问向对应的不同的副本 ?
    13 条回复    2023-12-21 13:59:51 +08:00
    BeijingBaby
        1
    BeijingBaby  
       2023 年 12 月 20 日 via iPhone   1
    不存在副本
    nagisaushio
        2
    nagisaushio  
       2023 年 12 月 20 日 via Android   1
    都是一样的
    yaott2020
        3
    yaott2020  
       2023 年 12 月 20 日 via Android   1
    不存在什么副本,但是如果存在多个同时写入可能造成冲突,建议加锁。还有,你要么写 var search_result = []string{},要么写 var search_result []string ,你上面的写法是不正确的
    qloog
        4
    qloog  
       2023 年 12 月 20 日   2
    在 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 。这样可以避免并发访问导致的问题。
    InDom
        5
    InDom  
       2023 年 12 月 20 日
    @qloog #4 如果是 AI 生成的,建议注明一下。
    mangoDB
        6
    mangoDB  
       2023 年 12 月 20 日
    @qloog 使用 AI 生成回复,小心被 ban 哦。
    qloog
        7
    qloog  
       2023 年 12 月 20 日
    @InDom
    @mangoDB
    补充,回复参考自:ChatGPT
    CloveAndCurrant
        8
    CloveAndCurrant  
       2023 年 12 月 20 日
    如果读大于写,可以使用读写锁,没要想#4 楼那些使用互斥锁
    jonsmith
        9
    jonsmith  
       2023 年 12 月 20 日
    包级变量(全局变量)的生命周期和整个程序的运行周期是一致的,Go 主程序( main goroutine )不结束,会一直存在。
    每个 web 请求是从主程序 main 创建的子协程 goroutine ,所有请求读写的全局变量是同一块内存,并发写时会有竞争关系,要加锁或使用 channel 。
    chengxiao
        10
    chengxiao  
       2023 年 12 月 20 日   1
    你这个简单且业务量不大的处理方法是 用 map[string][]string
    为每个用户 id 设置一个[]string
    dyllen
        11
    dyllen  
       2023 年 12 月 20 日
    没有副本,所有的用户都是读写同一个 search_result 。
    jahanngauss414
        12
    jahanngauss414  
       2023 年 12 月 21 日 via Android
    @chengxiao 并发读写 map 又是新的坑,要加锁
    chengxiao
        13
    chengxiao  
       2023 年 12 月 21 日
    @jahanngauss414 都说了前提是初学和业务量不大, 整天拿个大炮轰蚂蚁,有意思么
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3002 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 55ms UTC 06:38 PVG 14:38 LAX 23:38 JFK 02:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86