使用 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,然后将打印出字节码。谢谢!


慕容3067478
浏览 91回答 3
3回答

拉风的咖菲猫

\n您需要在 JSON 之后输出换行符或换行符 ( )。最简单的方法可能是使用fmt.Printfeg ( playground )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("%s\n", someObjectLogEntry)os.Stdout.Write([]byte("something else\n"))

隔江千里

最干净的方法是将 json.Encoder 用于 os.Stdout。json.Encoder 已经为每条写入的消息附加了一个换行符,并且比使用带有 json 字节的 fmt 更有效。您可以重新使用 json 编码器,而不是调用 json.Marshal 然后为每条消息进行某种类型的单独写入。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}

12345678_0001

Printf在使用包中的函数时实现此目的的典型方法是在格式字符串中fmt包含换行符。\n您不一定需要将数据写入标准输出,因为Printf它已经为您完成了。另一种选择是使用包中的Println函数,该函数fmt使用其操作数的默认格式写入标准输出。使用. _ bytes_ 请注意,始终在操作数之间添加空格,并在使用时附加换行符。stringPrintlnPrintln您在使用时看到单个字节值的原因fmt.Println是因为字节切片被打印为字符串或切片的未解释字节——字节切片可以包含任何东西,而不仅仅是可打印的字符。另一方面,os.Stdout.Write将字节切片写入标准输出,您的终端会正确呈现它们,因为它们是可打印字符。
打开App,查看更多内容
随时随地看视频慕课网APP