package main import ( "fmt" "reflect" "strings" ) type MyUrlParams struct { UserId string `path:"user",json:"-"` OrgId string `path:"org"` Foo string } func main() { params := MyUrlParams{ UserId: "abc123", OrgId: "xyz789", Foo: "bar", } uri := "/api/v1/users/{user}/orgs/{org}" fmt.Println(resolvePath(uri, params)) } func resolvePath(uri string, params interface{}) string { for search, replace := range getPathParams(params) { uri = strings.Replace(uri, "{"+search+"}", replace, 1) } return uri } func getPathParams(params interface{}) map[string]string { p := map[string]string{} v := reflect.ValueOf(params) for i := 0; i < v.NumField(); i++ { val := v.Field(i).String() tag := v.Type().Field(i).Tag.Get("path") if tag != "" { p[tag] = val } } return p }