使用Go 切片作為Map Key 的局限性
Go 切片本質上是Go 數組的實現,與數組在以下方面有相似之處:他們的價值類型本質。然而,它們作為映射鍵的適用性與數組的適用性有很大不同。這種差異源自於切片引用底層數組的事實,這引入了數組所不存在的複雜性。
如 Nigel Tao 所解釋的,複製切片比複製數組要快得多,這要歸功於它的 O(1 ) 時間複雜度與數組的 O(length) 複雜度相比。這種差異突出了值類型(數組)和引用類型(切片)之間的差異。
定義映射鍵時,有必要建立相等的概念。對於數組,透過比較各個元素可以直接確定相等性。然而,對於切片來說,有多種方法來定義相等性。考慮元素級相等或基於它們所引用的底層數組儲存的相等。
此外,將鍵插入映射的行為會產生關於是否需要整個後備數組的昂貴副本的不確定性。雖然複製可能符合預期,但它會偏離切片的賦值行為。
為了說明這些複雜性,請考慮以下範例:
m := make(map[[]int]bool) s0 := []int{6, 7, 8} s1 := []int{6, 7, 8} s2 := s0 m[s0] = true s2[0] = 9 println(m[s0]) println(m[s1]) println(m[s2])
程式設計師可能對切片有不同的期望結果表明,使用切片作為映射鍵時可能會出現混亂。為了避免這種歧義,我們選擇禁止在 Go 中使用切片作為映射鍵。
以上是為什麼 Go 切片不能當 Map Key?的詳細內容。更多資訊請關注PHP中文網其他相關文章!