This commit is contained in:
chai2010
2015-12-14 11:31:28 +08:00
parent 44532b45b5
commit 7b4e9340f8
7 changed files with 82 additions and 82 deletions

View File

@@ -1,11 +1,11 @@
## 12.1. 為何需要反射?
候我需要编写一个函数能够处理一类并不满足普通公共接口的型的值, 也可能它们并没有确定的示方式, 或者在我们设计该函数的时候还这些类型可能不存在, 各种情况都有可能.
候我需要編寫一箇函數能夠處理一類併不滿足普通公共接口的型的值, 也可能它們併沒有確定的示方式, 或者在我們設計該函數的時候還這些類型可能不存在, 各種情況都有可能.
个大家熟悉的例子是 fmt.Fprintf 函提供的字符串格式化处理逻辑, 它可以用例任意型的值格式化打印, 甚至是用自定义的类型. 让我们来尝试实现一个类似功能的函. 简单起见, 我的函数只接收一个参数, 然后返回和 fmt.Sprint 似的格式化的字符串, 我的函名也叫 Sprint.
箇大傢熟悉的例子是 fmt.Fprintf 函提供的字符串格式化處理邏輯, 它可以用例任意型的值格式化打印, 甚至是用自定義的類型. 讓我們來嘗試實現一箇類似功能的函. 簡單起見, 我的函數隻接收一箇參數, 然後返迴和 fmt.Sprint 似的格式化的字符串, 我的函名也叫 Sprint.
使用了 switch 分支首先来测试输入参数是否实现了 String 方法, 如果是的就使用方法. 然后继续增加测试分支, 检查是否是每个基于 string, int, bool 等基础类型的动态类型, 在每种情况下执行适当的格式化操作.
使用了 switch 分支首先來測試輸入參數是否實現了 String 方法, 如果是的就使用方法. 然後繼續增加測試分支, 檢査是否是每箇基於 string, int, bool 等基礎類型的動態類型, 在每種情況下執行適噹的格式化操作.
```Go
func Sprint(x interface{}) string {
@@ -32,8 +32,8 @@ func Sprint(x interface{}) string {
}
```
但是我如何理其它似 []float64, map[string][]string 等型呢? 我们当然可以添加更多的测试分支, 但是这些组合类型的目基本是无穷的. 有如何理 url.Values 等命令的型呢? 虽然类型分支可以识别出底层的基础类型是 map[string][]string, 但是它不匹配 url.Values 型, 因为这是两种不同的类型, 而且 switch 分支也不可能包含每个类似 url.Values 的型, 这会导致对这些库的依.
但是我如何理其它似 []float64, map[string][]string 等型呢? 我們噹然可以添加更多的測試分支, 但是這些組閤類型的目基本是無窮的. 有如何理 url.Values 等命令的型呢? 雖然類型分支可以識別齣底層的基礎類型是 map[string][]string, 但是它不匹配 url.Values 型, 因爲這是兩種不衕的類型, 而且 switch 分支也不可能包含每箇類似 url.Values 的型, 這會導緻對這些庫的依.
有一方法来检查未知型的示方式, 我被卡住了. 就是我们为何需要反射的原因.
有一方法來檢査未知型的示方式, 我被卡住了. 就是我們爲何需要反射的原因.