在结构内打印结构图

时间:2020-10-07 23:52:18

标签: go

我有这个Router结构,该结构具有保存指向结构的指针的映射的属性:

type Router struct {
    tree map[string]*node
}

创建路由器:

func New() *Router {
    return &Router{
        make(map[string]*node),
    }
}

节点结构如下:

type node struct {
    path   string
    method string
}

然后我像这样添加key:value对:

func (r *Router) GET(path string) {
    r.tree["GET"] = createNode(path, "GET")
    fmt.Println("GET:r:", r.tree)
}

func createNode(path string, method string) *node {
    return &node{path, "GET"}
}

然后我尝试像这样使用此软件包:

var server = goserve.New()

func main() {
    server.GET("/home")
    fmt.Printf("%+v", server)
}

问题是,当我运行使用此软件包的模块时,我看到的是地址,而不是节点结构中的值,我认为指针应该显示出来。我很困惑,因为New函数返回一个* Router并按照我期望的方式显示,而createNode函数返回* node(也是一个指针)但没有正确显示...我是什么失踪了吗?

结果:

GET:r: map[GET:0xc00000e2e0]
&{tree:map[GET:0xc00000e2e0]}%

请注意,我使用的是两种不同的打印方法,但这两种都不起作用

2 个答案:

答案 0 :(得分:0)

您需要为String()定义一个Router方法。这是为了实现Stringer接口。

例如:

func (r *Router) String() string {
    buf := &bytes.Buffer{}
    buf.WriteString("Router (\n")
    for _, v := range r.tree {
        fmt.Fprintf(buf, "\t%s: %s\n", v.method, v.path)
    }
    buf.WriteString(")")
    return buf.String()
}

可运行的示例:https://play.golang.org/p/qgcUkxrAdyd

请注意,您的路由器存在问题,因为添加多个GET会导致它们被覆盖。

答案 1 :(得分:0)

L Lawliet的答案是正确的,并提供了预期的结果。但是,查看byte包文档会建议您使用strings Builder类型以提高效率。

代码如下:

func (r *Router) String() string {
    b := &strings.Builder{}
    b.WriteString("Router: {\n")
    for _, v := range r.tree {
        fmt.Fprintf(b, "\t%s: %s\n", v.method, v.path)
    }
    b.WriteString("}")
    return b.String()
}

文档可以在这里找到: https://golang.org/pkg/strings/#Builder https://golang.org/pkg/bytes/#Buffer.String

如果我想念这个,请告诉我