【问题标题】:About the google.golang.org/protobuf why use append not make a had cap slice关于 google.golang.org/protobuf 为什么使用 append 而不是做一个 had cap slice
【发布时间】:2021-10-02 04:07:56
【问题描述】:
// AppendVarint appends v to b as a varint-encoded uint64.
func AppendVarint(b []byte, v uint64) []byte {
    switch {
    case v < 1<<7:
        b = append(b, byte(v))
    case v < 1<<14:
        b = append(b,
            byte((v>>0)&0x7f|0x80),
    
    // ...
    }
    return b
}

在需要内存复制时使用追加

但我们知道长度

这是不是更好?

我们为什么不这样做

switch {
    case v < 1<<7:
        b = []byte{byte(v)}
    case v < 1<<14:
        b = []byte{byte((v>>0)&0x7f|0x80), byte(v>>7)}

【问题讨论】:

  • 您能否尝试更全面地表达您的问题,并解释您要达到的目标?

标签: go protocol-buffers grpc


【解决方案1】:

append 附加到现有切片,仅重新分配“[i]f the capacity is not large enough to fit the additional values”。切片文字总是返回一个唯一的(新分配的)切片。

一般来说,你使用哪一个取决于你用它做什么,但在protobuf “你用它做什么”的情况下,通常是将一个 varint 编码的整数附加到一个(可能更大)序列化协议消息。在这种情况下,append 具有正确的语义,而返回一个新切片可能会执行不必​​要的分配(因为该切片本身将被附加到包含序列化消息的缓冲区中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多