如何解决是否通过接口{}传递对象还没有初始化字段

Mbd*_*ded 0 interface go

我有问题解决是否作为函数的接口传递的对象没有初始化字段,像被定义为刚才的对象someObject{}是空的,因为所有字段,值为0或nil

如果我传递不同的对象,问题会变得更复杂,因为每个对象都有不同的类型字段值,所以在这一刻我找不到通用的方法.

func main(){
    oo := objectOne{}
    ot := objectTwo{}
    oth := objectThree{"blah" , "balbal" , "blaal"}
    resolveIsNotIntialized(oo)
    resolveIsNotIntialized(ot)
    resolveIsNotIntialized(oth)
}

func resolveIsNotIntialized(v interface{}) bool{
    // and below, how resolve that oo and ot is empty
    if (v.SomeMethodWhichCanResolveThatAllFiledIsNotIntialized){
        return true
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)

我想避免使用switch如下所示的用法语句,并为每个对象添加额外的功能,如果可能的话.

func unsmartMethod(v interface{}) bool{
    switch v.(type){
    case objectOne:
        if v == (objectOne{}) {
          return true
        }
        // and next object, and next....
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ier 6

正如弗兰克所说,这可能是一个坏主意.每个值始终在Go中初始化.您的实际问题是类型是否等于零值.通常,Zero值应设计为有效.更好的方法通常是创建一个接口:

type ZeroChecker interface {
    IsZero() bool
}
Run Code Online (Sandbox Code Playgroud)

然后将其附加到您要检查的任何类型.(或者可能更好:IsValid()改为创建测试而不是向后做逻辑.)

也就是说,通过将其与Zero进行比较,可以通过反射检查这一点.

func resolveIsNotIntialized(v interface{}) bool {
    t := reflect.TypeOf(v)
    z := reflect.Zero(t).Interface()
    return reflect.DeepEqual(v, z)
}
Run Code Online (Sandbox Code Playgroud)

(你或许可以return v == z在这里逃脱;我没有考虑过所有可能的情况.)