package utils
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"mime/multipart"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"reflect"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
rolePrefix string = "role_"
|
|
)
|
|
|
|
// 将结构体内所有string类型字段去除首位空格
|
|
// sp为结构体指针, s为结构体值
|
|
func TrimStruct(sp interface{}, s interface{}) {
|
|
// 判断类型是否为struct
|
|
av := reflect.ValueOf(sp)
|
|
avv := reflect.ValueOf(s)
|
|
at := reflect.TypeOf(s)
|
|
// 简单判断下
|
|
if at.Kind() != reflect.Struct {
|
|
log.Printf("s must be a struct")
|
|
return
|
|
}
|
|
av = reflect.ValueOf(av.Interface())
|
|
for i := 0; i < avv.NumField(); i++ {
|
|
if at.Field(i).Type.Name() == "string" {
|
|
f := av.Elem().Field(i)
|
|
val := strings.TrimSpace(avv.Field(i).String())
|
|
f.Set(reflect.ValueOf(val))
|
|
}
|
|
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
//
|
|
func FmtRolePrefix(sub interface{}) string {
|
|
var s string
|
|
switch sub.(type) {
|
|
case int64:
|
|
uid := sub.(int64)
|
|
s = strconv.FormatInt(uid, 10)
|
|
case string:
|
|
s = sub.(string)
|
|
}
|
|
return fmt.Sprintf("%s%s", rolePrefix, s)
|
|
}
|
|
|
|
// timestamp to time
|
|
func StampToTime(st int64) time.Time {
|
|
return time.Unix(st / 1000, 0)
|
|
}
|
|
|
|
func IdsStrToIdsIntGroup(keys string) []int {
|
|
IDS := make([]int, 0)
|
|
ids := strings.Split(keys, ",")
|
|
for i := 0; i < len(ids); i++ {
|
|
ID:= ValueToInt(ids[i],0)
|
|
IDS = append(IDS, ID)
|
|
}
|
|
return IDS
|
|
}
|
|
|
|
func IDsToStringIn(ids []int) string {
|
|
ll := len(ids)
|
|
var str string
|
|
for i := 0; i < ll; i++ {
|
|
if i > 0 {
|
|
str = str + "," + ValueToString(ids[i], "")
|
|
} else {
|
|
str = ValueToString(ids[i], "")
|
|
}
|
|
}
|
|
return str
|
|
}
|
|
|
|
func IDsToStrings(ids []string) string {
|
|
ll := len(ids)
|
|
var str string
|
|
for i := 0; i < ll; i++ {
|
|
if i > 0 {
|
|
str = str + "','" + ValueToString(ids[i], "")
|
|
} else {
|
|
str = "'" + ValueToString(ids[i], "")
|
|
}
|
|
}
|
|
if len(str) > 0 {
|
|
str = str + "'"
|
|
}
|
|
return str
|
|
}
|
|
|
|
// SaveUploadedFile uploads the form file to specific dst.
|
|
func SaveUploadedFile(file *multipart.FileHeader, dst string) error {
|
|
src, err := file.Open()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer src.Close()
|
|
|
|
out, err := os.Create(dst)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer out.Close()
|
|
|
|
_, err = io.Copy(out, src)
|
|
return err
|
|
}
|
|
|
|
func MakeOrderSn(key string) string {
|
|
// 转大写
|
|
key = strings.ToUpper(key)
|
|
|
|
// 获取时间戳
|
|
ts := time.Now().Format("20060102150405.000")
|
|
tss := fmt.Sprint(time.Now().UnixNano())
|
|
ts = string([]byte(ts)[0:14]) + string([]byte(tss)[13:16])
|
|
|
|
return key + ts
|
|
}
|
|
//判断字符串是否在一个数组里
|
|
func IsContain(items []string, item string) bool {
|
|
for _, eachItem := range items {
|
|
if eachItem == item {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
// 是否是文件 不是文件也不一定是目录
|
|
func IsFile(path string) bool {
|
|
s, err := os.Stat(path)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
return !s.IsDir()
|
|
}
|
|
|
|
//求并集
|
|
func Union(slice1, slice2 []string) []string {
|
|
m := make(map[string]int)
|
|
for _, v := range slice1 {
|
|
m[v]++
|
|
}
|
|
|
|
for _, v := range slice2 {
|
|
times, _ := m[v]
|
|
if times == 0 {
|
|
slice1 = append(slice1, v)
|
|
}
|
|
}
|
|
return slice1
|
|
}
|
|
|
|
//求交集
|
|
func Intersect(slice1, slice2 []string) []string {
|
|
m := make(map[string]int)
|
|
nn := make([]string, 0)
|
|
for _, v := range slice1 {
|
|
m[v]++
|
|
}
|
|
|
|
for _, v := range slice2 {
|
|
times, _ := m[v]
|
|
if times == 1 {
|
|
nn = append(nn, v)
|
|
}
|
|
}
|
|
return nn
|
|
}
|
|
|
|
//求差集 slice1-并集
|
|
func Difference(slice1, slice2 []string) []string {
|
|
m := make(map[string]int)
|
|
nn := make([]string, 0)
|
|
inter := Intersect(slice1, slice2)
|
|
for _, v := range inter {
|
|
m[v]++
|
|
}
|
|
|
|
for _, value := range slice1 {
|
|
times, _ := m[value]
|
|
if times == 0 {
|
|
nn = append(nn, value)
|
|
}
|
|
}
|
|
return nn
|
|
}
|
|
|
|
// 将给定的整数值转换成给定长度的字符串,不足长度的在前面补足0
|
|
func ConvInt2FormatString(input, ilen int)(retstring string){
|
|
var igap int
|
|
|
|
if len(string(input)) >= ilen {
|
|
retstring = string(input)
|
|
}else{
|
|
igap = ilen - len(strconv.Itoa(input))
|
|
retstring = strings.Repeat("0", igap) + strconv.Itoa(input)
|
|
}
|
|
return
|
|
}
|
|
|
|
//windows环境下获取绝对路径
|
|
func GetCurrentPath(dir string) (string, error) {
|
|
file, err := exec.LookPath(os.Args[0])
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
path, err := filepath.Abs(file)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
i := strings.LastIndex(path, "/")
|
|
if i < 0 {
|
|
i = strings.LastIndex(path, "\\")
|
|
}
|
|
if i < 0 {
|
|
return "", errors.New(`error: Can't find "/" or "\".`)
|
|
}
|
|
pathdir := string(path[0 : i+1])
|
|
if len(dir) > 0 {
|
|
dir = strings.Replace(dir, "/", "\\", -1)
|
|
return filepath.Join(pathdir, dir), nil
|
|
}
|
|
return string(path[0 : i+1]), nil
|
|
}
|