猿问

在 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{})

}

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


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


回首忆惘然
浏览 165回答 1
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)))
随时随地看视频慕课网APP

相关分类

Go
我要回答