package utils import ( "github.com/jinzhu/copier" "github.com/pkg/errors" "runtime" "strconv" "strings" ) // copy a by b b->a func CopyStructFields(a interface{}, b interface{}, fields ...string) (err error) { return copier.Copy(a, b) } func Wrap(err error, message string) error { return errors.Wrap(err, "==> "+printCallerNameAndLine()+message) } func WithMessage(err error, message string) error { return errors.WithMessage(err, "==> "+printCallerNameAndLine()+message) } func printCallerNameAndLine() string { pc, _, line, _ := runtime.Caller(2) return runtime.FuncForPC(pc).Name() + "()@" + strconv.Itoa(line) + ": " } func GetSelfFuncName() string { pc, _, _, _ := runtime.Caller(1) return cleanUpFuncName(runtime.FuncForPC(pc).Name()) } func cleanUpFuncName(funcName string) string { end := strings.LastIndex(funcName, ".") if end == -1 { return "" } return funcName[end+1:] } func Intersect(slice1, slice2 []uint32) []uint32 { m := make(map[uint32]bool) n := make([]uint32, 0) for _, v := range slice1 { m[v] = true } for _, v := range slice2 { flag, _ := m[v] if flag { n = append(n, v) } } return n } func Difference(slice1, slice2 []uint32) []uint32 { m := make(map[uint32]bool) n := make([]uint32, 0) inter := Intersect(slice1, slice2) for _, v := range inter { m[v] = true } for _, v := range slice1 { if !m[v] { n = append(n, v) } } for _, v := range slice2 { if !m[v] { n = append(n, v) } } return n }