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

标签 string go capitalization

我有一个这样的字符串

var sentence string = "the biggest ocean is the Pacific ocean"

我希望能够将输入字符串中的第一个字母t转为大写,这样字符串就变成了

"The biggest ocean is the Pacific ocean"

在 Go 中如何做到这一点?

我尝试过使用 strings.Titlestrings.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/

相关文章:

css - 大写字符/单词的伪选择器?

php - 将字符串的最后一个字母大写

java - 追加和替换字符串不起作用

ssl - 如何显示网站证书的公钥

go - 如何调试“语法错误:{之前出现意外的分号或换行符”?

php - 仅返回字符串开头的大写字母的函数?

c++ - 最长最大重复子串

C# HTML 字符串 -> 获取没有 html 的长度

C++ 将字符串(或 char*)转换为 wstring(或 wchar_t*)

go - 如何将文件上传到 Google Drive,并使用服务帐户和 Golang 与任何人共享