String 何时在Go中使用[]字节或字符串?
在编写Go应用程序时,我经常选择使用String 何时在Go中使用[]字节或字符串?,string,bytearray,go,String,Bytearray,Go,在编写Go应用程序时,我经常选择使用[]字节或字符串。除了[]字节的明显易变性之外,我如何决定使用哪一个 我有几个用例作为例子: 函数返回一个新的[]字节。既然片容量是固定的,那么有什么理由不返回字符串呢 默认情况下,[]字节的打印效果不如字符串好,因此我经常发现自己为了记录日志而转换为字符串。它是否应该始终是一个字符串 在预结束[]字节时,始终会创建一个新的基础数组。如果要前置的数据是常量,为什么不应该是字符串 一个区别是返回的[]字节可能是 重新使用以保存另一个/新数据(无新内存分配),而
[]字节
或字符串
。除了[]字节
的明显易变性之外,我如何决定使用哪一个
我有几个用例作为例子:
[]字节
。既然片容量是固定的,那么有什么理由不返回字符串呢[]字节
的打印效果不如字符串
好,因此我经常发现自己为了记录日志而转换为字符串。它是否应该始终是一个字符串
[]字节时,始终会创建一个新的基础数组。如果要前置的数据是常量,为什么不应该是字符串
[]字节
可能是
重新使用以保存另一个/新数据(无新内存分配),而
字符串
不能。另一个是,在
至少,字符串
是比[]字节
小一个单词的实体。可以是
用于在有大量此类项目处于活动状态时保存一些内存[]字节
强制转换为字符串
进行日志记录。典型的“文本”动词,如%s
,%q
适用于字符串
和[]字节
表达式
同样地。在另一个方向,例如%x
或%02x
也适用[]字节
的性能可能会更好我感觉到,在Go中,类型比任何其他非ML风格的语言更用于传达含义和预期用途。因此,确定使用哪种类型的最佳方法是问问自己数据是什么 字符串表示文本。只发短信。编码不是你必须担心的事情,所有的操作都是以字符为基础的,不管“字符”实际上是什么 数组表示二进制数据或该数据的特定编码<代码>[]字节表示数据只是字节流或单字节字符流<代码>[]int16表示整数流或两字节字符流 考虑到几乎所有处理字节的东西都有处理字符串的函数,反之亦然,我建议不要问你需要对数据做什么,而是问数据代表什么。然后,一旦你发现了瓶颈,就进行优化
编辑:是我得到使用类型转换来分解字符串的基本原理的地方。我的建议是在处理文本时默认使用字符串。但如果下列条件之一适用,则使用[]字节:
- []字节的可变性将显著减少所需的分配数量
- 您正在处理使用[]字节的API,避免转换为字符串将简化代码
string
。如果它只是一个不透明的数据,为什么不[]字节
?这取决于用例。如果您需要处理单个字符,而不是UTF-8编码字节流,那么首先将其转换为符文(32位ints IIRC)。然后还有[]符文
,哪个是表示可变字符字符串的最佳方法?可变性实际上是字符串与字节或符文片段之间的关键区别。如果修改了原始数组,则在处理切片时会有许多细微差别,例如,该数组的切片被用作映射中的键或存储在其他位置。尽量避免陷入将切片视为固定元组的习惯——它们实际上更像是具有长度的C指针?我对谷歌的看法有所提高。FWIW,%v
说明符将[]字节视为整数数组,这是非-f
方法的默认值。还有返回切片而不是将其作为参数的函数呢?您所说的“字符串是比[]字节小一个单词的实体”是什么意思?自从@animaacija注释以来已经将近一年了,但我想我会回答:由于字符串是不可变的,它们在内部表示为指针和长度,而[]字节
s也需要容量。我们是否应该考虑是否只处理ASCII字符?原因如果不是,则字节
不能容纳这样的字符,我们需要使用符文
?如果将非ASCII字符编码为字节(例如,在UTF-8中),则[]字节
可以容纳非ASCII字符。我假设在这种情况下,我们可能没有1-1字符-字节映射(UTF-8
码点可以表示为1到4个字节
)。没错。但是字符串也是这样。我经常发现转换为字符串很方便,因为缺少了在字节数组上不起作用的扫描函数。但是转换为字符串是不必要的复制。在处理大文件时,最好不要转换为可能的字符串。这会产生巨大的p性能提升