生成request body
package main
import (
"encoding/json"
"fmt"
)
type userInfo struct {
Name string
Age int
Hobby []string
}
func test1() {
a := userInfo{
Name: "wang",
Age: 18,
Hobby: []string{"Golang"},
}
buf, err := json.Marshal(a)
if err != nil {
panic(err)
}
fmt.Println(buf)
fmt.Printf(string(buf))
buf, err = json.MarshalIndent(a, "", "\t")
if err != nil {
panic(err)
}
fmt.Println(string(buf))
var b userInfo
err = json.Unmarshal(buf, &b)
if err != nil {
panic(err)
}
fmt.Printf("%#v\n", b)
}
json.Marshal()
a := userInfo{
Name: "wang",
Age: 18,
Hobby: []string{"Golang"},
}
buf, err := json.Marshal(a)
if err != nil {
panic(err)
}
fmt.Println(buf)
fmt.Printf(string(buf))
json.MarshalIndent()
json.MarshalIndent() 函数是 Go 语言标准库 encoding/json 中提供的一个函数,用于将 Go 语言中的数据结构转换为 JSON 格式的字符串,并且可以通过缩进和分隔符来格式化输出。
json.MarshalIndent() 函数的定义如下:
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)
第一个参数 v 是要序列化为 JSON 格式的对象;
第二个参数 prefix 是每行输出前缀,通常用于缩进;
第三个参数 indent 是用于缩进的字符串。
json.MarshalIndent() 函数返回序列化后的 JSON 字符串和可能出现的错误。
例如,假设我们有以下的结构体类型:
type Person struct {
Name string
Age int
Address string
}
我们可以创建一个该类型的实例并将其转换为 JSON 格式的字符串,代码如下:
p := Person{Name: "Alice", Age: 30, Address: "123 Main St"}
b, err := json.MarshalIndent(p, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
这段代码将会输出下面的 JSON 字符串:
{
"Name": "Alice",
"Age": 30,
"Address": "123 Main St"
}
可以看到,JSON 字符串被使用了两个空格作为缩进符,并且每个字段都单独占据一行,使得输出更加易读。
string
buf, err := json.Marshal(a)
if err != nil {
panic(err)
}
fmt.Println(buf)
fmt.Printf(string(buf))
在这段代码中,json.Marshal(a)返回一个字节数组(byte array),表示JSON编码的结果。
这时候就需要使用string()函数来完成从字节数组到字符串的转换。
string()函数将字节数组解释为UTF-8编码的字符串,并返回该字符串。因此,fmt.Printf(string(buf))语句会打印出buf字节数组所表示的UTF-8编码字符串。
fmt.Printf()
fmt.Printf("%#v\n", b)
fmt.Printf("%v\n", b)
这两个代码的区别在于它们打印结构体时使用的格式化字符串不同。
第一个代码 fmt.Printf("%#v\n", b) 使用 %#v 格式化字符串,它会以 Go 语言的语法格式输出变量 b 的值。例如,如果 b 是一个结构体,那么该代码将输出类似于 main.MyStruct{Field1: "value1", Field2: "value2"} 这样的格式。
第二个代码 fmt.Printf("%v\n", b) 使用 %v 格式化字符串,它会根据变量 b 的实际类型选择合适的默认格式输出值。对于结构体来说,默认格式是按照 {字段1 值1 字段2 值2 ...} 的格式输出。
因此,使用 %#v 可以更全面地输出结构体的值,包括字段名和类型信息,而 %v 会根据变量的实际类型选择默认的格式进行输出。