最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

標(biāo)準(zhǔn)庫里面提供了高度優(yōu)化的函數(shù)bytes.Equal來比較兩個字節(jié)類型的slice([]byte)

2.1 深度比較

自己寫一個方法,首先比較兩個slice的長度,再比較兩個slice對應(yīng)位置元素是否相等。

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
?? ?}
?? ?// 比較對應(yīng)位置的元素是否相同
?? ?for i := 0; i < len(slice1); i++ {
?? ??? ?if slice1[i] != slice2[i] {
?? ??? ??? ?return false
?? ??? ?} else {
?? ??? ??? ?continue
?? ??? ?}
?? ?}
?? ?return true
}

2.2 使用reflect.DeepEqual函數(shù)

使用反射包中提供的DeepEqual可以更加簡潔的實(shí)現(xiàn)。另外有些時候我們需要對結(jié)構(gòu)體對象進(jìn)行比較的時候,我們可以使用該函數(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、擴(kuò)展:如何在map中讓slice充當(dāng)key???

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

本質(zhì)上,其實(shí)是將slice按其字面轉(zhuǎn)化為string
%q 該值對應(yīng)的單引號括起來的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]
}

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

相關(guān)文章

  • 以Golang為例詳解AST抽象語法樹的原理與實(shí)現(xiàn)

    以Golang為例詳解AST抽象語法樹的原理與實(shí)現(xiàn)

    AST?使用樹狀結(jié)構(gòu)來表達(dá)編程語言的結(jié)構(gòu),樹中的每一個節(jié)點(diǎn)都表示源碼中的一個結(jié)構(gòu),本文將以GO語言為例,為大家介紹一下AST抽象語法樹的原理與實(shí)現(xiàn),希望對大家有所幫助
    2024-01-01
  • GO實(shí)現(xiàn)協(xié)程池管理的方法

    GO實(shí)現(xiàn)協(xié)程池管理的方法

    這篇文章給大家介紹GO實(shí)現(xiàn)協(xié)程池管理的方法,分別使用channel實(shí)現(xiàn)協(xié)程池和消費(fèi)者模式實(shí)現(xiàn)協(xié)程池,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • Golang使用Decimal庫避免運(yùn)算中精度損失詳細(xì)步驟

    Golang使用Decimal庫避免運(yùn)算中精度損失詳細(xì)步驟

    decimal是為了解決Golang中浮點(diǎn)數(shù)計(jì)算時精度丟失問題而生的一個庫,使用decimal庫我們可以避免在go中使用浮點(diǎn)數(shù)出現(xiàn)精度丟失的問題,下面這篇文章主要給大家介紹了關(guān)于Golang使用Decimal庫避免運(yùn)算中精度損失的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Golang基于JWT與Casbin身份驗(yàn)證授權(quán)實(shí)例詳解

    Golang基于JWT與Casbin身份驗(yàn)證授權(quán)實(shí)例詳解

    這篇文章主要為大家介紹了Golang基于JWT與Casbin實(shí)現(xiàn)身份驗(yàn)證授權(quán)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • go local history本地歷史恢復(fù)代碼神器

    go local history本地歷史恢復(fù)代碼神器

    這篇文章主要為大家介紹了go local history本地歷史恢復(fù)代碼神器的使用功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • golang字符串拼接實(shí)現(xiàn)方式和區(qū)別對比

    golang字符串拼接實(shí)現(xiàn)方式和區(qū)別對比

    本文介紹了Go語言中字符串拼接的多種方法及其優(yōu)缺點(diǎn),推薦使用strings.Builder進(jìn)行頻繁拼接以優(yōu)化內(nèi)存分配和性能,同時,還討論了通過sync.Pool優(yōu)化高頻創(chuàng)建的對象,以減少垃圾回收壓力,感興趣的朋友一起看看吧
    2025-02-02
  • Golang實(shí)現(xiàn)http重定向https

    Golang實(shí)現(xiàn)http重定向https

    這篇文章介紹了Golang實(shí)現(xiàn)http重定向https的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 深入探索Golang中的SM4加密解密算法

    深入探索Golang中的SM4加密解密算法

    SM4加密算法在安全性、高效性、簡單性、標(biāo)準(zhǔn)化和廣泛支持等方面具有優(yōu)勢,適用于各種數(shù)據(jù)保護(hù)和加密應(yīng)用場景,這篇文章就來和大家探索一下Golang中的SM4加密解密算法吧
    2023-06-06
  • 小學(xué)生也能看懂的Golang異常處理recover panic

    小學(xué)生也能看懂的Golang異常處理recover panic

    在其他語言里,宕機(jī)往往以異常的形式存在,底層拋出異常,上層邏輯通過 try/catch 機(jī)制捕獲異常,沒有被捕獲的嚴(yán)重異常會導(dǎo)致宕機(jī),go語言追求簡潔,優(yōu)雅,Go語言不支持傳統(tǒng)的 try…catch…finally 這種異常
    2021-09-09
  • GO語言對數(shù)組切片去重的實(shí)現(xiàn)

    GO語言對數(shù)組切片去重的實(shí)現(xiàn)

    本文主要介紹了GO語言對數(shù)組切片去重的實(shí)現(xiàn),主要介紹了幾種方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論

江城| 富蕴县| 微山县| 昭平县| 平度市| 普安县| 新竹县| 鸡东县| 明光市| 无棣县| 龙门县| 绥宁县| 衡山县| 罗江县| 新密市| 安徽省| 阿荣旗| 应城市| 黑山县| 银川市| 玉林市| 灌南县| 和硕县| 西平县| 新和县| 余姚市| 通海县| 河池市| 遵化市| 鄄城县| 丰顺县| 拜城县| 如东县| 宁都县| 治县。| 华容县| 渝北区| 恩平市| 乐业县| 德庆县| 德安县|