Answers:
要在结构中打印字段名称:
fmt.Printf("%+v\n", yourProject)
从fmt
包装中:
打印结构时,加号(
%+v
)添加字段名称
假设您有一个Project实例(位于“ 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"]}
如果没有任何实例,则需要使用反射来显示给定结构的字段名称,如本例所示。
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数据结构实现一个深层漂亮的打印机以帮助调试”
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) ""
}
我的2美分将被使用json.MarshalIndent
-不建议这样做,因为这是最简单的方法。例如:
func prettyPrint(i interface{}) string {
s, _ := json.MarshalIndent(i, "", "\t")
return string(s)
}
没有外部部门,并且可以很好地格式化输出。
"\t"
," "
则可以替换为
我认为,如果您想要某种格式的输出,最好实现自定义字符串 struct
例如
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)
}
p = Project{...}
fmt.Printf("%+v", p)
fmt.Printf("%#v", p) //with type
fmt.Printf(%#v, p)
,让我感到和@cokebol main.struct
有struct type
什么区别"%#v"
"%+v"
或者,尝试使用此功能 PrettyPrint()
// 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()
。
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)
}
它的输出是
### struct as a pointer ###
{
"Network": "10.1.1.0",
"Mask": 24
}
在这里播放代码。
我喜欢垃圾。
从他们的自述文件:
type Person struct {
Name string
Age int
Parent *Person
}
litter.Dump(Person{
Name: "Bob",
Age: 20,
Parent: &Person{
Name: "Jane",
Age: 50,
},
})
Sdump
在测试中非常方便:
func TestSearch(t *testing.T) {
result := DoSearch()
actual := litterOpts.Sdump(result)
expected, err := ioutil.ReadFile("testdata.txt")
if err != nil {
// First run, write test data since it doesn't exist
if !os.IsNotExist(err) {
t.Error(err)
}
ioutil.Write("testdata.txt", actual, 0644)
actual = expected
}
if expected != actual {
t.Errorf("Expected %s, got %s", expected, actual)
}
}
我建议使用Pretty Printer Library。这样您就可以很容易地打印任何结构。
要么
go get github.com/kr/pretty
现在在您的代码中这样做
package main
import (
fmt
github.com/kr/pretty
)
func main(){
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", pretty.Formatter(Project)) //It will print all struct details
fmt.Printf("%# v", pretty.Formatter(Project.Id)) //It will print component one by one.
}
此外,您还可以通过该库获得组件之间的区别,等等。您也可以在这里查看图书馆文档。
pretty.Formatter
如果您具有更复杂的结构,则可能需要在打印之前转换为JSON:
// Convert structs to JSON.
data, err := json.Marshal(myComplexStruct)
fmt.Printf("%s\n", data)
请访问此处以查看完整的代码。在这里,您还将找到一个在线终端的链接,可以在该终端上运行完整的代码,该程序表示如何提取结构的信息(字段名称及其类型和值)。下面是仅显示字段名称的程序片段。
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
*/
还有go-render,它处理指针递归以及对字符串和int映射的许多键排序。
安装:
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)}
fmt.Printf("%+v\n", project)
这是打印细节的基本方法
另一种方法是,创建一个称为toString
struct 的func ,并根据需要设置字段的格式。
import (
"fmt"
)
type T struct {
x, y string
}
func (r T) toString() string {
return "Formate as u need :" + r.x + r.y
}
func main() {
r1 := T{"csa", "ac"}
fmt.Println("toStringed : ", r1.toString())
}
Stringer
接口。它看起来像这样: func (t T) String() string { return fmt.Sprintf("SomeT{TID: %d, TField: %d, SomeTField: %s, SomeAnotherField: %s}", t.ID, t.Field, t.SomeTField, t.SomeAnotherField) }
在不使用外部库的情况下,在每个字段之后添加换行符:
log.Println(
strings.Replace(
fmt.Sprintf("%#v", post), ", ", "\n", -1))
type Response struct {
UserId int `json:"userId"`
Id int `json:"id"`
Title string `json:"title"`
Body string `json:"body"`
}
func PostsGet() gin.HandlerFunc {
return func(c *gin.Context) {
xs, err := http.Get("https://jsonplaceholder.typicode.com/posts")
if err != nil {
log.Println("The HTTP request failed with error: ", err)
}
data, _ := ioutil.ReadAll(xs`enter code here`.Body)
// this will print the struct in console
fmt.Println(string(data))
// this is to send as response for the API
bytes := []byte(string(data))
var res []Response
json.Unmarshal(bytes, &res)
c.JSON(http.StatusOK, res)
}
}
非常简单,我没有数据和提交的结构,所以我更改了
package main
import (
"fmt"
)
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() {
p := Project{
1,
"First",
"Ankit",
"your data",
"Commit message",
}
fmt.Println(p)
}
要学习,您可以从这里获取帮助:https : //gobyexample.com/structs
也许这不应应用于生产请求,但是如果您处于调试模式,建议您采用以下方法。
marshalledText, _ := json.MarshalIndent(inputStruct, "", " ")
fmt.Println(string(marshalledText))
这导致以增强的可读性将数据格式化为json格式。
这些软件包中的大多数都依靠反射软件包来使这种事情成为可能。
fmt.Sprintf()使用的是标准库的-> func(p * pp)printArg(arg interface {},动词符文)
转到第638行-> https://golang.org/src/fmt/print.go
反射:
https://golang.org/pkg/reflect/
示例代码:
https://github.com/donutloop/toolkit/blob/master/debugutil/prettysprint.go
fmt.Println("%+v", structure variable)
更好的方法是在名为“ commons”(也许)的包中为字符串“%+ v”创建一个全局常量,并在代码中的任何地方使用它
//In commons package
const STRUCTURE_DATA_FMT = "%+v"
//In your code everywhere
fmt.Println(commons.STRUCTURE_DATA_FMT, structure variable)
Println
函数不接受格式字符串参数。您说全局常数更好,但是还没有理由为什么它比标记答案好。您已经为众所周知的格式字符串创建了非标准标签。标签更长,更难记,任何在您的代码上工作的人都不会使用它。它同时使用ALL_CAPS和下划线,每个golang短毛猫都会抱怨。约定为mixedCaps
golang.org/doc/effective_go.html#mixed-caps最好删除此答案。
fmt.Println
。