首页 > 解决方案 > 如何打印结构的 []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 或使用反射的情况下做到这一点吗?

标签: goprintingbyte

解决方案


(免责声明:我认为仅使用 %q 进行调试打印会更好,但这取决于您的需求。我添加此替代方法只是因为GoStringer接口是一个有趣的技巧)。

%q 之外的另一种方法是用实现 GoStringer 接口的类型包装 []byte,这将被调用格式化%#v。假设我们有:

type PrintableBuffer []byte

func (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}

推荐阅读