Go语言中比较两个map[string]interface{}是否相等

 更新时间:2023年08月10日 11:15:15   作者:妮蔻大眼睛  
本文主要介绍了Go语言中比较两个map[string]interface{}是否相等,我们可以将其转化成顺序一样的 slice ,然后再转化未json,具有一定的参考价值,感兴趣的可以了解一下

Go语言中Map是无序的

再Go语言中,Map是一个内置类型,它将键与值绑定在一起,可以通过键获取响应的值。

由于Go Map内部不存储机制是以key为hash的结构来实现的,所以顺序是混乱的。

举例说明:在两次遍历中读取数据的顺序是不一样的。

func main() {
    a := map[string]interface{}{
        "orange": "1",
        "apple":  "2",
        "banana": "3",
    }
    fmt.Println("第一遍:")
    for k, v := range a {
        fmt.Print(k + " : ")
        fmt.Println(v)
    }
    fmt.Println("第二遍:")
    for k, v := range a {
        fmt.Print(k + " : ")
        fmt.Println(v)
    }
}

执行结果:

第一遍:
apple : 2
banana : 3
orange : 1
第二遍:
banana : 3
orange : 1
apple : 2

因为Go中的Map是无序的,所以每次读取都不一样。

Go interface{}无法比较是否相等

Go 语言中两个 interface{} 是无法比较是否相等的。因为类型不确定,任何类型的数据都可以被塞到interface{}中。

那么如何比较两个map[string]interface{} 是否相等呢?

首先,我们可以将它们转化为 json 字符串来比较即可,但是因为Map是无序的,所以转化的json字符串不一定会一模一样。(当然,你也可以用反射来做,但是代码量多,麻烦。)

所以我们可以将其转化成顺序一样的 slice ,然后再转化未 json 。 这样就确保的json可以一样了。

代码如下:

func CompareTwoMapInterface(data1 map[string]interface{}, 
                        data2 map[string]interface{}) bool {
    keySlice := make([]string, 0)
    dataSlice1 := make([]interface{}, 0)
    dataSlice2 := make([]interface{}, 0)
    for key, value := range data1 {
        keySlice = append(keySlice, key)
        dataSlice1 = append(dataSlice1, value)
    }
    for _, key := range keySlice {
        if data, ok := data2[key]; ok {
            dataSlice2 = append(dataSlice2, data)
        } else {
            return false
        }
    }
    dataStr1, _ := json.Marshal(dataSlice1)
    dataStr2, _ := json.Marshal(dataSlice2)
    return string(dataStr1) == string(dataStr2)
}

到此这篇关于Go语言中比较两个map[string]interface{}是否相等的文章就介绍到这了,更多相关Go 两个map[string]interface{}相等内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言对JSON数据进行序列化和反序列化

    Go语言对JSON数据进行序列化和反序列化

    这篇文章介绍了Go语言对JSON数据进行序列化和反序列化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • golang模拟实现带超时的信号量示例代码

    golang模拟实现带超时的信号量示例代码

    这篇文章主要给大家介绍了关于golang模拟实现带超时的信号量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-09-09
  • 利用Go语言实现二叉搜索树

    利用Go语言实现二叉搜索树

    二叉树是一种常见并且非常重要的数据结构,在很多项目中都能看到二叉树的身影,当然它也有很多变种,本文要介绍的是二叉搜索树的实现,希望对大家有所帮助
    2023-07-07
  • golang快速实现网页截图的方法

    golang快速实现网页截图的方法

    这篇文章主要介绍了golang快速实现网页截图的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Golang变量直接初始化的方法详解

    Golang变量直接初始化的方法详解

    在 Go 语言中,我们常用的数据结构有在Go语言中,你可以初始化不同的数据结构,例如数组、切片、结构体、指针、map等,本文将给大家介绍一下Golang变量直接初始化的方法,需要的朋友可以参考下
    2023-08-08
  • go语言算法题解二叉树的拷贝、镜像和对称

    go语言算法题解二叉树的拷贝、镜像和对称

    这篇文章主要为大家详细介绍了go语言算法题解二叉树的拷贝、镜像和对称,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-01-01
  • GO语言开发环境搭建过程图文详解

    GO语言开发环境搭建过程图文详解

    这篇文章主要介绍了GO语言开发环境搭建过程图文详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Golang中的变量学习小结

    Golang中的变量学习小结

    本文主要带大家学习了Golang里面的四大类型的变量,十分的详细,有需要的小伙伴可以参考下
    2018-10-10
  • Golang标准库syscall详解(什么是系统调用)

    Golang标准库syscall详解(什么是系统调用)

    最近在研究go语言,发现go语言系统调用源码只有调用函数的定义,今天通过本文给大家分享Golang标准库syscall详解及什么是系统调用,感兴趣的朋友一起看看吧
    2021-05-05
  • 一文详解Golang协程调度器scheduler

    一文详解Golang协程调度器scheduler

    这篇文章主要介绍了一文详解Golang协程调度器scheduler,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07

最新评论