输出带有os.stdout.write和新行的json



这里是golang的新手。我想简单地将一些json输出到stdout以进行调试。我想我做错了。这是我所拥有的:

type SomeObject struct {
Thing1 string
Thing2 string
Thing3 otherStruct
}
...
someObject = &SomeObject{
Thing1: "hello",
Thing2: "world",
...
}
someObjectLogEntry, err := json.Marshal(someObject)
if err != nil {
fmt.Println("error:", err)
}
os.Stdout.Write(someObjectLogEntry)

当我运行这个程序时,它将json输出为一行,但我的服务也有一个心跳,因此两者重合,并在同一行中输出两个东西,类似于:

{/// All that json content }[GIN] 2022/03/16 - 02:07:16 | 200 | 1.16µs | 127.0.0.1 | GET "/heartbeat"

做我正在做的事情的正确方法是什么(简单地构建一个json对象并输出它(?如果我执行fmt.println,它将打印出字节码。谢谢

您需要在JSON之后输出换行符或换行符(n(。最简单的方法可能是使用fmt.Printf,例如(操场(

type SomeObject struct {
Thing1 string
Thing2 string
}
someObject := &SomeObject{
Thing1: "hello",
Thing2: "world",
}
someObjectLogEntry, err := json.Marshal(someObject)
if err != nil {
fmt.Println("error:", err)
}
fmt.Printf("%sn", someObjectLogEntry)
os.Stdout.Write([]byte("something elsen"))

在使用fmt包中的Printf函数时,实现这一点的典型方法是在格式字符串中包含换行符n。您不一定需要将数据写入标准输出,因为Printf会为您完成这项工作。

另一个选项是使用fmt包中的Println函数,该函数使用默认格式格式化其操作数写入标准输出。在使用Println时,有必要将JSONbytes转换为string。请注意,在使用Println时,总是在操作数之间添加空格,并添加换行符。

在使用fmt.Println时看到单个字节值的原因是,字节切片被打印为字符串或切片的未解释字节——字节切片可以包含任何内容,而不仅仅是可打印字符。另一方面,os.Stdout.Write将字节片写入标准输出,您的终端会正确地渲染它们,因为它们是可打印的字符。

最干净的方法是使用json。编码器到操作系统。标准偏差。

Encoder已经为编写的每条消息添加了一行换行符,并且比使用带有json字节的fmt更高效。

您可以重用json编码器,而不是调用json。然后对每条消息进行某种类型的单独写入。

import (
"os"
"encoding/json"
)
type SomeObject struct {
Thing1 string
Thing2 string
Thing3 otherStruct
}
...
encoder := json.NewEncoder(os.Stdout)
someObject = &SomeObject{
Thing1: "hello",
Thing2: "world",
...
}
if err := encoder.Encode(&someObject); err != nil {
// handle error
}

最新更新