在Go中打印结构变量的方法

2,426 阅读1分钟

标准 fmt.Print()不打印Go结构的变量名,但这并不意味着你不能这样做。要在Go中打印结构变量,可以使用以下方法:

  • 使用 fmt.Printf()与格式 "动词" %+v%#v.
  • 将结构体转换为JSON并打印输出。
  • 使用外部包来漂亮地打印结构,例如。 go-spew.

请看下面的例子,比较一下这三个选项。

package main
import (
"encoding/json"
"fmt"
"log"
"github.com/davecgh/go-spew/spew"
)
type Fruit struct {
Name string
color string
Similar *Fruit
}
func main() {
strawberry := Fruit{
Name: "strawberry",
color: "red",
Similar: nil,
}
raspberry := Fruit{
Name: "raspberry",
color: "pink",
Similar: &strawberry,
}
// fmt.Printf with format verbs
fmt.Printf("fmt.Printf with format verbs\n")
fmt.Printf("%+v\n%#v\n", raspberry, raspberry)
// json encoding
fmt.Printf("---\njson encoding\n")
jsonData, err := json.Marshal(&raspberry)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(jsonData))
// go-spew
fmt.Printf("---\ngo-spew\n")
spew.Dump(raspberry)
}

输出

fmt.Printf with format verbs
{Name:raspberry color:pink Similar:0xc000070390}
main.Fruit{Name:"raspberry", color:"pink", Similar:(*main.Fruit)(0xc000070390)}
---
json encoding
{"Name":"raspberry","Similar":{"Name":"strawberry","Similar":null}}
---
go-spew
(main.Fruit) {
Name: (string) (len=9) "raspberry",
color: (string) (len=4) "pink",
Similar: (*main.Fruit)(0xc000070390)({
Name: (string) (len=10) "strawberry",
color: (string) (len=3) "red",
Similar: (*main.Fruit)(<nil>)
})
}

注意不同之处:

  • fmt.Printf()只打印字段值,在指针的情况下,它是它指向的变量的内存地址。
  • 编码为JSON需要导出所有结构字段(第一个字母大写)。否则,未导出的字段(如color )将不会出现在生成的JSON中。
  • go-spew可以打印结构的详细信息,但它是一个需要导入的外部依赖。

根据你的使用情况,你应该选择最适合你的方法。