invalid recursive type XXX

zero valueを設定する際に循環してしまうと無限に再帰してしまい終わらないという話。

例えば以下のような定義はダメ。

自分自身で再帰

type Tree struct {
    Value int
    Left  Tree
    Right Tree
}

もちろん、ポインターにしてあげれば、nilがzero valueになるので無限に再帰はしなくなる。

type Tree struct {
    Value int
    Left  *Tree
    Right *Tree
}

相互再帰(N=2)

自分自身の型で再帰的に定義してはダメというルールではない。初期化時のiterationで循環参照が起きれば無限再帰が起きる。こういうのもダメ。

type L struct {
    R R
}

type R struct {
    L L
}

どれか1つでもnilになればそこが終端になるので以下はOK。

type L struct {
    R R
}

type R struct {
    L *L
}

N=3

もちろん3つ組の循環でもダメ。

type A struct {
    B B
}

type B struct {
    C C
}

type C struct {
    A A
}

循環しなければただの木なのでいつかは終端に辿り着く。

type T0 struct {
    T1 T1
}

type T1 struct {
    T2 T2
}

type T2 struct{}