《Go语言底层原理剖析》(郑建勋著)KEY笔记——字符串
字符串的两种类型:
- 可变
- 不可变(GO)
字符串的两种结束方式
- ‘\0’隐式结尾
- 显式结尾(GO)
GO的字符串:
底层结构体:data+len
编码方式:utf-8可变长度的编码方式
采用符文类型表示字符:rune——理解字符串在编程语言中的设计——GO语言的设计哲学:explicit better than implicit
rune==int32,表示一个Unicode码点
rune的设计是为了更安全和方便地处理UTF-8编码的字符串中的Unicode字符,尤其是在需要逐个字符处理的情况下
Go语言中range遍历时,每个迭代返回的是rune类型的字符,而不是单个字节;
tips:
其他语言可能使用固定长度的编码(比如UTF-16,像Java和C#);
Java的char基于UTF-16,代理对(surrogate pair);
Python 3的str类型直接处理Unicode码点
C/C++:无原生Unicode支持,需依赖库(如ICU)处理多字节字符。
上述语言在处理字符串时一般是安全的,但是处理单个字符时,可能会遇到字符的编码长度的问题,而GO语言 显式区分byte
和rune
,强调开发者应明确意图:[]byte
:操作原始字节(如网络传输、文件读写)。[]rune
:按字符处理文本(如字符串反转、分词)。
关于其他语言的设计:
历史兼容性:Java/C#设计时Unicode范围较小(BMP),
char
足够,后续扩展导致代理对问题。抽象层次:Python等高级语言隐藏编码细节,简化用法但可能牺牲性能或底层控制。
设计目标:Go注重系统编程和性能,需直接操作字节,同时提供安全的字符处理方式。
示例代码:
for index,runeValue := range str{ } //可以看到轮询字符串可以获取int32的表示runeValue 以及偏移量index
总结:Go符文的核心价值
安全处理Unicode:避免因UTF-8变长编码导致的字符拆分错误。
性能与灵活性的平衡:允许开发者按需选择字节或字符视角。
符合Go的简洁哲学:通过
rune
和range
的配合,提供直观的字符级操作。
fmt;#U;
utf8标准库
starFunction:
DecodeRuneInString当前字节之后的符文数以及实际字节长度
字符串工具函数
strings;strconv
底层原理
字符串解析:
特殊标识:
双引号:字符串字面量,代表string类型;处理转义字符,不能处理换行转义;
单引号:rune/Unicode码点,必须且只能一个字符,否则都会报错
反引号:创建原生字符串字面量,保留文本中的所有字符,包括换行符和空格,且不支持任何转义序列。适合用于书写多行文本、HTML内容或正则表达式。
不同引号处理的逻辑不同,处理的函数不同
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: