登录
首页 >  Golang >  Go问答

使用reflect设置接口方法返回的接口值

来源:stackoverflow

时间:2024-02-17 18:00:24 391浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《使用reflect设置接口方法返回的接口值》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

给定一个返回指针类型切片但包装为接口类型的接口。是否可以修改这些值?

type base interface {
    do()
}

type meta interface {
    base
    children() []base
}

type a struct {
}

func (a *a) do() {
}

type b struct {
    children []base
}

func (b *b) children() []base {
    return b.children
}

如果代码按如下方式初始化:

a := &A{}
b := &B{children: []Base{a}}

是否可以仅使用调用 b.children() 和使用 reflect 后返回的值来覆盖 b.children 处的值?或者说这是不可能的?

https://play.golang.net/p/rvmsdvnlq6a


正确答案


接口方法 children() []base 从底层结构返回切片头的副本。您可以修改切片的元素,但不能修改接口引用的对象中包含的切片。

如果您有 meta 类型的变量,则可以使用类型断言来检查底层对象是否为 *b,如果是,则直接从同一包访问 children

更改切片的一种方法是添加另一个接口来执行此操作:

type childrenSetter interface {
   SetChildren([]Base)
}

...
if setter, ok:=intf.(childrenSetter); ok {
   setter.SetChildren(newChildren)
}

仅当底层类型实现 setchildren 方法时,这才有效。

理论要掌握,实操不能落!以上关于《使用reflect设置接口方法返回的接口值》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>