package utils import ( "fmt" "reflect" "strings" "unsafe" ) // string与slice互转,零copy省内存 // zero copy to change slice to string func Slice2String(b []byte) (s string) { pBytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) pString := (*reflect.StringHeader)(unsafe.Pointer(&s)) pString.Data = pBytes.Data pString.Len = pBytes.Len return } // no copy to change string to slice func StringToSlice(s string) (b []byte) { pBytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) pString := (*reflect.StringHeader)(unsafe.Pointer(&s)) pBytes.Data = pString.Data pBytes.Len = pString.Len pBytes.Cap = pString.Len return } // 任意slice合并 func SliceJoin(sep string, elems ...interface{}) string { l := len(elems) if l == 0 { return "" } if l == 1 { s := fmt.Sprint(elems[0]) sLen := len(s) - 1 if s[0] == '[' && s[sLen] == ']' { return strings.Replace(s[1:sLen], " ", sep, -1) } return s } sep = strings.Replace(fmt.Sprint(elems), " ", sep, -1) return sep[1 : len(sep)-1] } func DiffArray(a []string, b []string) []string { var diffArray []string temp := map[string]struct{}{} for _, val := range b { if _, ok := temp[val]; !ok { temp[val] = struct{}{} } } for _, val := range a { if _, ok := temp[val]; !ok { diffArray = append(diffArray, val) } } return diffArray }