【问题标题】:Printing a map of structs within a struct在结构中打印结构映射
【发布时间】:2020-10-07 23:52:18
【问题描述】:

我有这个 Router 结构,它有一个属性,其中包含指向结构的指针映射:

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

创建路由器:

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

节点结构如下所示:

type node struct {
    path   string
    method string
}

然后我像这样添加键:值对:

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]}%

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

【问题讨论】:

    标签: go


    【解决方案1】:

    您需要为您的Router 定义一个String() 方法。这是为了实现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

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

    【讨论】:

    • 现在试试。我在发布后立即修复了另一个问题,感谢您指出!
    • fmt 包调用String 方法。从我发布的链接中:“fmt 包(和许多其他包)寻找这个接口来打印值。”您不会将 String 方法添加到 node 类型的唯一原因是因为 fmt 不会将其称为深度 1。
    • 所以如果我理解正确的话,fmt 包在底层会寻找一个String 方法,它定义了它应该如何打印一些东西。在我的情况下,它不存在,所以它采用默认值,即内存地址。现在它有了它,它知道该怎么做,将它写入缓冲区并将该缓冲区作为字符串返回?
    【解决方案2】:

    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

    如果我理解错了,请告诉我

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 2013-08-07
      • 2015-07-02
      • 2014-10-03
      • 1970-01-01
      相关资源
      最近更新 更多