欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang比較兩個slice是否相等的問題

 更新時間:2023年03月22日 16:10:07   作者:ccgkk  
本文主要介紹了Golang比較兩個slice是否相等的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

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

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

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

2、如何實現(xiàn)兩個slice的比較呢?

標準庫里面提供了高度優(yōu)化的函數(shù)bytes.Equal來比較兩個字節(jié)類型的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函數(shù)

使用反射包中提供的DeepEqual可以更加簡潔的實現(xiàn)。另外有些時候我們需要對結(jié)構(gòu)體對象進行比較的時候,我們可以使用該函數(shù)

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的底層實現(xiàn)原理)僅對元素做淺拷貝,這就要求散列表里面的鍵在散列表的整個生命周期內(nèi)必須保持不變。因此正常情況下,我們無法讓一個slice作為一個map的鍵,但是如果有這樣的業(yè)務需要我們怎么來實現(xiàn)呢?

本質(zhì)上,其實是將slice按其字面轉(zhuǎn)化為string
%q 該值對應的單引號括起來的go語法字符字面值,必要時會采用安全的轉(zhuǎn)義表示

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是否相等的問題的文章就介紹到這了,更多相關Golang比較兩個slice相等內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一文初探Go語言中的reflect反射包

    一文初探Go語言中的reflect反射包

    這篇文章主要和大家分享一下Go語言中的reflect反射包,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的小伙伴可以參考一下
    2022-12-12
  • Golang如何使用go.mod配置加載本地模塊

    Golang如何使用go.mod配置加載本地模塊

    這篇文章主要介紹了Golang如何使用go.mod配置加載本地模塊問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 解決Go語言中高頻次和高并發(fā)下隨機數(shù)重復的問題

    解決Go語言中高頻次和高并發(fā)下隨機數(shù)重復的問題

    在Golang中,獲取隨機數(shù)的方法一般會介紹有兩種,一種是基于math/rand的偽隨機,一種是基于crypto/rand的真隨機,math/rand由于其偽隨機的原理,經(jīng)常會出現(xiàn)重復的隨機數(shù),導致在需要進行隨機的業(yè)務出現(xiàn)較多的重復問題,所以本文給大家介紹了較好的解放方案
    2023-12-12
  • GoFrame框架garray并發(fā)安全數(shù)組使用開箱體驗

    GoFrame框架garray并發(fā)安全數(shù)組使用開箱體驗

    這篇文章主要介紹了GoFrame框架garray并發(fā)安全數(shù)組使用開箱體驗,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Go?的入口函數(shù)和包初始化的使用

    Go?的入口函數(shù)和包初始化的使用

    本文主要介紹了Go?的入口函數(shù)和包初始化的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • 淺談Go連接池的設計與實現(xiàn)

    淺談Go連接池的設計與實現(xiàn)

    本文主要介紹了淺談Go連接池的設計與實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • gin框架中使用JWT的定義需求及解析

    gin框架中使用JWT的定義需求及解析

    這篇文章主要為介紹了gin框架中使用JWT的定義需求及解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • GoLang中panic與recover函數(shù)以及defer語句超詳細講解

    GoLang中panic與recover函數(shù)以及defer語句超詳細講解

    這篇文章主要介紹了GoLang的panic、recover函數(shù),以及defer語句,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • Golang中Map按照Value大小排序的方法實例

    Golang中Map按照Value大小排序的方法實例

    這篇文章主要給大家介紹了關于Golang中Map按照Value大小排序的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03
  • 一文帶你掌握go中的異常處理

    一文帶你掌握go中的異常處理

    代碼在執(zhí)行的過程中可能因為一些邏輯上的問題而出現(xiàn)錯誤,我們稱之為異常,那么如何處理這些異常呢,下面小編就來和大家詳細聊聊golang中的異常處理機制吧
    2023-09-09

最新評論