打印golang结构时如何忽略String()方法?

时间:2018-01-28 21:15:04

标签: debugging go

我有一个golang结构,并创建了一个String()方法,用于程序的正常操作。我现在想要查看结构的全部内容。我尝试了通常的%+v格式,但它似乎使用String()方法而不是向我显示所有字段。如何输出原始结构数据?

示例:https://play.golang.org/p/SxTVOtwVV-9

package main

import (
    "fmt"
)

type Foo struct {
    Jekyl string
    Hyde  string
}

func (foo Foo) String() string {
    return foo.Jekyl // how I want it to show in the rest of the program
}

func main() {
    bar := Foo{Jekyl: "good", Hyde: "evil"}
    fmt.Printf("%+v", bar) // debugging to see what's going on, can't see the evil side
}

输出

good

但我想看看你没有实现String()方法得到的东西

{Jekyl:good Hyde:evil}

3 个答案:

答案 0 :(得分:9)

使用%#v格式

fmt.Printf("%#v", bar)

输出:

main.Foo{Jekyl:"good", Hyde:"evil"}

ref https://stackoverflow.com/a/26116578/10245

https://play.golang.org/p/YWIf6zGU-En

答案 1 :(得分:1)

虽然您的答案是正确的,但通常的做法是使用其他类型去除结构的所有方法并使用其他方法(通常用于编组/解组)。

如果某个类型定义为type stripped Foo,则不再使用方法Foo.String()

代码:https://play.golang.org/p/Ba2VvLAm92a

输出:{Jekyl:good Hyde:evil}

答案 2 :(得分:0)

  

为任何对象打印完整键值对的另一种方法是这样的:

 package main

import (
    "encoding/json"
    "fmt"
)

type Foo struct {
    Jekyl string
    Hyde  string
}

func main() {
    bar := Foo{Jekyl: "good", Hyde: "evil"}
    b, err := json.Marshal(bar)
    if err != nil {
        fmt.Println("error marshaling object")
        return
    }
    fmt.Println("bar data : ", string(b))
}
  

输出:

 bar data :  {"Jekyl":"good","Hyde":"evil"}
  

去游乐场参考:https://play.golang.org/p/VJZNmpC_wNJ