Skip to content

字符串处理

string类型

在 Go 语言的字符串其实就是一个字符切片。Go 语言的字符串是兼容 Unicode 字符组的,并且是 UTF-8 编码的。

语法格式

go
// 直接声明字符串数据类型
var str1 string = "Hello, World"

// 使用反引号声明字符串数据类型
var str2 string = `Hello, World`

// 使用类型推断的方式声明字符串数据类型
var str3 = "Hello, World"

// 简短定义的方式声明字符串数据类型
str4 := "Hello, World"
go
// 直接声明字符串数据类型使用反引号
var str1 string = `Hello, World
This is a multiline string.`

// 使用类型推断的方式声明字符串数据类型
var str2 = `Hello, World
This is a multiline string.`

// 简短定义的方式声明字符串数据类型
str3 := `Hello, World
This is a multiline string.`

示例

go
package main

import "fmt"

func main() {
	// 定义单行字符串语法格式
	str1 := "Hello, World!"
	// 定义多行字符串语法格式
	str2 := `
	Hello, World!
	你好, 世界!
	`
	fmt.Println(str1, str2)
}

常用字符转义

以下就是一些常用的字符转义:

转义字符含义
\a响铃
\b退格
\f换页
\n换行
\r回车
\t制表符
\v纵向制表符
\反斜杠
\xhh十六进制转义字符(hh 表示两位十六进制数字)
\ddd八进制转义字符(ddd 表示三位八进制数字)

示例

go
package main

import "fmt"

func main() {
	str1 := "hello\aworld" // \a 响铃
	fmt.Println(str1)
	str1 = "hello\bworld" // \b 退格
	fmt.Println(str1)
	str1 = "hello\fworld" // \f 换页
	fmt.Println(str1)
	str1 = "hello\nworld" // \n 换行
	fmt.Println(str1)
	str1 = "hello\rworld" // \r 回车
	fmt.Println(str1)
	str1 = "hello\tworld" // \t 制表符
	fmt.Println(str1)
	str1 = "hello\vworld" // \v 纵向制表符
	fmt.Println(str1)
	str1 = "hello\"world" // \ 斜杠
	fmt.Println(str1)
	str1 = "打印字母 'A' 的十六进制转义字符:\x41"
	fmt.Println(str1)
	str1 = "打印希腊字母 'α' 的十六进制转义字符:\u03b1"
	fmt.Println(str1)
	str1 = "打印一个自定义的十六进制字符:\xff"
	fmt.Println(str1)
	str1 = "打印字母 'A' 的八进制转义字符:\101"
	fmt.Println(str1)
	str1 = "打印希腊字母 'α' 的八进制转义字符:\316\261"
	fmt.Println(str1)
	str1 = "打印一个自定义的八进制字符:\377"
	fmt.Println(str1)
}

提示

在 Go 语言中使用最多的字符转义是 \n,表示换行。其他的字符转义,请参考字符转义

字符串拼接

使用 + 操作符来拼接字符串。

示例

go
package main

import (
	"fmt"
)

func main() {
	// 字符串拼接,只能是字符串类型(其他数据类型需要转换成字符串类型再进行拼接).
	str1 := "hello"
	str2 := "world"
	r1 := str1 + str2
	fmt.Printf("r1类型:%T,r1的值:%s\n", r1, r1)
}

可以使用 fmt.Sprintf() 函数来拼接字符串。

示例

go
package main

import "fmt"

func main() {
	// 使用fmt.Sprintf()函数来进行字符串拼接
	var str = "hello"
	var str2 = "world"
	// 返回的是按照格式拼接好的字符串
	info1 := fmt.Sprintf("%s %s", str, str2)
	fmt.Println(info1)
	info2 := fmt.Sprintf("%s , %s", str, str2)
	fmt.Println(info2)
}

字符串长度

可以通过 len() 函数获取字符串长度。

示例

go
package main

import "fmt"

func main() {
	// len函数获取字符串长度
	s1 := "hello world"
	// 这个字符串包含 12 个字符(包括空格)
	// 在 UTF-8 编码下,每个字符占用 1 个字节
	// 因此这个字符串的总大小为 12 个字节
	fmt.Println(len(s1))
}

比较字符串内容

可以使用 ==!= 操作符来对字符串进行比较。

go
package main

import (
	"fmt"
)

func main() {
	// 字符串比较
	s1 := "hello"
	s2 := "hello"
	s3 := "world"
	fmt.Println(s1 == s2) // true
	fmt.Println(s1 == s3) // false
	fmt.Println(s1 != s2) // false
	fmt.Println(s1 != s3) // true
}

