package utils import ( "bytes" "crypto/md5" "encoding/hex" "encoding/json" "fmt" "io/ioutil" "net" "reflect" "strconv" "strings" "time" ) func JSONMethod(content interface{}) map[string]interface{} { var name map[string]interface{} if marshalContent, err := json.Marshal(content); err != nil { fmt.Println(err) } else { d := json.NewDecoder(bytes.NewReader(marshalContent)) d.UseNumber() // 设置将float64转为一个number if err := d.Decode(&name); err != nil { fmt.Println(err) } else { for k, v := range name { name[k] = v } } } return name } func Struct2Map(obj interface{}) map[string]interface{} { t := reflect.TypeOf(obj) v := reflect.ValueOf(obj) var data = make(map[string]interface{}) for i := 0; i < t.NumField(); i++ { data[t.Field(i).Name] = v.Field(i).Interface() } return data } func GetFileContentAsStringLines(filePath string) ([]string, error) { fmt.Println("get file content as lines: ", filePath) result := []string{} b, err := ioutil.ReadFile(filePath) if err != nil { fmt.Println("read file error: ", err) return result, err } s := string(b) for _, lineStr := range strings.Split(s, ";") { lineStr = strings.TrimSpace(lineStr) if lineStr == "" { continue } result = append(result, lineStr) } fmt.Println("get file content as lines size: ", len(result)) return result, nil } func Print(m map[string]interface{}) { for k, v := range m { switch vv := v.(type) { case string: fmt.Println(k, "is string", vv) case float64: fmt.Println(k, "is float64", float64(vv)) case int: fmt.Println(k, "is int", vv) case []interface{}: fmt.Println(k, "is an array:") for i, u := range vv { fmt.Println(i, u) } case nil: fmt.Println(k, "is nil", "null") case map[string]interface{}: fmt.Println(k, "is an map:") Print(vv) default: fmt.Println(k, "is of a type I don't know how to handle ", fmt.Sprintf("%T", v)) } } } func GenPK(v interface{}, len int) string { str := fmt.Sprintf("%v", v) hasher := md5.New() hasher.Write([]byte(str)) a := hex.EncodeToString(hasher.Sum(nil)) b := a[:len] return b } func GenDefaultPK(v interface{}) string { return GenPK(v, 4) } func Min(x, y int) int { if x < y { return x } return y } func checkIp(ipStr string) bool { address := net.ParseIP(ipStr) if address == nil { // fmt.Println("ip地址格式不正确") return false } else { // fmt.Println("正确的ip地址", address.String()) return true } } // ip to int64 func inetAton(ipStr string) int64 { bits := strings.Split(ipStr, ".") b0, _ := strconv.Atoi(bits[0]) b1, _ := strconv.Atoi(bits[1]) b2, _ := strconv.Atoi(bits[2]) b3, _ := strconv.Atoi(bits[3]) var sum int64 sum += int64(b0) << 24 sum += int64(b1) << 16 sum += int64(b2) << 8 sum += int64(b3) return sum } //int64 to IP func inetNtoa(ipnr int64) net.IP { var bytes [4]byte bytes[0] = byte(ipnr & 0xFF) bytes[1] = byte((ipnr >> 8) & 0xFF) bytes[2] = byte((ipnr >> 16) & 0xFF) bytes[3] = byte((ipnr >> 24) & 0xFF) return net.IPv4(bytes[3], bytes[2], bytes[1], bytes[0]) } func IsInnerIp(ipStr string) bool { if !checkIp(ipStr) { return false } inputIpNum := inetAton(ipStr) innerIpA := inetAton("10.255.255.255") innerIpB := inetAton("172.16.255.255") innerIpC := inetAton("192.168.255.255") innerIpD := inetAton("100.64.255.255") innerIpF := inetAton("127.255.255.255") return inputIpNum>>24 == innerIpA>>24 || inputIpNum>>20 == innerIpB>>20 || inputIpNum>>16 == innerIpC>>16 || inputIpNum>>22 == innerIpD>>22 || inputIpNum>>24 == innerIpF>>24 } func Itob(i int) bool { return i == 1 } func ParseTimeString(timeStr string) (time.Time, error) { layout := "2006-01-02 15:04:05" parsedTime, err := time.Parse(layout, timeStr) if err != nil { return time.Time{}, err } return parsedTime, nil }