乐闻世界logo
搜索文章和话题

How to print struct variables in console on golang

7 个月前提问
3 个月前修改
浏览次数110

6个答案

1
2
3
4
5
6

在Go语言中,如果您想在控制台中打印结构体变量,可以使用fmt包中的Println函数或者Printf函数。另外,为了能够更加美观地输出结构体的内容,可以使用%+v这个格式化占位符,它会以字段名和相应的值的形式输出结构体信息。当然,如果你想要完整的控制输出格式,也可能需要实现String()方法来自定义结构体的字符串表示。下面是一个简单的例子:

首先,定义一个结构体:

go
package main import ( "fmt" ) // 定义一个示例结构体 type Person struct { Name string Age int City string }

然后,创建一个结构体实例并打印它:

go
func main() { // 创建一个结构体实例 p := Person{ Name: "Alice", Age: 25, City: "New York", } // 使用 fmt 包打印结构体 // %+v 打印包含字段名和字段值的结构体信息 fmt.Printf("Person: %+v\n", p) // 或者使用 fmt.Println 也可以打印结构体的值,但不包括字段名 fmt.Println("Person:", p) // 如果需要更定制化的输出,可以实现 String 方法 fmt.Println(p.String()) } // 实现 String 方法来自定义 Person 结构体的字符串表示形式 func (p Person) String() string { return fmt.Sprintf("Name: %s, Age: %d, City: %s", p.Name, p.Age, p.City) }

当你运行这段代码时,控制台将输出:

shell
Person: {Name:Alice Age:25 City:New York} Person: {Alice 25 New York} Name: Alice, Age: 25, City: New York

在第一个Printf中,%+v格式化占位符使得结构体的每个字段名和对应的值都被打印出来。而在使用Println时,只有结构体的值被打印,没有字段名。最后,通过实现String()方法,我们有了完全自定义的输出格式。

2024年6月29日 12:07 回复

要打印结构体中字段的名称:

shell
fmt.Printf("%+v\n", yourProject)

fmt包装中:

打印结构时,加号 ( %+v) 添加字段名称

假设您有一个 Project 实例(在“ yourProject”中)

JSON 和 Go一文将提供有关如何从 JSON 结构检索值的更多详细信息。


Go 示例页面提供了另一种技术:

shell
type Response2 struct { Page int `json:"page"` Fruits []string `json:"fruits"` } res2D := &Response2{ Page: 1, Fruits: []string{"apple", "peach", "pear"}} res2B, _ := json.Marshal(res2D) fmt.Println(string(res2B))

那会打印:

shell
{"page":1,"fruits":["apple","peach","pear"]}

如果您没有任何实例,则需要**使用反射**来显示给定结构体的字段名称,如本例所示

shell
type T struct { A int B string } t := T{23, "skidoo"} s := reflect.ValueOf(&t).Elem() typeOfT := s.Type() for i := 0; i < s.NumField(); i++ { f := s.Field(i) fmt.Printf("%d: %s %s = %v\n", i, typeOfT.Field(i).Name, f.Type(), f.Interface()) }
2024年6月29日 12:07 回复

我想推荐go-spew,根据他们的 github “为 Go 数据结构实现一个深度漂亮的打印机以帮助调试”

shell
go get -u github.com/davecgh/go-spew/spew

用法示例:

shell
package main import ( "github.com/davecgh/go-spew/spew" ) type Project struct { Id int64 `json:"project_id"` Title string `json:"title"` Name string `json:"name"` Data string `json:"data"` Commits string `json:"commits"` } func main() { o := Project{Name: "hello", Title: "world"} spew.Dump(o) }

输出:

shell
(main.Project) { Id: (int64) 0, Title: (string) (len=5) "world", Name: (string) (len=5) "hello", Data: (string) "", Commits: (string) "" }
2024年6月29日 12:07 回复

我的 2 美分将是使用json.MarshalIndent- 令人惊讶的是没有建议这样做,因为它是最简单的。例如:

shell
func prettyPrint(i interface{}) string { s, _ := json.MarshalIndent(i, "", "\t") return string(s) }

没有外部依赖,并且会产生格式良好的输出。

2024年6月29日 12:07 回复

我认为如果您想要某种格式的输出,最好实现自定义纵梁struct

例如

shell
package main import "fmt" type Project struct { Id int64 `json:"project_id"` Title string `json:"title"` Name string `json:"name"` } func (p Project) String() string { return fmt.Sprintf("{Id:%d, Title:%s, Name:%s}", p.Id, p.Title, p.Name) } func main() { o := Project{Id: 4, Name: "hello", Title: "world"} fmt.Printf("%+v\n", o) }
2024年6月29日 12:07 回复

或者,尝试使用此功能PrettyPrint()

shell
// print the contents of the obj func PrettyPrint(data interface{}) { var p []byte // var err := error p, err := json.MarshalIndent(data, "", "\t") if err != nil { fmt.Println(err) return } fmt.Printf("%s \n", p) }

为了使用它,除了fmt和之外,您不需要任何其他包encoding/json,只需您创建的结构的引用、指针或文字。

要使用,只需获取您的结构,在 main 或您所在的任何包中初始化它,然后将其传递到PrettyPrint().

shell
type Prefix struct { Network string Mask int } func valueStruct() { // struct as a value var nw Prefix nw.Network = "10.1.1.0" nw.Mask = 24 fmt.Println("### struct as a pointer ###") PrettyPrint(&nw) }

它的输出将是

shell
### struct as a pointer ### { "Network": "10.1.1.0", "Mask": 24 }

尝试一下这里的代码。

2024年6月29日 12:07 回复

你的答案