2016-08-25 3 views
1

입력이 strings.Reader입니다. 입력이 주어지면 id을 추출하여 출력하고 있습니다. 그런 다음 원래 입력을 다른 작업을 수행하는 일반 함수에 전달합니다. 원본을 재사용 할 수있는 유일한 방법은 콘텐츠를 읽고 bytes.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

관련 문제