gpt4 book ai didi

go - 为什么不只是在方法header.clone中为目标分配值

转载 作者:行者123 更新时间:2023-12-01 21:20:20 24 4
gpt4 key购买 nike

正式版
我的问题是“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而不是创建 slice

    for k, vv := range h {
// changed here
h2[k] = vv
}

最佳答案

看起来Headermap[string][]string(也许是http.Header?)。如果它符合您的建议,那么新的Header将是 map 的浅拷贝,其中包含来自源Header的原始 slice 。如果这些 slice 的支持数组的内容被修改,则复制的 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)字符串 slice 分配,每个键分配一个。相反,此算法使用一种分配,即包含原始 header 的所有字符串的单个共享字符串片。

该算法首先计算 header 中包含的字符串数,然后分配该大小的字符串 slice 。在第二个for循环中,它将字符串从键的值复制到共享的字符串 slice ,使用该共享的 slice 数组创建一个 slice 并将其设置为关键字的值,然后更新共享的 slice 以指向下一个可用的空插槽。最后,它是具有单个内存分配的深拷贝,而不是 len(h)

关于go - 为什么不只是在方法header.clone中为目标分配值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59807138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com