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 关注
- 209 浏览
添加回答
举报