update tw

This commit is contained in:
chai2010
2015-12-18 10:53:03 +08:00
parent 510c741a6f
commit c66a96ee52
106 changed files with 864 additions and 864 deletions

View File

@@ -1,6 +1,6 @@
## 13.3. 示例: 深度相等判斷
來自 reflect 包的 DeepEqual 對兩個值進行深度相等判斷. DeepEqual 使用內建的 `==` 操作符對基礎類型進行相等判斷, 對於復類型則遞歸變量每個基礎類型然後做類似的比較判斷. 因它工作在任意的類型上, 甚至對一些不支持 `==` 操作符的類型也可以工作, 因此在一些測試代碼中被廣地使用. 比如下的代碼是用 DeepEqual 比較兩個字符串數組是否等價.
來自 reflect 包的 DeepEqual 對兩個值進行深度相等判斷. DeepEqual 使用內建的 `==` 操作符對基礎類型進行相等判斷, 對於復類型則遞歸變量每個基礎類型然後做類似的比較判斷. 因它工作在任意的類型上, 甚至對一些不支持 `==` 操作符的類型也可以工作, 因此在一些測試代碼中被廣地使用. 比如下的代碼是用 DeepEqual 比較兩個字符串數組是否等價.
```Go
func TestSplit(t *testing.T) {
@@ -10,9 +10,9 @@ func TestSplit(t *testing.T) {
}
```
管 DeepEqual 很方便, 而且可以支持任意的類型, 但是也有不足之處.
管 DeepEqual 很方便, 而且可以支持任意的類型, 但是也有不足之處.
例如, 它將一個 nil map 和 非 nil 的空的 map 視作不相等,
樣 nil slice 和 非 nil 的空的 slice 也不相等.
樣 nil slice 和 非 nil 的空的 slice 也不相等.
```Go
var a, b []string = nil, []string{}
@@ -22,7 +22,7 @@ var c, d map[string]int = nil, make(map[string]int)
fmt.Println(reflect.DeepEqual(c, d)) // "false"
```
在這定義一個自己的 Equal 函數用於比較人員的值. 和 DeepEqual 類似的是它也是基於 slice 和 map 的元素進行遞歸比較, 不之處是它將 nil slice(map類似) 和非 nil 的空 slice 視作相等的值. 基礎部分的比較可以基於反射完成, 和 12.3 章的 Display 實現方法類似. 樣, 我們頂一個一個內部函數 equal, 用於內部的遞歸比較. 目前不用關心 seen 參數. 對於每一對需要比較的 x 和 y, equal 函數 首先檢測它們是否都有效(或都無效), 然後檢測它們是否是相的類型. 剩下的部分是一個大的 switch 分支, 用於擁有相基礎類型的比較. 因為頁麫空間的限製, 我們省略了一些類似的分支.
在這定義一個自己的 Equal 函數用於比較人員的值. 和 DeepEqual 類似的是它也是基於 slice 和 map 的元素進行遞歸比較, 不之處是它將 nil slice(map類似) 和非 nil 的空 slice 視作相等的值. 基礎部分的比較可以基於反射完成, 和 12.3 章的 Display 實現方法類似. 樣, 我們頂一個一個內部函數 equal, 用於內部的遞歸比較. 目前不用關心 seen 參數. 對於每一對需要比較的 x 和 y, equal 函數 首先檢測它們是否都有效(或都無效), 然後檢測它們是否是相的類型. 剩下的部分是一個大的 switch 分支, 用於擁有相基礎類型的比較. 因爲頁面空間的限製, 我們省略了一些類似的分支.
```Go
gopl.io/ch13/equal
@@ -65,8 +65,8 @@ func equal(x, y reflect.Value, seen map[comparison]bool) bool {
}
```
和前的建議一樣, 我們不公開使用反射相關的接口,
所以導齣的函數需要在內部自己將變量轉 reflect.Value 類型.
和前的建議一樣, 我們不公開使用反射相關的接口,
所以導齣的函數需要在內部自己將變量轉 reflect.Value 類型.
```Go
// Equal reports whether x and y are deeply equal.
@@ -81,7 +81,7 @@ type comparison struct {
}
```
了確保算法對於循環數據結構也能正常退齣, 我們必鬚記每次已經比較的變量, 從而避免進入第二次的比較. Equal 函數分配了一組用於比較的結構體, 包含每對比較對象的地址(unsafe.Pointer形式保存)和類型. 我們記類型的原因是, 有些不的變量可能對應相的地址. 例如, 如果 x 和 y 都是數組類型, 那 x 和 `x[0]` 將對應相的地址, y 和 `y[0]` 也是對應相的地址, 這可以用於判斷 對x 和 y 比較 或 x[0] 和 y[0] 的是否進行過了.
了確保算法對於循環數據結構也能正常退齣, 我們必鬚記每次已經比較的變量, 從而避免進入第二次的比較. Equal 函數分配了一組用於比較的結構體, 包含每對比較對象的地址(unsafe.Pointer形式保存)和類型. 我們記類型的原因是, 有些不的變量可能對應相的地址. 例如, 如果 x 和 y 都是數組類型, 那 x 和 `x[0]` 將對應相的地址, y 和 `y[0]` 也是對應相的地址, 這可以用於判斷 對x 和 y 比較 或 x[0] 和 y[0] 的是否進行過了.
```Go
// cycle check