亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何打印結構的 []byte 成員字符串

如何打印結構的 []byte 成員字符串

Go
瀟瀟雨雨 2022-05-10 13:32:41
我有以下結構: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 或使用反射的情況下做到這一點嗎?
查看完整描述

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>


查看完整回答
反對 回復 2022-05-10
?
繁花如伊

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}


查看完整回答
反對 回復 2022-05-10
  • 2 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號