如何在控制台中打印结构variables?
如何在Golang中打印(在控制台中)该结构的Id
, Title
, Name
等?
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))