在Go语言中比较多个结构体字段

6

我想知道是否有一种通用的方法可以单元测试一个相当大的结构体的值,而不必写许多if语句。 我知道在Go中我们可以使用表驱动的单元测试,但我还没有找到如何使用结构体实现这种表驱动的方法。

我的目标是创建一个结构体,对其进行操作,并对结构体的新值进行单元测试。 有人知道如何使用表驱动测试来实现这一点,或者有更好的方法吗?


你想检查所有字段还是只是其中一些? - Ainar-G
所有字段,如果只需要检查其中一些,我可以使用几个if语句来完成,但对于所有字段来说,这看起来并不是一个好的做法。 - jbrulmans
1个回答

5
如果您需要检查所有字段,只需比较结构体:
type S struct {
    A int
    B float64
}

func main() {
    fmt.Println(S{1, 3.14} == S{1, 3.14}) // Prints true.
}

请注意,如果您的结构体包含指针,可能会变得棘手,因为它们可能指向两个不同但相等的值。在这种情况下,您可以使用reflect.DeepEqual
type S2 struct {
    A int
    B *float64
}

func main() {
    var f1, f2 = 3.14, 3.14
    // Prints false because the pointers differ.
    fmt.Println(S2{1, &f1} == S2{1, &f2})
    // Prints true.
    fmt.Println(reflect.DeepEqual(S2{1, &f1}, S2{1, &f2}))
}

游乐场:http://play.golang.org/p/G24DbRDQE8

任何比这更复杂的东西很可能需要您定义自己的相等方法。


谢谢,特别是针对 reflect.DeepEqual。我现在想我会如何管理它了,因为我有点担心我的指针。干杯 - jbrulmans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接