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

时间:2012-05-31 02:16:51

标签: string bytearray go

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

我有几个例子用例:

  1. 函数返回新的[]byte。由于切片容量是固定的,有什么理由不返回字符串?
  2. 默认情况下,
  3. []byte的打印效果不如string,所以我经常会发现自己正在转向string进行日志记录。它应该始终是string吗?
  4. 在前置[]byte时,始终会创建一个新的基础数组。如果前置数据是常量,为什么这不是string

3 个答案:

答案 0 :(得分:26)

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

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

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

答案 1 :(得分:13)

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

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

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

鉴于事实上几乎所有处理字节的东西都有处理字符串的函数,反之亦然,我建议不要问你需要对数据做什么,而是询问数据代表什么。然后在找出瓶颈后进行优化。

编辑:This post是我获得使用类型转换来分解字符串的理由。

答案 2 :(得分:5)

  1. 一个区别是返回的[]byte可能是潜在的 重用来保存另一个/新数据(没有新内存分配),同时 string不能。另一个是,在gc实现中 至少,string是比[]byte小一个字的实体。可 用来在有很多这样的物品存活时节省一些记忆。

  2. 无需将[]byte投射到string进行记录。典型的“文字”动词,例如%s%q适用于string[]byte表达式 相等。在另一个方向,同样适用于例如%x% 02x

  3. 取决于连接执行的原因以及结果是否有效 之后再与其他/其他地方合并。如果是这种情况,那么[]byte可能会表现得更好。