登录
首页 >  Golang >  Go问答

json.Marshal 返回一个字节切片,其容量可能超出预期

来源:stackoverflow

时间:2024-03-12 20:09:25 412浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《json.Marshal 返回一个字节切片,其容量可能超出预期》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

因此,我遇到一种情况,假设满足某些条件,我需要从 marshaljson 接口返回 "" 作为字节切片。

我在为此接口编写单元测试期间观察到的一个事实是,在对该类型调用 json.marshal 时返回的字节切片的容量设置为 8(意外),并且 长度设置为2(预期)。

问:有人可以帮助我理解这种行为的原因吗?切片容量不应该相同吗,因为在这两种情况下我本质上都使用 []byte(`""`)

下面提供了要重现的代码。您还可以查看演示 url https://go.dev/play/p/svgmovgonnb

// You can edit this code!
// Click here and start typing.
package main

import (
    "encoding/json"
    "fmt"
)

type Foo struct{}

func (f Foo) MarshalJSON() ([]byte, error) {
    return []byte(`""`), nil
}

func main() {
    s1 := []byte(`""`)
    f := Foo{}
    s2, _ := json.Marshal(f)
    fmt.Printf("Len: %d, cap: %d\n", len(s1), cap(s1))
    fmt.Printf("Len %d, cap: %d\n", len(s2), cap(s2))
}

正确答案


json.Marshal 将从 MarshalJSON 和其他内置编码器返回的字节与任何其他 JSON 语法一起复制到缓冲区中,然后返回缓冲区内容的副本。 没有理由期望 json.Marshal 返回 MarshalJSON 的结果不变,因为在一般情况下,不只是单个 MarshalJSON 调用。

我们可以查看 json.Marshal's implementation,看看在您的情况下它实际上返回了 append([]byte(nil), '"', '"') 的结果。

append 根据一些旨在最小化摊销内存分配的启发式增长(在本例中从头开始创建)切片。您不能对这些启发式方法做出假设,因为它们不是语言规范的一部分并且可以更改(过去确实如此)。

今天关于《json.Marshal 返回一个字节切片,其容量可能超出预期》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>