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


相关文章
|
2月前
|
存储 Go 索引
go语言中遍历字符串
go语言中遍历字符串
53 5
|
1月前
|
Go
go语言for 遍历字符串
go语言for 遍历字符串
31 8
|
2月前
|
Go 索引
go语言遍历字符串
go语言遍历字符串
33 3
|
2月前
|
Go 索引
go语言按字符(Rune)遍历
go语言按字符(Rune)遍历
33 3
|
2月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
56 4
|
2月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
40 1
|
2月前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
46 7
|
2月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
2月前
|
Go
go语言常量的类型
【10月更文挑战第20天】
29 2
|
3月前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
58 7