为什么golang没有子字符串?

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)

icz*_*cza 5

子字符串在 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过串解码字节,并且每个迭代“产率”一runestring,并且还返回的起始字节位置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)