Я пытаюсь создать два типа GraphQL, Item и Listing, которые содержат экземпляры друг друга в виде полей. На языке типов GraphQL они будут:
type Item {
id: ID!
name: String!
...
listings: [Listing]!
}
type Listing {
id: ID!
price: Int!
...
item: Item!
}
(... представляет нерелевантные пропущенные поля)
Я видел, как другие проекты делали это, поэтому я знаю, что это возможно, но я возникли трудности с выполнением этого с помощью github.com / graphql-go / graphql . Из того, что я узнал в Интернете, способ сделать это с помощью Go будет:
var ItemType graphql.Type = graphql.NewObject(
graphql.ObjectConfig {
Name: "Item",
Fields: graphql.Fields {
"id": &graphql.Field {
Type: graphql.ID,
},
"name": &graphql.Field {
Type: graphql.String,
},
...
"listings": &graphql.Field {
Type: graphql.NewList(ListingType),
},
},
},
)
var ListingType graphql.Type = graphql.NewObject(
graphql.ObjectConfig {
Name: "Listing",
Fields: graphql.Fields {
"id": &graphql.Field {
Type: graphql.ID,
},
"price": &graphql.Field {
Type: graphql.Int,
},
...
"item": &graphql.Field {
Type: ItemType,
},
},
},
)
, но это приводит к инициализации l oop:
./test.go:9:5: initialization loop:
/home/william/Desktop/test.go:9:5: ItemType refers to
/home/william/Desktop/test.go:26:5: ListingType refers to
/home/william/Desktop/test.go:9:5: ItemType
Я понимаю что это происходит потому, что компилятору необходимо знать размер ItemType, чтобы определить размер ListingType, чтобы определить размер ItemType (и так далее и так далее ...), но я не уверен, как это обойти.