跳到主要内容

string

为什么 string 按字节索引且不能原地修改?​

func main() {
s := "hello" // string 为不可变字节序列
println(len(s)) // len 返回底层字节数
}
  • string 底层: 只读字节序列;
  • 编码约定: Go 源码中的字符串字面量通常为 UTF-8;
  • 索引结果: s[i] 返回 byte, 不返回 rune;
  • 修改限制: string 不可原地修改;
s := "语言"
println(len(s), s[0]) // 6 个字节;索引得到第一个 UTF-8 字节
  • 字符计数: Unicode 码点与字节不是同一单位,需要按字符解码时见rune;

字符串字面量如何表达转义文本与原始文本?​

  • 双引号: 解释 \n 等反斜杠转义,适合需要换行、制表符等控制字符的文本;
  • 反引号: 保留原始文本与换行,不解释反斜杠转义;内容不能直接包含反引号;
escaped := "line1\nline2"
path := `C:\tmp\file.txt`
println(escaped, path)

字符串如何比较? 排序语义有何不同?​

  • string 可比较: 可使用 ==, !=, <, <=, >, >=;
  • 比较方式: 按字节序列逐字节比较;
  • 排序语义: 不等于自然语言排序;
func main() {
println("go" == "go") // true
println("abc" < "abd") // true; 按字节序比较
}