Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 从内部进入外部结构_Go - Fatal编程技术网

Go 从内部进入外部结构

Go 从内部进入外部结构,go,Go,我有一个与此类似的问题:,除了有一个嵌套结构,而不是嵌入式结构 基本上,我需要的是从嵌套结构访问外部结构的可能性。然而,在公认的答案中建议的组合方法不适合我当前的结构结构,因此如果没有一些繁琐的重构,它就不适用 相反,我想到了将指向外部结构的指针嵌入内部结构的想法: 类型外部结构{ someField int 内部结构内部 } 类型内部结构{ 外部构造*外部 } func检验{ 外部:=外部{someField:123} 内部:=内部{outerStruct:&outer} outer.inne

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

基本上,我需要的是从嵌套结构访问外部结构的可能性。然而,在公认的答案中建议的组合方法不适合我当前的结构结构,因此如果没有一些繁琐的重构,它就不适用

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

类型外部结构{ someField int 内部结构内部 } 类型内部结构{ 外部构造*外部 } func检验{ 外部:=外部{someField:123} 内部:=内部{outerStruct:&outer} outer.innerStruct=内部 printlniner.outerStruct.someField//仅用于测试 }
所以,现在我想知道,在意识形态上,这是否是围棋的有效方法?这种方法有任何可能的缺点吗?

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

func NewOuter() *Outer {
  ret:=Outer{}
  ret.outer=&ret
  return &ret
}
此外,您还必须注意如何传递Outer,因为内部结构中的指针可能最终指向您不期望的Outer实例:

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

上面,g将获得一个外部实例,其指针指向的外部实例与它得到的外部实例不同。

如果您真的要这样做,您需要确保永远不要复制外部实例,因为副本的内部将指向错误的外部实例


请参阅sync.Mutex或WaitGroup,了解如何创建无法复制的结构。

它在技术上是有效的,是否好是主观意见的问题。可能的缺点可能是显而易见的——以指向错误的外部对象的指针结束,或者没有指向外部对象的指针结束,或者在不需要外部对象后保留内部对象及其指针以防止外部对象被GC’d,诸如此类的事情。我通常认为,如果你需要这个,你的设计可能需要工作;内部与外部紧密耦合,这是一个坏迹象。