获取没有指针的struct标签

时间:2017-07-25 12:12:21

标签: go reflection

我在Go中创建了一个简单的封送程序,用于将文本修复为struct,详见here

编组程序的功能正如我现在预期的那样,尽管仍然缺少某些功能。我陷入困境的是编组功能。

相关代码如下

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标签?

1 个答案:

答案 0 :(得分:6)

如果您希望它可以处理值,请不要在反射类型上调用Type.Elem()。要处理它们(指针和非指针),检查它是否是指针类型,然后只调用Type.Elem()

elemsType := reflect.TypeOf(obj)
if elemsType.Kind() == reflect.Ptr {
    elemsType = elemsType.Elem()
}