字符串切片

在Go语言中,字符串是由字节组成的序列。可以使用切片操作符([])来获取字符串的子串。切片操作符的语法为 s[start:end],其中 start 是起始索引(包含),end 是结束索引(不包含)。如果省略 start,则默认从字符串的开头开始;如果省略 end,则默认到字符串的末尾结束。

示例

go
package main

import "fmt"

func main() {
	// 定义一个字符串
	s1 := "hello world!"
	// 获取子字符串 "hello"
	sub1 := s1[0:5] // 从索引0开始,到索引5结束,但不包含索引5
	fmt.Println(sub1)
	// 获取子字符串 "world!"
	// sub2 := s1[6:12] // 从索引6开始,到索引12结束,但不包含索引12
	// sub2 := s1[6:] // 从索引6开始,到字符串末尾结束
	sub2 := s1[6:len(s1)] // 从索引6开始,到字符串末尾结束,不包含最后的索引
	fmt.Println(sub2)
}

字符串格式化

可以使用 fmt 包中的 Sprintf() 函数来格式化字符串。

示例

go
package main

import "fmt"

func main() {
	// 字符串格式化
	str := fmt.Sprintf("Hello, %s\n", "world")
	fmt.Println(str)
}

strings包的使用

strings 包是 Go 语言标准库中用于处理字符串的一个非常重要的包。它提供了一系列常用的字符串操作函数,帮助开发者更方便地操作和处理字符串。

字符串拼接

可以使用strings包中的 Join() 函数来拼接字符串。

go
// elems:字符切片
// sep:字符串,表示用于分隔 elems 中各个字符串元素的分隔符。
// 返回值:拼接后的字符串
func Join(elems []string, sep string) string

示例

go
package main

import (
	"fmt"
	"strings"
)

func main() {
	// 使用strings包的Join()函数来拼接字符串
	parts := []string{"hello", "world", "Java", "Go", "Python"}
	// elems []string: 字符切片
	// sep string: 这是一个字符串,表示用于分隔 elems 中各个字符串元素的分隔符.
	result := strings.Join(parts, "+")
	fmt.Println(result)
}

可以使用 strings 包中的 Builder 结构体来拼接字符串。

go
type Builder struct {
	addr *Builder // 指向 Builder 的指针
	buf  []byte // 字节数组
}

示例

go
package main

import "strings"

func main() {
	// 使用 strings.Builder 构建字符串
	var builder strings.Builder
	builder.WriteString("Hello")
	builder.WriteString("World")
	builder.WriteString("Go语言学习笔记")
	// builder.String()方法返回构造好的字符串
	result := builder.String()
	println(result)
}

字符串查找

使用 strings 包中的 Index()LastIndex() 函数查找子字符串的位置。

go
// s:表示要查找的字符串
// substr:表示要查找的子字符串
// 返回值:如果在 s 中找到 substr,则返回 substr 第一次出现的索引位置。索引从 0 开始计算;如果在 s 中找不到 substr,则返回 -1。
func Index(s, substr string) int
go
// s:表示要查找的字符串
// substr:表示要查找的子字符串
// 返回值:如果在 s 中找到 substr,则返回 substr 最后一次出现的索引位置。索引从 0 开始计算;如果在 s 中找不到 substr,则返回 -1。
func LastIndex(s, substr string) int

示例

go
package main

import (
	"fmt"
	"strings"
)

func main() {
	// 字符串查找
	str := "Hello, World!"
	// Index()函数作用:用来查找字符串中的内容
	index := strings.Index(str, "World")     // 7
	// LastIndex()函数作用:用来查找字符串中的内容
	lastIndex := strings.LastIndex(str, "o") // 8
	fmt.Printf("index:%d, lastIndex:%d\n", index, lastIndex)
}

字符串替换

使用 strings 包中的 Replace()ReplaceAll() 函数替换字符串中的子字符串。

go
// s:表示要替换的字符串
// old:表示要替换的子字符串
// new:表示要替换的新字符串
// n:表示替换的次数,如果 n 小于 0,则表示替换所有匹配的子字符串;如果 n 大于 0,则表示替换前 n 个匹配的子字符串。
// 返回值:替换后的字符串
func Replace(s, old, new string, n int) string
go
// s:表示要替换的字符串
// old:表示要替换的子字符串
// new:表示要替换的新字符串
// 返回值:替换后的字符串
func ReplaceAll(s, old, new string) string

示例

go
package main

import (
	"fmt"
	"strings"
)

