获取没有指针的struct标签

irf*_*ief 1 reflection struct pointers go

我在Go中创建了一个简单的封送器,用于将文本固定到struct中,详见此处.

编组器的功能正如我所预期的那样,尽管仍然缺少一些功能.我陷入困境的是编组功能.

相关代码如下

func Marshal(obj interface{}) (str string, err error) {
...
    elemsType := reflect.TypeOf(obj).Elem()
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我试图模仿json包的marshal签名.然后唯一的问题是当我试图通过值传递给编组函数时,reflect.TypeOf返回的类型与我传入它的类型不同.只有在我将指针传递给marshal函数时才能执行该函数.

这有效

user := User{"johnjohnjohn", "the", "doe", "smart", 26}
res, err := Marshal(&user)
Run Code Online (Sandbox Code Playgroud)

事实并非如此

user := User{"johnjohnjohn", "the", "doe", "smart", 26}
res, err := Marshal(user)
Run Code Online (Sandbox Code Playgroud)

有没有办法只传递值,然后在编组函数中获取struct标签?

icz*_*cza 6

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

elemsType := reflect.TypeOf(obj)
if elemsType.Kind() == reflect.Ptr {
    elemsType = elemsType.Elem()
}
Run Code Online (Sandbox Code Playgroud)