What is reflection?
Reflection 是 golang 中的一個 package,可以在執行時檢查變數和值,並找到其所屬的 type。
reflect.Type and reflect.Value
reflect.Type
可以表示interface{}
具體的 type,透過 reflect.TypeOf() 取得reflect.Value
可以表示interface{}
底層的 value,透過 reflect.ValueOf() 取得reflect.Kind
可以表示具體 type 的類型 reflect.Kind- 以下範例可能會比較清楚
Generalize query creator and make it work on any struct
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
NumField() and Field() methods
NumField()
用來算出 reflect.Value 裡的數量Field()
用來取出 reflect.Value 的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
Int() and String() methods
- The methods Int and String help extract the reflect.Value as an int64 and string respectively.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Complete Generalize query creator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
|
Should reflection be used?
Rob Pike: Clear is better than clever. Reflection is never clear.
結論是 reflection 是非常強大且高級的技巧,但是難以寫的乾淨或是很好維護,所以作者是建議盡量可以避免,除非真的有需要的話
參考文件