是否有一种通用的方法来测试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的初始值?
答案 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)))