gpt4 book ai didi

string - 字符串范围和 rune slice 范围之间有什么区别吗?

转载 作者:IT王子 更新时间:2023-10-29 02:25:13 26 4
gpt4 key购买 nike

遍历字符串

func main() {
str := "123456"
for _, s := range str {
fmt.Printf("type of v: %s, value: %v, string v: %s \n", reflect.TypeOf(s), s, string(s))
}
}

https://play.golang.org/p/I1JCUJnN41h

并覆盖 rune slice ([]rune(str))

func main() {
str := "123456"
for _, s := range []rune(str) {
fmt.Printf("type : %s, value: %v ,string : %s\n", reflect.TypeOf(s), s, string(s))
}
}

https://play.golang.org/p/rJvyHH6lkl_t

我得到了相同的结果,它们是否相同?

最佳答案

是的,有区别。给定

for i, c := range v {

c 无论 v 是字符串还是 rune slice 都是一样的,但是如果字符串包含多字节字符,i 会有所不同。

字符串索引

字符串是字节序列,索引适用于一段字节。除非您有意读取或操作字节而不是代码点或字符,或者确定您的输入不包含多字节字符,否则在您倾向于索引字符串的任何地方都应该使用 rune slice 。

范围循环很特别

for i, c := range str {

字符串上的范围循环很特殊。 range 不是将字符串简单地视为 byte slice 段,而是将字符串部分视为 byte slice 段,部分视为 rune 片段。

i 将是代码点开头的字节索引。 c 将是一个可以包含多个字节的 rune 。这意味着 i 可以在迭代中增加不止一个,因为先前的代码点是一个多字节字符。

Besides the axiomatic detail that Go source code is UTF-8, there's really only one way that Go treats UTF-8 specially, and that is when using a for range loop on a string. We've seen what happens with a regular for loop. A for range loop, by contrast, decodes one UTF-8-encoded rune on each iteration. Each time around the loop, the index of the loop is the starting position of the current rune, measured in bytes, and the code point is its value.

更多请看官方Go Blog post 以上内容摘自:Strings, bytes, runes and characters in Go

关于string - 字符串范围和 rune slice 范围之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49062100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com