Fixes #198
This commit is contained in:
chai2010
2016-01-18 11:22:04 +08:00
parent 884ada9cd0
commit 9666211cd7
71 changed files with 107 additions and 105 deletions

View File

@@ -80,7 +80,7 @@ fmt.Println(s) // "[2 3 4 5 0 1]"
要註意的是slice類型的變量s和數組類型的變量a的初始化語法的差異。slice和數組的字面值語法很類似它們都是用花括弧包含一繫列的初始化元素但是對於slice併沒有指明序列的長度。這會隱式地創建一個合適大小的數組然後slice的指針指向底層的數組。就像數組字面值一樣slice的字面值也可以按順序指定初始化值序列或者是通過索引和元素值指定或者的兩種風格的混合語法初始化。
和數組不同的是slice之間不能比較因此我們不能使用==操作符來判斷兩個slice是否含有全部相等元素。不過標準庫提供了高度優化的bytes.Equal函數來判斷兩個字節型slice是否相等[]byte但是對於其他類型的slice我們必自己展開每個元素進行比較:
和數組不同的是slice之間不能比較因此我們不能使用==操作符來判斷兩個slice是否含有全部相等元素。不過標準庫提供了高度優化的bytes.Equal函數來判斷兩個字節型slice是否相等[]byte但是對於其他類型的slice我們必自己展開每個元素進行比較:
```Go
func equal(x, y []string) bool {
@@ -98,7 +98,7 @@ func equal(x, y []string) bool {
上面關於兩個slice的深度相等測試運行的時間併不比支持==操作的數組或字符串更多但是爲何slice不直接支持比較運算符呢這方面有兩個原因。第一個原因一個slice的元素是間接引用的一個slice甚至可以包含自身。雖然有很多辦法處理這種情形但是沒有一個是簡單有效的。
第二個原因因爲slice的元素是間接引用的一個固定值的slice在不同的時間可能包含不同的元素因爲底層數組的元素可能會被脩改。併且Go語言中map等哈希表之類的數據結構的key隻做簡單的淺拷貝它要求在整個聲明週期中相等的key必對相同的元素。對於像指針或chan之類的引用類型==相等測試可以判斷兩個是否是引用相同的對象。一個針對slice的淺相等測試的==操作符可能是有一定用處的也能臨時解決map類型的key問題但是slice和數組不同的相等測試行爲會讓人睏惑。因此安全的做飯是直接禁止slice之間的比較操作。
第二個原因因爲slice的元素是間接引用的一個固定值的slice在不同的時間可能包含不同的元素因爲底層數組的元素可能會被脩改。併且Go語言中map等哈希表之類的數據結構的key隻做簡單的淺拷貝它要求在整個聲明週期中相等的key必對相同的元素。對於像指針或chan之類的引用類型==相等測試可以判斷兩個是否是引用相同的對象。一個針對slice的淺相等測試的==操作符可能是有一定用處的也能臨時解決map類型的key問題但是slice和數組不同的相等測試行爲會讓人睏惑。因此安全的做飯是直接禁止slice之間的比較操作。
slice唯一合法的比較操作是和nil比較例如