網站首頁 編程語言 正文
前言
開發中經常會遇到需要比較兩個slice
包含的元素是否完全相等的情況,在golang
中是不能夠直接通過 ==
來判斷兩個切片是否相等的,我們通常會通過兩種方法去比較切片是否相等,這里通過幾個示例來看一下這兩種方法,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
判斷兩個[]byte是否相等
因為在bytes
標準庫中提供了[]byte
的比較方法,所以我們不再需要重復造輪子了;示例如下:
package main import ( "bytes" "fmt" ) func main() { a := []byte{1,2,3} b := []byte{1,2} c := []byte{1,2,3} fmt.Println(bytes.Equal(a,b)) fmt.Println(bytes.Equal(a,c)) }
執行代碼輸出如下:
使用reflect判斷slice是否相等
我們還可以借助reflect包的reflect.DeepEqual方法來比較兩個切片是否相等。這個寫法很簡單:
// ReflectDeepEqual 直接使用 reflect 包的 reflect.DeepEqual 方法進行比較 func StringSliceReflectEqual(a, b []string) bool { return reflect.DeepEqual(a, b) }
手寫循環遍歷比較
我們都知道Golang中reflect效率很低,使用reflect通常需要付出性能代價,如果我們確定了slice的類型,那么自己實現slice的相等判斷相對來說也不是那么麻煩:
// LoopCompare 循環遍歷比較 // 先比較兩個數的長度是否相等 // 再循環遍歷每一個元素進行比較 func LoopCompare(a, b []int) bool { if len(a) != len(b) { return false } //與reflect.DeepEqual的結果保持一致:[]int{} != []int(nil) if (a == nil) != (b == nil) { return false } for i, v := range a { if v != b[i] { return false } } return true }
性能比較
借助Benchmark來簡單的測試比較下二者的性能。
package test import ( "reflect" "testing" ) var ( testA = []int{1,3,5,9,11,13} testB = []int{1,3,5,9,11,13,17,23} ) // BenchmarkReflectDeepEqual 測試 reflect.DeepEqual 效率 func BenchmarkReflectDeepEqual(b *testing.B) { for n := 0; n < b.N; n++ { ReflectDeepEqual(testA, testB) } } // BenchmarkLoopCompare 測試 循環比較 效率 func BenchmarkLoopCompare(b *testing.B) { for n := 0; n < b.N; n++ { LoopCompare(testA, testB) } }
在測試文件所在目錄執行go test -bench=.
命令
Benchmark對比測試結果:
根據測試結果我們可以得到:
- 使用reflect的方式,649 ns完成一次操作;
- 使用循環遍歷的方式,12.7 ns完成一次比較,效率對比十分明顯。
原因在于reflect 接收任意類型的參數,方法內部要對類型做判斷;循環遍歷僅支持已知固定類型,效率自然要高些。所以就只能忍痛放棄reflect了。
總結
以上就是整理的golang 判斷 兩個slice 是否相等全部內容,我們可以借助reflect包的reflect.DeepEqual方法來比較兩個切片是否相等,但是效率比較低,如果我們確定了slice的類型,我們可以手寫遍歷循環的方式來比較,相對效率比較高,希望文章能夠幫你解決golang 判斷 兩個slice 是否相等所遇到的程序開發問題。
原文鏈接:https://juejin.cn/post/7167584927976783880
相關推薦
- 2022-06-07 使用Docker容器部署rocketmq單機的全過程_docker
- 2023-02-09 最新解決'nvidia-smi'?不是內部或外部命令也不是可運行的程序_python
- 2023-04-08 react中實現拖拽排序react-dnd功能_React
- 2022-03-15 PEM_read_bio_X509_AUX() failed (SSL: error:0906D06
- 2022-12-23 Android入門之彈出式對話框的實現_Android
- 2022-12-24 淺析如何截獲C#程序產生的日志_C#教程
- 2023-03-03 react?native圖片解析流程詳解_React
- 2022-04-08 WPF控件模板與其觸發器_基礎應用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支