<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(&x)</code>來替換剛才的值傳遞,就可以實作值的修改。
首先介紹如何周遊結構體字段内容,
假設結構體如下,
進而,通過反射來周遊所有的字段内容
接下來,如何擷取結構體的标簽内容?
一般情況下,為了存儲多個函數值,一般采用<code>map</code>來存儲。其中key為函數名稱,而value為相應的處理函數。
在這裡需要定義好函數類型,但是函數的參數以及傳回類型就需要是統一的,如下
如果希望<code>map</code>可以存儲任意類型的函數(參數不同,傳回值不同),那麼就需要用interface{}而不是func(param...)來定義value。
直接調用會報錯,提示不能調用interface{}類型的函數。
這時,需要利用<code>reflect</code>把函數從interface轉換到函數來使用,
![]()
golang reflect