Создание циклических типов GraphQL в Go - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь создать два типа 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 (и так далее и так далее ...), но я не уверен, как это обойти.

1 Ответ

1 голос
/ 27 мая 2020

Рекомендуемый способ обработки этого - использование AddFieldConfig:

houseType := &graphql.Object{...}
residentType := &graphql.Object{...}

houseType.AddFieldConfig("residents", &graphql.Field{Type: graphql.NewList(residentType)})
residentType.AddFieldConfig("houses",  &graphql.Field{Type: graphql.NewList(houseType)})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...