fmt.Println 与 os.Stdout.Write

Ibn*_*aid 0 go

我有这段代码,我[]byte使用json.Marshal. 打印时,为什么fmt.Println()os.Stdout.Write写入字符串时将数字写入标准输出。

我的问题是如何fmt.Println解析[]byte.

package main

import (
        "encoding/json"
        "fmt"
        "os"
    )

func main(){
    str := "My string"
    dat,_:= json.Marshal(str)
    fmt.Println(dat)
    os.Stdout.Write(dat)
}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出

[34 77 121 32 115 116 114 105 110 103 34]
"My string"
Run Code Online (Sandbox Code Playgroud)

Mar*_*arc 6

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

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

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

尝试使用不可打印的字符,fmt.Println的行为原因将变得清晰:

func main() {
    dat := []byte{0, 1, 2, 3, 4}
    fmt.Println(dat)
    os.Stdout.Write(dat)
}
Run Code Online (Sandbox Code Playgroud)

输出:

[0 1 2 3 4]
XXXX // four non-printable character placeholders (based on your terminal)
Run Code Online (Sandbox Code Playgroud)

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