1.string 与 byte slice 之间的转换
当进行 string 和 byte slice 相互转换时,参与转换的是拷贝的原始值。这种转换的过程,与其他编程语的强制类型转换操作不同,也和新 slice 与旧 slice 共享底层数组不同。
Go 在 string 与 byte slice 相互转换上优化了两点,避免了额外的内存分配:
- 在 map[string] 中查找 key 时,使用了对应的 []byte,避免做 m[string(key)] 的内存分配
- 使用 for range 迭代 string 转换为 []byte 的迭代:for i,v := range []byte(str) {…}
2.string 与索引操作符
对字符串用索引访问返回的不是字符,而是一个 byte 值。
这种处理方式和其他语言一样,比如 PHP 中:
> php -r '$name="中文"; var_dump($name);' # "中文" 占用 6 个字节
string(6) "中文"
> php -r '$name="中文"; var_dump($name[0]);' # 把第一个字节当做 Unicode 字符读取,显示 U+FFFD
string(1) "�"
> php -r '$name="中文"; var_dump($name[0].$name[1].$name[2]);'
string(3) "中"
func main() {
x := "ascii"
fmt.Println(x[0]) // 97
fmt.Printf("%T\n", x[0])// uint8
}
如果需要使用 for range
迭代访问字符串中的字符(unicode code point / rune
),标准库中有 "unicode/utf8"
包来做 UTF8
的相关解码编码。另外 utf8string
也有像 func (s *String) At(i int) rune
等很方便的库函数。
最后编辑: kuteng 文档更新时间: 2024-04-01 10:51 作者:kuteng