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

5

我有一个类似于这样的字符串

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

我希望能够将输入字符串中的首字母 t 大写,使字符串变为

"The biggest ocean is the Pacific ocean"

如何在 Go 中实现此功能?

我尝试过使用 strings.Titlestrings.ToTitle,但它们并不是我想要的。

4个回答

6
假设您的输入字符串是有效的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切片是可变的,因此您可以用ToUpper替换第一个rune,它将处理具有大写字母(例如俄语)和保留没有大写字母(例如亚洲文字)的非ASCII和/或多字节代码点。
注意:大写和标题大小写之间存在差异,简单地在这里说明。简而言之,类似DŽ的双字母字符将具有不同的标题大小写(Dž,只有第一个字母大写)和大写(DŽ,两个字母都大写)。如果您实际上需要标题大小写,请使用unicode.ToTitle
注意2:转换为/从string[]rune涉及复制,因为您从不可变字符串中获得可变切片。如果您希望在性能敏感的代码中使用它,请对您的应用程序进行分析。

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


如果您有一个较大的输入字符串,全符文片段转换会变得过于昂贵,您可以使用在某个分隔符上截断的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

之前的代码存在问题。对于 """ hello" 这样的情况会出现 panic。 因此需要一些额外的代码。func firstLetterToUppercase(s string) string { sep := " " ss := strings.SplitN(s, sep, 2) r := []rune(ss[0]) if len(r) == 0 { return s } r[0] = unicode.ToUpper(r[0]) s = string(r) if len(ss) > 1 { s += sep + ss[1] } return s } - Pedro C. Abreu

2

实现所需的结果最简单的方法是使用strings.ToUpper()函数。参考

    var input string = "the biggest ocean is the Pacific ocean"
    res := strings.ToUpper(input[:1]) + input[1:]

    fmt.Println(res)

或者

你可以在goplayground上尝试它。


字符串索引[]无法处理多字节输入:https://go.dev/play/p/0-bi1WmC1AX - blackgreen

-1

获取第一个符文,将该符文转换为标题大小写并重新组合字符串:

sentence := "the biggest ocean is the Pacific ocean"
r, i := utf8.DecodeRuneInString(sentence)
sentence = string(unicode.ToTitle(r)) + sentence[i:]
fmt.Println(sentence)

2
utf8.DecodeRuneInString 可能会针对空输入字符串(或如果字符串的开头具有无效符文)返回 RuneError - 因此可能需要检查这一点。 - colm.anseo

-11

我有一个简单的解决方案。

这是我在Github上fork别人项目的结果。

https://github.com/CleanMachine1/capitalise

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

go mod init MODULENAME
go get github.com/cleanmachine1/capitalise

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


package main

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

func main(){
 sentence = capitalise.First(sentence)
}

4
@CleanMachine1,你可能会更成功地引用代码库的代码,而不是将解决方案与第三方包绑定在一起。 - colm.anseo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接