首页 > 解决方案 > 从 Go 中的实例打印结构定义

问题描述

我正在寻找一个允许(漂亮)打印的不是结构实例的内容而是它的结构的库或片段。这是一些代码和预期的输出:

package main

import "fantastic/structpp"

type Foo struct {
    Bar string
    Other int
}

func main() {
    i := Foo{Bar: "This", Other: 1}
    str := structpp.Sprint{i}
    fmt.Println(str)
}

会打印(这个或类似的):

Foo struct {
    Bar string
    Other int
}   

请注意,我知道github.com/davecgh/go-spew/spew但我不想打印数据,我只需要结构的定义。

标签: go

解决方案


像这样的东西会起作用吗?可能需要根据您的特定结构和用例进行一些调整(是否要打印值实际上是结构的接口{}等)

package main

import (
    "fmt"
    "reflect"
)

func printStruct(t interface{}, prefix string) {
    s := reflect.Indirect(reflect.ValueOf(t))
    typeOfT := s.Type()

    for i := 0; i < s.NumField(); i++ {
        f := s.Field(i)

        fmt.Printf("%s%s %s\n", prefix, typeOfT.Field(i).Name, typeOfT.Field(i).Type)
        switch f.Type().Kind() {
        case reflect.Struct, reflect.Ptr:
            fmt.Printf("%s{\n", prefix)
            printStruct(f.Interface(), prefix+"\t")
            fmt.Printf("%s}\n", prefix)

        }
    }
}

然后,对于这个结构:

type C struct {
    D string
}

type T struct {
    A int
    B string
    C *C
    E interface{}
    F map[string]int
}

t := T{
    A: 23,
    B: "hello_world",
    C: &C{
        D: "pointer",
    },
    E: &C{
        D: "interface",
    },
}

你得到:

A int
B string
C *main.C
{
    D string
}
E interface {}
F map[string]int

去游乐场链接: https: //play.golang.org/p/IN8-fCOe0OS


推荐阅读