chelovekmuravei
@chelovekmuravei
\(-_-)/ раз два три четыре

Доступ к методам и функция уровнем выше?

Имеется объект структуры, с несколькими уровнями вложенности друг в друга. Из нижних уровней требуется получить методы или поля структуры выше. Как это лучше сделать? Можно передавать при инициализации структур указатель на главную вглубь, какие еще могут быть варианты? Может у вас есть пример кода (ссылки) или имеется некий общий подход
  • Вопрос задан
  • 148 просмотров
Решения вопроса 3
2ord
@2ord
Можно в самой дочерней структуре хранить поле о родителе.
Можно передавать по цепочке вызовов при помощи context.Context
func doSomething(ctx context.Context) {
	fmt.Printf("doSomething: myKey's value is %s\n", ctx.Value("myKey"))
}
Ответ написан
Комментировать
@calculator212
Из нижних уровней требуется получить методы или поля структуры выше.
Напрямую насколько я знаю этого сделать нельзя, как вариант можно использовать интерфейсы, но это в любом случае означает, что вам придётся писать код для каждой структуры отдельно.
Можно передавать при инициализации структур указатель на главную вглубь,
Если нет веских причин для этого, то я бы не рекомендовал бы вам так делать, т.к. это делает код довольно запутанным и увеличивает вероятность ошибок в дальнейшем
Ответ написан
@comdivuz
Ну обычно требуется явное знакомство.
А все явное лучше неявного

type Parent struct {
    GroupId int
    children []*Children
}
type Child struct {
    parent *Parent
}
func (p *Parent) Add(c *Child) {
    p.children = append(p.children, c)
    c.parent = p
}
func (p *Parent) Children() []*Child { return p.children }
func (c *Child) GroupId() {return c.parent.GroupId }


Как-то так

```
Допустим это не сработает при демаршализации
типа вы хотите все сразу из JSON вычитывать, ну тогда тоже можно явно сделать промежуточный объект

type parentJson struct {
    GroupId int `json:"group_id"`
    Children []*Child `json:"children"`
}
func (pj *parentJson) apply(p *Parent) {
    p.GroupId = pj.GroupId
    for _, c := range pj.Children {
          p.Add(c)
    }
}
type Parent struct {
    GroupId int 
    сhildren []*Children
}
type Child struct {
    parent *Parent
}
func (p *Parent) UnmarshalJSON(data []byte) error {
     var pj parentJson
     if err := json.Unmarshal(data, &pj); err != nil {return err}
     pj.apply(p)
}
func (p *Parent) Add(c *Child) {
    p.children = append(p.children, c)
    c.parent = p
}
func (p *Parent) Children() []*Child { return p.children }
func (c *Child) GroupId() {return c.parent.GroupId }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы