什么时候在Go中使用[]字节或字符串?

Mat*_*ner 55 string bytearray go

经常写Go应用程序,我发现自己可以选择使用[]bytestring.除了明显的可变性之外[]byte,我该如何决定使用哪一个?

我举例说明了几个用例:

  1. 函数返回一个新函数[]byte.由于切片容量是固定的,有什么理由不返回字符串?
  2. []byte不像string默认情况下打印得那么好,所以我经常发现自己正在string为了记录目的而进行投射.应该一直是string吗?
  3. 在预先添加时[]byte,始终会创建一个新的基础数组.如果前置数据是不变的,为什么这不是一个string

and*_*olm 28

我的建议是在你处理文本时默认使用字符串.但是,如果满足下列条件之一,请使用[]字节:

  • []字节的可变性将显着减少所需的分配数量.

  • 您正在处理使用[]字节的API,并且避免转换为字符串将简化您的代码.

  • 如果非 ASCII 字符被编码为字节(例如,UTF-8),则“[]byte”可以容纳非 ASCII 字符。 (3认同)

Abh*_*uch 15

我已经意识到在Go中,比任何其他非ML风格的语言更多,这种类型用于传达意义和预期用途.因此,确定使用哪种类型的最佳方法是问自己数据什么.

字符串表示文本.只是文字.编码不是你必须担心的,并且所有操作都是逐个字符地工作,而不管"字符"实际上是什么.

数组表示二进制数据或该数据的特定编码.[]byte表示数据只是字节流或单字节字符流.[]int16表示整数流或两个字节字符的流.

鉴于几乎所有处理字节的事物都具有处理字符串的功能,反之亦然,我建议不要问你需要对数据做什么,而是询问数据代表什么.一旦找出瓶颈,就进行优化.

编辑:这篇文章是我得到使用类型转换来分解字符串的理由.


zzz*_*zzz 6

  1. 一个区别是返回的[]byte可能会被重用来保存另一个/新数据(string没有新的内存分配),而 不能.另一个是,至少在gc实现中,string是一个比单词更小的实体[]byte.当有很多这样的项目时,可以用来节省一些内存.

  2. 铸造一个[]bytestring伐木是没有必要的.典型的"文本"的动词,比如%s,%q用于工作string[]byte表情同样.在另一个方向,同样适用于例如%x% 02x.

  3. 取决于为什么要进行连接,以及结果是否会在之后的某个/其他地方再次组合.如果是这种情况那么[]byte可能表现更好.

  • 自 @animaacija 发表评论以来已经近一年了,但我想我会回答它:因为“字符串”是不可变的,它们在内部表示为指针和长度,而“[]字节”也需要容量。 (2认同)