Strings

这一章节主要讲string类型和标准库中跟string相关的包(strings,strconv, fmt). 章节的安排包括如何写字符串以及字符串操作, 如何检索字符, 以及如何格式化输出strings, numbers以及其它内置的自定义类型。

Go的字符串高级函数包括 for ... range对字符串按字符进行遍历, 标准库中的strings和strconv包,以及对字符串进行slice等函数都是我们每天都要使用到的, 我们不仅会讲解这些高级函数的使用,也会更深入的去了解Go string字符串, 包括更低层的知识,如字符串内部是如何表现的。

Go字符串是由任意字节bytes组成的不可变序列。 在大多数情况下, 一个字符串的字节(bytes)代表了Unicode文本。这就是说Go的字符串可以包含世界上的所有语言。

Go字符串类型从根本上讲跟其它语言是不同的。Java字符串, C++ std::string以及Python 3's str types 都是由固定宽度的字符组成的序列, 而Go string是由可变宽度组成的字符序列, 每一个字符可以由一个或者多个字节byte组成, 通常由UTF8编码。

这样看来其它语方对字符串的检索要比Go来的方便,因为它们的字符都是固定大小, 而Go的string可能会包含7位的ASCII字符(UTF-8是单个字节表示). 但实际中这对于Go程序员来说不是什么问题, 第一,我们不会大多的使用index去一个字符一个字符的遍历字符串。 第二, Go标准库中提供了全面的字符串搜索和操作的函数。 第三,我们可以所一个字符串转化为Unicode Code points(字符码[]rune)数组,这样就可以直接使用index.

对比于Java或者Python, Go使用UTF8有几个优势,比如Java表示字符串的字符码,每个字符码占用16 bits(2个byte), 而Python 2.x到3.2则使用16或者32bits(依赖于Python是如何编译的). 而对于Go来讲,English 文本只当用8 bit. 另一个使用UTF-8的优势是不用去管机器的字节顺序, 而对于UTF-16和UTF-32来说,字节顺序是至关重要的(比如UTF-16低位优先), 它影响到是否能够正确的解码字符串。此外UTF-8已经是世界文本文件的编码标准,所以其它语言必须使用它们内部的Unicode库去解码或者编码这些文件,而Go可以直接操作。 而且,语多主流的库是使用的UTF-8编码,比如GTK+(跨平台的图形库). 这样Go就可以同它们一起工作,而不需要编码和解码。