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

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

什么使设计有所不同

一个相关的问题:

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

所以我很困惑

最佳答案

对称对中的潜在函数是:

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可能看起来不对称,因为#3的data参数是指针类型,而#4的v参数未声明为指针类型。它们实际上是对称的,因为传递给#4的v参数的实际值必须是一个指针。如果该函数不是指针,则返回错误。

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

功能3不是惯用语言。 slice 的指针很少在Go中使用。我不记得在标准库中使用过任何方法,但是我敢肯定,如果有任何人在这里发表评论。

我们剩下#1和#4的非对称对:
func Marshal(v interface{}) ([]byte, error)         // 1
func Unmarshal(data []byte, interface{}) error      // 4

07-28 10:50