github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/util/common.go (about) 1 package util 2 3 import ( 4 "math/rand" 5 "path/filepath" 6 "regexp" 7 "strings" 8 "time" 9 ) 10 11 func init() { 12 rand.Seed(time.Now().UnixNano()) 13 } 14 15 // RandStringRunes 返回随机字符串 16 func RandStringRunes(n int) string { 17 var letterRunes = []rune("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") 18 19 b := make([]rune, n) 20 for i := range b { 21 b[i] = letterRunes[rand.Intn(len(letterRunes))] 22 } 23 return string(b) 24 } 25 26 // ContainsUint 返回list中是否包含 27 func ContainsUint(s []uint, e uint) bool { 28 for _, a := range s { 29 if a == e { 30 return true 31 } 32 } 33 return false 34 } 35 36 // IsInExtensionList 返回文件的扩展名是否在给定的列表范围内 37 func IsInExtensionList(extList []string, fileName string) bool { 38 ext := strings.ToLower(filepath.Ext(fileName)) 39 // 无扩展名时 40 if len(ext) == 0 { 41 return false 42 } 43 44 if ContainsString(extList, ext[1:]) { 45 return true 46 } 47 48 return false 49 } 50 51 // ContainsString 返回list中是否包含 52 func ContainsString(s []string, e string) bool { 53 for _, a := range s { 54 if a == e { 55 return true 56 } 57 } 58 return false 59 } 60 61 // Replace 根据替换表执行批量替换 62 func Replace(table map[string]string, s string) string { 63 for key, value := range table { 64 s = strings.Replace(s, key, value, -1) 65 } 66 return s 67 } 68 69 // BuildRegexp 构建用于SQL查询用的多条件正则 70 func BuildRegexp(search []string, prefix, suffix, condition string) string { 71 var res string 72 for key, value := range search { 73 res += prefix + regexp.QuoteMeta(value) + suffix 74 if key < len(search)-1 { 75 res += condition 76 } 77 } 78 return res 79 } 80 81 // BuildConcat 根据数据库类型构建字符串连接表达式 82 func BuildConcat(str1, str2 string, DBType string) string { 83 switch DBType { 84 case "mysql": 85 return "CONCAT(" + str1 + "," + str2 + ")" 86 default: 87 return str1 + "||" + str2 88 } 89 } 90 91 // SliceIntersect 求两个切片交集 92 func SliceIntersect(slice1, slice2 []string) []string { 93 m := make(map[string]int) 94 nn := make([]string, 0) 95 for _, v := range slice1 { 96 m[v]++ 97 } 98 99 for _, v := range slice2 { 100 times, _ := m[v] 101 if times == 1 { 102 nn = append(nn, v) 103 } 104 } 105 return nn 106 } 107 108 // SliceDifference 求两个切片差集 109 func SliceDifference(slice1, slice2 []string) []string { 110 m := make(map[string]int) 111 nn := make([]string, 0) 112 inter := SliceIntersect(slice1, slice2) 113 for _, v := range inter { 114 m[v]++ 115 } 116 117 for _, value := range slice1 { 118 times, _ := m[value] 119 if times == 0 { 120 nn = append(nn, value) 121 } 122 } 123 return nn 124 }