应直接调用 sort.strings 对 []string 升序排序,它按 utf-8 字节序(字典序)排列,支持中文 unicode 码点排序,但需避免传 nil、类型不匹配及误用于非字典序场景;非字典序需求须用 sort.slice。

字符串切片直接升序用 sort.Strings
Go 里对 []string 升序排序,就该直接调 sort.Strings,别绕弯子。它按 UTF-8 字节序排(也就是字典序),数字字符 '0'~'9' 在大写字母前,大写字母又在小写字母前,中文按 Unicode 码点排——比如 "张"(U+5F20)会排在 "李"(U+674E)前面。
常见错误:传 nil 切片会 panic;传 []interface{} 或 []*string 编译不通过;想按长度或忽略大小写却硬套 sort.Strings,结果逻辑错乱。
-
sort.Strings只接受[]string,类型必须严格匹配 - 调用前建议加判空:
if words != nil { sort.Strings(words) } - 数组要排序?先转切片:
var arr [3]string; sort.Strings(arr[:])
忽略大小写排序必须用 sort.Slice
sort.Strings 不支持自定义规则,所有“非纯字典序”需求都得退回到 sort.Slice。忽略大小写就是典型场景——闭包里用 strings.ToLower 就行,清晰且无副作用。
容易踩的坑:闭包里直接写 strings.ToLower(a) 没问题,但若捕获了循环变量(比如 <code>for _, s := range words { sort.Slice(..., func(...) bool { return s ),会导致所有比较都用最后一个 <code>s 值,结果全乱。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 必须用索引访问:
words[i]和words[j],别用外部变量 -
strings.ToLower要包在<code>标签里:strings.ToLower(words[i]) - 如果切片含
nil元素(如[]*string),得先过滤或在闭包里判空
按字符串长度降序:别碰 sort.Reverse
sort.Reverse(sort.StringSlice(words)) 这种写法只适合“先升序再整体翻转”的简单场景。一旦要按长度、按首字母分组、或混合排序优先级,它立刻失效,还容易漏掉 sort.Sort() 调用导致静默失败。
真实项目里更常见的是“长字符串在前,相同时按字典序”,这种必须用 sort.Slice + if-else 分层判断。
- 降序写法是
len(a) > len(b),不是len(a) 取反 - 多条件时靠短路:
if len(words[i]) != len(words[j]) { return len(words[i]) > len(words[j]) },然后接return words[i] -
sort.Reverse返回的是包装器,不能直接传给sort.Strings,语法不兼容
结构体字段含字符串时排序逻辑要拆解
比如 type Person struct { Name string; Age int },想按 Name 忽略大小写排序,闭包里就得写 strings.ToLower(people[i].Name) 。这里的关键约束是:字段必须导出(首字母大写),否则闭包读不到值;如果 <code>Name 是指针或嵌套字段(如 Address.Street),还得提前判空。
时间字段、布尔字段、自定义类型字段同理——不能直接用 > 或 比较,得调对应方法(如 <code>a.CreatedAt.After(b.CreatedAt))。
- 结构体字段名必须大写:
Name✅,name❌ - 闭包参数是下标
i、j,不是元素本身,别写成person.Name - 所有分支路径都要有明确
return,没兜底语句可能 panic 或结果未定义
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