func main() {
	// Replace()函数作用:用来替换字符串中的内容
	// 参数1: 字符串 参数2: 要替换的内容 参数3: 替换的内容 参数4: 替换的次数
	str1 := "Hello, World!"
	newStr := strings.Replace(str1, "World", "Go", 1)
	fmt.Println(newStr)
	// ReplaceAll()函数作用:用来替换字符串中的内容
	// 参数1: 字符串 参数2: 要替换的内容 参数3: 替换的内容
	newStrAll := strings.ReplaceAll(str1, "o", "O")
	fmt.Println(newStrAll)
}

字符串分割

使用 strings 包中的 Split()SplitN() 函数来分割字符串。

go
// s:表示要分割的字符串
// sep:表示要分割的分隔符
func Split(s, sep string) []string
go
// s:表示要分割的字符串
// sep:表示要分割的分隔符
func SplitN(s, sep string, n int) []string

示例

go
package main

import (
	"fmt"
	"strings"
)

func main() {
	// 定义字符串
	str1 := "a,b,c"
	// Split()函数作用:将字符串 s 按照指定的分隔符 sep 切分成一个字符串切片。
	parts := strings.Split(str1, ",") // [a b c]
	fmt.Println(parts)
	// SplitN()函数作用:将字符串 s 按照指定的分隔符 sep 切分成最多 n 个子串的字符串切片,不会忽略分隔符。
	partsN := strings.SplitN(str1, ",", 2)
	fmt.Println(partsN)
}

检查子字符串是否存在

使用 strings 包中的 Contains() 函数检查子字符串是否存在。

go
// s:表示要检查的字符串
// substr:表示要检查的子字符串
func Contains(s, substr string) bool

示例

go
package main

import (
	"fmt"
	"strings"
)

func main() {
	// Contains()函数作用:检查字符串 s 是否包含子串 substr。
	// 定义字符串
	str := "Hello World"
	// 检查子字符串是否存在
	contains1 := strings.Contains(str, "World") // true
	fmt.Println(contains1)
	// 检查子字符串是否存在
	contains2 := strings.Contains(str, "golang") // false
	fmt.Println(contains2)
}

统计子字符串出现的次数

使用 strings 包中的 Count() 函数统计子字符串出现的次数。

go
// s:表示要统计的字符串
// substr:表示要统计的子字符串
func Count(s, substr string) int

示例

go
package main

import (
	"fmt"
	"strings"
)

func main() {
	// Count()函数作用:统计字符串中某个字符出现的次数
	// 统计字符串中每个字符出现的次数
	str := "hello world"
	for _, v := range str {
		// 统计字符出现的次数
		count := strings.Count(str, string(v))
		fmt.Printf("%c: %d\n", v, count)
	}
}

包含某个字符做为前缀

使用 strings 包中的 HasPrefix() 函数检查字符串是否以某个前缀开头。

go
// s:表示要检查的字符串
// prefix:表示要检查的前缀
func HasPrefix(s, prefix string) bool

示例

go
package main

import (
	"fmt"
	"strings"
)

func main() {
	// 包含某个字符做为前缀
	str := "hello world!"
	fmt.Println(strings.HasPrefix(str, "he"))  // true
	fmt.Println(strings.HasPrefix(str, "llo")) // false
}

包含某个字符做为后缀

使用 strings 包中的 HasSuffix() 函数检查字符串是否以某个后缀结尾。

go
// s:表示要检查的字符串
// suffix:表示要检查的后缀
func HasSuffix(s, suffix string) bool

示例

go
package main

import (
	"fmt"
	"strings"
)

func main() {
	// 包含某个字符做为后缀
	str := "hello world"
	fmt.Println(strings.HasSuffix(str, "ld"))  // true
	fmt.Println(strings.HasSuffix(str, "wor")) // false
}

复制几次字符串

使用 strings 包中的 Repeat() 函数创建一个新的字符串,由指定的字符串 s 重复 count 次拼接而成。

go
// s:表示要重复的字符串
// count:表示重复的次数
func Repeat(s string, count int) string

示例

go
package main

import (
	"fmt"
	"strings"
)

func main() {
	// Repeat()函数作用:创建一个新的字符串,由指定的字符串 s 重复 count 次拼接而成。
	// 复制几次字符串
	str := "hello"
	fmt.Println(strings.Repeat(str, 2)) // hellohello
}

转换大小写

使用 strings 包中的 ToLower()ToUpper() 函数将字符串转换为小写或大写。

go
// s:表示要转换的字符串
func ToLower(s string) string
go
// s:表示要转换的字符串
func ToUpper(s string) string

