http://play.golang.org/p/CZTmhNepkM
有人可以解释为什么我们需要字节吗?例如,在 go playgound 上,我正在做同样的事情,但字符串包比字节更容易使用。当我们有字符串包时,为什么有人需要为 HasSuffix 功能提供字节包?
strings.HasSuffix(word, "ed")
bytes.HasSuffix(word_byte, []byte("ed"))
http://play.golang.org/p/CZTmhNepkM
有人可以解释为什么我们需要字节吗?例如,在 go playgound 上,我正在做同样的事情,但字符串包比字节更容易使用。当我们有字符串包时,为什么有人需要为 HasSuffix 功能提供字节包?
strings.HasSuffix(word, "ed")
bytes.HasSuffix(word_byte, []byte("ed"))
一个重要的答案是性能。在进行大规模字符串处理时,例如这个生物信息学任务(这里是最快的 Go 代码),字节切片 API 是必须的。
在 Go v1.0 之前的某个时候,没有rune
类型。这就是为什么标准库中的某些处理部分字符串或迭代“字符”的方法将采用字节切片(而不是符文切片)。
由于许多方法采用字节切片并避免不断转换为字符串并返回 - 两种类型都存在一些基本功能。
Go 1.8 通过优化其对 ASCII 集的使用进一步改进了字节包。
请参阅Joe Tsai ( )的提交 9a8c695dsnet
bytes
, strings
: 优化 ASCII 集在 Google 的大型代码库中,有数千种用途:
ContainsAny|IndexAny|LastIndexAny|Trim|TrimLeft|TrimRight
对其用法的分析表明,其中超过 97% 只使用仅由 ASCII 符号组成的字符集。
Uses of ContainsAny|IndexAny|LastIndexAny:
6% are 1 character (e.g., "\n" or " ")
58% are 2-4 characters (e.g., "<>" or "\r\n\t ")
24% are 5-9 characters (e.g., "()[]*^$")
10% are 10+ characters (e.g., "+-=&|><!(){}[]^\"~*?:\\/ ")
我们针对 ASCII 集进行了优化,这些集通常用于在某些字符串中搜索“控制”字符。我们不针对单字符场景进行优化,因为
IndexRune
或者IndexByte
可以使用