请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

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

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

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


正在回答

1回答

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 回复 有任何疑惑可以回复我~
  • 提问者 aibo #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-08-14 09:43:58
  • 提问者 aibo #2
    非常感谢老师!大致明白了,其实主要问题可能出在从前端脚本语言转过来,这是第一门后端语言。脚本语言应该算是所见即所得,go需要被编译器再编译一遍才能运行,所以没有这个思路。
    “range这个东西在go语言中,是会做很多事情的,并不是简单地把数组或者slice里面的东西给出去。”
    “我们观察到的都是go语言的规定。”;
    非常感谢老师!
    回复 有任何疑惑可以回复我~ 2018-08-14 09:50:18
  • ccmouse 回复 提问者 aibo #3
    很高兴能够帮助到同学理解
    回复 有任何疑惑可以回复我~ 2018-08-19 10:57:40
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信