Golang阅读器接口实现,当您已经有字节片缓冲区时

Golang阅读器接口实现,当您已经有字节片缓冲区时,go,io,Go,Io,我正在尝试为一个程序实现一种读写方法,该程序将文件[]字节上传到云端,并从云端下载文件[]字节 到目前为止,我的读取方法陷入了一个无止境的读取循环,只能读取相同的32KiB 我正在使用打开的文件作为输入,以满足io.Copy 我确信我的实现在某种程度上是混乱的 func (s S3File) Read(buffer []byte) (int, error){ if s.mode != "rb"{ fmt.Println("Wrong mode used") } buf, err := s

我正在尝试为一个程序实现一种读写方法,该程序将文件[]字节上传到云端,并从云端下载文件[]字节

到目前为止,我的读取方法陷入了一个无止境的读取循环,只能读取相同的32KiB

我正在使用打开的文件作为输入,以满足
io.Copy

我确信我的实现在某种程度上是混乱的

func (s S3File) Read(buffer []byte) (int, error){
if s.mode != "rb"{
    fmt.Println("Wrong mode used")
}
buf, err := s.DownBufferInfo(s.path)
if err != nil{
    fmt.Println("Error from getting buffer for reader. at `rb` ")
}
allbytes := buf.Bytes()  //BYTES READ FROM A FILE IN THE CLOUD
fmt.Printf("len of bytes from reader --%v", len(allbytes))
/////////////////////////////////////////////////////////
//result := copy(buffer, allbytes)
//n := append(buffer, allbytes...)
////////////////////////////////////////////////////////
fileBytes := bytes.NewBuffer(allbytes)
result, err := fileBytes.Read(buffer)
////////////////////////////////////////////////////////
//fileBytes := bytes.NewReader(allbytes)
//result, err := fileBytes.Read(buffer)
fmt.Printf("len of bytes read to buffer --%v", result)
fmt.Printf("Total buffer len after read --%v", len(buffer))

return result, err
}


编辑:我能够让它工作,答案如下

虽然我的主要动机是能够在我的代码中方便地使用
io.Copy
,但后来我意识到,对于我目前的阅读器来说,这是不必要的,因为它仍然可以正常工作

函数
func-Copy(dst-Writer,src-Reader)(写入int64,err-error)
接受源读卡器和目标读卡器

我的通用阅读器已经为我提供了一片
[]字节。我所需要的只是一个写入程序来接收这些字节

足够方便的是,
dst Writer
实现了Writer接口,如下所示:

type Writer interface {
    Write(p []byte) (n int, err error)
}

我所做的只是:

dst.Write(my_slice_byte)

或者,我重新编写了我的读取实现,但这是不必要的。

因此,我们无法知道程序的其余部分做什么,但看起来您可能正在下载一个文件,并且只反复读取前32K。我不知道你想做什么,但是如果你已经缓冲了文件中的字节,为什么你需要一个读取方法呢?在创建Zip存档时,我需要使用io.Copy。这种方法需要读者和作者。Zip.NewWriter需要一个作家。如果一切都能像葛朗那样顺利的话,那就太好了。无论如何,我很快就能让它工作了。如果你需要一个
io.Reader
[]字节
,这就是
bytes.Reader
的用途,如果你需要通过
io.Writer
获得
[]字节
,你可以使用
bytes.Buffer
。文件在某个时候必须来自
io.Reader
,因此您可以直接使用它。您在这里所做的只是添加越来越多的层,使您从一个简单的解决方案中走得更远。@JimB,请在代码中向我展示您对此的实现。如果你所说的是对的,那么我在上面评论的一个方法应该可以直接工作。尽管如此,我还是能够让它正常工作。事实证明,满足读者界面并不是那么简单。我将很快发布我的答案。当没有人向我展示代码时,我也不理解其中的缺点。