天天看點

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