Go 语言入门教程
strings/strconv/sort 包
本教程共 80 篇 · 第 78 篇 · 更新于 2026-07-27 · 约 8 分钟阅读
GoGo 入门教程stringsstrconvsortslices字符串处理排序
78. strings/strconv/sort 包
本节目标:掌握 strings 包的字符串操作、strconv 的类型转换、sort 和 slices 包的排序功能。
strings 包
strings 包提供字符串的常用操作。
搜索和判断
import "strings"
strings.Contains("hello world", "world") // true,是否包含
strings.HasPrefix("hello", "he") // true,前缀
strings.HasSuffix("hello", "lo") // true,后缀
strings.Index("hello", "l") // 2,第一次出现位置
strings.LastIndex("hello", "l") // 3,最后一次
strings.Count("hello", "l") // 2,出现次数
strings.EqualFold("Hello", "hello") // true,忽略大小写比较
替换
strings.Replace("a-b-c", "-", "+", 1) // "a+b-c",替换 1 次
strings.ReplaceAll("a-b-c", "-", "+") // "a+b+c",全部替换
strings.Replace("a-b-c", "-", "+", -1) // -1 表示全部
分割和拼接
// 分割
parts := strings.Split("a,b,c", ",") // [a b c]
fields := strings.Fields("a b c") // [a b c],按空白分割
// 按多个分隔符
parts := strings.Split("a,b;c", "") // 不行,要用 FieldsFunc
// 拼接
strings.Join([]string{"a", "b", "c"}, "-") // "a-b-c"
strings.Repeat("ab", 3) // "ababab"
大小写和修剪
strings.ToUpper("hello") // HELLO
strings.ToLower("HELLO") // hello
strings.TrimSpace(" hi ") // "hi",去首尾空白
strings.Trim("xxhixx", "x") // "hi",去首尾指定字符
strings.TrimLeft("xxhi", "x") // "hi"
strings.TrimRight("hixx", "x") // "hi"
Builder 高效拼接
循环拼接字符串用 strings.Builder,比 + 高效:
var b strings.Builder
for i := 0; i < 1000; i++ {
b.WriteString("item")
b.WriteString(strconv.Itoa(i))
}
result := b.String()
Tip用
+拼接字符串每次都创建新字符串,循环里性能很差。Builder内部用[]byte,避免了重复分配。
strconv 包
strconv 负责字符串和基本类型的转换。
字符串转数字
import "strconv"
n, err := strconv.Atoi("42") // 字符串转 int
f, err := strconv.ParseFloat("3.14", 64) // 字符串转 float64
b, err := strconv.ParseBool("true") // 字符串转 bool
i, err := strconv.ParseInt("ff", 16, 64) // 16 进制转 int64,结果 255
转换失败会返回错误,要检查:
n, err := strconv.Atoi("abc")
if err != nil {
fmt.Println("不是数字") // 走这里
}
数字转字符串
s := strconv.Itoa(42) // int 转字符串 "42"
s := strconv.FormatFloat(3.14, 'f', 2, 64) // "3.14"
s := strconv.FormatBool(true) // "true"
s := strconv.FormatInt(255, 16) // "ff",转 16 进制
便捷函数
strconv.Itoa(42) // 最常用,int -> string
strconv.Atoi("42") // 最常用,string -> int
sort 包
sort 包对切片排序。Go 1.21 之前用类型特定函数,1.21 起推荐用泛型的 slices 包。
老式 sort(了解)
import "sort"
nums := []int{3, 1, 4, 1, 5}
sort.Ints(nums) // 升序 [1 1 3 4 5]
sort.Sort(sort.Reverse(sort.IntSlice(nums))) // 降序 [5 4 3 1 1]
sort.Float64s([]float64{3.2, 1.1})
sort.Strings([]string{"b", "a", "c"})
// 自定义排序
people := []Person{{"Tom", 20}, {"Jerry", 18}}
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age // 按年龄升序
})
slices 包(Go 1.21+ 推荐)
slices 包用泛型,更简洁:
import "slices"
nums := []int{3, 1, 4, 1, 5}
slices.Sort(nums) // 升序 [1 1 3 4 5]
slices.Reverse(nums) // 原地反转
// 自定义比较函数
slices.SortFunc(people, func(a, b Person) int {
return a.Age - b.Age // 负数 a 在前
})
// 判断是否已排序
slices.IsSorted(nums) // true
// 查找
slices.Contains(nums, 3) // true
idx := slices.Index(nums, 4) // 3
// 复制
numsCopy := slices.Clone(nums)
// 用 cmp 包排序(自然顺序)
slices.SortStableFunc(nums, func(a, b int) int {
return cmp.Compare(a, b)
})
NoteGo 1.21 新增的
slices和cmp包是首选。老代码里的sort.Slice还能用,但新代码推荐slices.Sort。
搜索(二分查找)
已排序的切片可以用二分查找:
nums := []int{1, 3, 5, 7, 9}
idx := sort.SearchInts(nums, 5) // 2,返回插入位置
maps 包(Go 1.21+)
顺带提一下 maps 包,操作 map:
import "maps"
m := map[string]int{"a": 1, "b": 2}
keys := maps.Keys(m) // Go 1.23+ 返回迭代器
vals := maps.Values(m)
m2 := maps.Clone(m) // 复制
maps.Copy(m, m3) // 把 m3 合并到 m
maps.Equal(m, m2) // 是否相等
maps.DeleteFunc(m, func(k string, v int) bool {
return v < 2 // 删除值小于 2 的
})
小结
- strings:
Contains/HasPrefix/Split/Join/Replace/TrimSpace/Builder - strconv:
Atoi/Itoa最常用,注意检查 error - sort 包:
sort.Ints/sort.Slice老式 API - slices 包(1.21+):
slices.Sort/Reverse/Contains/Clone,泛型更简洁 slices.SortFunc配合cmp.Compare做自定义排序- maps 包(1.21+):
Clone/Copy/Equal/Keys
下一节讲测试和工程化工具。