我应该总是使用 rune 而不是 string 除了做 I/O

Should I ALWAYS use rune instead of string except doing I/O

在Python3中,所有字符串都是Unicode,所以你只需要在I/O操作时进行解码或编码,而在你的代码的主要部分,你只需要使用Unicode。

所以,我想知道在 Go 中,我应该做同样的事情吗?我是否应该在输入处将所有字符串转换为 []rune 并且我的所有函数只接收 []rune 类型?

因为我是 Go 的新手,所以我不知道有多少第 3 方库支持 rune 作为字符串。如果我在我的代码中一直使用 rune,当我需要与第 3 方库交互时,将 rune 转换为字符串的开销会成为问题吗?

Should I ALWAYS use rune instead of string except doing I/O

有几个非常有用的包可以处理字符串,如果您的数据在符文数组(或切片)中,您会发现使用它们很尴尬。

There are many cases that I have to get the character at a index,

通常这样做是不安全的,部分原因是 combining characters 但也因为字符串(或一般的 Unicode 文本)可能包含许多其他困难的情况 - 可能是从左到 -右边和从右到左的文本等

Normalizing 几种正常形式之一的文本可能有助于处理大多数组合字符,但有些组合不会简化为单个符文。

I'm writing something like a parser to parse the text with emoji

Unicode emoticons 只是另一个代码点 - 因此可以像大多数普通字符一样对待。

在许多情况下,最好使用 range 运算符遍历字符串。

例如,如果您想用 :-) 替换所有内容,这也许可以使用 strings.Replace() 或使用 for ... rangestrings.Builder 来处理。


对我来说,最有说服力的论点是,一旦你在 ASCII 之外冒险,文本就会很奇怪,Unicode 几乎是不可思议的怪异,探索它的深度最好留给专家,他们一生都在与它的疯狂作斗争。如果您想将时间花在通常对您、您的企业和客户更重要的业务端功能上,请使用标准包。


有用的参考资料: