Help us understand the problem. What is going on with this article?

Goで雑にio.Reader作ろうとしたらハマった

More than 1 year has passed since last update.

io.Reader 便利ですよね

雑に実装するかと思ってこんな感じで実装しました

type T struct {
   Body []byte
}

func (t *T) Read(p []byte) (n int, err error) {
   buffer := bytes.NewBuffer(t.Body)
   return buffer.Read (p)
}

io.Copy を使って os.Stdout にcopyしてみましょう

package main

import (
    "bytes"
    "io"
    "os"
)

type T struct {
    Body []byte `json:"body"`
}

func (t *T) Read(p []byte) (n int, err error) {
    buffer := bytes.NewBuffer(t.Body)
    buffer.WriteT
    return buffer.Read(p)
}

func main() {
    t := &T{Body: []byte("hoge")}

    io.Copy(os.Stdout, t)
}

無限に hoge が出力されて止まらなくなります

何が起きたのか

bytes.Bufferが持っている Read関数が io.EOF を返す条件はBufferが空のときです
空じゃないときは読み込んだ長さとnilを返します

io.Copy関数io.WriteToio.ReaderFrom, *LimitedReaderではないときforループを回して何らかのエラーが出るまで処理します

今回実装した T 構造体はforループに入るパターンだったが EOF を出すことができないのでforループをずっと回ることになってしまった

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away