不能用strings.Title转驼峰,因其仅将非字母数字字符后首字母大写、不处理大小写归一化且已弃用;应使用strings.FieldsFunc按下划线分词后逐段处理:首段小写,其余段首字母大写。

Go 中如何用 strings.Title 转驼峰?别这么干
strings.Title 看起来最直接,但它会把每个单词首字母大写,且对非 ASCII 字符(比如中文、下划线后接数字)行为不可靠。更关键的是:它不处理下划线分隔符,也不会跳过已存在的大写字母——结果可能是 "HTTPServer" 变成 "Httpserver",完全错了。
真正要的是“下划线转驼峰 + 保留已有大写缩写”的逻辑,比如:"http_response_code" → "HttpResponseCode","xml_parser" → "XmlParser"。
- 不要依赖
strings.Title或strings.ToTitle - 不要用正则全局替换,容易漏掉边界情况(如开头/结尾下划线、连续下划线)
- 手动遍历字符是最可控的方式:遇到下划线就标记下一个字母需大写,同时跳过下划线本身
手写驼峰转换函数要注意的三个边界
核心逻辑是状态机式扫描:记录是否刚经过下划线,决定当前字母要不要大写。但实际写时容易忽略这些点:
- 开头或结尾的下划线要丢弃,比如
"_user_id_"应转为"UserId",不是"UserId_" - 连续多个下划线(
"user__id")应视为单个分隔符,不能生成空字段 - 全大写缩写(如
"API_KEY")要保持"ApiKey",而不是"Apikey";这意味着不能简单地把所有字母小写后再首字母大写,得识别连续大写字母块
所以推荐先用 strings.FieldsFunc(s, func(r rune) bool { return r == '_' }) 拆分非空段,再逐段处理首字母大小写,比边扫边状态管理更清晰、更少出错。
推荐方案:用 strings.FieldsFunc + 首字母提升
这是目前最简、最稳的做法,适合绝大多数 API 字段名、配置键转换场景:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
func ToCamel(s string) string {
parts := strings.FieldsFunc(s, func(r rune) bool { return r == '_' })
if len(parts) == 0 {
return ""
}
var b strings.Builder
for i, part := range parts {
if part == "" {
continue
}
if i == 0 {
b.WriteString(strings.ToLower(part))
} else {
b.WriteString(strings.Title(strings.ToLower(part)))
}
}
return b.String()
}
注意:strings.Title 在这里只用于单个单词(如 "id"→"Id"),不会跨词误操作,所以是安全的。如果需要严格支持 "XMLParser" 这类,就得额外加缩写识别逻辑,但日常 JSON key 映射基本不需要。
- 该函数对
"user_name"→"userName"(小驼峰)也适用,只需把首段改为strings.ToLower(part)即可 - 若输入含混合大小写如
"UserID",此函数会统一转小写再升首字母,变成"Userid"—— 这是预期行为,因为原始字符串本就不符合下划线命名规范
为什么不用现成包?比如 github.com/microcosm-cc/bluemonday 或 golang.org/x/text/cases
这些包都不是为命名转换设计的。bluemonday 是 HTML 过滤器,cases 是本地化大小写转换(比如土耳其语的 I/i 规则),它们都不处理下划线分隔逻辑。
真正专用于此的轻量库如 github.com/gobuffalo/fizz/stringy 或 github.com/iancoleman/strcase 确实可用,但引入外部依赖只为一个几十行的函数,往往得不偿失。尤其在 CLI 工具、配置解析等简单场景,手写更透明、无版本漂移风险。
唯一需要外部库的情况是:你正在处理大量来自不同来源的命名(Protobuf、OpenAPI、数据库列名),且要求精确匹配各种缩写规则(如 "OAuthToken" 而非 "Oauthtoken")。否则,上面那个 strings.FieldsFunc 版本已经覆盖 95% 的真实需求。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