示例

go
package main

import (
	"fmt"
	"strings"
)

func main() {
	// ToLower函数:将字符串转换为小写
	str1 := strings.ToLower("GOLANG")
	fmt.Printf("str1:%s\n", str1) // str1:golang
	str2 := strings.ToLower("你好") // 不支持中文
	fmt.Printf("str2:%s\n", str2) // str2:你好
	// ToUpper函数:将字符串转换为大写
	str3 := strings.ToUpper("java")
	fmt.Printf("str3:%s\n", str3) // str3:JAVA
}

去除空格或指定字符

使用 strings 包中的 Trim()TrimSpace() 函数去除字符串中的空格或指定字符。

go
// s:表示要处理的字符串
// cutset:表示要去除的字符
func Trim(s, cutset string) string
go
// s:表示要处理的字符串
// cutset:表示要去除的空格
func TrimSpace(s string) string

示例

go
package main

import (
	"fmt"
	"strings"
)

func main() {
	// Trim()函数的作用:去除字符串首尾的指定字符
	str1 := "  Hello World!  "
	trimStr1 := strings.Trim(str1, " ")
	fmt.Printf("trimStr1: %s\n", trimStr1) // trimStr1: Hello World!
	str2 := "+++Hello World!+++"
	trimStr2 := strings.Trim(str2, "+")
	fmt.Printf("trimStr2: %s\n", trimStr2) // trimStr2: Hello World!
	str3 := "===Hello World!==="
	trimStr3 := strings.Trim(str3, "=")
	fmt.Printf("trimStr3: %s\n", trimStr3) // trimStr3: Hello World!
}
go
package main

import (
	"fmt"
	"strings"
)

func main() {
	// Trim()函数的作用:去除字符串首尾的指定字符
	str1 := "   hello, world!   "
	trimmed1 := strings.Trim(str1, " ")
	fmt.Println(trimmed1) // 输出: hello, world!
	str2 := "---hello, world!---"
	trimmed2 := strings.Trim(str2, "-")
	fmt.Println(trimmed2) // 输出: hello, world!
	str3 := "***hello, world!***"
	trimmed3 := strings.Trim(str3, "*")
	fmt.Println(trimmed3)              // 输出: hello, world!
	trimmed4 := strings.Trim(str1, "") // cutset 为空字符串时,Trim() 函数不会做任何修改
	fmt.Println(trimmed4)
}

使用 strings 包中的 TrimPrefix()TrimSuffix() 函数去除字符串中的前缀或后缀。

go
// s:表示要处理的字符串
// prefix:表示要去除的前缀
func TrimPrefix(s, prefix string) string
go
// s:表示要处理的字符串
// suffix:表示要去除的后缀
func TrimSuffix(s, suffix string) string

示例

go
package main

import "strings"

func main() {
	// TrimPrefix函数的作用:删除字符串s的前缀字符串prefix
	// 去除字符串开头的指定前缀
	str1 := "https://example.com/path/to/resource"
	prefix := "https://"
	trimmed1 := strings.TrimPrefix(str1, prefix)
	println(trimmed1)
	// 当前缀不存在时,返回原字符串
	str2 := "example.com/path/to/resource"
	trimmed2 := strings.TrimPrefix(str2, prefix)
	println(trimmed2)
}
go
package main

import (
	"fmt"
	"strings"
)

func main() {
	// TrimSuffix函数的作用:删除字符串末尾的指定后缀
	// 去除字符串末尾的指定后缀
	str1 := "file.txt"
	suffix := ".txt"
	trimmed1 := strings.TrimSuffix(str1, suffix)
	fmt.Println(trimmed1)
	// 当后缀不存在时,返回原字符串
	str2 := "file.zip"
	trimmed2 := strings.TrimSuffix(str2, suffix)
	fmt.Println(trimmed2)
}

strconv包的使用

strconv 包提供了将字符串转换为其他类型的函数。

字符串与整数之间的转换

使用 strconv 包中的 Atoi() 函数将字符串转换为整数,Itoa() 函数将整数转换为字符串。

go
// s:表示要转换的字符串
func Atoi(s string) (int, error)
go
// i:表示要转换的整数
func Itoa(i int) string

示例

go
package main

import (
	"fmt"
	"strconv"
)

func main() {
	// 字符串与整数之间的转换
	// Atio函数:将字符串转换为整数
	r1, _ := strconv.Atoi("12345")
	fmt.Printf("r1类型:%T,r1值:%v\n", r1, r1)
	// Iota函数:将整数转换为字符串
	r2 := strconv.Itoa(54321)
	fmt.Printf("r2类型:%T,r2值:%v\n", r2, r2)
}

