Pointers 获取不带指针的结构标记

Pointers 获取不带指针的结构标记,pointers,go,struct,reflection,Pointers,Go,Struct,Reflection,我正在创建一个简单的封送拆收器,用于将文本固定到Go中的结构中,如详细所述 封送拆收器的功能与我现在预期的一样,尽管仍然缺少一些特性。我陷入的是封送函数 有关守则如下: func Marshal(obj interface{}) (str string, err error) { ... elemsType := reflect.TypeOf(obj).Elem() 如您所见,我试图模拟json包的封送签名。唯一的问题是,当我试图将值传递给封送处理函数时,reflect.TypeOf返

我正在创建一个简单的封送拆收器,用于将文本固定到Go中的结构中,如详细所述

封送拆收器的功能与我现在预期的一样,尽管仍然缺少一些特性。我陷入的是封送函数

有关守则如下:

func Marshal(obj interface{}) (str string, err error) {
...
    elemsType := reflect.TypeOf(obj).Elem()
如您所见,我试图模拟json包的封送签名。唯一的问题是,当我试图将值传递给封送处理函数时,reflect.TypeOf返回的类型与我传递给它的类型不同。仅当我将指针传递给封送处理函数时,才能执行该函数

这很有效

user := User{"johnjohnjohn", "the", "doe", "smart", 26}
res, err := Marshal(&user)
这并不重要

user := User{"johnjohnjohn", "the", "doe", "smart", 26}
res, err := Marshal(user)

有没有办法只传递值,然后在封送处理函数中获取struct标记?

如果希望它处理值,请不要在反射类型上调用Type.Elem。要同时处理指针和非指针,请检查它是否为指针类型,然后才调用类型。元素:


如果您想让它处理值,不要在反射类型上调用Type.Elem。要同时处理指针和非指针,请检查它是否为指针类型,然后才调用类型。元素:


是的,就是这样。我还在掌握围棋中指针的概念,谢谢回答!是的,就是这样。我还在掌握围棋中指针的概念,谢谢回答!
elemsType := reflect.TypeOf(obj)
if elemsType.Kind() == reflect.Ptr {
    elemsType = elemsType.Elem()
}