今天尝试了一下使用go语言中的反射来将struct类型转换成xml,结果相当纠结。首先去看了一下go的reflect包的实现,根据go的规则,首先应该去看一个NewXXX的方法,结果发现了一个叫NewValue的方法,通过这个方法我们能够得到一个Value接口。另外我们还应该注意到,go的反映实现中将Type和Value分开了,于是还有另外一个接口Type.
然后包里还根据每种数据类型都定义了相应的XXXType和XXXValue结构体,那么我们如何得到这些结构体的实例呢?因为只有得到这些构体的实例才能利用反映来操纵这些数据。于是很丑陋的地方来了,你需要使用.(type)来得到当前这个变量的类型,而这个使用必须在switch中,请看下面的例子
NewValue创建了一个data的Value接口,但是这个接口是谁实现的呢?通过.(type)就可以得到。
Typeof创建了一个data的Type接口,同样的这个接口也可以通过.(type)得到它的实现。
而如果不使用reflect里的任何方法直接对变量data使用.(type),那么就会得到这个接口的实现。
因此从这里我们可以看到go语言中使用反映需要两个条件,一个是通过type得到它的实现变量,一个是通过reflect里提供的接口来进行操作。
但是很恶心的是,每次操作都必须通过switch case来执行,比如最后我的代码就变成了如下这个样子:
有疑问加站长微信联系(非本文作者)