从golang中的特定接口获取底层类型

时间:2017-09-20 05:59:23

标签: go reflection

作为示例,我可以从界面工作中获取其基础类型的零值吗?

func MakeSomething(w Worker){
    w.Work()

    //can I get a zeor value type of The type underlying w?
    //I tried as followed, but failed

    copy :=w
    v := reflect.ValueOf(&copy)
    fm :=v.Elem()
    modified :=reflect.Zero(fm.Type())//fm.type is Worker, and modified comes to be nil
    fm.Set(modified)
    fmt.Println(copy)
}

type Worker interface {
    Work()
}

the playground

1 个答案:

答案 0 :(得分:2)

由于w包含指向Worker的指针,因此您可能希望获得指向的元素的零值。获得元素后,您可以创建其类型的零值:

v := reflect.ValueOf(w).Elem() // Get the element pointed to
zero := reflect.Zero(v.Type()) // Create the zero value

如果您将非指针传递给MakeSomething,则上面的代码段会发生混乱。为防止出现这种情况,您可能需要执行以下操作:

v := reflect.ValueOf(w)
if reflect.TypeOf(w).Kind() == reflect.Ptr {
    v = v.Elem()
}
zero := reflect.Zero(v.Type())

如果您确实希望获得指向新Worker的指针,只需将reflect.Zero(v.Type())替换为reflect.New(v.Type())