Kil*_*tel 0 string substring go
为什么没有子串函数?
我可以做一些类似 javascript 原型设计的事情,所以我至少可以做一些类似的事情:
string.substring(0,7)
Run Code Online (Sandbox Code Playgroud)
还是我被迫在这里使用我的功能?:
func substring(str string, start int, length int) string {
return string([]rune(str)[start:length+start])
}
Run Code Online (Sandbox Code Playgroud)
子字符串在 Go 中也是一个“东西”:将string结果切片到string与原始string.
不同之处在于 Go 中的索引是字节索引,而不是字符或符文索引。Go 将 UTF-8 编码的文本字节序列存储在string.
如果您的输入仅包含 ASCII 字符(字节值小于 128),则使用字节索引与使用符文索引相同:
s := "abcdef"
fmt.Println(s[1:3])
Run Code Online (Sandbox Code Playgroud)
这将输出:
bc
Run Code Online (Sandbox Code Playgroud)
如果您的输入可能包含多字节 unicode 字符,则您必须解码字符串的 (UTF-8) 字节。为此,有标准unicode/utf8包,或者您可以使用for rangeoverstring做同样的事情。
所述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:]
}
Run Code Online (Sandbox Code Playgroud)
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))
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上试试):
bc
??
?????
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1912 次 |
| 最近记录: |