为了账号安全,请及时绑定邮箱和手机立即绑定

为什么golang没有子字符串?

为什么golang没有子字符串?

Go
慕姐4208626 2022-06-01 11:11:29
为什么 go 没有子字符串函数?我可以从 javascript 做一些原型设计,这样我至少可以做一些类似的事情:string.substring(0,7) 还是我被迫在这里使用我的功能?:func substring(str string, start int, length int) string {    return string([]rune(str)[start:length+start])}
查看完整描述

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

界世

界世界世界


查看完整回答
反对 回复 2022-06-01
  • 1 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信