您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Go语言

Golang中如何判断两个Slice是否相等?

时间:2023-03-31 12:02:58  来源:今日头条  作者:路多辛


在 Golang 中,要判断两个 slice 是否相等是不能直接使用 == 运算符的(== 只能说明 两个 slice 是否指向同一个底层数组)。如果两个 slice 的底层数组相同,但长度或容量不同,则仍然不相等;反之,如果两个 slice 的底层数组不同,即使有相同的元素也不相等。因此,为了判断两个 slice 是否相等,需要比较它们的元素。

循环遍历比较

下面是一种比较 slice 是否相等的通用方法,需要遍历两个 slice 内的元素并进行逐个比较:

package main

func equalWithLoop(a, b []int) bool {
    if len(a) != len(b) { // 长度不同,直接返回 false
        return false
    }
  
    if (a == nil) != (b == nil) {
        return false
    }
  
    for i, v := range a { // 每个元素逐一比较
        if v != b[i] {
            return false
        }
    }
    return true
}

首先,通过 len 函数比较长度,如果长度不同,那么肯定不相等,直接返回 false。然后,把 []int{} != []int(nil) 这种情况也考虑进去。最后使用 for 循环逐一比较每个元素,如果发现有不相等的元素,返回 false,如果遍历结束后没有发现不相等的元素,返回 true。

需要注意的是,这种方法只适用于切片元素是可比较类型的情况。如果切片元素是结构体等不可比较类型,则需要使用 reflect.DeepEqual 函数来比较两个切片是否相等。

reflect比较

可以使用 reflect.DeepEqual() 函数来进行比较,这个函数会递归比较两个 slice 中的元素,如果完全相同,则返回true,否则返回false。示例代码如下:

package main

import "reflect"

func equalWithReflect(a, b []int) bool {
    return reflect.DeepEqual(a, b)
}

这种方法虽然很简洁,但是由于使用了反射和递归,效率比较低。

两种方法效率对比

接下来使用Benchmark来简单测试下两种方法的效率,编写测试代码如下:

package main

import "testing"

func BenchmarkEqualWithLoop(b *testing.B) {
   sa := []int{1, 3, 5, 7, 9}
   sb := []int{2, 4, 6, 8, 0}
   b.ResetTimer()
   for n := 0; n < b.N; n++ {
      equalWithLoop(sa, sb)
   }
}

func BenchmarkEqualWithReflect(b *testing.B) {
   sa := []int{1, 3, 5, 7, 9}
   sb := []int{2, 4, 6, 8, 0}
   b.ResetTimer()
   for n := 0; n < b.N; n++ {
      equalWithReflect(sa, sb)
   }
}

在测试文件所在目录运行如下命令

go test -bench=.

在我电脑上运行结果如下

luduoxin$ go test -bench=.
goos: darwin
goarch: amd64
pkg: test/cmp
cpu: Intel(R) Core(TM) i5-8259U CPU @ 2.30GHz
BenchmarkEqualWithLoop-8        1000000000               0.8794 ns/op
BenchmarkEqualWithReflect-8      6162374               196.2 ns/op
PASS
ok      hello/slice     2.847s

可以看出reflect方式要慢上几个数量级。



