4.6 字符串

    字符串是一种值类型,且值不可变,即创建某个文本后你无法再次修改这个文本的内容;更深入地讲,字符串是字节的定长数组。

    Go 支持以下 2 种形式的字面值:

    • 解释字符串:

      该类字符串使用双引号括起来,其中的相关的转义字符将被替换,这些转义字符包括:

      • :换行符
      • \r:回车符
      • \u\U:Unicode 字符
      • \\:反斜杠自身
    • 非解释字符串:

      该类字符串使用反引号括起来,支持换行,例如:

    string 类型的零值为长度为零的字符串,即空字符串 ""

    一般的比较运算符(==!=<<=、、>)通过在内存中按字节比较来实现字符串的对比。你可以通过函数 len() 来获取字符串所占的字节长度,例如:len(str)

    字符串的内容(纯字节)可以通过标准索引法来获取,在中括号 [] 内写入索引,索引从 0 开始计数:

    • 字符串 str 的第 1 个字节:str[0]
    • 最后 1 个字节:str[len(str)-1]

    需要注意的是,这种转换方案只对纯 ASCII 码的字符串有效。

    注意事项 获取字符串中某个字节的地址的行为是非法的,例如:&str[i]

    字符串拼接符 +

    追加在 s1 尾部并生成一个新的字符串 s

    你可以通过以下方式来对代码中多行的字符串进行拼接:

    由于编译器行尾自动补全分号的缘故,加号 + 必须放在第一行。

    拼接的简写形式 += 也可以用于字符串:

    在循环中使用加号 + 拼接字符串并不是最高效的做法,更好的办法是使用函数 strings.Join()(第 4.7.10 节),有没有更好的办法了?有!使用字节缓冲(bytes.Buffer)拼接更加给力(第 7.2.6 节)!

    在第 7 章,我们会讲到通过将字符串看作是字节(byte)的切片(slice)来实现对其标准索引法的操作。会在第 5.4.1 节中讲到的 for 循环只会根据索引返回字符串中的纯字节,而在第 5.4.4 节(以及第 7.6.1 节的示例)将会展示如何使用 for-range 循环来实现对 Unicode 字符串的迭代操作。在下一节,我们会学习到许多有关字符串操作的函数和方法,同时 fmt 包中的 fmt.Sprint(x) 也可以格式化生成并返回你所需要的字符串(第 4.4.3 节)。

    创建一个用于统计字节和字符(rune)的程序,并对字符串 asSASA ddd dsjkdsjs dk 进行分析,然后再分析 asSASA ddd dsjkdsjsこん dk,最后解释两者不同的原因(提示:使用 unicode/utf8 包)。