Ну обычно требуется явное знакомство.
А все явное лучше неявного
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 }