Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 何时在Go中使用[]字节或字符串?_String_Bytearray_Go - Fatal编程技术网

String 何时在Go中使用[]字节或字符串?

String 何时在Go中使用[]字节或字符串?,string,bytearray,go,String,Bytearray,Go,在编写Go应用程序时,我经常选择使用[]字节或字符串。除了[]字节的明显易变性之外,我如何决定使用哪一个 我有几个用例作为例子: 函数返回一个新的[]字节。既然片容量是固定的,那么有什么理由不返回字符串呢 默认情况下,[]字节的打印效果不如字符串好,因此我经常发现自己为了记录日志而转换为字符串。它是否应该始终是一个字符串 在预结束[]字节时,始终会创建一个新的基础数组。如果要前置的数据是常量,为什么不应该是字符串 一个区别是返回的[]字节可能是 重新使用以保存另一个/新数据(无新内存分配),而

在编写Go应用程序时,我经常选择使用
[]字节
字符串
。除了
[]字节
的明显易变性之外,我如何决定使用哪一个

我有几个用例作为例子:

  • 函数返回一个新的
    []字节
    。既然片容量是固定的,那么有什么理由不返回字符串呢
  • 默认情况下,
    []字节
    的打印效果不如
    字符串
    好,因此我经常发现自己为了记录日志而转换为
    字符串。它是否应该始终是一个
    字符串
  • 在预结束
    []字节时,始终会创建一个新的基础数组。如果要前置的数据是常量,为什么不应该是
    字符串
  • 一个区别是返回的
    []字节
    可能是 重新使用以保存另一个/新数据(无新内存分配),而
    字符串
    不能。另一个是,在 至少,
    字符串
    是比
    []字节
    小一个单词的实体。可以是 用于在有大量此类项目处于活动状态时保存一些内存

  • 无需将
    []字节
    强制转换为
    字符串
    进行日志记录。典型的“文本”动词,如
    %s
    %q
    适用于
    字符串
    []字节
    表达式 同样地。在另一个方向,例如
    %x
    %02x
    也适用

  • 取决于执行串联的原因以及结果是否正确 之后再与某物/某处结合。如果是这样的话,
    []字节
    的性能可能会更好


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

    字符串表示文本。只发短信。编码不是你必须担心的事情,所有的操作都是以字符为基础的,不管“字符”实际上是什么

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

    考虑到几乎所有处理字节的东西都有处理字符串的函数,反之亦然,我建议不要问你需要对数据做什么,而是问数据代表什么。然后,一旦你发现了瓶颈,就进行优化


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

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

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

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


    听起来这取决于您的使用。如果您计划对它们执行string-y操作,则将其称为
    string
    。如果它只是一个不透明的数据,为什么不
    []字节
    ?这取决于用例。如果您需要处理单个字符,而不是UTF-8编码字节流,那么首先将其转换为符文(32位ints IIRC)。然后还有
    []符文
    ,哪个是表示可变字符字符串的最佳方法?可变性实际上是字符串与字节或符文片段之间的关键区别。如果修改了原始数组,则在处理切片时会有许多细微差别,例如,该数组的切片被用作映射中的键或存储在其他位置。尽量避免陷入将切片视为固定元组的习惯——它们实际上更像是具有长度的C指针?我对谷歌的看法有所提高。FWIW,
    %v
    说明符将[]字节视为整数数组,这是非
    -f
    方法的默认值。还有返回切片而不是将其作为参数的函数呢?您所说的“字符串是比[]字节小一个单词的实体”是什么意思?自从@animaacija注释以来已经将近一年了,但我想我会回答:由于
    字符串
    是不可变的,它们在内部表示为指针和长度,而
    []字节
    s也需要容量。我们是否应该考虑是否只处理ASCII字符?原因如果不是,则
    字节
    不能容纳这样的字符,我们需要使用
    符文
    ?如果将非ASCII字符编码为字节(例如,在UTF-8中),则
    []字节
    可以容纳非ASCII字符。我假设在这种情况下,我们可能没有1-1字符-字节映射(
    UTF-8
    码点可以表示为1到4个
    字节
    )。没错。但是
    字符串也是这样。我经常发现转换为字符串很方便,因为缺少了在字节数组上不起作用的扫描函数。但是转换为字符串是不必要的复制。在处理大文件时,最好不要转换为可能的字符串。这会产生巨大的p性能提升