91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang怎么比較兩個slice是否相等

發布時間:2023-05-11 17:32:38 來源:億速云 閱讀:225 作者:iii 欄目:開發技術

本篇內容介紹了“Golang怎么比較兩個slice是否相等”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    1、為什么在Golang中無法直接使用==來比較兩個slice?

    和數組不同的是,slice無法做比較,因此不能使用==來測試兩個slice是否擁有相同的元素。這里主要是兩個原因:

    首先和數組元素不同,slice元素是非直接的,有可能slice可以包含它自身。雖然有辦法處理這種特殊情況,但是始終沒有一種方法是簡單、高效、直觀的;
    其次,因為slice的元素不是直接的,所以如果底層數組元素改變,同一個slice在不同的時間會有不同的元素;

    2、如何實現兩個slice的比較呢?

    標準庫里面提供了高度優化的函數bytes.Equal來比較兩個字節類型的slice([]byte)

    2.1 深度比較

    自己寫一個方法,首先比較兩個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
    }

    2.2 使用reflect.DeepEqual函數

    使用反射包中提供的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))
    }

    3、擴展:如何在map中讓slice充當key?

    由于散列表(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是否相等”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    西乌| 房山区| 明星| 休宁县| 察哈| 和田县| 阿瓦提县| 射洪县| 康乐县| 湘潭县| 兴山县| 宜黄县| 通道| 杭州市| 太白县| 英山县| 沧源| 蒙阴县| 贵南县| 临漳县| 凤凰县| 印江| 溧阳市| 岳阳市| 合川市| 博罗县| 乃东县| 长白| 房山区| 邯郸县| 宝清县| 松原市| 密云县| 乐东| 拉萨市| 华容县| 沈阳市| 太保市| 沅江市| 平顺县| 雅安市|