您好,登錄后才能下訂單哦!
本篇內容介紹了“Golang怎么比較兩個slice是否相等”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
和數組不同的是,slice無法做比較,因此不能使用==來測試兩個slice是否擁有相同的元素。這里主要是兩個原因:
首先和數組元素不同,slice元素是非直接的,有可能slice可以包含它自身。雖然有辦法處理這種特殊情況,但是始終沒有一種方法是簡單、高效、直觀的;
其次,因為slice的元素不是直接的,所以如果底層數組元素改變,同一個slice在不同的時間會有不同的元素;
標準庫里面提供了高度優化的函數bytes.Equal來比較兩個字節類型的slice([]byte)
自己寫一個方法,首先比較兩個slice的長度,再比較兩個slice對應位置元素是否相等。
package main import ( "fmt" ) func main() { slice1 := []int{1, 3, 4} slice2 := []int{1, 2, 4} fmt.Printf("Expect:false\tOutput:%v\n", equal(slice1, slice2)) // Expect:false Output:false slice1 = []int{1, 2, 4} slice2 = []int{1, 2, 4} fmt.Printf("Expect:true\tOutput:%v\n", equal(slice1, slice2)) // Expect:true Output:true } func equal(slice1, slice2 []int) bool { // 比較長度 if len(slice1) != len(slice2) { return false } // 比較對應位置的元素是否相同 for i := 0; i < len(slice1); i++ { if slice1[i] != slice2[i] { return false } else { continue } } return true }
使用反射包中提供的DeepEqual可以更加簡潔的實現。另外有些時候我們需要對結構體對象進行比較的時候,我們可以使用該函數
package main import ( "fmt" "reflect" ) func main() { slice1 := []int{1, 3, 4} slice2 := []int{1, 2, 4} fmt.Printf("Expect:false\tOutput:%v\n", reflect.DeepEqual(slice1, slice2)) // fmt.Printf("Expect:false\tOutput:%v\n", equal(slice1, slice2)) slice1 = []int{1, 2, 4} slice2 = []int{1, 2, 4} fmt.Printf("Expect:true\tOutput:%v\n", reflect.DeepEqual(slice1, slice2)) // fmt.Printf("Expect:true\tOutput:%v\n", equal(slice1, slice2)) }
由于散列表(Golang中map的底層實現原理)僅對元素做淺拷貝,這就要求散列表里面的鍵在散列表的整個生命周期內必須保持不變。因此正常情況下,我們無法讓一個slice作為一個map的鍵,但是如果有這樣的業務需要我們怎么來實現呢?
本質上,其實是將slice按其字面轉化為string
%q 該值對應的單引號括起來的go語法字符字面值,必要時會采用安全的轉義表示
package main import "fmt" // "reflect" type MyMap map[string]int func (mm MyMap) Add(list []string) { mm[k(list)]++ } func (mm MyMap) Count(list []string) int { return mm[k(list)] } func k(list []string) string { return fmt.Sprintf("%q", list) } func main() { slice1 := []string{"1", "3", "4"} slice2 := []string{"1", "3", "4"} slice3 := []string{"1", "2", "4"} m := make(MyMap) m.Add(slice1) m.Add(slice2) m.Add(slice3) fmt.Printf("Expect:1\tOutput:%v\n", m.Count(slice2)) // Expect:1 Output:1 fmt.Printf("Expect:2\tOutput:%v\n", m.Count(slice1)) // Expect:2 Output:2 fmt.Printf("%v\n", m) // map[["1" "2" "4"]:1 ["1" "3" "4"]:2] }
“Golang怎么比較兩個slice是否相等”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。