我有问题解决是否作为函数的接口传递的对象没有初始化字段,像被定义为刚才的对象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)
正如弗兰克所说,这可能是一个坏主意.每个值始终在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在这里逃脱;我没有考虑过所有可能的情况.)