Go 编程 | 连载 04 - 字符与字符串类型

简介: Go 编程 | 连载 04 - 字符与字符串类型

一、Go 中的字符与字符串

字符与字符串

Go 默认使用 Unicode 字符集并使用 UTF-8 作为编码方式。Go 中没有字符类型,而是使用 byte 类型和 rune 类型来表示字符。

87a9ac0be725495babf914b14e716f0a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

字符串可以转换为字符数组 []rune 和 字节数组 []byte

byte 类型表示 ASCII 码的一个字符,而 rune 类型,代表一个 UTF-8 字符,所以中文的处理使用 rune 类型,对 ASCII 码的处理使用 byte 类型;二进制传输的时候,使用 byte 类型会非常方便。

Go 中字符串就是由字符组成的一段固定长度的序列,字符串是不可修改的。Go 中字符 byte 使用单引号括起来,字符串 string 使用双引号括起来。

字符串的长度

len() 函数可以用来获取字符串的长度。

func main() {
   var zulu = "你好 Go"
   var yankee = "Hello Go"
   fmt.Println("zulu 字符串的长度为:", len(zulu))
   fmt.Println("yankee 字符串的长度为:", len(yankee))
}
复制代码

执行上述代码,输出结果如下:

zulu 字符串的长度为: 9
yankee 字符串的长度为: 8
复制代码

UTF-8 编码中一个中文字符占三个字节。

字符串相当于一个只读的字符数组,如果字符串中只包含英文字符,那么字符串的长度就等于字符数组中字符的个数。

而对于包含中文的字符串来说,字符串的长度是不等于字符数组的长度的,而且 len() 函数作用于字符串时,取得是底层的 byte 数组的长度。要获取包含中文字符串底层字符数组的长度则先转为 rune 数组,再去获取数组的长度。

func main() {
   var zulu = "你好 Go"
   var yankee = "Hello Go"
   fmt.Println("zulu 字符串的长度为:", len(zulu))
   fmt.Println("yankee 字符串的长度为:", len(yankee))
   zulu_arr := []rune(zulu)
   fmt.Println(zulu_arr)
   fmt.Println("zulu 字符数组的长度为:", len(zulu_arr))
   yankee_arr := []byte(yankee)
   fmt.Println(yankee_arr)
   fmt.Println("yankee 字节数组的长度为:", len(yankee_arr))
}
复制代码

执行上述代码,输出结果如下:

zulu 字符串的长度为: 9
yankee 字符串的长度为: 8
[20320 22909 32 71 111]
zulu 字符数组的长度为: 5
[72 101 108 108 111 32 71 111]
yankee 字节数组的长度为: 8
复制代码

转义字符

转义字符是一种特殊的字符串常量,通常以反斜线开头,包含一个或者多个字符。每个转义字符都有特殊含义,常用的转义字符有:

