Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go 两个map[string]interface{}相等

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

作者:妮蔻大眼睛

本文主要介绍了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{}相等内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文