You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
3.8 KiB
Go

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
}