从内部访问外部结构

问题描述 投票:-2回答:2

我有一个与此问题类似的问题:accessing struct fields from embedded struct,除了有一个嵌套结构而不是嵌入式结构。

基本上,我需要从嵌套结构访问外部结构的可能性。但是,在已接受的答案中建议的组合方法不适合我当前的“结构结构”,因此,如果不进行一些繁琐的重构,它实际上就不适用。

相反,我想到了将指向外部结构的指针嵌入内部结构的想法:

type Outer struct {
    someField   int
    innerStruct Inner
}

type Inner struct {
    outerStruct *Outer
}

func test() {
    outer := Outer{someField:123}
    inner := Inner{outerStruct:&outer}
    outer.innerStruct = inner
    println(inner.outerStruct.someField) // just to test
}

所以,现在我想知道,从意识形态上讲,这对Go是否有效?而且此方法是否有任何弊端?

go
2个回答
0
投票

具有指向外部结构的指针是唯一的方法。缺点是您必须确保指针已初始化。因此,类似构造函数的功能可能会有所帮助:

func NewOuter() *Outer {
  ret:=Outer{}
  ret.outer=&ret
  return &ret
}

此外,您还必须介意如何传递Outer,因为内部结构体中的指针可能最终指向您不期望的Outer实例:

func f(o Outer) {
   g(&o)
}

以上,g将获得Outer的实例,并且其指针指向的Outer实例与其获得的实例不同。


0
投票

如果您确实要执行此操作,则需要确保您从未制作过外部副本,因为副本的内部指向错误的外部。

有关如何制作无法复制的结构,请参见sync.Mutex或WaitGroup。

© www.soinside.com 2019 - 2024. All rights reserved.