Fork me on GitHub

Go语言开发-字符串

3.字符串

本章将讲授Go语言的字符串类型和标准库中与字符串类型相关的关键包。本章各小节的内容将涵盖如何编写字符串常量及如何使用字符串操作符;如何对字符串进行索引和切片(取子串);如何格式化输出字符串、数值和其他内置类型及自定义类型。

Go语言的高级字符串处理相关的功能,如逐字符遍历字符串的for…range循环,strings和strconv包中的函数,字符串切片功能,所有这些功能都是日常编程中所需要用到的。尽管如此,本章还是会深入介绍Go语言的字符串,包括一些底层细节,如字符串类型的内部表示。关于字符串底层方面的东西非常有趣且在某些情况下非常有用。

Unicode编码

 

在Unicode编码出现之前,要在文本文件中包含不同语言的文本几乎是不可能的,例如在英文中引用一些日文或者俄文,这是因为不同语言使用的不同的编码,而单个文本文件只能使用一种编码。Unicode被设计成能够表示世界上所有的语言字符,所以使用Unicode编码的单个文件可以同时包含任意多种语言,包括数学符号、“修饰符”及其他特殊字符。

 

每个Unicode字符都有一个独一无二的标识号,称作码点。目前有超过100000 个Unicode字符被定义,其码点的值的范围从0x0 到 0x10FFFF (在Go语言中后者被定义为unicode.MaxRune常量),但是对于码点的定义,不同的语言有一些区别或一些特殊情况。在Unicode文档中,码点是用4个或更多个十六进制数字以U+hhhh的形式表示的,如U+21D4表示字符⇔。

 

在Go语言中,单个码点(如,字符)在内存中以rune的形式表示。(rune类型与int32类型等价。)

 

Unicode 文本——无论是在文件中或在内存中——都必须使用一种编码来表示。Unicode标准定义了多种Unicode转换格式(编码),如 UTF-8、 UTF-16 和 UTF-32。Go语言的字符串类型使用UTF-8编码。UTF-8是使用最广泛的编码;它也是文本文件的事实标准编码及XML和JSON文件的默认编码。UTF-8编码使用1至4个字节来表示每个码点。对于只包含7位ASCII(US-ASCII)的字符串来说,字节和字符之间是一一对应的关系,因为每个7位ASCII字符可以用一个UTF-8字节来表示。这样做的一个结果是,UTF-8存储英文文本时会非常紧凑(一个字节表示一个字符);另一个结果是用7位ASCII编码的文本与用UTF-8编码的文本是难以区分的。

Go语言字符串是包含任意字节的不可修改的字符序列。在大多数情况下,一个字符串的字节使用UTF-8编码表示Unicode文本。Unicode编码的使用意味着Go语言的字符串可以在代码页没有任何混淆与限制的情况下同时包含世界上任意多种语言。

Go语言的字符串类型从根本上就不同于其他编程语言。Java的String、C++的std::string及Python3的str类型都是固定长度的字符序列,而Go语言的字符串是可变长度的字符序列,它的每个字符都用一个或多个字节表示,且通常使用UTF-8编码。

初看起来可能会觉得其他语言的字符串类型比GO语言的字符串类型更加方便,因为它们的字符串中的单个字符可以被直接索引,而在Go语言中,只有包含 7 位 ASCII 字符(因为它们都由一个单一的UTF-8位组表示)的字符串才可被逐字符索引。在实际情况中,对Go程序员来说这从来不是问题:首先,在Go语言中直接对字符索引并不常用,Go语言支持对字符串进行逐字符迭代;其次,标准库提供了大量的字符串搜索和操作函数;第三,我们可以将Go语言的字符串转换成一个可以被直接索引的Unicode码点切片(其类型为[]rune)。

与其他使用Unicode编码的字符串的编程语言相比,如Java或Python,Go语言使用UTF-8编码的字符串具有更多的优势。Java使用码点序列来表示字符串,每个码点占用16比特位;Python2.x至3.2版本使用了与Java相同的实现方法,但在构建的时候会选择使用16或32比特位。对于英文文本,这意味着Go语言中每个字符使用8比特位,而Java和Python使用的位数则至少是Go语言的两倍。UTF-8编码的另一个优点是,不需要关心机器码存储顺序,而对于UTF-16和 UTF-32,则必须知道机器码的存储顺序(如UTF-16 little-endian)才能正确的解码相应的文本。另外,由于UTF-8是世界上文本文件的事实编码标准,其他语言必须编码解码此类文件以能够在其内部Unicode编码和UTF-8之间互相转换,而Go语言可以直接读写此类文件。此外,一些主要的库(如GTK+)也原生使用UTF-8编码的字符串,所以Go语言无需编码解码就可以使用它们。

在实际使用中,Go语言的字符串与其他语言中的字符串类型一样方便和容易使用——一旦我们学会了Go语言中关于字符串的语法。


目录


作者:Johnson
原创文章,版权所有,转载请保留原文链接。

发表评论

电子邮件地址不会被公开。 必填项已用*标注