图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