Reputation: 1982
I want to put my router config in an extern json config file like so:
{
"routes": [
{
"name": "Index",
"method": "GET",
"pattern": "/",
"handler": "Index"
},
{
"name": "CountsIndex",
"method": "GET",
"pattern": "/counts",
"handler": "CountsIndex"
}
]
}
My related struct looks like so:
type Route struct {
Name string `json:"name"`
Method string `json:"method"`
Pattern string `json:"pattern"`
HandlerFunc http.HandlerFunc `json:"handler"`
}
type Routes []Route
The Problem is the handlerFunc. When I get the config it will be a string but how to make it a go value? Can I cast it somehow?
Following error occures:
json: cannot unmarshal string into Go value of type http.HandlerFunc
Thanks
Upvotes: 0
Views: 1000
Reputation: 2068
The simplest solution is to have a string instead of the http.HandlerFunc as type, and define a map with the functions.
var functions = map[string]interface{}{
"func1": func1,
}
then after unmarshalling your json you can assign the handler using the handlername of each route
Upvotes: 4
Reputation: 1233
The problem is, that not every data could be marshaled to json (or unmarshaled). http.HandlerFunc is not a function (https://golang.org/pkg/net/http/#HandlerFunc). You cannot put it directly - but you can change handler to string and on the place when you trying to call it obtain HandlerFunc from reflect (a quite complicated) or from prepared map[string]HandlerFunc.
Upvotes: 2