登录
首页 >  Golang >  Go问答

为何 google.golang.org/protobuf 使用追加操作而不是创建一个定长切片

来源:stackoverflow

时间:2024-03-08 19:27:30 437浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《为何 google.golang.org/protobuf 使用追加操作而不是创建一个定长切片》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

// 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)}

正确答案


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

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

本篇关于《为何 google.golang.org/protobuf 使用追加操作而不是创建一个定长切片》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>