2 回答

TA貢獻1824條經驗 獲得超5個贊
可能實現Stringer會更好,但這里是實現 (slightly)接口fmt的示例:Formatter
package main
import (
"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,處理其他格式化動詞和標志,等等。(我還沒有談到寬度和精度?。?/p>

TA貢獻2012條經驗 獲得超12個贊
(免責聲明:我認為僅使用 %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}
- 2 回答
- 0 關注
- 122 瀏覽
添加回答
舉報