mirror of
https://github.com/unti-io/go-utils.git
synced 2025-09-27 04:36:22 +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
|
||
}
|