如何将嵌套结构传递给参数

时间:2019-11-10 12:29:14

标签: go mux

我正在尝试为我的API路由创建一个结构。我有两个结构:查询和路由。然后,我会根据我的路线类型创建一条路线。

创建路由后,然后创建一个新的路由器,并在路由范围内进行迭代,然后将它们传递给方法,路径,处理程序和查询。

在尝试传递查询时,我总是收到错误消息

  

不能使用route.Queries([]查询类型)作为参数中的类型字符串...

type Queries struct {
    item     string
    useritem string
    key      string
    userkey  string
}


type Route struct {
    Method     string
    Path       string
    HandleFunc http.HandlerFunc
    Queries []Queries
}

var Routes = []Route{
    {
        Method:     "GET",
        Path:       "/items",
        HandleFunc: controllers.Getitems,
        Queries: []Queries{{"item", "{useritem}", "key", "{userkey}",},
        },
    },
}

func CreateRouter() *mux.Router {
    router := mux.NewRouter()

    for _, route := range Routes {
        router.
            Methods(route.Method).
            Path(route.Path).
            Handler(route.HandleFunc).
            Queries(route.Queries) //This is where the error occurs
        } 
        return router
    }

2 个答案:

答案 0 :(得分:1)

首先将route.Queries转换为queries []string

然后,您需要解压缩数组作为参数。请改用router.Queries(queries...)

有关此方法的实现,请参见https://github.com/gorilla/mux/blob/master/mux.go#L341

答案 1 :(得分:0)

@mkopriva ive对此玩了一段时间,并已经实施(我认为)上面给出的建议,但是现在我得到了syntax error: unexpected ..., expecting expressiongo

这是我的代码现在的样子:

type Queries struct {
    item     string
    useritem string
    key      string
    userkey  string
}

type Route struct {
    Method     string
    Path       string
    HandleFunc http.HandlerFunc
    Queries []string
}


// Routes is
var Routes = []Route{
    {
        Method:     "GET",
        Path:       "/items",
        HandleFunc: controllers.Getitems,
        Queries: []string{
            "item", "{useritem}", "key", "{userkey}",
        },
    },
}

// CreateRouter is
func CreateRouter() {

    router := mux.NewRouter()

    for _, route := range Routes {
        router.
            Methods(route.Method).
            Path(route.Path).
            Handler(route.HandleFunc).
            Queries(router.Queries(...))
    }
    return router
}```