mirror of
https://github.com/unti-io/go-utils.git
synced 2026-04-22 23:47:03 +08:00
226 lines
4.2 KiB
Go
226 lines
4.2 KiB
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
func typeof(args ...any) (typeof string, empty bool) {
|
|
typeof, empty = "string", false
|
|
for _, item := range args {
|
|
|
|
// 判断是否为空
|
|
if item == nil {
|
|
empty = true
|
|
continue
|
|
}
|
|
|
|
// 先利用反射获取数据类型,再进入不同类型的判空逻辑
|
|
switch reflect.TypeOf(item).Kind().String() {
|
|
case "int":
|
|
typeof = "int"
|
|
if item == 0 {
|
|
empty = true
|
|
}
|
|
case "string":
|
|
typeof = "string"
|
|
if item == "" {
|
|
empty = true
|
|
}
|
|
case "int64":
|
|
typeof = "int64"
|
|
if item == 0 {
|
|
empty = true
|
|
}
|
|
case "uint8":
|
|
typeof = "bool"
|
|
if item == false {
|
|
empty = true
|
|
}
|
|
case "float64":
|
|
typeof = "float"
|
|
if item == 0.0 {
|
|
empty = true
|
|
}
|
|
case "byte":
|
|
typeof = "byte"
|
|
if item == 0 {
|
|
empty = true
|
|
}
|
|
case "ptr":
|
|
typeof = "ptr"
|
|
// 接口状态下,它不认为自己是nil,所以要用反射判空
|
|
if item == nil {
|
|
empty = true
|
|
}
|
|
// 反射判空逻辑
|
|
if reflect.ValueOf(item).IsNil() {
|
|
// 利用反射直接判空
|
|
empty = true
|
|
}
|
|
case "struct":
|
|
typeof = "struct"
|
|
if item == nil {
|
|
empty = true
|
|
}
|
|
case "slice":
|
|
typeof = "slice"
|
|
s := reflect.ValueOf(item)
|
|
// 遍历所有元素
|
|
for i := 0; i < s.Len(); i++ {
|
|
elem := reflect.ValueOf(s.Index(i).Interface())
|
|
if elem.Kind() == reflect.Map {
|
|
typeof = "2d slice"
|
|
break
|
|
}
|
|
}
|
|
if s.Len() == 0 {
|
|
empty = true
|
|
}
|
|
// typeof = "slice"
|
|
// s := reflect.ValueOf(item)
|
|
// if s.Len() == 0 {
|
|
// empty = true
|
|
// }
|
|
case "array":
|
|
typeof = "array"
|
|
s := reflect.ValueOf(item)
|
|
// 遍历所有元素
|
|
for i := 0; i < s.Len(); i++ {
|
|
elem := reflect.ValueOf(s.Index(i).Interface())
|
|
if elem.Kind() == reflect.Map {
|
|
typeof = "2d array"
|
|
break
|
|
}
|
|
}
|
|
if s.Len() == 0 {
|
|
empty = true
|
|
}
|
|
case "map":
|
|
typeof = "map"
|
|
s := reflect.ValueOf(item)
|
|
if s.Len() == 0 {
|
|
empty = true
|
|
}
|
|
case "chan":
|
|
typeof = "chan"
|
|
s := reflect.ValueOf(item)
|
|
if s.Len() == 0 {
|
|
empty = true
|
|
}
|
|
case "func":
|
|
typeof = "func"
|
|
if item == nil {
|
|
empty = true
|
|
}
|
|
default:
|
|
if item == "true" || item == "false" || item == true || item == false {
|
|
typeof = "bool"
|
|
if item == false {
|
|
empty = true
|
|
}
|
|
} else {
|
|
typeof = "other"
|
|
empty = true
|
|
fmt.Println("奇怪的数据类型")
|
|
}
|
|
}
|
|
|
|
}
|
|
return
|
|
}
|
|
|
|
func CustomProcessApi(url string, api string) (result string) {
|
|
if empty := Is.Empty(api); empty {
|
|
api = "api"
|
|
}
|
|
result = url
|
|
if empty := Is.Empty(url); !empty {
|
|
prefix := "//"
|
|
if check := strings.HasPrefix(url, "https://"); check {
|
|
prefix = "https://"
|
|
} else if check := strings.HasPrefix(url, "http://"); check {
|
|
prefix = "http://"
|
|
}
|
|
// 正则匹配 http(s):// - 并去除
|
|
url = regexp.MustCompile("^((https|http)?://)").ReplaceAllString(url, "")
|
|
array := ArrayFilter(strings.Split(url, `/`))
|
|
if len(array) == 1 {
|
|
result = prefix + array[0] + "/" + api + "/"
|
|
} else if len(array) == 2 {
|
|
result = prefix + array[0] + "/" + array[1] + "/"
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// InMapKey
|
|
// 在 map key 中
|
|
func InMapKey(key string, array map[string]any) bool {
|
|
for k := range array {
|
|
if key == k {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// MapMerge
|
|
// map合并
|
|
func MapMerge(map1 map[any]any, map2 map[any]any) map[any]any {
|
|
|
|
result := make(map[any]any)
|
|
for i, v := range map1 {
|
|
for j, w := range map2 {
|
|
if i == j {
|
|
result[i] = w
|
|
} else {
|
|
if _, ok := result[i]; !ok {
|
|
result[i] = v
|
|
}
|
|
if _, ok := result[j]; !ok {
|
|
result[j] = w
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// MapMergeString
|
|
// map合并
|
|
func MapMergeString(map1 map[string]string, map2 map[string]string) map[string]string {
|
|
|
|
result := make(map[string]string)
|
|
for i, v := range map1 {
|
|
for j, w := range map2 {
|
|
if i == j {
|
|
result[i] = w
|
|
} else {
|
|
if _, ok := result[i]; !ok {
|
|
result[i] = v
|
|
}
|
|
if _, ok := result[j]; !ok {
|
|
result[j] = w
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// InMapValue
|
|
// 在 map value 中
|
|
func InMapValue(value any, array map[string]string) bool {
|
|
for _, val := range array {
|
|
if value == val {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|