亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么不只是在方法 header.clone 中為目標賦值

為什么不只是在方法 header.clone 中為目標賦值

Go
當年話下 2022-05-05 18:01:33
正式版我的問題是“sv”的作用是什么func (h Header) Clone() Header {    if h == nil {        return nil    }    // Find total number of values.    nv := 0    for _, vv := range h {        nv += len(vv)    }    sv := make([]string, nv) // shared backing array for headers' values    h2 := make(Header, len(h))    for k, vv := range h {        n := copy(sv, vv)        h2[k] = sv[:n:n]        sv = sv[n:]    }    return h2}為什么不把它寫成這樣,只是將值分配給 h2 而不是創建一個切片    for k, vv := range h {        // changed here        h2[k] = vv    }
查看完整描述

1 回答

?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

它看起來像Header一個map[string][]string,(也許是 http.Header?)。如果它按照您的建議進行,那么新Header的將是地圖的淺表副本,其中包含來自 source 的原始切片Header。如果修改了這些切片的后備數組的內容,則復制的標頭也將被修改。例如:


s:=make([]string,0,10)

s=append(s,"a")

header[key]=s

h2:=header.Clone()

s=append(s,"b")

// Here, both header[key] and h2[key] has two elements, "a" and "b"

防止這種情況,Clone正在做一個深拷貝,其中每個[]string也被復制。那將需要len(h)字符串切片分配,每個鍵一個。相反,該算法使用一個分配,一個包含原始標頭的所有字符串的單個共享字符串切片。


該算法首先計算標題中包含的字符串數量,并分配該大小的字符串切片。在第二個 for 循環中,它將字符串從鍵的值復制到共享字符串切片,使用該共享切片數組創建切片并將其設置為鍵的值,然后更新共享切片以指向下一個可用的空槽。最后,它是一個具有單一內存分配的深拷貝,而不是len(h).


查看完整回答
反對 回復 2022-05-05
  • 1 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號