栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

编码为JSON的对象的大小(以位为单位)?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

编码为JSON的对象的大小(以位为单位)?

io.Writer
并且
json.Enprer
不公开也不维护写入字节数。

一种方法是先使用内置函数

json.Marshal()
[]byte
其编入其长度来封送该值
len()
。您要查找的位数是长度乘以8(1字节为8位)。之后,您必须手动将字节片写入输出中。对于小型类型,这不是问题,但是对于大型结构/值,可能是不希望的。另外,也没有必要的工作将其编组,获取其长度并手动编写切片。

一种更好,更优雅的方法是使用 embedding
扩展任何作者的功能来管理已写入的字节:

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.NewEnprer()
,您可以
CounterWr.Count
直接从中访问写入的字节数。

用法示例:

type Something struct {    S string    I int}buf := &bytes.Buffer{}// Any writer, not just a buffer!var out io.Writer = bufcw := &CounterWr{Writer: out}s := Something{"hello", 4}if err := json.NewEnprer(cw).Enpre(s); err != nil {    panic(err)}fmt.Printf("Count: %d bytes, %d bitsn", cw.Count, cw.Count*8)fmt.Printf("Verif: %d bytes, %d bitsn", buf.Len(), buf.Len()*8)

为了进行验证,我们还打印了

bytes.Buffer
用作输出的的长度(
CounterWr.Count
并且
Buffer.Len()
应该匹配)。

输出:

Count: 20 bytes, 160 bitsVerif: 20 bytes, 160 bits

在Go Playground上尝试一下。

笔记:

如果您也对其他值进行编码,

cw.Count
则将是当然的总字节数(而不仅仅是最后一个值)。如果只想获取最后一个编码值的大小,请
cw.Count
在调用之前存储
Enprer.Enpre()
,然后计算与编码后得到的计数之差。或简单地设置
cw.Count
0
编码前(是的,您也可以更改该字段):

cw.Count = 0


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/372009.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号