内容简介:在 Go 语言中,字符串是一种基本类型,默认是通过 UTF-8 编码的字符序列,当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节,比如中文编码通常需要 3 个字节。字符串的声明和初始化非常简单,举例如下:要获取字符串中的某个字符,可以通过访问数组下标的方式:
字符串
基本使用
在 Go 语言中,字符串是一种基本类型,默认是通过 UTF-8 编码的字符序列,当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节,比如中文编码通常需要 3 个字节。
声明和初始化
字符串的声明和初始化非常简单,举例如下:
var str string // 声明字符串变量 str = "Hello World" // 变量初始化 str_2 := "你好,学院君 // 也可以同时进行声明和初始化
获取单个字符
要获取字符串中的某个字符,可以通过访问数组下标的方式:
ch := str[0] // 取字符串的第一个字符
格式化输出
还可以通过 Go 语言内置的 len()
函数获取指定字符串的长度,以及通过 fmt
包提供的 Printf
进行字符串格式化输出(用法和 PHP 中的 printf
类似):
fmt.Printf("The length of \"%s\" is %d \n", str, len(str))
fmt.Printf("The first character of \"%s\" is %c.\n", str, ch)
转义字符
与 PHP 不同,Go 语言的字符串不支持单引号,只能通过双引号定义字符串字面值,如果要对特定字符进行转义,可以通过 \
实现,就像我们上面在字符串中转义双引号和换行符那样,常见的需要转义的字符如下所示:
\n \r \t \u \\
所以,上述打印代码输出结果为:
The length of "Hello world" is 11 The first character of "Hello world" is H.
不可变值类型
虽然可以通过数组下标方式访问字符串中的字符,但是和数组不同,在 Go 语言中,字符串是一种不可变值类型,一旦初始化之后,它的内容不能被修改,比如看下面这个例子:
str := "Hello world" str[0] = 'X' // 编译错误
编译器会报类似如下的错误:
cannot assign to str[0]
字符编码
Go 语言中字符串默认是 UTF-8 编码的 Unicode 字符序列,所以可以包含非 ANSI 字符,比如「Hello, 学院君」可以出现在 Go 代码中。但需要注意的是,如果你的 Go 代码需要包含非 ANSI 字符,保存源文件时请注意编码格式必须选择 UTF-8。特别是在 Windows 下一般编辑器都默认存为本地编码,比如中国地区可能是 GBK 编码而不是 UTF-8,如果没注意这点在编译和运行时就会出现一些意料之外的情况。
字符串的编码转换是处理文本文档(比如 TXT、XML、HTML 等)时非常常见的需求,不过 Go 语言默认仅支持 UTF-8 和 Unicode 编码,对于其他编码,Go 语言标准库并没有内置的编码转换支持。不过,所幸的是我们可以很容易基于 iconv 库包装一个。这里有一个开源项目可供参考: https://github.com/qiniu/iconv 。
字符串操作
字符串连接
PHP 默认提供了丰富的 字符串函数 对字符串进行操作,Go 也不例外,常见的操作包含连接、获取长度和指定字符,获取长度和指定字符前面已经介绍过,字符串连接只需要通过「+」即可(PHP 里面使用的是「.」):
str = str + ", 学院君" str += ", 学院君" // 上述语句也可以简写为这样,效果完全一样
另外,还有一点需要注意的是如果字符串长度较长,需要换行,则「+」必须出现在上一行的末尾,否则会报错:
str = str +
", 学院君"
字符串切片
在 PHP 中我们可以通过 substr 函数获取字符串的子串,在 Go 语言中,可以通过字符串切片功能实现类似的操作,相比 substr 函数,使用起来更加方面:
str = "hello, world" str_1 := str[:5] // 获取索引5(不含)之前的子串 str_2 := str[7:] // 获取索引7(含)之后的子串 str_3 := str[0:5] // 获取从索引0(含)到索引5(不含)之间的子串 fmt.Println(str_1) fmt.Println(str_2) fmt.Println(str_3)
上述代码打印结果如下:
hello world hello
字符串切片和 PHP 的 substr
函数使用方式有所差异,通过「:」对字符串进行切片,冒号之前的数字代表起始点(为空表示从0开始),之后的数字代表结束点(为空表示到字符串最后),而不是子串的长度。
此外 Go 字符串也支持字符串比较、是否包含指定字符/子串、获取指定子串索引位置、字符串替换、大小写转换、trim 等操作,更多操作 API,请参考标准库 strings 包。
字符串遍历
Go 语言支持两种方式遍历字符串。
一种是以字节数组的方式遍历:
str := "Hello, 世界"
n := len(str)
for i := 0; i < n; i++ {
ch := str[i] // 依据下标取字符串中的字符,类型为byte
fmt.Println(i, ch)
}
这个例子的输出结果为:
可以看出,这个字符串长度为 13,尽管从直观上来说,这个字符串应该只有 9 个字符。这是因为每个中文字符在 UTF-8 中占 3 个字节,而不是 1 个字节。
另一种是以 Unicode 字符遍历:
str := "Hello, 世界"
for i, ch := range str {
fmt.Println(i, ch) // ch 的类型为 rune
}
输出结果为:
这个时候,打印的就是 9 个字符了,以 Unicode 字符方式遍历时,每个字符的类型是 rune
(早期的 Go 语言用 int
类型表示 Unicode 字符),而不是 byte
。
字符类型
和 PHP 不同,Go 语言对单个字符进行了单独的类型支持,在 Go 语言中支持两个字符类型,一个是 byte
(实际上是 uint8
的别名),代表 UTF-8 字符串的单个字节的值;另一个是 rune
,代表单个 Unicode 字符。 关于 rune
相关的操作,可查阅 Go 标准库的 unicode
包。 另外 unicode/utf8
包也提供了 UTF-8 和 Unicode 之间的转换。
出于简化语言的考虑,Go 语言的多数 API 都假设字符串为 UTF-8 编码。尽管 Unicode 字符在标准库中有支持,但实际上较少使用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Designing Data-Intensive Applications
Martin Kleppmann / O'Reilly Media / 2017-4-2 / USD 44.99
Data is at the center of many challenges in system design today. Difficult issues need to be figured out, such as scalability, consistency, reliability, efficiency, and maintainability. In addition, w......一起来看看 《Designing Data-Intensive Applications》 这本书的介绍吧!