не получается получить данные аргумента query запроса в graphql

В запросе принимаю аргумент filters , в котором передаю данные такого вида:

[{code:"category",id:19},{code:"brand",id:39}]

Определил input тип данных для аргумента filters в запросе.

Сам запрос такой:

http://localhost:8000/graphql?query={product(filters:[{code:"category",id:19},{code:"brand",id:39}],product_id:18810){product_id,name}}

В резолвере пытаюсь привести filters к слайсу структуры, но получаю false

filters, filtersOk := p.Args["filters"].([]Filter)
//filtersOk false

Подскажите как это исправить. неверный формат данных?

Упрощенный пример воспроизводящий ошибку: https://play.golang.org/p/Jrb8Kom3Vxm

    package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "github.com/graphql-go/graphql"
)

type Product struct {
    ProductId  int64   `json:"product_id"`
    Name       string  `json:"name"`
}

type Filter  struct {
    Id  int64   `json:"id"`
    Code    string  `json:"code"`
}


var productType = graphql.NewObject(graphql.ObjectConfig{
        Name: "Product",
        Fields: graphql.Fields{
            "product_id": &graphql.Field{
                Type: graphql.Int,
            },
            "name": &graphql.Field{
                Type: graphql.String,
            },

        },
    },
)

var FiltersInputType = graphql.NewInputObject(graphql.InputObjectConfig{
        Name: "FiltersInput",
        Fields: graphql.InputObjectConfigFieldMap{
            "id": &graphql.InputObjectFieldConfig{
                Type: graphql.Int,
            },
            "code": &graphql.InputObjectFieldConfig{
                Type: graphql.String,
            },
        },
    },
)



var queryType = graphql.NewObject(graphql.ObjectConfig{
        Name: "Query",
        Fields: graphql.Fields{
            /*
               http://localhost:8000/graphql?query={product(product_id:18810,filters:[{code:"category",id:19},{code:"brand",id:39}]){product_id,name}}
            */
            "product": &graphql.Field{
                Type:        productType,
                Description: "Get product by product_id",
                Args: graphql.FieldConfigArgument{
                    "product_id": &graphql.ArgumentConfig{
                        Type: graphql.Int,
                    },
                    "filters": &graphql.ArgumentConfig{
                        Type: graphql.NewList(FiltersInputType),
                    },
                },
                Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                    p_id, pOk := p.Args["product_id"].(int)
                    filters, filtersOk := p.Args["filters"].([]Filter)

                    fmt.Println(filters, filtersOk)
                    
                    if pOk {
                        product_id := int64(p_id)
                        // ищем товар
                        for _, product := range products {
                            if product.ProductId == product_id {

                                fmt.Println("Name: ", product.Name, " queryType")
                                return product, nil
                            }
                        }
                    }
                    return nil, nil
                },
            },


        },
    })

var schema, _ = graphql.NewSchema(
    graphql.SchemaConfig{
        Query:    queryType,
    },
)

func executeQuery(query string, schema graphql.Schema) *graphql.Result {
    result := graphql.Do(graphql.Params{
        Schema:        schema,
        RequestString: query,
    })
    if len(result.Errors) > 0 {
        fmt.Printf("{\"errors\": [{\"message\": \"%v\"}], \"data\":null}", result.Errors)
    }

    fmt.Println("Result: ", result, " executeQuery")

    return result
}


// products
var products = []Product{
    {
        ProductId: 18810,
        Name: "Тетрадь",
    },

}


func main() {
    http.HandleFunc("/graphql", func(w http.ResponseWriter, r *http.Request) {
        requestData := r.URL.Query().Get("query")

        result := executeQuery(requestData, schema)
        json.NewEncoder(w).Encode(result)
    })

    fmt.Println("Server is running on port 8000")
    http.ListenAndServe(":8000", nil)
}

Ответы (0 шт):