我在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标签?
答案 0 :(得分:6)
如果您希望它可以处理值,请不要在反射类型上调用Type.Elem()
。要处理它们(指针和非指针),检查它是否是指针类型,然后只调用Type.Elem()
:
elemsType := reflect.TypeOf(obj)
if elemsType.Kind() == reflect.Ptr {
elemsType = elemsType.Elem()
}