有没有一种通用的方法可以在 Go 中测试变量的初始值?鉴于这些测试:package mainimport "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{})}A: 什么是测试BarStruct初始的正确方法?B:有没有一种通用的方法来测试任何 var 的初始值?
1 回答
慕沐林林
TA贡献2016条经验 获得超9个赞
您可以使用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)))
- 1 回答
- 0 关注
- 164 浏览
添加回答
举报
0/150
提交
取消