我正在使用 Go 中的一些“通用”函数,这些函数在interface{}通道上运行和发送东西等等。瘦下来,假设我有这样的东西:
type MyType struct {
// Fields
}
func (m *MyType) MarshalJSON() ([]byte, error) {
// MarshalJSON
log.Print("custom JSON marshal")
return []byte("hello"), nil
}
func GenericFunc(v interface{}) {
// Do things...
log.Print(reflect.TypeOf(v))
log.Print(reflect.TypeOf(&v))
b, _ = json.Marshal(&v)
fmt.Println(string(b))
}
func main() {
m := MyType{}
GenericFunc(m)
}
这输出:
2014/11/16 12:41:44 MyType
2014/11/16 12:41:44 *interface {}
其次是默认json.Marshal输出,而不是自定义输出。据我所知,这是因为调用Marshal看到的是指向接口的指针而不是指向 MyType 的指针类型的值。
为什么我在服用时会丢失类型信息&v?我希望输出的第二行是*MyType而不是*interface {}.
有什么方法可以让我在不显式转换的情况下调用自定义 JSON Marshaller?
梦里花落0921
萧十郎
相关分类