-2

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

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仅用调用后返回的值b.Children()和使用反射来覆盖值?或者那不可能?

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

4

1 回答 1

0

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

如果你有一个 type 的变量Meta,你可以使用类型断言来检查底层对象是否是 a *B,如果是,children直接从同一个包中访问。

更改切片的一种方法是添加另一个接口来做到这一点:

type childrenSetter interface {
   SetChildren([]Base)
}

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

这仅在底层类型实现SetChildren方法时才有效。

于 2021-07-27T04:45:42.577 回答