栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > 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号