《Go语言底层原理剖析》(郑建勋著)KEY笔记——字符串

  1. 字符串的两种类型:

    1. 可变
    2. 不可变(GO)
  2. 字符串的两种结束方式

    1. ‘\0’隐式结尾
    2. 显式结尾(GO)

GO的字符串:

  1. 底层结构体:data+len

  2. 编码方式:utf-8可变长度的编码方式

  3. 采用符文类型表示字符:rune——理解字符串在编程语言中的设计——GO语言的设计哲学:explicit better than implicit

    1. rune==int32,表示一个Unicode码点

    2. rune的设计是为了更安全和方便地处理UTF-8编码的字符串中的Unicode字符,尤其是在需要逐个字符处理的情况下

    3. Go语言中range遍历时,每个迭代返回的是rune类型的字符,而不是单个字节;

    4. tips:
      其他语言可能使用固定长度的编码(比如UTF-16,像Java和C#);
      Java的char基于UTF-16,代理对(surrogate pair);
      Python 3的str类型直接处理Unicode码点
      C/C++:无原生Unicode支持,需依赖库(如ICU)处理多字节字符。
      上述语言在处理字符串时一般是安全的,但是处理单个字符时,可能会遇到字符的编码长度的问题,而GO语言 显式区分byterune,强调开发者应明确意图:

      • []byte:操作原始字节(如网络传输、文件读写)。

      • []rune:按字符处理文本(如字符串反转、分词)。

      关于其他语言的设计:

      • 历史兼容性:Java/C#设计时Unicode范围较小(BMP),char足够,后续扩展导致代理对问题。

      • 抽象层次:Python等高级语言隐藏编码细节,简化用法但可能牺牲性能或底层控制。

      • 设计目标:Go注重系统编程和性能,需直接操作字节,同时提供安全的字符处理方式。

      示例代码:

      
        for index,runeValue := range str{
        }
      
        //可以看到轮询字符串可以获取int32的表示runeValue 以及偏移量index
      
    5. 总结:Go符文的核心价值

      • 安全处理Unicode:避免因UTF-8变长编码导致的字符拆分错误。

      • 性能与灵活性的平衡:允许开发者按需选择字节或字符视角。

      • 符合Go的简洁哲学:通过runerange的配合,提供直观的字符级操作。

  4. fmt;#U;

  5. utf8标准库

  6. starFunction:

    1. DecodeRuneInString当前字节之后的符文数以及实际字节长度

    2. 字符串工具函数

strings;strconv

  1. 底层原理

  2. 字符串解析:

  3. 特殊标识:

    1. 双引号:字符串字面量,代表string类型;处理转义字符,不能处理换行转义;

    2. 单引号:rune/Unicode码点,必须且只能一个字符,否则都会报错

    3. 反引号:创建原生字符串字面量,保留文本中的所有字符,包括换行符和空格,且不支持任何转义序列。适合用于书写多行文本、HTML内容或正则表达式。

    不同引号处理的逻辑不同,处理的函数不同

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!