用于测试初始化​​的通用方法

时间:2015-11-03 10:59:28

标签: go

是否有一种通用的方法来测试Go中的初始变量?

鉴于这些测试:

package main

import "fmt"

type FooStruct struct {
    A string
    B int
}

type BarStruct struct {
    A string
    B int
    C map[int]string
}

func main() {
    // string isinital test
    var s string
    fmt.Println(s == "")

    // int isinital test
    var i int
    fmt.Println(i == 0)

    // primitive struct isinital test
    var fp FooStruct
    fmt.Println(fp == FooStruct{})

    // complex struct isinital test
    // fail -> invalid operation: fc == BarStruct literal (struct containing map[int]string cannot be compared)
    var fc BarStruct
    fmt.Println(fc == BarStruct{})

    // map isinital test
    var m map[string]int
    fmt.Println(len(m) == 0)

    // map isinital test 
    // fail -> invalid operation: m == map[string]int literal (map can only be compared to nil)
    fmt.Println(m == map[string]int{})
}

答:测试BarStruct初始化的正确方法是什么?

B:是否有一种通用的方法来测试任何var的初始值?

1 个答案:

答案 0 :(得分:1)

您可以使用reflect.DeepEqual

bs := BarStruct{}
fmt.Println(reflect.DeepEqual(bs, BarStruct{}))
// Output:
//   true

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

编辑:您还可以定义isZero辅助函数,如下所示:

func isZero(v interface{}) bool {
    zv := reflect.Zero(reflect.TypeOf(v)).Interface()
    return reflect.DeepEqual(v, zv)
}

这适用于任何类型:

fmt.Println(isZero(0))
fmt.Println(isZero(""))
fmt.Println(isZero(bs))
fmt.Println(isZero(map[int]int(nil)))