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