天天看点

golang reflect

<code>typeof</code>函数的定义如下,参数为接口类型,返回值为类型

<code>valueof</code>函数的定义如下,参数为接口类型,返回值为<code>value</code>

可以通过<code>kind</code>函数来检查类型,

通过<code>interface</code>函数可以实现反射对象到接口值的转换,

修改反射对象的前提条件是其值必须是可设置的

为了避免这个问题,需要使用<code>canset</code>函数来检查该值的设置性,

那么如何才能设置该值呢?

这里需要考虑一个常见的问题,<code>参数传递</code>,传值还是传引用或地址?

在上面的例子中,我们使用的是<code>reflect.valueof(x)</code>,这是一个值传递,传递的是x的值的一个副本,不是x本身,因此更新副本中的值是不允许的。如果使用<code>reflect.valueof(&amp;x)</code>来替换刚才的值传递,就可以实现值的修改。

首先介绍如何遍历结构体字段内容,

假设结构体如下,

从而,通过反射来遍历所有的字段内容

接下来,如何获取结构体的标签内容?

一般情况下,为了存储多个函数值,一般采用<code>map</code>来存储。其中key为函数名称,而value为相应的处理函数。

在这里需要定义好函数类型,但是函数的参数以及返回类型就需要是统一的,如下

如果希望<code>map</code>可以存储任意类型的函数(参数不同,返回值不同),那么就需要用interface{}而不是func(param...)来定义value。

直接调用会报错,提示不能调用interface{}类型的函数。

这时,需要利用<code>reflect</code>把函数从interface转换到函数来使用,

golang reflect