如何打印结构的 []byte 成员字符串

我有以下结构:


type foo struct {

   number int

   data []byte

}

我想以“漂亮”的方式从结构中打印一个对象。我做什么:


obj := foo{

    number: 1,

    data: []byte("json"),

}

fmt.Printf("Obj: %+v", obj)

我得到什么:


Obj: {number:1 data:[106 115 111 110]}

我想要的是:


Obj: {number:1 data:"json"}

我可以在不实现 Stringer 或使用反射的情况下做到这一点吗?


潇潇雨雨
浏览 92回答 2
2回答

沧海一幻觉

可能实现Stringer会更好,但这里是实现 (slightly)接口fmt的示例:Formatterpackage mainimport (    "fmt")type foo struct {    number int    data   []byte}func (x foo) Format(f fmt.State, c rune) {    var s string    switch c {    case 's', 'v':        if f.Flag('+') {            s = fmt.Sprintf("{number:%d data:%q}", x.number, x.data)        } else {            s = fmt.Sprintf("{%d %q}", x.number, x.data)        }    default:        s = "(bad formatting verb)"    }    f.Write([]byte(s))}func main() {    o1 := foo{number: 1, data: []byte("json")}    o2 := foo{number: 1, data: []byte("\001with\u2038unicode")}    o3 := foo{number: 42, data: nil}    fmt.Printf("o1: %+v\n", o1)    fmt.Printf("o2: %v\n", o2)    fmt.Printf("o3: %#v\n", o3)}对象o3在这里显示丢失了多少:处理好 nil,处理其他格式化动词和标志,等等。(我还没有谈到宽度和精度!)

繁花如伊

(免责声明:我认为仅使用 %q 进行调试打印会更好,但这取决于您的需求。我添加此替代方法只是因为GoStringer接口是一个有趣的技巧)。%q 之外的另一种方法是用实现 GoStringer 接口的类型包装 []byte,这将被调用格式化%#v。假设我们有:type PrintableBuffer []bytefunc (b PrintableBuffer) GoString() string {    return string(b)}现在我们定义结构:type foo struct {    number int    Data   PrintableBuffer}(要使这个技巧起作用,您需要该成员是公开的:/)进而:func main() {    obj := foo{        number: 1,        Data:   PrintableBuffer("json"),    }    fmt.Printf("Obj: %#v", obj)}将打印出:Obj: main.foo{number:1, Data:json}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go