在Golang中获取特定接口的基础类型

3
作为一个例子,我能否从接口Work中获取其底层类型的零值?
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()
}

这里是 Go 语言的练习场。

1个回答

3

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

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

如果你向MakeSomething传递非指针类型的参数,上面的代码段将会抛出panic错误。为了防止这种情况发生,你可以采用以下方式:

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())

我的第一个问题,非常感谢~ 我发现了不同之处, fmt.Println(reflect.ValueOf(w).Type())//输出 *main.Testg fmt.Println(reflect.ValueOf(&w).Type())//输出 *main.Worker 在我使用第二种方式时(我认为这可以改变指向变量 w 的指针的值) - lin van
1
@linvan 不用谢!是的,&w 真的没什么用。它会给你一个指向包含值指针的接口的指针。在 Go 中,你很少(实际上从来不)使用指向接口的指针。 - ANisus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接