for i, ch := range s {fmt.Printf("(%d %X)", i, ch)} 。的执行问题

来源:3-6 字符和字符串处理

aibo

2018-08-13

老师您好,前面几天弄公司的事,才弄完回来接着看,进度耽误了些~;其实上个问题还是有些没明白,就想再问一下~

主要不明白的是在for循环中,声明了变量ch,它是一个rune,我们遍历的难道不应该也是这个rune吗;老师您说在原字符串中中文是utf8编码(3字节)然后会有一个解码的过程,转unicode存在rune中,最后补0;这个我应该是get到了;

可还是不太明白会什么声明的ch的变量类型是rune,在遍历这个ch(rune)的时候它是3字节啊,(难道不应该是顺序执行的吗...思路有点转不过来啊......);还是说它在遍历的时候虽然是rune类型,却在实际的内存中因为还没有转unicode和补0,所以实际是开了对应utf8编码的3字节呢~

怕问得多了些,只是想搞明白到底怎么回事~非常感谢老师!


写回答

1回答

ccmouse

2018-08-13

range这个东西在go语言中,是会做很多事情的,并不是简单地把数组或者slice里面的东西给出去。

for i, ch := range s

这里我们i, ch是什么东西,什么值,具体什么行为,每一门语言的设计者都是可以对他们作出规定的。我们观察到的都是go语言的规定。

ch就是规定它是rune类型,i是它在字符串s中的偏移字节数,而ch的值是从i开始的这个utf-8字符,我们的例子里看到可能是一字节,也可能是三字节,进行编码转换转成unicode,并且在其之前补0而成。

上面这些就是go语言设计者对range s的规定,他规定成怎样都行,但是他选择了这样的一种方式来规定。那对于具体实现,编译器看到range,后面当然可以做很多事情,进行编码转换之后,把unicode的结果写到ch里面去。

1
4
aibo
回复
ccmouse
谢谢老师,荒废挺久蛮惭愧的,回来学习了
2018-10-16
共4条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1908 问题

查看课程