为了账号安全,请及时绑定邮箱和手机立即绑定

使用 os.stdout.write 和新行输出 json?

使用 os.stdout.write 和新行输出 json?

Go
慕容3067478 2022-11-23 15:26:11

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


查看完整描述

3 回答

?
拉风的咖菲猫

TA贡献1715条经验 获得超2个赞

\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"))


查看完整回答
反对 回复 2022-11-23
?
隔江千里

TA贡献1608条经验 获得超10个赞

最干净的方法是将 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

}


查看完整回答
反对 回复 2022-11-23
?
12345678_0001

TA贡献1511条经验 获得超5个赞

Printf在使用包中的函数时实现此目的的典型方法是在格式字符串中fmt包含换行符。\n您不一定需要将数据写入标准输出,因为Printf它已经为您完成了。

另一种选择是使用包中的Println函数,该函数fmt使用其操作数的默认格式写入标准输出。使用. _ bytes_ 请注意,始终在操作数之间添加空格,并在使用时附加换行符。stringPrintlnPrintln

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


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信