如何在Go中重用原始strings.Reader?

时间:2016-08-25 20:32:42

标签: go

我输入的类型为strings.Reader。鉴于输入,我从中提取id并将其打印出来。然后,我将原始输入传递给在其上执行其他任务的通用函数。我能想到重用原文的唯一方法是阅读内容并将其传递给bytes.Reader两次。

以下是在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)
}   

1 个答案:

答案 0 :(得分:0)

您可以使用strings.Readerbytes.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)