【问题标题】:why protobuf use byte[] for bytes in golang but use string/ByteString for bytes in other language?为什么 protobuf 在 golang 中使用 byte[] 作为字节,而在其他语言中使用 string/ByteString 作为字节?
【发布时间】:2021-05-05 04:39:57
【问题描述】:

这里指定https://developers.google.com/protocol-buffers/docs/proto3#scalar

protobuf 在 golang 中使用 byte[] 作为字节,而在其他语言中使用 string/ByteString 作为字节,为什么有区别?

正如@Volker 所解释的,字符串不适合保存任意 []byte。

那么为什么 pb 使用 string/ByteString 作为除 go 之外的所有其他语言的字节?

【问题讨论】:

    标签: java go protocol-buffers


    【解决方案1】:
    • []byte 对于字节流来说是自然的
    • Go 中的字符串不是字节流而是不可变字符串
    • Go 中的字符串应该采用 UTF-8 编码,至少在它们之上进行 for-rangeing 是这样假设的,在字符串中使用非 UTF-8 字节流是可能的,但有点不雅。
    • Go 中没有 ByteString 类型。嗯,实际上有:[]byte。

    【讨论】:

    • 但仍然有点困惑 1. []byte 对于字节流来说是很自然的,我完全同意你的看法。但是为什么 pb 使用 string/ByteString 作为字节而不是直接使用 byte[]。我读了stackoverflow.com/questions/29018411/…,但它没有解释为什么使用字符串而不是字节[]。
    • Go 中的字符串应该是 UTF-8 编码的,至少这就是在它们之上的 for-rangeing 假设其他语言中的字符串,比如 java 也绑定到 charset ,并且不适合保存任意 byte[]
    • @MichaelShy Java 和 Go 之间存在差异。 Go 中没有 ByteString。 Java 使用 ByteString 而不是 []byte (Java) 的问题与 Go 无关。基本上这里没有什么可看或知道的。在 Go 中它是 []byte。
    • 还是谢谢你,你的回答确实帮助我更好地理解这一点; )
    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2017-10-14
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多