登录
首页 >  Golang >  Go问答

字符串迭代的 range 值与索引访问值之间存在的类型差异的原因是什么?

来源:stackoverflow

时间:2024-02-15 13:09:22 310浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《字符串迭代的 range 值与索引访问值之间存在的类型差异的原因是什么?》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

当我迭代字符串来访问符文时,我有两个选择:

s := "AB"
range i, v := range s {
    // access the copy of the rune via value
    fmt.Printf("%T", v) // prints int32
    // access the rune via its index directly trough s
    fmt.Printf("%T", s[i]) // prints uint8
}

我确实明白 int32 用于 rune 类型,而 uint8 用于 byte 类型。这意味着一次我得到一个符文,另一次我得到一个字节。但为什么呢?

对于上下文:在这种情况下,这不是问题,因为 ascii 字符在 uint8 内有足够的空间,但当有表情符号时,例如空间不足,因此值是错误的。


正确答案


因为它们是做不同事情的不同事物。字符串上的范围会迭代符文,字符串上的索引访问会访问字节,因为字符串存储为 UTF-8,并且无法对中间的给定符文进行恒定时间访问。需要明确的是: s[1] 不是 s 的第二个符文、代码点或字符;这是第二个字节。

如果你想迭代字节,你可以使用 range([]byte(s))。如果你想随机访问符文,你可以使用 []rune(s) (最好转换一次并对其进行多次索引,否则你可能会意外地陷入二次),或者弄清楚如何做你想做的事根据strings包中的函数来完成。

到这里,我们也就讲完了《字符串迭代的 range 值与索引访问值之间存在的类型差异的原因是什么?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>