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

11
我有一个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个回答

16

3

尽管您的答案是正确的,但通常使用另一种类型来剥离结构体的所有方法并使用其他方法(这通常用于编组/解组)。

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

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

输出:{Jekyl:good Hyde:evil}


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"}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接