gin的中间件实现原理
2023年4月11日小于 1 分钟
# 包company/client-go/cache与k8s.io/apimachinery@latest不兼容
# 需要指定k8s.io/apimachinery的版本为旧版 (默认会指向最新版)
# 并且k8s.io/api@latest也依赖了k8s.io/apimachinery@latest
# 所以k8s.io也需要指定旧版
company-nvs/internal/vnetstore imports
company/client-go/cache imports
k8s.io/apimachinery/pkg/util/clock:
module k8s.io/apimachinery@latest found (v0.27.3),
but does not contain package k8s.io/apimachinery/pkg/util/clock
package tool
import (
"errors"
"fmt"
"net/url"
"reflect"
)
// QueryRange 范围查找结构体
type QueryRange struct {
Query string `json:"query"`
Start int64 `json:"start"`
End int64 `json:"end"`
Step int `json:"step"`
}
// GetStructTag 获取结构体标签
func GetStructTag(s interface{}) (map[string]string, error) {
getValue := reflect.ValueOf(s)
if getValue.Kind() != reflect.Struct {
return nil, errors.New("not struct")
}
getType := reflect.TypeOf(s)
t := map[string]string{}
for i := 0; i < getValue.NumField(); i++ {
t[getType.Field(i).Name] = getType.Field(i).Tag.Get("json")
}
return t, nil
}
// BuildURLByStruct build url
func BuildURLByStruct(path string, queryRange *QueryRange) (string, error) {
if queryRange == nil {
return "", errors.New("query range is nil")
}
tagMap, err := GetStructTag(*queryRange)
if err != nil {
return "", err
}
getValue := reflect.ValueOf(*queryRange)
urlParamMap := url.Values{}
for k, v := range tagMap {
urlParamMap.Set(v, fmt.Sprintf("%v", getValue.FieldByName(k).Interface()))
}
base, err := url.Parse(path)
if err != nil {
return "", err
}
base.RawQuery = urlParamMap.Encode()
return base.String(), nil
}