广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang比较两个slice是否相等的问题
  • 615
分享到

Golang比较两个slice是否相等的问题

Golang比较两个slice相等Golang比较slice相等 2023-03-22 17:03:03 615人浏览 安东尼
摘要

目录1、为什么在golang中无法直接使用==来比较两个slice?2、如何实现两个slice的比较呢?2.1 深度比较2.2 使用reflect.DeepEqual函数3、扩展:如

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是否相等的问题的文章就介绍到这了,更多相关Golang比较两个slice相等内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Golang比较两个slice是否相等的问题

本文链接: https://www.lsjlt.com/news/200905.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang比较两个slice是否相等的问题
    目录1、为什么在Golang中无法直接使用==来比较两个slice?2、如何实现两个slice的比较呢?2.1 深度比较2.2 使用reflect.DeepEqual函数3、扩展:如...
    99+
    2023-03-22
    Golang比较两个slice相等 Golang比较slice相等
  • Golang怎么比较两个slice是否相等
    本篇内容介绍了“Golang怎么比较两个slice是否相等”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、为什么在Golang中无法直接使...
    99+
    2023-07-05
  • 详解Golang如何比较两个slice是否相等
    目录前言判断两个[]byte是否相等使用reflect判断slice是否相等手写循环遍历比较性能比较总结前言 开发中经常会遇到需要比较两个slice包含的元素是否完全相等的情况,在g...
    99+
    2022-11-21
    Golang比较slice是否相等 Golang比较slice Golang slice
  • java如何比较两个对象是否相等
    在Java中,可以使用equals()方法来比较两个对象是否相等。该方法是Object类的一个方法,所有的类都继承自Object类。...
    99+
    2023-10-24
    java
  • php怎么比较两个数组是否相等
    这篇“php怎么比较两个数组是否相等”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php怎么比较两个数组是否相等”文章吧。比...
    99+
    2023-06-30
  • 比较两个字符串是否相等的shell代码
    比较两个字符串是否相等的办法是: if [ "$test"x = "test"x ]; then 这里的关键有几点: 1 使用单个等号 2 注意到等号两边各有一个空格:这是unix shell的要求 3 注...
    99+
    2022-06-04
    字符串 两个 代码
  • 如何使用shell比较两个字符串是否相等
    这篇文章给大家分享的是有关如何使用shell比较两个字符串是否相等的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。比较两个字符串是否相等的办法是: if [ "$test"x = "t...
    99+
    2023-06-09
  • c语言怎么比较两个字符串是否相等
    在C语言中,可以使用strcmp函数来比较两个字符串是否相等。strcmp函数的原型为:int strcmp(const char ...
    99+
    2023-10-10
    c语言
  • 教你使用.NET快速比较两个byte数组是否相等
    目录前言评测方案几种不同的方案Memcmp64字长优化SIMDSseAvx2SequenceCompare总结参考文献前言 之前在群里面有群友问过一个这样的问题,在.NET中如何快速...
    99+
    2022-11-13
  • js如何比较两个单独的数组或对象是否相等
    这篇文章主要介绍js如何比较两个单独的数组或对象是否相等,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!所谓js的中的传值,其实也就是说5种基本数据类型(null,undefind,b...
    99+
    2022-10-19
  • Python字符串比较:如何判断两个字符串是否相等?
    Python字符串比较:如何判断两个字符串是否相等? 在Python编程中,字符串是最常用的数据类型之一。当我们需要比较两个字符串时,通常需要判断它们是否相等。这篇文章将详细介绍Python中比较两个字符串的方法。 使用“==”运算符比较...
    99+
    2023-08-22
    python 开发语言 java Python
  • Java比较两个对象中全部属性值是否相等的方法
    例如下述Java类: import java.io.Serializable; import java.util.List; public class Bean_Topolog...
    99+
    2022-11-12
  • es6如何比较2个数组的值是否相等
    本篇内容主要讲解“es6如何比较2个数组的值是否相等”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“es6如何比较2个数组的值是否相等”吧! ...
    99+
    2022-10-19
  • 怎么用Java比较两个对象中全部属性值是否相等
    本篇内容介绍了“怎么用Java比较两个对象中全部属性值是否相等”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!例如下述Java类:import...
    99+
    2023-06-20
  • GO比较两个对象是否相同实战案例
    目录前言DeepEqual 案例DeepEqual 原理总结前言 本文主要是来聊一聊关于 Golang 中的深度比较 DeepEqual 因为最近发现身边的小伙伴写 2 个或者多个 ...
    99+
    2022-12-08
    go 对象 go比较对象
  • Python 比较两个时间序列在图形上是否相似
    比较两个时间序列在图形上是否相似,可以通过以下方法:可视化比较:将两个时间序列绘制在同一张图上,并使用相同的比例和轴标签进行比较。可以观察它们的趋势、峰值和谷值等特征,从而进行比较。峰值和谷值比较:通过比较两个时间序列中的峰值和谷值来进行比...
    99+
    2023-05-14
    Python 序列 图形
  • 如何go语言比较两个对象是否深度相同
    前言: func DeepEqual(x, y interface{}) bool DeepEqual 函数的参数是两个 interface,实际上也就是可...
    99+
    2022-06-07
    GO 对象 go语言
  • 怎么用go语言比较两个对象是否深度相同
    这篇文章主要介绍“怎么用go语言比较两个对象是否深度相同”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用go语言比较两个对象是否深度相同”文章能帮助大家解决问题。前言:func Dee...
    99+
    2023-06-30
  • Java怎么比较两个对象并获取不相等的字段
    这篇文章主要介绍“Java怎么比较两个对象并获取不相等的字段”,在日常操作中,相信很多人在Java怎么比较两个对象并获取不相等的字段问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java怎么比较两个对象并获取...
    99+
    2023-06-21
  • Python怎么比较两个时间序列在图形上是否相似
    这篇“Python怎么比较两个时间序列在图形上是否相似”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python怎么比较两个...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作