回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,10 +1,10 @@
## 12.1. 何需要反射?
## 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 {
@@ -31,6 +31,6 @@ 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的型,这会导致对这些库的循环依赖
有一方法來檢査未知型的表示方式,我被卡住了。就是我們爲何需要反射的原因。
有一方法来检查未知型的表示方式,我被卡住了。就是我们为何需要反射的原因。