package lib import ( "encoding/json" "fmt" "go.mongodb.org/mongo-driver/bson" "math/rand" "reflect" "strconv" "strings" "time" ) func init() { } const Success = 200 const Error = 201 type JSONR struct { //必须的大写开头 Code int16 Msg string Data interface{} // 泛型 } type JSONS struct { //必须的大写开头 Code int16 Msg string List interface{} Total int16 PageIndex int PageSize int } func C_Page(list interface{}, PageIndex, PageSize int, Total int64) (Jsons JSONS) { Jsons.List = list Jsons.Total = int16(Total) Jsons.PageIndex = PageIndex Jsons.PageSize = PageSize //Jsons.PageSize = int16(math.Ceil(float64(Total) / float64(PageSize))) return Jsons } func Strval(value interface{}) string { var key string if value == nil { return key } switch value.(type) { case float64: ft := value.(float64) key = strconv.FormatFloat(ft, 'f', -1, 64) case float32: ft := value.(float32) key = strconv.FormatFloat(float64(ft), 'f', -1, 64) case int: it := value.(int) key = strconv.Itoa(it) case uint: it := value.(uint) key = strconv.Itoa(int(it)) case int8: it := value.(int8) key = strconv.Itoa(int(it)) case uint8: it := value.(uint8) key = strconv.Itoa(int(it)) case int16: it := value.(int16) key = strconv.Itoa(int(it)) case uint16: it := value.(uint16) key = strconv.Itoa(int(it)) case int32: it := value.(int32) key = strconv.Itoa(int(it)) case uint32: it := value.(uint32) key = strconv.Itoa(int(it)) case int64: it := value.(int64) key = strconv.FormatInt(it, 10) case uint64: it := value.(uint64) key = strconv.FormatUint(it, 10) case string: key = value.(string) case []byte: key = string(value.([]byte)) default: newValue, _ := json.Marshal(value) key = string(newValue) } return key } // 取一个 func Take_one(a, b string) string { if len(a) == 0 { return b } return a } func To_int(value interface{}) int { var key int if value == nil { return key } switch value.(type) { case float64: key = int(value.(float64)) case float32: key = int(value.(float32)) case int: key = int(value.(int)) case uint: key = int(value.(uint)) case int8: key = int(value.(int8)) case uint8: key = int(value.(uint8)) case int16: key = int(value.(int16)) case uint16: key = int(value.(uint16)) case int32: key = int(value.(int32)) case uint32: key = int(value.(uint32)) case int64: key = int(value.(int64)) case uint64: key = int(value.(uint64)) case string: key, _ = strconv.Atoi(value.(string)) case []byte: key, _ = strconv.Atoi(string(value.([]byte))) default: newValue, _ := json.Marshal(value) key, _ = strconv.Atoi(string(newValue)) } return key } func To_int64(value interface{}) int64 { var key int64 if value == nil { return key } switch value.(type) { case float64: key = int64(value.(float64)) case float32: key = int64(value.(float32)) case int: key = int64(value.(int)) case uint: key = int64(value.(uint)) case int8: key = int64(value.(int8)) case uint8: key = int64(value.(uint8)) case int16: key = int64(value.(int16)) case uint16: key = int64(value.(uint16)) case int32: key = int64(value.(int32)) case uint32: key = int64(value.(uint32)) case int64: key = int64(value.(int64)) case uint64: key = int64(value.(uint64)) case string: key, _ = strconv.ParseInt(value.(string), 10, 64) case []byte: key, _ = strconv.ParseInt(string(value.([]byte)), 10, 64) default: newValue, _ := json.Marshal(value) key, _ = strconv.ParseInt(string(newValue), 10, 64) } return key } func To_float32(value interface{}) float32 { var key float32 if value == nil { return key } switch value.(type) { case float64: key = float32(value.(float64)) case float32: key = float32(value.(float32)) case int: key = float32(value.(int)) case uint: key = float32(value.(uint)) case int8: key = float32(value.(int8)) case uint8: key = float32(value.(uint8)) case int16: key = float32(value.(int16)) case uint16: key = float32(value.(uint16)) case int32: key = float32(value.(int32)) case uint32: key = float32(value.(uint32)) case int64: key = float32(value.(int64)) case uint64: key = float32(value.(uint64)) case string: key_float64, _ := strconv.ParseFloat(value.(string), 32/64) key = float32(key_float64) case []byte: key_float64, _ := strconv.ParseFloat(string(value.([]byte)), 32/64) key = float32(key_float64) default: newValue, _ := json.Marshal(value) key_float64, _ := strconv.ParseFloat(string(newValue), 32/64) key = float32(key_float64) } key_float64, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", key), 32/64) key = float32(key_float64) return key } func To_string(value interface{}) string { var key string if value == nil { return key } switch value.(type) { case float64: ft := value.(float64) key = strconv.FormatFloat(ft, 'f', -1, 64) case float32: ft := value.(float32) key = strconv.FormatFloat(float64(ft), 'f', -1, 64) case int: it := value.(int) key = strconv.Itoa(it) case uint: it := value.(uint) key = strconv.Itoa(int(it)) case int8: it := value.(int8) key = strconv.Itoa(int(it)) case uint8: it := value.(uint8) key = strconv.Itoa(int(it)) case int16: it := value.(int16) key = strconv.Itoa(int(it)) case uint16: it := value.(uint16) key = strconv.Itoa(int(it)) case int32: it := value.(int32) key = strconv.Itoa(int(it)) case uint32: it := value.(uint32) key = strconv.Itoa(int(it)) case int64: it := value.(int64) key = strconv.FormatInt(it, 10) case uint64: it := value.(uint64) key = strconv.FormatUint(it, 10) case string: key = value.(string) case []byte: key = string(value.([]byte)) default: newValue, _ := json.Marshal(value) key = string(newValue) } return key } func Random(min, max int) int { rand.Seed(time.Now().Unix()) //Seed生成的随机数 return rand.Intn(max-min) + min } // #取得随机字符串:通过打乱slice来操作 func GetRandstring(length int, char string, rand_x int64) string { if length < 1 { return "" } if len(char) <= 6 || len(char) <= length { char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" } charArr := strings.Split(char, "") ran := rand.New(rand.NewSource(time.Now().Unix() + rand_x)) l := len(charArr) for i := l - 1; i > 0; i-- { r := ran.Intn(i) charArr[r], charArr[i] = charArr[i], charArr[r] } rchar := charArr[:length] return strings.Join(rchar, "") } // 判断时间是当年的第几周 func WeekByDate() string { t := time.Now() yearDay := t.YearDay() yearFirstDay := t.AddDate(0, 0, -yearDay+1) firstDayInWeek := int(yearFirstDay.Weekday()) //今年第一周有几天 firstWeekDays := 1 if firstDayInWeek != 0 { firstWeekDays = 7 - firstDayInWeek + 1 } var week int if yearDay <= firstWeekDays { week = 1 } else { week = (yearDay-firstWeekDays)/7 + 2 } return fmt.Sprintf("%d%02d", t.Year()%100, week) // 2253 } // 将 时间格式为 bson.M 时间格式 func MongdbJsonHtime(ArticleSlide bson.M) bson.M { bson_M := bson.M{} for key, value := range ArticleSlide { //logs.Println(reflect.TypeOf(value).String()) switch reflect.TypeOf(value).String() { case "map[string]interface {}": jsonFind_M := bson.M{} data, _ := json.Marshal(value.(map[string]interface{})) err := json.Unmarshal(data, &jsonFind_M) if err == nil { bson_M[key] = MongdbJsonHtime(jsonFind_M) } break case "[]interface {}": bson_M_list := []bson.M{} for _, valuex := range value.([]interface{}) { if reflect.TypeOf(valuex).String() == "map[string]interface {}" { jsonFind_M := bson.M{} data, _ := json.Marshal(valuex.(map[string]interface{})) err := json.Unmarshal(data, &jsonFind_M) if err == nil { bson_M_list = append(bson_M_list, MongdbJsonHtime(jsonFind_M)) } } } bson_M[key] = bson_M_list //return json_r break default: t1, err := time.ParseInLocation("2006-01-02 15:04:05", value.(string), time.Local) // +8 时差 if err == nil { bson_M[key] = t1 } else { bson_M[key] = value } break } } return bson_M } // 判断字符串是否在数组中 func StringExistsInSlice(str string, slice []string) bool { for _, s := range slice { if s == str { return true } } return false } // 获取 JSON 指定位置 field : "AAA.BBB.d_name" func JsonGetField(data map[string]interface{}, field string) interface{} { fields := strings.Split(field, ".") result := data for _, f := range fields { if val, ok := result[f]; ok { switch val.(type) { case map[string]interface{}: result = val.(map[string]interface{}) default: return val } } else { return nil } } return result } // 获取 JSON 指定位置 data:修改的field必须存在 field : "AAA.BBB.d_name" value: 123 func JsonSetField(data map[string]interface{}, field string, value interface{}) { fields := strings.Split(field, ".") current := data for i, fieldv := range fields { if i == len(fields)-1 { current[fieldv] = value } else { next, ok := current[fieldv].(map[string]interface{}) if !ok { return } current = next } } } // 复制一份 Map func CopyMap(inputMap map[string]interface{}) map[string]interface{} { copiedMap := make(map[string]interface{}) for key, value := range inputMap { copiedMap[key] = value } return copiedMap }