Files
go-utils/utils/map.go
2024-10-23 15:07:53 +08:00

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
}