当前位置: 首页 > 知识库问答 >
问题:

从Go中的实例打印结构定义

蓝泰平
2023-03-14

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

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,但我不想漂亮地打印数据,我只需要结构的定义。

共有2个答案

姚俊材
2023-03-14

除了使用反射,我看不到其他选择

func Sprint(v interface{}) string {

    t := reflect.Indirect(reflect.ValueOf(v)).Type()

    fieldFmt := ""

    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)
        fieldFmt += "\t" + field.Name + " " + field.Type.Name() + "\n"
    }

    return "type " + t.Name() + " struct {\n" + fieldFmt + "}"
}

请注意,这个函数没有验证/检查,可能会对非结构输入感到恐慌。

编辑:去游乐场:https://play.golang.org/p/5RiAt86Wj9F

其输出:

type Foo struct {
    Bar string
    Other int
}
太叔炎彬
2023-03-14

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

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

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

 类似资料:
  • 本文向大家介绍pytorch打印网络结构的实例,包括了pytorch打印网络结构的实例的使用技巧和注意事项,需要的朋友参考一下 最简单的方法当然可以直接print(net),但是这样网络比较复杂的时候效果不太好,看着比较乱;以前使用caffe的时候有一个网站可以在线生成网络框图,tensorflow可以用tensor board,keras中可以用model.summary()、或者plot_mo

  • 问题内容: 我是新手,我想在其中打印struct变量的地址,这是我的程序 这个的输出 但是我想打印r变量的地址,因为我知道’&’代表地址,’*’指向指针位置的值,但是在这里我无法打印r的地址,我正在使用go-的在线编辑器lang https://play.golang.org/ 同样,我想将此地址存储在某个变量中。 问题答案: 当您使用来打印值时,将使用默认格式。引用以下文件的doc : %v的默

  • 主要内容:基本的实例化形式,创建指针类型的结构体,取结构体的地址实例化结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存,因此必须在定义结构体并实例化后才能使用结构体的字段。 实例化就是根据结构体定义的格式创建一份与格式一致的内存区域,结构体实例与实例间的内存是完全独立的。 Go语言可以通过多种方式实例化结构体,根据实际需要可以选用不同的写法。 基本的实例化形式 结构体本身是一种类型,可以像整型、字符串等类型一样,以 var 的方式声明结构

  • 本文向大家介绍javaScript 连接打印机,打印小票的实例,包括了javaScript 连接打印机,打印小票的实例的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇javaScript 连接打印机,打印小票的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 我有一个小的Go工具,该工具基本上允许用户定义一个命令,该命令将使用来运行。 我的问题是我想向用户显示命令的输出(stdout / stderr)。 一个示例可能看起来像这样:用户定义一个命令,最后是。 test.sh的 内容: 在我当前的实现中,用户仅在完成完整命令后才能看到输出。在上面的示例中,用户直到命令和第二次完成才看到输出 Start 。 我目前正在检索命令的输出,如下所示:

  • 问题内容: 我正在看Go,它看起来很有前途。我试图弄清楚如何获得go结构的大小,例如 我当然知道它是24字节,但是我想以编程方式知道它。 您对如何执行此操作有任何想法吗? 问题答案: 注意: OP错误。unsafe.Sizeof确实在示例Coord3d结构上返回24。请参阅下面的评论。