gpt4 book ai didi

go - 从 golang 中的特定接口(interface)获取底层类型

转载 作者:IT王子 更新时间:2023-10-29 01:57:39 32 4
gpt4 key购买 nike

作为示例,我可以从接口(interface) 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

最佳答案

由于 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()).

关于go - 从 golang 中的特定接口(interface)获取底层类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46314316/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com