2016-08-25 4 views
1

入力はstrings.Readerです。入力があれば、私はそれからidを抽出して印刷しています。次に、元の入力を他のタスクを実行する汎用関数に渡します。私がオリジナルを再利用すると考えることができる唯一の方法は、コンテンツを読んでそれをbytes.Readerに2回渡すことです。元のstrings.ReaderをGoに再利用するにはどうすればよいですか?

Goでこれを達成する唯一の方法は次のとおりですか?

package main 

import (
    "bytes" 
    "encoding/json" 
    "fmt" 
    "io" 
    "io/ioutil" 
    "log" 
    "strings" 
) 

type Food struct { 
    Id int `json:"id"` 
    Name string `json:"name"` 
} 

func genericFunction(body io.Reader) { 
    content, err := ioutil.ReadAll(body) 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Println(string(content)) 
} 

func main() { 
    // Original input 
    reader := strings.NewReader("{\"id\": 10, \"name\": \"Pie\"}") 

    original, err := ioutil.ReadAll(reader) 
    if err != nil { 
     log.Fatal(err) 
    } 

    foodReader := bytes.NewReader(original) 
    decoder := json.NewDecoder(foodReader) 
    var food Food 
    decoder.Decode(&food) 
    fmt.Println("About to eat food", food.Id) 

    foodReader = bytes.NewReader(original) 
    genericFunction(foodReader) 
} 

答えて

0

あなたはバックstrings.Readerまたはbytes.Reader

reader := bytes.NewReader([]byte("{\"id\": 10, \"name\": \"Pie\"}")) 

decoder := json.NewDecoder(reader) 
var food Food 
decoder.Decode(&food) 
fmt.Println("About to eat food", food.Id) 

reader.Seek(0, 0) 
genericFunction(reader) 
+1

strings.Readerも同様であるいずれかの文字列の先頭に求めることができます。 'var _ io.Seeker =(* strings.Reader)(nil)// ok' – Darigaaz

関連する問題