为什么golang没有子字符串?

为什么 go 没有子字符串函数?


我可以从 javascript 做一些原型设计,这样我至少可以做一些类似的事情:


string.substring(0,7) 

还是我被迫在这里使用我的功能?:


func substring(str string, start int, length int) string {

    return string([]rune(str)[start:length+start])

}


慕姐4208626
浏览 131回答 1
1回答

富国沪深

子字符串在 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 {&nbsp; &nbsp; counter, startIdx := 0, 0&nbsp; &nbsp; for i := range s {&nbsp; &nbsp; &nbsp; &nbsp; if counter == start {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; startIdx = i&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if counter == end {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return s[startIdx:i]&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; counter++&nbsp; &nbsp; }&nbsp; &nbsp; 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界世界世界世界
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go