内容简介:在 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 字符在标准库中有支持,但实际上较少使用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 二)redis 字符串类型
- MySQL数据类型 -- 字符型
- python数据类型-字符串常用操作
- Golang语言包-字符串处理string和字符串类型转换strconv
- redis 基本数据类型-字符串(String)
- TypeScript 4.1 RC 发布,字符串模板类型实装
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
国际大学生程序设计竞赛例题解
郭嵩山 / 电子工业出版社 / 2007-7 / 32.00元
《国际大学生程序设计竞赛例题解3:图论、动态规划算法、综合题专集》以图论、动态规划算法、综合题的形式介绍了ACM国际大学生程序设计竞赛(ACM/ICPC)中所用到的典型算法,并结合例题,对如何灵活地运用这些算法进行比较详细分析和深入浅出的讲解。《国际大学生程序设计竞赛例题解3:图论、动态规划算法、综合题专集》以精讲多练为教学宗旨,并在每一个专题论述后用一章的篇幅选出一批有代表性的竞赛例题,对每道例......一起来看看 《国际大学生程序设计竞赛例题解》 这本书的介绍吧!