我有一个这样的字符串
var sentence string = "the biggest ocean is the Pacific ocean"
我希望能够将输入字符串中的第一个字母t
转为大写,这样字符串就变成了
"The biggest ocean is the Pacific ocean"
在 Go 中如何做到这一点?
我尝试过使用 strings.Title
和 strings.ToTitle
但是他们不做我想做的事。
最佳答案
假设您的输入字符串是有效的 UTF-8,这个线程 ( Golang - ToUpper() on a single byte? ) 已经足够接近了,尽管不是一个完美的副本。我们可以在此基础上使用 unicode.ToUpper
得出可接受的解决方案在字符串的第一个 rune 上。
r := []rune(s)
r[0] = unicode.ToUpper(r[0])
s := string(r)
或者使用“聪明”的单行代码:
s := string(append([]rune{unicode.ToUpper(r[0])}, r[1:]...))
与字符串不同, rune slice 不是不可变的,因此您可以用 ToUpper
替换第一个 rune ,这将处理非 ASCII 和/或具有大写字母的多字节代码点(例如俄语)而不管那些不存在的(例如亚洲文字)
NOTE:UPPER case和TITLE case有区别,简单说明here .简而言之,象 DŽ 这样的二合字母将有不同的标题大小写(Dž,只有第一个字素大写)和大写字母(DŽ,两个字素都大写)。如果您确实需要标题,请使用 unicode.ToTitle
.
注意 2: 将 string
转换为 []rune
涉及复制,因为您从不可变字符串中获取可变 slice 。如果您希望在对性能敏感的代码中使用它,请对您的应用程序进行概要分析。
Playground :https://go.dev/play/p/HpCBM7cRflZ
如果您有一个相当大的输入字符串,而完整的 rune slice 转换变得过于昂贵,您可以使用加盖的 strings.SplitN
来解决这个问题。在一些分隔符上,本质上是提取文本的第一个单词并在转换中仅使用它:
sep := " "
ss := strings.SplitN(s, sep, 2)
r := []rune(ss[0])
r[0] = unicode.ToUpper(r[0])
s = string(r) + sep + ss[1])
使用 ~30K 输入字符串进行基准测试显示出显着差异:
go test -v -bench=. -benchmem
goos: darwin
goarch: arm64
pkg: example.com
BenchmarkRuneConv-10 6376 183691 ns/op 258049 B/op 3 allocs/op
BenchmarkSplitN-10 1709989 706.1 ns/op 4152 B/op 3 allocs/op
PASS
ok example.com 3.477s
关于string - 如何将字符串的第一个字母大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70206380/