如何在控制台中打印结构variables?

如何在Golang中打印(在控制台中)该结构的IdTitleName等?

 type Project struct { Id int64 `json:"project_id"` Title string `json:"title"` Name string `json:"name"` Data Data `json:"data"` Commits Commits `json:"commits"` } 

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

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

fmt包 :

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

这假设你有一个项目的实例(在yourProject的项目)

文章JSON和Go将给出更多关于如何从JSON结构中获取值的细节。


这个例子页面提供了另一种技术:

 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)) 

这将打印:

 {"Page":1,"Fruits":["apple","peach","pear"]} 

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

 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()) } 

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

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

用法示例:

 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) } 

输出:

 (main.Project) { Id: (int64) 0, Title: (string) (len=5) "world", Name: (string) (len=5) "hello", Data: (string) "", Commits: (string) "" } 

我认为如果你想要某种struct的格式化输出的话,实现一个自定义的stringer会更好

例如

 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) } 

访问这里查看完整的代码。 在这里你还可以find一个在线terminal的链接,在这里可以运行完整的代码,程序代表如何提取结构的信息(字段的名称,types和值)。 以下是只打印字段名称的程序片段。

 package main import "fmt" import "reflect" func main() { type Book struct { Id int Name string Title string } book := Book{1, "Let us C", "Enjoy programming with practice"} e := reflect.ValueOf(&book).Elem() for i := 0; i < e.NumField(); i++ { fieldName := e.Type().Field(i).Name fmt.Printf("%v\n", fieldName) } } /* Id Name Title */ 
 p = Project{...} fmt.Printf("%+v", p) fmt.Printf("%#v", p) //with type 

也有去渲染 ,它处理指针recursion和大量的string和int映射的关键sorting。

安装:

 go get github.com/luci/go-render/render 

例:

 type customType int type testStruct struct { S string V *map[string]int I interface{} } a := testStruct{ S: "hello", V: &map[string]int{"foo": 0, "bar": 1}, I: customType(42), } fmt.Println("Render test:") fmt.Printf("fmt.Printf: %#v\n", a))) fmt.Printf("render.Render: %s\n", Render(a)) 

打印:

 fmt.Printf: render.testStruct{S:"hello", V:(*map[string]int)(0x600dd065), I:42} render.Render: render.testStruct{S:"hello", V:(*map[string]int){"bar":1, "foo":0}, I:render.customType(42)} 

我想用一个Struc Type的例子推荐Stuct Example GO语言程序。

包主要

import(
 “FMT”
 )

 func main(){
    inputSalary struct {
        基本,HRA,TA float64      
     }

    typesEmployee struct {
        名字,姓氏,电子邮件string
        年龄诠释
         MonthlySalary []薪水
     }

     e:=员工{
        名字:“马克”,
        姓氏:“琼斯”,
        电子邮件:“mark@gmail.com”,
        年龄:25岁,
         MonthlySalary:[]薪水{
            薪水{
                基本:15000.00,
                 HRA:5000.00,
                 TA:2000.00,
             },
            薪水{
                基本:16000.00,
                 HRA:5000.00,
                 TA:2100.00,
             },
            薪水{
                基本:17000.00,
                 HRA:5000.00,
                 TA:2200.00,
             },
         },
     }
     fmt.Println(e.FirstName,e.LastName)
     fmt.Println(e.Age)
     fmt.Println(e.Email)
     fmt.Println(e.MonthlySalary [0])
     fmt.Println(e.MonthlySalary [1])
     fmt.Println(e.MonthlySalary [2])
 }

另一种方法是创build一个叫做toString的func,它需要struct,根据需要设置字段的格式。

 import ( "fmt" ) type T struct { x, y string } func (r T) toString() string { return "Formate as u need :" + rx + ry } func main() { r1 := T{"csa", "ac"} fmt.Println("toStringed : ", r1.toString()) } 

在每个字段之后不使用外部库和新行:

 log.Println( strings.Replace( fmt.Sprintf("%#v", post), ", ", "\n", -1))