我正在尝试学习Golang,在这样做的同时,我写了下面的代码(更大的自我学习项目的一部分),并从陌生人那里获得了代码审查,其中一条评论是,">你可以直接将其编组到标准输出,而不是编组到堆,然后转换为字符串,然后将其流式传输到标准输出">
我已经阅读了encoding/json
包和io
包的文档,但无法拼凑出所需的更改。
任何指示或帮助将是伟大的。
// Marshal the struct with proper tab indent so it can be readable
b, err := json.MarshalIndent(res, "", " ")
if err != nil {
log.Fatal(errors.Wrap(err, "error marshaling response data"))
}
// Print the output to the stdout
fmt.Fprint(os.Stdout, string(b))
编辑
我在文档中发现了下面的代码示例:
var out bytes.Buffer
json.Indent(&out, b, "=", "t")
out.WriteTo(os.Stdout)
但是在写stdout
之前,它还是先写堆。不过,它确实省去了将其转换为字符串的一个步骤。
创建并使用指向os.Stdout
的json.Encoder
。json.NewEncoder()
接受任何io.Writer
作为目的地。
res := map[string]interface{}{
"one": 1,
"two": "twotwo",
}
if err := json.NewEncoder(os.Stdout).Encode(res); err != nil {
panic(err)
}
这将输出(直接到Stdout):
{"one":1,"two":"twotwo"}
如果你想设置缩进,使用它的Encoder.SetIndent()
方法:
enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
if err := enc.Encode(res); err != nil {
panic(err)
}
这将输出:
{
"one": 1,
"two": "twotwo"
}
试试Go Playground上的例子。