我在解决作为接口传递给函数的对象是否没有初始化字段(如定义为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
}
我想避免使用switch
如下的用法声明,避免使用每个对象的附加功能,如果可能的话。
func unsmartMethod(v interface{}) bool{
switch v.(type){
case objectOne:
if v == (objectOne{}) {
return true
}
// and next object, and next....
}
return false
}
正如弗兰克指出的那样,这可能是个坏主意。每个值始终在Go中初始化。您的实际问题是类型是否等于其零值。通常,零值的设计应使其有效。更好的方法通常是按照以下方式创建接口:
type ZeroChecker interface {
IsZero() bool
}
然后将其附加到要检查的任何类型。(或者可能更好:创建一个IsValid()
测试而不是向后做逻辑。)
就是说,可以通过将其与零进行比较来进行反射检查。
func resolveIsNotIntialized(v interface{}) bool {
t := reflect.TypeOf(v)
z := reflect.Zero(t).Interface()
return reflect.DeepEqual(v, z)
}
(您也许可以摆脱return v == z
这里;我还没有考虑所有可能的情况。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句