在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实现:
答案
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中被破坏了?