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

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

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

注意 Marshal 接受一个接口并返回一个 []byte 作为输出,而 Unmarshal 接受一个 []byte 并将输出直接写入输入参数数据


设计有何不同


一个相关的问题:


我认为使用输入参数可以保存一次内存副本(函数返回需要一个副本),golang中的每个赋值都是一个副本操作,所以看起来Unmarshal可以保存副本,但Marshal不能。


所以我很困惑...


红糖糍粑
浏览 255回答 2
2回答

慕无忌1623718

对称对中的势函数是:func Marshal(v interface{}) ([]byte, error)         // 1func Unmarshal(data []byte) (interface{}, error)    // 2func Marshal(v interface{}, data *[]byte) error     // 3func 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)         // 1func Unmarshal(data []byte, interface{}) error      // 4

隔江千里

通过Marshal 返回一个字节数组,您可以轻松地将其传递给诸如bufio.Writer.Write()将字节数组作为参数的函数。在编写提供 JSON 的 Web 服务时,您可能会遇到其中之一。如果您正在使用Unmarshal,那么您很可能正在从 JSON 中读取数据。通过Unmarshal采用与Marshal返回相同的第一个参数,您可以获得任何已由 输出的 JSON Marshal,并将其直接传递给Unmarshal。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go