栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

go中的reflect.ValueOf()和Value.Elem()有什么区别?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

go中的reflect.ValueOf()和Value.Elem()有什么区别?

reflect.ValueOf()
是一个 函数
,请将其视为反射的切入点。当您具有“非反射”值(例如
string
或)时
int
,可以
reflect.ValueOf()
用来获取其
reflect.Value
描述符。

Value.Elem()
是一个 方法
reflect.Value
。因此,只有在您已有时,才可以使用它
reflect.Value
。您可以
Value.Elem()
用来获取
reflect.Value
由原始包装的值所指向的值()
reflect.Value
。请注意,您也可以使用
reflect.Indirect()
它。还有一个“用例”
Value.Elem()
,但是它更“高级”,我们在答案的最后返回。

要“离开”反射,可以使用常规

Value.Interface()
方法,该方法将包装的值作为返回
interface{}

例如:

var i int = 3var p *int = &ifmt.Println(p, i)v := reflect.ValueOf(p)fmt.Println(v.Interface()) // This is the p pointerv2 := v.Elem()fmt.Println(v2.Interface()) // This is i's value: 3

这将输出(在Go Playground上尝试):

0x414020 30x4140203

有关Go反射的重要介绍,请阅读The Go Blog:反射法则。尽管如果您只是从Go开始,我会专注于其他事情,并为以后的冒险留神。

另一个用例
Value.Elem()

这是一个高级主题,所以如果您不了解它,请不要惊慌。 不用了

我们看到了

Value.Elem()
当指针包装在时如何用于“导航”
reflect.Value
。的医生
Value.Elem()
说:

Elem返回接口v包含的值或指针v指向的值。

因此,如果

reflect.Value
包装一个接口值,
Value.Elem()
也可以用来获取包装在该接口值中的具体值。

Go中的接口是它自己的主题,对于内部结构而言,您可以阅读Russ
Cox的Go数据结构:接口。再次重申,不一定是Go入门者的主题。

基本上,无论您传递给什么值

reflect.ValueOf()
,如果它还不是接口值,它将被
interface{}
隐式包装。如果传递的值已经是接口值,则存储在其中的具体值将作为传递
interface{}
。如果您将指针传递给接口,则会出现第二个“用例”(否则,在Go!中非常罕见)。

因此,如果将指针传递给接口,则该指针将包装在一个

interface{}
值中。您可以使用
Value.Elem()
来获得目标值,该目标值将是接口值(而不是具体值),
Value.Elem()

再次 使用它可以得到具体值。

这个例子说明了这一点:

var r io.Reader = os.Stdin // os.Stdin is of type *os.File which implements io.Readerv := reflect.ValueOf(r) // r is interface wrapping *os.File valuefmt.Println(v.Type())   // *os.Filev2 := reflect.ValueOf(&r) // pointer passed, will be wrapped in interface{}fmt.Println(v2.Type())    // *io.Readerfmt.Println(v2.Elem().Type())        // navigate to pointed: io.Reader (interface type)fmt.Println(v2.Elem().Elem().Type()) // 2nd Elem(): get concrete value in interface: *os.File

在Go Playground上尝试一下。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484355.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号