在编写Go应用程序时,我发现自己可以选择使用[]byte
或string
。除了[]byte
的明显可变性之外,我该如何决定使用哪一个?
我有几个例子用例:
[]byte
。由于切片容量是固定的,有什么理由不返回字符串?[]byte
的打印效果不如string
,所以我经常会发现自己正在转向string
进行日志记录。它应该始终是string
吗?[]byte
时,始终会创建一个新的基础数组。如果前置数据是常量,为什么这不是string
?答案 0 :(得分:26)
我的建议是在处理文本时默认使用字符串。但是,如果满足下列条件之一,请使用[]字节:
[]字节的可变性将显着减少所需的分配数量。
您正在处理使用[]字节的API,避免转换为字符串会简化您的代码。
答案 1 :(得分:13)
我已经意识到在Go中,比任何其他非ML风格的语言更多,该类型用于传达意义和预期用途。因此,确定使用哪种类型的最佳方法是问自己是的数据。
字符串代表文字。只是文字。编码不是你必须担心的,并且所有操作都是逐个字符地工作,而不管“字符”实际上是什么。
数组表示二进制数据或该数据的特定编码。 []byte
表示数据只是字节流或单字节字符流。 []int16
表示整数流或两个字节字符的流。
鉴于事实上几乎所有处理字节的东西都有处理字符串的函数,反之亦然,我建议不要问你需要对数据做什么,而是询问数据代表什么。然后在找出瓶颈后进行优化。
编辑:This post是我获得使用类型转换来分解字符串的理由。
答案 2 :(得分:5)
一个区别是返回的[]byte
可能是潜在的
重用来保存另一个/新数据(没有新内存分配),同时
string
不能。另一个是,在gc实现中
至少,string
是比[]byte
小一个字的实体。可
用来在有很多这样的物品存活时节省一些记忆。
无需将[]byte
投射到string
进行记录。典型的“文字”动词,例如%s
,%q
适用于string
和[]byte
表达式
相等。在另一个方向,同样适用于例如%x
或% 02x
。
取决于连接执行的原因以及结果是否有效
之后再与其他/其他地方合并。如果是这种情况,那么[]byte
可能会表现得更好。