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) bool
和 strings.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) string
和 strings.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) string
和 strings.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) string
、strings.TrimLeft(s, cutset string) string
和 strings.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 或 false | true, false |
%b | 整数的二进制表示 | 101010, 11110000 |
%c | 相应 Unicode 码点所表示的字符 | U+0042 ('B'), U+03B2 ('β') |
%d | 整数的十进制表示 | 42, -42 |
%o | 整数的八进制表示 | 52, -52 |
%q | 单引号围绕的字符字面值,由 Go 语法安全地转义 | 'a', '\'' |
%x | 整数的十六进制表示,字母形式为小写 a-f | 2a, ff |
%X | 整数的十六进制表示,字母形式为大写 A-F | 2A, FF |
%U | Unicode 格式 | U+0042, U+03B2 |
%e | 科学计数法 | 1.234456e+78 |
%E | 科学计数法(大写) | 1.234456E+78 |
%f | 有小数点而无指数 | 123.456 |
%F | 等同于 %f | 123.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 | 指针的十六进制表示,前缀为 0x | 0x4218f0 |