82

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

我有几个用例作为示例:

  1. 一个函数返回一个新的[]byte. 既然切片容量是固定的,那有什么理由不返回字符串呢?
  2. []byte没有string默认打印得那么好,所以我经常发现自己string为了记录目的而强制转换。它应该一直是一个string吗?
  3. 前置时[]byte,总是会创建一个新的底层数组。如果要添加的数据是常量,为什么不应该是string?
4

3 回答 3

45

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

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

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

于 2012-06-09T23:44:24.713 回答
18

我的感觉是,在 Go 中,比在任何其他非 ML 风格的语言中,类型更用于传达意义和预期用途。因此,弄清楚要使用哪种类型的最佳方法是问自己数据什么。

字符串代表文本。只是文字。编码不是您必须担心的事情,并且所有操作都在逐个字符的基础上进行,无论“字符”实际上是什么。

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

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

编辑:这篇文章是我得到使用类型转换来分解字符串的基本原理的地方。

于 2012-06-08T12:51:00.263 回答
8
  1. 一个区别是返回的[]byte数据可能被重用以保存另一个/新数据(没有新的内存分配),而 string不能。另一个是,至少在 gc 实现中,string是一个比[]byte. 当有很多这样的项目时,可以用来节省一些内存。

  2. 没有必要为日志设置一个[]byteto 。string典型的“文本”动词,如%s,同样%q适用于string[]byte表达。在另一个方向上,例如%x或也是如此% 02x

  3. 取决于为什么要执行连接,以及结果是否要再次与/某物/某处其他地方组合。如果是这样,那么[]byte可能会表现得更好。

于 2012-05-31T11:18:12.650 回答