|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- 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]
- }
|