golang中io操作与其中读写指针移动的体现

图1


图2


从图1和图2的对比中可以 看到,图2少了第15行的读取操作,然后图2代码运行的结果,就是全部的hello worldABCDEFG,图1的代码就只有从read之后算起的ABCDEFG。

原因是什么呢?

读写指针在其中作怪!每次的读写操作都是从指针位置开始的。

图1中,第一次read之后,读写指针已经跑到hello word这个地方了,不是在0处,所以第二次read的结果是从这个非零指针之后开始往后读的,所以结果就只有后面的ABCDEFG。

图2中,刚开始没有进行read操作,所以读写指针一直保持在零处,所以下一次read是从零处开始读取的。结果为全部的hello worldABCDEFG。


图3

从图3可以看到,用buf.string()这种方式可以看到并没有进行读指针的移动。


图4

从图4可以看到,第一次打印出是hello world而不是hello worldhello world,是因为有一次read操作。读指针被移动了。

第二次打印出hello worldhello world是因为又写了一次。说明wtire写操作不移动指针,read读操作才移动指针。


图5

从图5的ReadByte()和UnreadByte()操作,更能清晰的看到读写指针的移动。


图6

从图6中可以看到,一次UnreadByte操作相当于一次ReadByte的撤销操作,其实是读写指针的回滚,但是不能回滚两次,即UnreadByte操作的上一个必须是ReadByte,否则报错,从err里面可以看到。


图7

seek操作是专门来移动读写指针的。从图7可以看到CopyN操作会移动指针,经过r.Seek(0,0)操作后,读写指针返回到零点了。所以第三次打印出来,是Hello

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容