转义字符 转义字符具有的含义
\n 换行符,将当前位置移到下一行开头
\r 回车符,将当前位置移到本行开头
\t 水平制表符跳到下一个TAB位置
\ 代表一个反斜线字符 \
" 代表一个双引号字符 "
func main() {
   c := "\n"
   fmt.Println(c)
   d := "\"
   fmt.Println(d)
   e := """
   fmt.Println(e)
   f := "?"
   fmt.Println(f)
}
复制代码

执行上述代码,输出结果如下:

\n
\
"
?
复制代码

二、Go 中字符串的常用操作

Package strings implements simple functions to manipulate UTF-8 encoded strings.

Go 中的 strings 标准库提供了字符串的基本操作,常见的字符串操作有:

  • 获取字符串求长度
  • 获取字符串的子串
  • 判断是否包含某个字符或者子串
  • 获取子串出现的次数(字符串匹配)
  • 字符串分割(切分)成[]string
  • 判断字符串是否存在某个前缀或后缀
  • 获取字符或者子串在字符串中首次出现的位置或最后一次出现的位置
  • 通过某个字符串将[]string进行拼接
  • 获取字符串重复次数
  • 字符串中子串替换
  • 大小写转换

更多的操作可以参考 Go 官方文档中的 Package strings 或者 strings 标准库的 中文文档

字符串查询和判断相关操作

func main() {
   name := "Stark"
   slogan := "I am IRONMAN, Tony Stark"
   fmt.Println("slogan 变量是否包含 "Stark":", strings.Contains(slogan, name))
   fmt.Println("slogan 变量中 "Stark" 字串的索引为:", strings.Index(slogan, name))
   fmt.Println("slogan 变量中 "a" 出现的次数为:", strings.Count(slogan, "a"))
   fmt.Println("slogan 变量是否以 "I" 开头:", strings.HasPrefix(slogan, "I"))
   fmt.Println("slogan 变量是否以 "Stark" 结尾:", strings.HasSuffix(slogan, "Stark"))
}
复制代码

执行上述代码,输出结果如下:

slogan 变量是否包含 "Stark": true
slogan 变量中 "Stark" 字串的索引为: 19
slogan 变量中 "a" 出现的次数为: 2
slogan 变量是否以 "I" 开头: true
slogan 变量是否以 "Stark" 结尾: true
复制代码

字符串更新相关操作

func main() {
   // 大小写替换
   fmt.Println("Stark 改为全部大写:", strings.ToUpper("Stark"))
   fmt.Println("Stark 改为全部小写:", strings.ToLower("Stark"))
   fmt.Println("the summer 改为 Title 样式:", strings.ToTitle("the summer"))
   // 去除空格
   fmt.Println("去除字符串中左右两边的空格:", strings.TrimSpace(" Hello Go "))
   fmt.Println("去除字符串左边的 H:", strings.TrimLeft("Hello Go", "H"))
   fmt.Println("去除字符串左边的 o:", strings.TrimRight("Hello Go", "o"))
   // 指定的字符串不是在左右边的位置,则去除失败,字符串不变
   fmt.Println("去除字符串左边的 o:", strings.TrimRight("Hello Go ", "o"))
   // 去掉左右两边指定的字符,如果不包含指定的字符,去除失败
   fmt.Println("去掉左右两边指定的字符:", strings.Trim("HelloH", "H"))
}
复制代码

执行上述代码,输出结果如下:

Stark 改为全部大写: STARK
Stark 改为全部小写: stark
the summer 改为 Title 样式: THE SUMMER
去除字符串中左右两边的空格: Hello Go
去除字符串左边的 H: ello Go
去除字符串左边的 o: Hello G
去除字符串左边的 o: Hello Go 
去掉左右两边指定的字符: ello
复制代码

字符串的分割与合并相关操作

func main() {
   location := []string{"usr", "local", "opt", "info.txt"}
   fmt.Println(strings.Split("/usr/local/opt/info.txt", "/"))
   fmt.Println(strings.Join(location, "/"))
   fmt.Println(strings.Replace("/usr/local/opt/info.txt", "/", "\", 4))
}
复制代码

执行上述代码,输出结果如下:

[ usr local opt info.txt]
usr/local/opt/info.txt
\usr\local\opt\info.txt


相关文章
|
15天前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
31 7
|
21天前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
22天前
|
Go
go语言常量的类型
【10月更文挑战第20天】
23 2
|
29天前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
49 7
|
1月前
|
Go 数据处理 调度
Go语言中的并发模型:解锁高效并行编程的秘诀
本文将探讨Go语言中独特的并发模型及其在现代软件开发中的应用。通过深入分析 Goroutines 和 Channels,我们将揭示这一模型如何简化并行编程,提升应用性能,并改变开发者处理并发任务的方式。不同于传统多线程编程,Go的并发方法以其简洁性和高效性脱颖而出,为开发者提供了一种全新的编程范式。
|
1月前
|
并行计算 算法 搜索推荐
探索Go语言的高并发编程与性能优化
【10月更文挑战第10天】探索Go语言的高并发编程与性能优化
|
2月前
|
存储 缓存 Go
go语言编程系列(五)
go语言编程系列(五)
|
2月前
|
搜索推荐 Java 编译器
go语言编程系列(四)
go语言编程系列(四)
|
2月前
|
Go
Go字节数组与字符串相互转换
Go字节数组与字符串相互转换
36 3
|
2月前
|
存储 JSON 安全
go语言编程系列(七)
go语言编程系列(七)