1 回答

TA貢獻1873條經驗 獲得超9個贊
io.Writer并且json.Encoder不暴露也不維護寫入的字節數。
一種方法是首先將使用的值編組為我們可以使用內置函數獲得其長度json.Marshal()的值。您尋找的位數是長度乘以 8(1 字節為 8 位)。之后,您必須手動將字節切片寫入輸出。對于小型類型,這不是問題,但對于大型結構/值可能是不可取的。還有不必要的工作來編組它,獲取它的長度并手動編寫切片。[]bytelen()
一種更好、更優雅的方法是擴展任何編寫器的功能以管理寫入的字節,使用嵌入:
type CounterWr struct {
io.Writer
Count int
}
func (cw *CounterWr) Write(p []byte) (n int, err error) {
n, err = cw.Writer.Write(p)
cw.Count += n
return
}
此CounterWr類型自動管理其Count字段中的寫入字節數,您可以隨時檢查/檢查。
現在您創建一個我們CounterWr傳遞的值io.Writer,您當前使用的,然后將此CounterWr值傳遞給json.NewEncoder(),您可以CounterWr.Count直接訪問寫入字節數。
示例用法:
type Something struct {
S string
I int
}
buf := &bytes.Buffer{}
// Any writer, not just a buffer!
var out io.Writer = buf
cw := &CounterWr{Writer: out}
s := Something{"hello", 4}
if err := json.NewEncoder(cw).Encode(s); err != nil {
panic(err)
}
fmt.Printf("Count: %d bytes, %d bits\n", cw.Count, cw.Count*8)
fmt.Printf("Verif: %d bytes, %d bits\n", buf.Len(), buf.Len()*8)
出于驗證目的,我們還打印了bytes.Buffer我們用作輸出的長度(CounterWr.Count并且Buffer.Len()應該匹配)。
輸出:
Count: 20 bytes, 160 bits
Verif: 20 bytes, 160 bits
在Go Playground上嘗試一下。
筆記:
如果您也對其他值進行編碼,cw.Count那么當然是總字節數(而不僅僅是最后一個值的字節數)。如果您只想獲取最后一個編碼值的大小,請cw.Count在調用之前存儲Encoder.Encode(),并計算與編碼后得到的計數的差值?;蛘咧皇窃诰幋a之前設置cw.Count(0是的,您也可以更改該字段):
cw.Count = 0
- 1 回答
- 0 關注
- 203 瀏覽
添加回答
舉報