Доступ к внешней структуре из внутренней - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть вопрос, похожий на этот: доступ к полям структуры из встроенной структуры , за исключением того, что вместо встроенной структуры просто есть вложенная.

В основном, что мне нужно это возможность доступа к внешней структуре из вложенной. Тем не менее, подход к компоновке, предложенный в принятом ответе, не соответствует моей нынешней «структуре структур», поэтому он на самом деле не применим без некоторого громоздкого рефакторинга.

Вместо этого у меня возникла идея встраивания указатель на внешнюю структуру во внутреннюю:

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? И есть ли возможные недостатки этого метода?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Если вы действительно хотите это сделать, вам нужно убедиться, что вы никогда не сделаете копию Outer, поскольку Inner копии будет указывать на неправильный Outer.

См. Syn c .Mutex или WaitGroup для как сделать структуру, которую нельзя скопировать.

0 голосов
/ 11 февраля 2020

Наличие указателя на внешнюю структуру - единственный способ сделать это. Недостатком является то, что вы должны убедиться, что указатель инициализирован. Итак, что-то вроде функции конструктора может помочь:

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

Кроме того, вы должны помнить, как вы передаете Outer, потому что указатель во внутренней структуре может в конечном итоге указывать на экземпляр Outer you не ожидайте:

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

Выше g получит экземпляр Outer с указателем, указывающим на экземпляр Outer, отличный от того, который он получил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...