1 回答
TA贡献1790条经验 获得超9个赞
子字符串在 Go 中也是一个“东西”:将 astring结果切片为string与原始string.
不同之处在于,在 Go 中,索引是字节索引,而不是字符或符文索引。Go 将 UTF-8 编码的文本字节序列存储在string.
如果您的输入仅包含 ASCII 字符(字节值小于 128),则使用字节索引与使用符文索引相同:
s := "abcdef"
fmt.Println(s[1:3])
这将输出:
bc
如果您的输入可能包含多字节 unicode 字符,那么您必须对字符串的 (UTF-8) 字节进行解码。为此,有标准unicode/utf8包,或者你可以使用for rangeover stringwhich 做同样的事情。
字符串上的for range对字节进行解码,每次迭代“产生”一个rune,string并且还返回 的起始字节位置rune。
这就是我们可以使用它来构造substr()函数的方式:
func substr(s string, start, end int) string {
counter, startIdx := 0, 0
for i := range s {
if counter == start {
startIdx = i
}
if counter == end {
return s[startIdx:i]
}
counter++
}
return s[startIdx:]
}
substr()接受一个字符串和一个start(包括)和end(不包括)符文索引,并根据它返回一个子字符串。start <= end为简洁起见,省略了检查(如)。
测试它:
s := "abcdef"
fmt.Println(substr(s, 1, 3))
s = "世界世界世界"
fmt.Println(substr(s, 1, 3))
fmt.Println(substr(s, 1, 100))
输出(在Go Playground上试试):
bc
界世
界世界世界
- 1 回答
- 0 关注
- 130 浏览
添加回答
举报