在golang的io.read实现中状态是否被破坏?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在golang的io.read实现中状态是否被破坏?相关的知识,希望对你有一定的参考价值。

golang中的基本接口之一是io.Reader接口。界面如下:

type Reader interface 
  Read(p []byte) (n int, err error)

Read方法的目的是读取传递的字节片,直到它不再能够读取字节片为止。通常用io.EOF表示。

[我为实现实现Read方法的基本的“ stringreader”感到不安。

我的实现如下:

type stringreader struct 
   payload string


func (sr *stringreader) Read(p []byte) (n int, err error) 
   if len(p) == 0 
      return 0, io.EOF
   
   //Copy over the bytes to the payload
   n = copy(p, sr.payload)
   sr.payload = sr.payload[n:] //This is where I am confused
   return

我感到困惑的是我重新分配字符串片段(sr.payload = sr.payload[n:])的部分。这不是在Read方法的调用者有机会使用读取的字节之前破坏读取器的基础状态吗?如果有人可以引导我了解这里的流程原理,那将很棒。

顺便说一句,我对实现的灵感来自以下的Read实现:

https://golang.org/src/strings/reader.go?s=3567:3599#L38

答案
type slice struct array unsafe.Pointer len int cap int

src/runtime/string.go

type stringStruct struct 
    str unsafe.Pointer
    len int

Read(p []byte) (n int, err error)

type stringreader struct 
   payload string


p是切片描述符:数组指针,长度,容量。当有活动指针时,垃圾收集器将保留基础数组。 payload是一个单独的,不同的字符串描述符:数组指针,长度。覆盖payload字符串描述符将使p切片描述符保持不变。

以上是关于在golang的io.read实现中状态是否被破坏?的主要内容,如果未能解决你的问题,请参考以下文章

“sed”中的range-operator实际上做了什么,是否在GNU / busybox中被破坏了?

持有C ++引用是否可以防止变量被破坏?

破坏者:日记示例

枚举实现单例避免被反射破坏的原因

是否有一种简单的方法来检查 Ruby IO 实例是否会在 read() 上阻塞?

并发线程安全性