4 回答

TA貢獻1865條經驗 獲得超7個贊
假設您的輸入字符串是有效的 UTF-8,這個線程(Golang - ToUpper() on a single byte?)足夠接近,雖然不是一個完美的副本。我們可以在此基礎上使用字符串unicode.ToUpper
的第一個符文來得出一個可接受的解決方案。
r := []rune(s) r[0] = unicode.ToUpper(r[0]) s := string(r)
或者使用“聰明”的單線:
s := string(append([]rune{unicode.ToUpper(r[0])}, r[1:]...))
與字符串不同,符文切片不是不可變的,因此您可以將第一個符文替換為ToUpper
,這將處理具有大寫字母(例如俄語)的非 ASCII 和/或多字節代碼點,而忽略那些沒有的t(例如亞洲文字)
注意: UPPER case 和 TITLE case 是有區別的,這里簡單解釋一下。簡而言之,像?這樣的二合字母將有不同的標題大小寫(?,只有第一個字素大寫)和大寫(?,兩個字素都大寫)。如果您確實需要標題大小寫,請使用unicode.ToTitle
.
注意 2:轉換為/從string
to[]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

TA貢獻2051條經驗 獲得超10個贊
獲取第一個符文,符文的標題大小寫并重新組裝字符串:
sentence := "the biggest ocean is the Pacific ocean"
r, i := utf8.DecodeRuneInString(sentence)
sentence = string(unicode.ToTitle(r)) + sentence[i:]
fmt.Println(sentence)

TA貢獻1790條經驗 獲得超9個贊
達到預期結果的最簡單方法是使用strings.ToUpper()
函數。參考
var input string = "the biggest ocean is the Pacific ocean"
res := strings.ToUpper(input[:1]) + input[1:]
fmt.Println(res)
或者
你可以去goplayground試試

TA貢獻1841條經驗 獲得超3個贊
我有簡單的解決方案給你。
它是我在 Github 上的某人項目的一個分支
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 回答
- 0 關注
- 161 瀏覽
添加回答
舉報