使用 strconv 包中的 ParseInt() 函数将字符串转换为整数,FormatInt() 函数将整数转换为字符串。

go
// s:表示要转换的字符串
// base:表示字符串的进制数(2、8、10、16)
// bitSize:表示整数的位数
func ParseInt(s string, base int, bitSize int) (i int64, err error)
go
// i:表示要转换的整数
// base:表示整数的进制数(2、8、10、16)
func FormatInt(i int64, base int) string

示例

go
package main

import (
	"fmt"
	"strconv"
)

func main() {
	// 字符串与整数之间的转换
	i1, _ := strconv.ParseInt("123", 10, 64) // 123, nil
	fmt.Printf("i1类型:%T,i1值:%v\n", i1, i1)
	i2 := strconv.FormatInt(321, 2) // 二进制 321
	fmt.Printf("i2类型:%T,i2值:%v\n", i2, i2)
	i3 := strconv.FormatInt(321, 8) // 八进制 321
	fmt.Printf("i3类型:%T,i3值:%v\n", i3, i3)
	i4 := strconv.FormatInt(321, 10) // 十进制 321
	fmt.Printf("i4类型:%T,i4值:%v\n", i4, i4)
	i5 := strconv.FormatInt(321, 16) // 十六进制 321
	fmt.Printf("i5类型:%T,i5值:%v\n", i5, i5)
}

字符串与布尔值之间的转换

使用 strconv 包中的 ParseBool() 函数将字符串转换为布尔值,FormatBool() 函数将布尔值转换为字符串。

go
// str:表示要转换的字符串
func ParseBool(str string) (bool, error)
go
// b:表示要转换的布尔值
func FormatBool(b bool) string

示例

go
package main

import (
	"fmt"
	"strconv"
)

func main() {
	// 字符串与布尔类型之间的转换
	// ParseBool函数的作用:将字符串转换为布尔类型
	b1, _ := strconv.ParseBool("true")
	fmt.Printf("b1类型:%T,b1值:%v\n", b1, b1)
	// Bool函数的作用:将布尔类型转换为字符串
	b2 := strconv.FormatBool(true)
	fmt.Printf("b2类型:%T,b2值:%v\n", b2, b2)
}

字符串与浮点数之间的转换

使用 strconv 包中的 ParseFloat() 函数将字符串转换为浮点数,FormatFloat() 函数将浮点数转换为字符串。

go
// str:表示要转换的字符串
// bitSize:表示要转换的浮点数的位数
func ParseFloat(s string, bitSize int) (float64, error)
go
// str:表示要转换的字符串
// fmt:表示要转换的浮点数的格式
// prec:表示要转换的浮点数的精度
// bitSize:表示要转换的浮点数的位数
func FormatFloat(f float64, fmt byte, prec, bitSize int) string

示例

go
package main

import (
	"fmt"
	"strconv"
)

func main() {
	// 字符串与浮点数之间的转换
	// ParseFloat函数的作用:将字符串转换为浮点数
	f1, _ := strconv.ParseFloat("3.1415", 64) // 3.1415, nil
	fmt.Printf("f1类型:%T,f1值:%v\n", f1, f1)
	f2 := strconv.FormatFloat(9.8765, 'f', -1, 64) // "9.8765"
	fmt.Printf("f2类型:%T,f2值:%v\n", f2, f2)
}

字符串与无符号整数之间的转换

使用 strconv 包中的 ParseUint() 函数将字符串转换为无符号整数,FormatUint() 函数将无符号整数转换为字符串。

go
// s:表示要转换的字符串
// base:表示字符串的进制数(2、8、10、16)
// bitSize:表示整数的位数
func ParseUint(s string, base int, bitSize int) (uint64, error)
go
// i:表示要转换的整数
// base:表示整数的进制数(2、8、10、16)
func FormatUint(i uint64, base int) string

示例

go
package main

import (
	"fmt"
	"strconv"
)

func main() {
	// 字符串与无符号整数之间的转换
	// ParseUint函数的作用:将字符串转换为无符号整数
	u1, _ := strconv.ParseUint("123", 10, 64) // 10表示进制,64表示转换后的类型
	fmt.Printf("u1类型:%T,u1值:%v\n", u1, u1)
	u2 := strconv.FormatUint(4321, 10) // "4321"
	fmt.Printf("u2类型:%T,u2值:%v\n", u2, u2)
}

根据 MIT 许可证发布