登录
首页 >  Golang >  Go问答

如何在 Golang 中测试 map 的等价性?

来源:Golang技术栈

时间:2023-04-12 21:33:00 464浏览 收藏

大家好,我们又见面了啊~本文《如何在 Golang 中测试 map 的等价性?》的内容中将会涉及到golang等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我有一个像这样的表驱动测试用例:

func CountWords(s string) map[string]int

func TestCountWords(t *testing.T) {
  var tests = []struct {
    input string
    want map[string]int
  }{
    {"foo", map[string]int{"foo":1}},
    {"foo bar foo", map[string]int{"foo":2,"bar":1}},
  }
  for i, c := range tests {
    got := CountWords(c.input)
    // TODO test whether c.want == got
  }
}

我可以检查长度是否相同并编写一个循环来检查每个键值对是否相同。map[string]string但是当我想将它用于另一种类型的地图(例如)时,我必须再次编写此检查。

我最终做的是,我将地图转换为字符串并比较字符串:

func checkAsStrings(a,b interface{}) bool {
  return fmt.Sprintf("%v", a) != fmt.Sprintf("%v", b) 
}

//...
if checkAsStrings(got, c.want) {
  t.Errorf("Case #%v: Wanted: %v, got: %v", i, c.want, got)
}

这假设等效映射的字符串表示是相同的,在这种情况下似乎是正确的(如果键相同,则它们散列到相同的值,因此它们的顺序将相同)。有一个更好的方法吗?在表驱动测试中比较两个地图的惯用方法是什么?

正确答案

Go 库已经涵盖了你。做这个:

import "reflect"
// m1 and m2 are the maps we want to compare
eq := reflect.DeepEqual(m1, m2)
if eq {
    fmt.Println("They're equal.")
} else {
    fmt.Println("They're unequal.")
}

如果您查看 's 案例的源代码您会发现它首先检查两个映射是否为 nil,然后检查它们是否具有相同的长度,最后检查它们是否具有相同的 (key,值)对。reflect.DeepEqualMap

因为reflect.DeepEqual采用接口类型,所以它将适用于任何有效的地图(map[string]bool, map[struct{}]interface{}等)。请注意,它也适用于非映射值,因此请注意您传递给它的实际上是两个映射。如果你给它传递两个整数,它会很高兴地告诉你它们是否相等。

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何在 Golang 中测试 map 的等价性?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表