2 回答

TA貢獻1884條經驗 獲得超4個贊
使用一個簡單的函數來隱藏實現細節。例如,
package main
import "fmt"
func maxString(s string, max int) string {
if len(s) > max {
r := 0
for i := range s {
r++
if r > max {
return s[:i]
}
}
}
return s
}
func main() {
s := "日本語"
fmt.Println(s)
fmt.Println(maxString(s, 2))
}
輸出:
日本語
日本

TA貢獻1898條經驗 獲得超8個贊
假設您想保留最多的maxLen字符,即您的代碼所說的內容,而不是您的字符串所說的內容。
如果你不需要原來的 myString,你可以像這樣覆蓋它:
const maxLen = 100
func main() {
myString := "This string might be longer, so we'll keep the first 100 bytes."
if len(myString) >= maxLen {
myString = myString[:maxLen] // slicing is a constant time operation in go
}
fmt.Println(myString) // Prints the first 100 bytes, or the whole string if shorter
}
這可能會將 unicode 字符減半,最后留下一些垃圾。如果您需要處理多字節 unicode(您可能會這樣做),請嘗試以下操作:
func main() {
myString := "日本語"
mid := maxLen
for len(myString) >= mid && utf8.ValidString(myString[:mid]) == false {
mid++ // add another byte from myString until we have a whole multi-byte character
}
if len(myString) > mid {
myString = myString[:mid]
}
fmt.Println(myString) // Prints the first 100 bytes, or the whole string if shorter
}
或者,如果您可以接受從輸出中刪除最多一個字符,則此版本會更簡潔一些
func main() {
myString := "日本語"
for len(myString) >= maxLen || utf8.ValidString(myString) == false {
myString = myString[:len(myString)-1] // remove a byte
}
fmt.Println(myString) // Prints the first 100 bytes, or the whole string if shorter
}
- 2 回答
- 0 關注
- 246 瀏覽
添加回答
舉報