为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 json.Marshal 和 json.Unmarshal 有不同的签名

为什么 json.Marshal 和 json.Unmarshal 有不同的签名

Go
红糖糍粑 2021-08-16 20:16:28
func Marshal(v interface{}) ([]byte, error)func Unmarshal(data []byte, v interface{}) error注意 Marshal 接受一个接口并返回一个 []byte 作为输出,而 Unmarshal 接受一个 []byte 并将输出直接写入输入参数数据设计有何不同一个相关的问题:我认为使用输入参数可以保存一次内存副本(函数返回需要一个副本),golang中的每个赋值都是一个副本操作,所以看起来Unmarshal可以保存副本,但Marshal不能。所以我很困惑...
查看完整描述

2 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

对称对中的势函数是:


func Marshal(v interface{}) ([]byte, error)         // 1

func Unmarshal(data []byte) (interface{}, error)    // 2


func Marshal(v interface{}, data *[]byte) error     // 3

func Unmarshal(data []byte, v interface{}) error    // 4

函数#3 和#4 可能看起来不对称,因为data#3的参数是指针类型,v而#4的参数没有声明为指针类型。它们实际上是对称的,因为传递给v#4的参数的实际值必须是一个指针。如果它不是指针,该函数将返回错误。


函数#2 不可行,因为该函数无法访问应用程序的结果类型。如果函数不知道该类型,则该函数无法将 JSON 解组为类型。此外,应用程序需要键入 assert 结果才能使用它。标准库尽可能避免类型断言。


功能#3 不是惯用的。Go 中很少使用指向切片的指针。我不记得在标准库中使用过任何东西,但我相信如果有的话,有人会在这里留下评论。


我们留下了#1 和#4 的不对称对:


func Marshal(v interface{}) ([]byte, error)         // 1

func Unmarshal(data []byte, interface{}) error      // 4


查看完整回答
反对 回复 2021-08-16
?
隔江千里

TA贡献1906条经验 获得超10个赞

通过Marshal 返回一个字节数组,您可以轻松地将其传递给诸如bufio.Writer.Write()将字节数组作为参数的函数。在编写提供 JSON 的 Web 服务时,您可能会遇到其中之一。

如果您正在使用Unmarshal,那么您很可能正在从 JSON 中读取数据。通过Unmarshal采用与Marshal返回相同的第一个参数,您可以获得任何已由 输出的 JSON Marshal,并将其直接传递给Unmarshal


查看完整回答
反对 回复 2021-08-16
  • 2 回答
  • 0 关注
  • 253 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信