第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

種族(?) 與互斥體 - 地圖中的數(shù)據(jù)損壞

種族(?) 與互斥體 - 地圖中的數(shù)據(jù)損壞

Go
桃花長(zhǎng)相依 2022-08-24 10:46:47
在項(xiàng)目中,我想使用緩存來(lái)存儲(chǔ)哈希之類的東西。但是,緩存中存儲(chǔ)的值會(huì)不時(shí)更改為密鑰。通常從密鑰中選取大約 4 個(gè)字符:<- Set hash::helloworldtest = abcdef0123456789-> Get hash::helloworldtest = testef0123456789這大致是我的緩存的結(jié)構(gòu):type node struct {    expires nodeExpiration    value   interface{}}// ...func (c *Cache) Set(key string, value interface{}, expiration time.Duration) {    c.mu.Lock()    c.val[key] = &node{        expires: c.expiration(expiration),        value:   value,    }    // fmt.Println( ... )    c.mu.Unlock()}func (c *Cache) Get(key string) (interface{}, bool) {    c.mu.Lock()    if v, o := c.val[key]; o && v != nil {        if !v.expires.IsExpired() {            // fmt.Println( ... )            c.mu.Unlock()            return v.value, true        }    }    c.mu.Unlock()    return nil, false}// Cache Backendfunc (b *CacheBackend) GetHash(key string) (res string, err error) {    return b.get("hash::" + key)}func (b *CacheBackend) get(key string) (res string, err error) {    if v, ok := b.cache.Get(key); ok {        if s, ok := v.(string); ok {            return s, nil        }        return "", b.errCast    }    return "", nil}// go-fiber Routefunc (s *WebServer) handleGetHashAnywhere(ctx *fiber.Ctx) (err error) {    path := ctx.Params("anywhere")    var res string    if res, err = s.Backend.GetHash(path); err != nil {        return    }    if res == "" {        ctx.Status(404)    } else {        ctx.Status(200)    }    return ctx.SendString(res)}我以前使用過(guò) a,但用 一個(gè) 替換了它,認(rèn)為這可能是問(wèn)題所在。但與.sync.RWMutexsync.Mutexsync.MutexGet 和 Set 方法在 goroutine 中由 go-fiber 調(diào)用,然后返回這些值。有沒(méi)有人知道這樣的事情是如何發(fā)生的?編輯1:保存而不是工作正常。[]bytestring
查看完整描述

1 回答

?
慕俠2389804

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊

該問(wèn)題在零分配下的文檔中進(jìn)行了描述。摘錄:

由于纖程針對(duì)高性能進(jìn)行了優(yōu)化,因此從纖程返回的值。默認(rèn)情況下,Ctx 不是不可變的,并且將在請(qǐng)求之間重復(fù)使用。[...]一旦您從處理程序返回,您從上下文中獲得的任何值都將在將來(lái)的請(qǐng)求中重復(fù)使用,并將在您的腳下更改。

因此,必須復(fù)制上下文值,或者必須在纖程配置中傳遞“不可變”標(biāo)志。

第一種解決方案:
從讀取值中新建緩沖區(qū)并復(fù)制其內(nèi)容

buf := bytes.NewBufferString(ctx.Params("hash"))
hash := string(buf.Bytes())

第二種解決方案:
使用此處描述的內(nèi)置函數(shù)。utils#CopyString(string)

hash := utils.CopyString(ctx.Params("hash"))

第三個(gè)解決方案:
不可變的配置標(biāo)志

cfg := &fiber.Config{Immutable: true}

然后一切正常。


查看完整回答
反對(duì) 回復(fù) 2022-08-24
  • 1 回答
  • 0 關(guān)注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)