首页 / Go 语言入门教程 / strings/strconv/sort 包

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)
})
Note

Go 1.21 新增的 slicescmp 包是首选。老代码里的 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

下一节讲测试和工程化工具。