【问题标题】:get underlying type from a specific interface in golang从 golang 中的特定接口获取底层类型
【发布时间】:2017-09-20 05:59:23
【问题描述】:

例如,我可以从接口 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()
}

the playground

【问题讨论】:

    标签: go reflection


    【解决方案1】:

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

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

    如果你传入一个指向MakeSomething 的非指针,上面的代码sn-p 将会崩溃。为防止这种情况,您可能需要执行以下操作:

    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())//print *main.Testgfmt.Println(reflect.ValueOf(&w).Type())//print *main.Worker在我使用第二种方式的情况下(我认为这可以改变w指向的值)
    • @linvan 不客气!是的,&w 真的没用。它会给你一个指向包含指向值的指针的接口的指针。而且你很少(从不,真的)在 Go 中使用指向接口的指针。
    猜你喜欢
    • 2015-06-02
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多