为了账号安全,请及时绑定邮箱和手机立即绑定

在 go 中测试初始值的通用方法

在 go 中测试初始值的通用方法

Go
回首忆惘然 2021-11-22 10:39:47
有没有一种通用的方法可以在 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)))


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信