跳到主要内容

Go 字符串操作和格式化

占位符

fmt.Printf 的性能不如 fmt.Print,因此在性能敏感的场景中要谨慎使用。

sampleText := "字符串"
number := 123
fmt.Printf("字符串是%s,数字是%d", sampleText, number) // 输出:字符串是字符串,数字是123

Sprintf

fmt.Sprintf 可以返回格式化后的字符串,便于进一步处理。

result := fmt.Sprintf("字符串是%s,数字是%d", sampleText, number)
fmt.Println(result)

strings.Builder

strings.Builder 的性能非常好,我推荐在需要拼接大量字符串时使用。

func buildString() {
var builder strings.Builder

// 追加字符串
builder.WriteString("Hello, ")
builder.WriteString("World!")
builder.WriteRune('\n')

// 获取最终的字符串
result := builder.String()

// 输出结果
fmt.Println(result)

// 重置 builder
builder.Reset()

// 再次使用 builder
builder.WriteString("Goodbye, World!")
result = builder.String()
fmt.Println(result)
}

字符串方法

strings.Contains(s, substr string) bool

检查字符串是否包含子串。

fmt.Println(strings.Contains("Golang", "Go")) // 输出:true

strings.Count(s, substr string) int

计算子串在字符串中出现的次数。

fmt.Println(strings.Count("hello hello hello", "hello")) // 输出:3

strings.HasPrefix(s, prefix string) boolstrings.HasSuffix(s, suffix string) bool

检查字符串是否以指定前缀开头或以指定后缀结尾。

fmt.Println(strings.HasPrefix("Golang", "Go"))   // 输出:true
fmt.Println(strings.HasSuffix("Golang", "lang")) // 输出:true

strings.Index(s, substr string) int

返回子串在字符串中第一次出现的位置,如果字符串不包含子串,则返回 -1。

fmt.Println(strings.Index("Golang", "lang")) // 输出:2

strings.Join(a []string, sep string) string

将一系列字符串连接为一个字符串,之间用 sep 分隔。

arr := []string{"foo", "bar", "baz"}
fmt.Println(strings.Join(arr, ", ")) // 输出:foo, bar, baz

strings.Replace(s, old, new string, n int) stringstrings.ReplaceAll(s, old, new string) string

替换字符串中的子串,可以指定替换的次数(n 为 -1 时表示替换所有)。

fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))     // 输出:oinky oinky oink
fmt.Println(strings.ReplaceAll("oink oink oink", "oink", "moo")) // 输出:moo moo moo

strings.Split(s, sep string) []string

根据分隔符将字符串分割为子串数组。

fmt.Printf("%q\n", strings.Split("a,b,c", ",")) // 输出:["a" "b" "c"]

strings.ToLower(s string) stringstrings.ToUpper(s string) string

将字符串中的所有字符都转换为小写或大写格式。

fmt.Println(strings.ToLower("Golang")) // 输出:golang
fmt.Println(strings.ToUpper("Golang")) // 输出:GOLANG

strings.TrimSpace(s string) string

剪切字符串两端的空白符。

fmt.Println(strings.TrimSpace(" \t\n Golang \n\t\r\n")) // 输出:Golang

strings.Trim(s, cutset string) stringstrings.TrimLeft(s, cutset string) stringstrings.TrimRight(s, cutset string) string

剪切字符串两端(或左端、右端)的指定字符。

fmt.Println(strings.Trim("!!!Hello, Gophers!!!", "!"))      // 输出:Hello, Gophers
fmt.Println(strings.TrimLeft("!!!Hello, Gophers!!!", "!")) // 输出:Hello, Gophers!!!
fmt.Println(strings.TrimRight("!!!Hello, Gophers!!!", "!")) // 输出:!!!Hello, Gophers

占位符表

占位符说明示例
%v值的默认格式表示42, Hello, true
%+v当打印结构体时,会添加字段名{Field1:42 Field2:Hello}
%#v值的 Go 语法表示main.User{Name:"Alice", Age:25}
%T值的类型的 Go 语法表示int, string, bool
%t布尔值 true 或 falsetrue, false
%b整数的二进制表示101010, 11110000
%c相应 Unicode 码点所表示的字符U+0042 ('B'), U+03B2 ('β')
%d整数的十进制表示42, -42
%o整数的八进制表示52, -52
%q单引号围绕的字符字面值,由 Go 语法安全地转义'a', '\''
%x整数的十六进制表示,字母形式为小写 a-f2a, ff
%X整数的十六进制表示,字母形式为大写 A-F2A, FF
%UUnicode 格式U+0042, U+03B2
%e科学计数法1.234456e+78
%E科学计数法(大写)1.234456E+78
%f有小数点而无指数123.456
%F等同于 %f123.456
%g根据情况选择 %e%f,以产生更紧凑的(无末尾的 0)输出1.234456e+78, 123.456
%G根据情况选择 %E%F,以产生更紧凑的(无末尾的 0)输出1.234456E+78, 123.456
%s字符串表示Hello World
%q双引号围绕的字符串,由 Go 语法安全地转义"Hello World"
%x字符串的十六进制表示,小写字母,每字节两个字符68656c6c6f
%X字符串的十六进制表示,大写字母,每字节两个字符68656C6C6F
%p指针的十六进制表示,前缀为 0x0x4218f0