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

fmt.Println vs os.Stdout.Write

fmt.Println vs os.Stdout.Write

Go
互换的青春 2022-06-27 09:33:21
我有这段代码,我在其中[]byte使用json.Marshal. 打印时,为什么在写入字符串时将fmt.Println()数字写入标准输出。os.Stdout.Write我的问题是如何fmt.Println解析[]byte.package mainimport (        "encoding/json"        "fmt"        "os"    )func main(){    str := "My string"    dat,_:= json.Marshal(str)    fmt.Println(dat)    os.Stdout.Write(dat)}我得到以下输出[34 77 121 32 115 116 114 105 110 103 34]"My string"
查看完整描述

1 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

fmt.Println为字节片生成友好格式。因为字节切片可以包含任何内容(而不仅仅是可打印的字符),它会向您显示各个字节值。根据文档:字节切片打印为:


字符串或切片的未解释字节


另一方面,os.Stdout.Write将字节片写入标准输出。因为它们是可打印的字符,所以您的终端可以正确呈现它们。


用不可打印的字符试一试,fmt.Println' 行为的原因就会变得清晰:


func main() {

    dat := []byte{0, 1, 2, 3, 4}

    fmt.Println(dat)

    os.Stdout.Write(dat)

}

输出:


[0 1 2 3 4]

XXXX // four non-printable character placeholders (based on your terminal)

至于 json,它的输出是一个字节切片,因为这是传递给写入器(网络、磁盘、存储等)的最有用的格式。


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

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