mirror of
https://github.com/unti-io/go-utils.git
synced 2025-10-05 16:26:50 +08:00
101 lines
2.1 KiB
Go
101 lines
2.1 KiB
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
// MapWithField - 从map中提取指定字段
|
|
func MapWithField[T map[string]any](data T, field []string) (result T) {
|
|
result = make(T)
|
|
for _, val := range field {
|
|
result[val] = data[val]
|
|
}
|
|
return
|
|
}
|
|
|
|
// MapWithoutField - 从map中排除指定字段
|
|
func MapWithoutField[T map[string]any](data T, field []string) (result T) {
|
|
result = make(T)
|
|
for key, val := range data {
|
|
if !InArray[string](key, field) {
|
|
result[key] = val
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// MapToURL - 无序 map 转 有序 URL
|
|
func MapToURL(params map[string]any) (result string) {
|
|
|
|
// 创建一个 URL 结构体实例
|
|
URL := url.URL{}
|
|
|
|
// 将 map 的 key 按照字母顺序排序
|
|
keys := make([]string, 0, len(params))
|
|
for key := range params {
|
|
keys = append(keys, key)
|
|
}
|
|
sort.Strings(keys)
|
|
|
|
// 构造有序的 URL 查询参数
|
|
values := url.Values{}
|
|
for _, index := range keys {
|
|
|
|
item := params[index]
|
|
|
|
switch value := item.(type) {
|
|
case string:
|
|
values.Set(index, value)
|
|
case []any:
|
|
for _, ele := range value {
|
|
values.Add(index, fmt.Sprintf("%v", ele))
|
|
}
|
|
case map[string]any:
|
|
for key, val := range value {
|
|
values.Set(index+"["+key+"]", fmt.Sprintf("%v", val))
|
|
}
|
|
default:
|
|
values.Set(index, fmt.Sprintf("%v", item))
|
|
}
|
|
}
|
|
|
|
// 将查询参数附加到 URL 中
|
|
URL.RawQuery = values.Encode()
|
|
|
|
// url 解码
|
|
// URL.RawQuery, _ = url.QueryUnescape(URL.RawQuery)
|
|
// 去除末尾的 & 和 前面的 ?
|
|
result = strings.TrimSuffix(URL.String(), "&")
|
|
|
|
return strings.TrimPrefix(result, "?")
|
|
}
|
|
|
|
// MapKeys - 获取 map 的所有 key
|
|
func MapKeys[T map[string]any](data T) (result []string) {
|
|
for key := range data {
|
|
result = append(result, key)
|
|
}
|
|
return
|
|
}
|
|
|
|
// MapValues - 获取 map 的所有 value
|
|
func MapValues[T map[string]any](data T) (result []any) {
|
|
for _, val := range data {
|
|
result = append(result, val)
|
|
}
|
|
return
|
|
}
|
|
|
|
// MapTrim - 去除 map 中的空值
|
|
func MapTrim[T map[string]any](data T) (result T) {
|
|
result = make(T)
|
|
for key, val := range data {
|
|
if !Is.Empty(val) {
|
|
result[key] = val
|
|
}
|
|
}
|
|
return
|
|
} |