Tags:Golang   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在 Golang 中,要判断两个 slice 是否相等是不能直接使用 == 运算符的(== 只能说明 两个 slice 是否指向同一个底层数组)。如果两个 slice 的底层数组相同,但长度或容量不同,则仍...【详细内容】
2023-03-31  Tags: Golang  点击:(0)  评论:(0)  加入收藏
前言大家好,我是星期八,是一个每天都要在镜子前给自己梳仅剩三根头发的三年码农本次我们来安排一下如何在win平台上配置Go语言开发环境。整体来说,Go配置环境还是挺轻松的,和Py...【详细内容】
2023-03-29  Tags: Golang  点击:(8)  评论:(0)  加入收藏
这篇文章是Go语言学习资料的精髓,可以让你终身受益,汇集Golang各种资料的精髓,以下是一些初学者如何学习golang的方法和学习资料。如果你是新手,以下就是学习Golang的过程:1.了解...【详细内容】
2023-03-16  Tags: Golang  点击:(3)  评论:(0)  加入收藏
背景一谈到golang,大家的第一感觉就是高并发,高性能。但是语言本身的优势是不是,就让程序员觉得编写高性能的处理系统变得轻而易举,水到渠成呢。下面这篇文章给大家的提醒便是,...【详细内容】
2023-03-13  Tags: Golang  点击:(50)  评论:(0)  加入收藏
在日常开发中,经常会遇到在程序中获取路径的问题。相信很多同学被这个问题搞得头痛不已,可能也没有深入思考过这个问题,在网上搜到相关代码就稀里糊涂得使用了,也没有在不同的...【详细内容】
2023-03-13  Tags: Golang  点击:(26)  评论:(0)  加入收藏
本文就介绍两个专门用来开发命令行应用程序的库。在日常开发中,大家对命令行工具(CLI)想必特别熟悉了,如果说你不知道命令工具,那你可能是个假开发。每天都会使用大量的命令行工...【详细内容】
2023-02-21  Tags: Golang  点击:(29)  评论:(0)  加入收藏
请遵守法律法规,文章旨在提高安全软件的应变策略,严禁非法使用。整体利用思路:生成器生成AES加密的Shellcode, 加载器代码中无Shellcode,参数接受。1. 生成shellcode以下以cs为...【详细内容】
2022-12-01  Tags: Golang  点击:(166)  评论:(0)  加入收藏
写在前边:国内有很多的邮件服务商,尤其几个大的云厂商都有非常成熟的邮件推送服务,如果可以的话,建议大家直接使用国内云厂商的服务。我们公司因为做的国际业务,很多东西都在亚马...【详细内容】
2022-09-27  Tags: Golang  点击:(251)  评论:(0)  加入收藏
简介本文主要通过探究在golang 中map的数据结构及源码实现来学习和了解map的特性,共包含map的模型探究、存取、扩容等内容。欢迎大家共同讨论。Map 的底层内存模型在 golang...【详细内容】
2022-08-15  Tags: Golang  点击:(118)  评论:(0)  加入收藏
一 背景日常我们会看一些开源项目,或者想看自己写的代码可视化,在golang中可以利用工具实现,go-callvis是以图片的形式展示了go程序的调用关系,在看复杂项目时尤其有用。二 go-...【详细内容】
2022-08-14  Tags: Golang  点击:(312)  评论:(0)  加入收藏
▌简易百科推荐
在 Golang 中,要判断两个 slice 是否相等是不能直接使用 == 运算符的(== 只能说明 两个 slice 是否指向同一个底层数组)。如果两个 slice 的底层数组相同,但长度或容量不同,则仍...【详细内容】
2023-03-31  路多辛  今日头条  Tags:Golang   点击:(0)  评论:(0)  加入收藏
近期在Twitter上看到一个名为“Command Line Interface Guidelines”的站点[1],这个站点汇聚了帮助大家编写出更好命令行程序的哲学与指南。这份指南基于传统的Unix编程原则[...【详细内容】
2023-03-31  白明的赞赏账户  微信公众号  Tags:Go   点击:(1)  评论:(0)  加入收藏
前言大家好,我是星期八,是一个每天都要在镜子前给自己梳仅剩三根头发的三年码农本次我们来安排一下如何在win平台上配置Go语言开发环境。整体来说,Go配置环境还是挺轻松的,和Py...【详细内容】
2023-03-29  星期八  Go语言进阶学习  Tags:Golang   点击:(8)  评论:(0)  加入收藏
背景我们在使用kubernetes的客户端k8s.io/client-go 进行开发的时候,比如写个CRD的operator, 经常会用到队列这种数据结构。并且很多时候,我们在做服务器端后台开发的时候,需要...【详细内容】
2023-03-28  研道鸠摩智  今日头条  Tags:Go语言   点击:(6)  评论:(0)  加入收藏
本文转载自微信公众号「洋芋编程」,作者蛮荆 。转载本文请联系洋芋编程公众号。在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决...【详细内容】
2023-03-21  洋芋编程  微信公众号  Tags:Go 语言   点击:(5)  评论:(0)  加入收藏
1、定义结点package mainimport ( "fmt")// 定义结点type BinaryTreeNode struct { Data int Left *BinaryTreeNode Right *BinaryTreeNode}2、创建结点// 创...【详细内容】
2023-03-16  奇幻小鱼k    Tags:Go语言   点击:(13)  评论:(0)  加入收藏
这篇文章是Go语言学习资料的精髓,可以让你终身受益,汇集Golang各种资料的精髓,以下是一些初学者如何学习golang的方法和学习资料。如果你是新手,以下就是学习Golang的过程:1.了解...【详细内容】
2023-03-16  雅心心    Tags:Golang   点击:(3)  评论:(0)  加入收藏
前言本文是根据阳哥 知识星球中的资料 整理的学习笔记,第一章关于Go语言中常见的语法现象。我的思考:一门语言中的语法都是固定的,基础语法几乎都差不多,本篇文章涉及到 Go 入门...【详细内容】
2023-03-14  程序员升级打怪之旅    Tags:Go   点击:(14)  评论:(0)  加入收藏
背景一谈到golang,大家的第一感觉就是高并发,高性能。但是语言本身的优势是不是,就让程序员觉得编写高性能的处理系统变得轻而易举,水到渠成呢。下面这篇文章给大家的提醒便是,...【详细内容】
2023-03-13  研道鸠摩智  今日头条  Tags:Golang   点击:(50)  评论:(0)  加入收藏
在日常开发中,经常会遇到在程序中获取路径的问题。相信很多同学被这个问题搞得头痛不已,可能也没有深入思考过这个问题,在网上搜到相关代码就稀里糊涂得使用了,也没有在不同的...【详细内容】
2023-03-13  路多辛  今日头条  Tags:Golang   点击:(26)  评论:(0)  加入收藏
站内最新
站内热门
站内头条