如何将字符串的第一个字母大写

Ine*_*ers 5 string capitalization go

我有一个像这样的字符串

var sentence string = "the biggest ocean is the Pacific ocean"
Run Code Online (Sandbox Code Playgroud)

我希望能够将t输入字符串中的第一个字母大写,以便该字符串变成

"The biggest ocean is the Pacific ocean"
Run Code Online (Sandbox Code Playgroud)

在 Go 中如何做到这一点?

我尝试过使用strings.Titlestrings.ToTitle但他们没有做我想要的。

bla*_*een 7

假设您的输入字符串是有效的 UTF-8,该线程(Golang - ToUpper() on a single byte?)足够接近,尽管不是完全完美的重复。unicode.ToUpper我们可以在此基础上使用第一个符文得出可接受的解决方案我们可以在此基础上使用字符串的

\n

性能最佳的解决方案

\n

性能最佳的解决方案(请参阅下面的基准)是此答案建议的解决方案,utf8.DecodeRuneInString尽管您可能想使用ToUpper并解释可能的错误:

\n
r, size := utf8.DecodeRuneInString(text)\nif r == utf8.RuneError {\n    // handle error\n}\ns = string(unicode.ToUpper(r)) + text[size:]\n
Run Code Online (Sandbox Code Playgroud)\n

这里用索引索引字符串[]不会破坏编码,因为size根据我们刚刚解码的符文,保证是有效的偏移量。

\n

其他解决方案

\n
    r := []rune(s)\n    r[0] = unicode.ToUpper(r[0])\n    s = string(r)\n
Run Code Online (Sandbox Code Playgroud)\n

或者用一句“聪明的”俏皮话:

\n
    s := string(append([]rune{unicode.ToUpper(r[0])}, r[1:]...))\n
Run Code Online (Sandbox Code Playgroud)\n

与字符串不同,符文切片不是一成不变的,因此您可以将第一个符文替换为ToUpper,这将处理确实具有大写字母(例如俄语)的非 ASCII 和/或多字节代码点,而忽略那些不存在的\ 't(例如亚洲文字)

\n

ToUpperToTitle

\n

UPPER case 和 TITLE case 之间有区别,这里简单解释一下。简而言之,像 \xc7\x84 这样的二合字母字符将具有不同的标题大小写(\xc7\x85,仅第一个字素大写)和大写(\xc7\x84,两个字素大写)。如果您确实需要标题大小写,请使用unicode.ToTitle.

\n

大输入字符串

\n

转换string为/从[]rune转换涉及复制,因为您从不可变字符串中获取可变切片。如果您希望在性能敏感的代码中使用您的应用程序,请务必对其进行分析。

\n

strings.SplitN如果您有一个相当大的输入字符串,其中完整的符文切片转换变得太昂贵,您可以使用某些分隔符 \xe2\x80\x94 上的上限来解决这个问题,或者strings.Cut从更高版本的 Go 版本 \xe2\x80\x94 中提取第一个单词文本并仅在转换中使用该文本:

\n
sep := " "\nss := strings.SplitN(s, sep, 2)\n\nr := []rune(ss[0])\nr[0] = unicode.ToUpper(r[0])\n\ns = string(r) + sep + ss[1])\n
Run Code Online (Sandbox Code Playgroud)\n

基准测试

\n

使用约 30K 输入字符串进行基准测试显示出显着差异,尽管最好的和第二好的差异很小(使用 Go 1.22 更新了基准):

\n
go test -v -bench=. -benchmem\ngoos: darwin\ngoarch: arm64\npkg: example.com\nBenchmarkRuneConv-10            6730        168665 ns/op      155648 B/op          2 allocs/op\nBenchmarkSplitN-10            504634          2357 ns/op       32800 B/op          2 allocs/op\nBenchmarkDecodeRune-10        533928          2307 ns/op       32768 B/op          1 allocs/op\nPASS\nok      example.com 4.981s\n
Run Code Online (Sandbox Code Playgroud)\n

对于较小的字符串,SplitN/Cut解决方案是不必要的,并且utf8.DecodeRuneInString是明显的赢家。

\n

游乐场:https://go.dev/play/p/HpCBM7cRflZ

\n


小智 -12

我为你提供了简单的解决方案。

这是我在 Github 上的某人项目的一个分支

https://github.com/CleanMachine1/capitalise

要使用它,只需在终端中运行:

go mod init MODULENAME
go get github.com/cleanmachine1/capitalise
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中你可以使用


package main

import ("github.com/cleanmachine1/capitalise")

func main(){
 sentence = capitalise.First(sentence)
}
Run Code Online (Sandbox Code Playgroud)

  • @CleanMachine1 引用存储库代码可能会取得更好的成功 - 而不是将解决方案绑定到第三方包。 (5认同)