ch8 ch8.1不通顺修改

This commit is contained in:
Xargin
2016-01-22 14:57:10 +08:00
parent 103efa03a4
commit 17f7b25352
4 changed files with 13 additions and 13 deletions

View File

@@ -1,10 +1,10 @@
## 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的類型這會導致對這些庫的循依賴。
沒有一種方法來檢査未知類型的表示方式,我們被卡住了。這就是我們爲何需要反射的原因。

View File

@@ -1,5 +1,5 @@
# 第十二章 反射
Go音提供了一種機製在運行時更新變量和檢査它們的值、調用它們的方法和它們支持的內在操作,但是在編譯時併不知道這些變量的具類型。這種機製被稱爲反射。反射也可以讓我們將類型本身作爲第一類的值類型處理。
Go音提供了一種機製在運行時更新變量和檢査它們的值、調用它們的方法和它們支持的內在操作,但是在編譯時併不知道這些變量的具類型。這種機製被稱爲反射。反射也可以讓我們將類型本身作爲第一類的值類型處理。
在本章我們將探討Go語言的反射特性看看它可以給語言增加哪些表達力以及在兩個至關重要的API是如何用反射機製的一個是fmt包提供的字符串格式功能另一個是類似encoding/json和encoding/xml提供的針對特定協議的編解碼功能。對於我們在4.6節中看到過的text/template和html/template包它們的實現也是依賴反射技術的。然後反射是一個複雜的內省技術不應該隨意使用因此盡管上面這些包部都是用反射技術實現的但是它們自己的API都沒有公開反射相關的接口。
在本章我們將探討Go語言的反射特性看看它可以給語言增加哪些表達力以及在兩個至關重要的API是如何用反射機製的一個是fmt包提供的字符串格式功能另一個是類似encoding/json和encoding/xml提供的針對特定協議的編解碼功能。對於我們在4.6節中看到過的text/template和html/template包它們的實現也是依賴反射技術的。然後反射是一個複雜的內省技術不應該隨意使用因此盡管上面這些包部都是用反射技術實現的但是它們自己的API都沒有公開反射相關的接口。