From cd80673d8b361c24e794caef1eceb2eb4a9f9eb5 Mon Sep 17 00:00:00 2001 From: pyihe <785131182@qq.com> Date: Fri, 4 Mar 2022 17:24:23 +0800 Subject: [PATCH] style(go-pkg): rename pkg --- {bytes => bytepkg}/bytes.go | 10 +- {certs => certpkg}/cert.go | 13 +- {clone => clonepkg}/clone.go | 4 +- {encrypts => cryptopkg}/encrypt.go | 8 +- encoding/encoding.go | 99 ------- errors/code.go | 35 --- errors/err.go | 83 ------ errpkg/error.go | 24 ++ {files => filepkg}/file.go | 2 +- {https => httppkg}/http.go | 27 +- {https => httppkg}/https.go | 50 ++-- listpkg/list_array.go | 85 ++++++ listpkg/list_hash.go | 402 ++++++++++++++++++++++++++++ listpkg/list_link.go | 3 + listpkg/list_priority.go | 3 + lists/list.go | 415 ----------------------------- {logs => logpkg}/log_log.go | 14 +- {logs => logpkg}/log_option.go | 2 +- {logs => logpkg}/log_zap.go | 6 +- logs/log.go | 217 --------------- {maps => mappkg}/hash.go | 2 +- {maps => mappkg}/kv.go | 11 +- {maps => mappkg}/map.go | 2 +- {maths => mathpkg}/factorial.go | 2 +- {maths => mathpkg}/math.go | 2 +- {monitor => monitorpkg}/file.go | 2 +- {monitor => monitorpkg}/monitor.go | 2 +- {nets => netpkg}/net.go | 2 +- {ptr => pointerpkg}/ptr.go | 2 +- {rands => randpkg}/rand.go | 6 +- {redis => redispkg}/conn.go | 20 +- {redis => redispkg}/hash.go | 2 +- {redis => redispkg}/list.go | 2 +- {redis => redispkg}/pool.go | 10 +- {redis => redispkg}/set.go | 2 +- {redis => redispkg}/string.go | 2 +- serialize/encoding.go | 6 + serialize/gob.go | 23 ++ serialize/json.go | 17 ++ serialize/msgpack.go | 17 ++ serialize/proto.go | 29 ++ {slice => slicepkg}/float32.go | 6 +- {slice => slicepkg}/float64.go | 6 +- {slice => slicepkg}/int.go | 6 +- {slice => slicepkg}/int16.go | 6 +- {slice => slicepkg}/int32.go | 6 +- {slice => slicepkg}/int64.go | 6 +- {slice => slicepkg}/int8.go | 6 +- {slice => slicepkg}/sli.go | 2 +- {slice => slicepkg}/string.go | 6 +- {slice => slicepkg}/uint.go | 6 +- {slice => slicepkg}/uint16.go | 6 +- {slice => slicepkg}/uint32.go | 6 +- {slice => slicepkg}/uint64.go | 6 +- {slice => slicepkg}/uint8.go | 6 +- {sorts => sortpkg}/sli.go | 2 +- {sorts => sortpkg}/sort.go | 2 +- {strings => stringpkg}/strings.go | 2 +- {syncs => syncpkg}/counter.go | 2 +- {times => timepkg}/timer.go | 2 +- {zips => zippkg}/zip.go | 2 +- 61 files changed, 751 insertions(+), 1006 deletions(-) rename {bytes => bytepkg}/bytes.go (83%) rename {certs => certpkg}/cert.go (57%) rename {clone => clonepkg}/clone.go (96%) rename {encrypts => cryptopkg}/encrypt.go (86%) delete mode 100644 encoding/encoding.go delete mode 100644 errors/code.go delete mode 100644 errors/err.go create mode 100644 errpkg/error.go rename {files => filepkg}/file.go (95%) rename {https => httppkg}/http.go (61%) rename {https => httppkg}/https.go (57%) create mode 100644 listpkg/list_array.go create mode 100644 listpkg/list_hash.go create mode 100644 listpkg/list_link.go create mode 100644 listpkg/list_priority.go delete mode 100644 lists/list.go rename {logs => logpkg}/log_log.go (91%) rename {logs => logpkg}/log_option.go (99%) rename {logs => logpkg}/log_zap.go (97%) delete mode 100644 logs/log.go rename {maps => mappkg}/hash.go (99%) rename {maps => mappkg}/kv.go (86%) rename {maps => mappkg}/map.go (99%) rename {maths => mathpkg}/factorial.go (99%) rename {maths => mathpkg}/math.go (97%) rename {monitor => monitorpkg}/file.go (97%) rename {monitor => monitorpkg}/monitor.go (98%) rename {nets => netpkg}/net.go (99%) rename {ptr => pointerpkg}/ptr.go (98%) rename {rands => randpkg}/rand.go (95%) rename {redis => redispkg}/conn.go (95%) rename {redis => redispkg}/hash.go (97%) rename {redis => redispkg}/list.go (97%) rename {redis => redispkg}/pool.go (94%) rename {redis => redispkg}/set.go (96%) rename {redis => redispkg}/string.go (98%) create mode 100644 serialize/encoding.go create mode 100644 serialize/gob.go create mode 100644 serialize/json.go create mode 100644 serialize/msgpack.go create mode 100644 serialize/proto.go rename {slice => slicepkg}/float32.go (97%) rename {slice => slicepkg}/float64.go (97%) rename {slice => slicepkg}/int.go (97%) rename {slice => slicepkg}/int16.go (97%) rename {slice => slicepkg}/int32.go (97%) rename {slice => slicepkg}/int64.go (97%) rename {slice => slicepkg}/int8.go (97%) rename {slice => slicepkg}/sli.go (99%) rename {slice => slicepkg}/string.go (97%) rename {slice => slicepkg}/uint.go (97%) rename {slice => slicepkg}/uint16.go (97%) rename {slice => slicepkg}/uint32.go (97%) rename {slice => slicepkg}/uint64.go (97%) rename {slice => slicepkg}/uint8.go (97%) rename {sorts => sortpkg}/sli.go (99%) rename {sorts => sortpkg}/sort.go (99%) rename {strings => stringpkg}/strings.go (99%) rename {syncs => syncpkg}/counter.go (94%) rename {times => timepkg}/timer.go (98%) rename {zips => zippkg}/zip.go (98%) diff --git a/bytes/bytes.go b/bytepkg/bytes.go similarity index 83% rename from bytes/bytes.go rename to bytepkg/bytes.go index 38515c9..6ef5991 100644 --- a/bytes/bytes.go +++ b/bytepkg/bytes.go @@ -1,4 +1,4 @@ -package bytes +package bytepkg import ( "unsafe" @@ -22,8 +22,8 @@ func String(b []byte) string { return *(*string)(unsafe.Pointer(&b)) } -// SliceEqual 判断两个字节切片每个元素是否相等 -func SliceEqual(a, b []byte) bool { +// BytesEqual 判断两个字节切片每个元素是否相等 +func BytesEqual(a, b []byte) bool { aLen, bLen := len(a), len(b) if aLen != bLen { return false @@ -43,7 +43,7 @@ func SliceEqual(a, b []byte) bool { } // Contain 判断字节切片b是否包含ele元素 -func Contain(ele byte, b []byte) bool { +func Contain(b []byte, ele byte) bool { for _, v := range b { if v == ele { return true @@ -62,7 +62,7 @@ func Reverse(b []byte) { } // Remove 从b中删除ele -func Remove(ele byte, b []byte) { +func Remove(b []byte, ele byte) { for i := range b { if ele == b[i] { b = append(b[:i], b[i+1:]...) diff --git a/certs/cert.go b/certpkg/cert.go similarity index 57% rename from certs/cert.go rename to certpkg/cert.go index 8d260c3..fb7864c 100644 --- a/certs/cert.go +++ b/certpkg/cert.go @@ -1,19 +1,24 @@ -package certs +package certpkg import ( "crypto/tls" "encoding/pem" + "errors" "io/ioutil" "golang.org/x/crypto/pkcs12" ) -func P12ToPem(p12Path string, password string) (*tls.Certificate, error) { - p12, err := ioutil.ReadFile(p12Path) +func P12ToPem(p12Path string, password string) (cert *tls.Certificate, err error) { + if p12Path == "" { + err = errors.New("empty path") + return + } + data, err := ioutil.ReadFile(p12Path) if err != nil { return nil, err } - blocks, err := pkcs12.ToPEM(p12, password) + blocks, err := pkcs12.ToPEM(data, password) if err != nil { return nil, err } diff --git a/clone/clone.go b/clonepkg/clone.go similarity index 96% rename from clone/clone.go rename to clonepkg/clone.go index 96706ca..58551a8 100644 --- a/clone/clone.go +++ b/clonepkg/clone.go @@ -1,4 +1,4 @@ -package clone +package clonepkg import "reflect" @@ -47,6 +47,7 @@ func deepCopy(dst, src reflect.Value) { } } +// DeepCopy 深拷贝 func DeepCopy(dst, src interface{}) { typeDst := reflect.TypeOf(dst) typeSrc := reflect.TypeOf(src) @@ -66,6 +67,7 @@ func DeepCopy(dst, src interface{}) { deepCopy(valueDst, valueSrc) } +// DeepClone 深克隆 func DeepClone(v interface{}) interface{} { dst := reflect.New(reflect.TypeOf(v)).Elem() deepCopy(dst, reflect.ValueOf(v)) diff --git a/encrypts/encrypt.go b/cryptopkg/encrypt.go similarity index 86% rename from encrypts/encrypt.go rename to cryptopkg/encrypt.go index 9931279..dd8d0be 100644 --- a/encrypts/encrypt.go +++ b/cryptopkg/encrypt.go @@ -1,4 +1,4 @@ -package encrypts +package cryptopkg import ( "encoding/base64" @@ -7,7 +7,7 @@ import ( "golang.org/x/crypto/scrypt" ) -//用于加密web的密码 +// BcEncryptPass 用于加密web的密码 func BcEncryptPass(plainPass string) (string, error) { var encryptPass string data, err := bcrypt.GenerateFromPassword([]byte(plainPass), bcrypt.DefaultCost) @@ -18,7 +18,7 @@ func BcEncryptPass(plainPass string) (string, error) { return encryptPass, nil } -//比较密码是否匹配 +// BcComparePass 比较密码是否匹配 func BcComparePass(hashPass, plainPass string) error { hashBytes, err := base64.StdEncoding.DecodeString(hashPass) if err != nil { @@ -27,7 +27,7 @@ func BcComparePass(hashPass, plainPass string) error { return bcrypt.CompareHashAndPassword(hashBytes, []byte(plainPass)) } -//scrypt加密 +// ScryptPass scrypt加密 func ScryptPass(plainPass, salt string) (string, error) { data, err := scrypt.Key([]byte(plainPass), []byte(salt), 1<<15, 8, 1, 32) if err != nil { diff --git a/encoding/encoding.go b/encoding/encoding.go deleted file mode 100644 index 6348bbc..0000000 --- a/encoding/encoding.go +++ /dev/null @@ -1,99 +0,0 @@ -package encoding - -import ( - "bytes" - "encoding/gob" - "encoding/json" - "errors" - - "github.com/golang/protobuf/proto" - "github.com/vmihailenco/msgpack/v5" -) - -type Encoding interface { - Marshal(v interface{}) ([]byte, error) - Unmarshal(data []byte, v interface{}) error -} - -// JSONEncoding json格式 -func JSONEncoding() Encoding { - return &jsonEncoding{} -} - -// GobEncoding -func GobEncoding() Encoding { - return &gobEncoding{} -} - -// MsgpackEncoding -func MsgpackEncoding() Encoding { - return &msgpackEncoding{} -} - -// ProtoEncoding -func ProtoEncoding() Encoding { - return &protoEncoding{} -} - -/***JSON Marshaler***/ -type jsonEncoding struct{} - -// Marshal -func (j *jsonEncoding) Marshal(v interface{}) ([]byte, error) { - return json.Marshal(v) -} - -// Unmarshal -func (j *jsonEncoding) Unmarshal(data []byte, v interface{}) error { - return json.Unmarshal(data, v) -} - -/***gob Marshaler***/ -type gobEncoding struct{} - -// Marshal -func (g *gobEncoding) Marshal(v interface{}) ([]byte, error) { - var b = bytes.NewBuffer(nil) - err := gob.NewEncoder(b).Encode(v) - return b.Bytes(), err -} - -// Unmarshal -func (g *gobEncoding) Unmarshal(data []byte, v interface{}) error { - return gob.NewDecoder(bytes.NewReader(data)).Decode(v) -} - -/***msgpack Marshaler***/ -type msgpackEncoding struct{} - -// Marshal -func (m *msgpackEncoding) Marshal(v interface{}) ([]byte, error) { - return msgpack.Marshal(v) -} - -// Unmarshal -func (m *msgpackEncoding) Unmarshal(data []byte, v interface{}) error { - return msgpack.Unmarshal(data, v) -} - -/***proto Encoding***/ -type protoEncoding struct{} - -// Marshal -func (p *protoEncoding) Marshal(v interface{}) ([]byte, error) { - m, ok := v.(proto.Message) - if !ok { - return nil, errors.New("not proto.Message") - } - - return proto.Marshal(m) -} - -// Unmarshal -func (p *protoEncoding) Unmarshal(data []byte, v interface{}) error { - m, ok := v.(proto.Message) - if !ok { - return errors.New("not proto.Message") - } - return proto.Unmarshal(data, m) -} diff --git a/errors/code.go b/errors/code.go deleted file mode 100644 index b8e99b9..0000000 --- a/errors/code.go +++ /dev/null @@ -1,35 +0,0 @@ -package errors - -import ( - "fmt" -) - -const ( - DefaultErrCode ErrorCode = 100000 -) - -type ErrorCode int64 - -func NewErrCode(code int64) ErrorCode { - return ErrorCode(code) -} - -func (ec ErrorCode) Int() int { - return int(ec) -} - -func (ec ErrorCode) Int64() int64 { - return int64(ec) -} - -func (ec ErrorCode) Int32() int32 { - return int32(ec) -} - -func (ec ErrorCode) ToString() string { - return fmt.Sprintf("%d", ec) -} - -func (ec ErrorCode) Equal(target ErrorCode) bool { - return ec == target -} diff --git a/errors/err.go b/errors/err.go deleted file mode 100644 index 9fb9276..0000000 --- a/errors/err.go +++ /dev/null @@ -1,83 +0,0 @@ -package errors - -import ( - "errors" - "fmt" -) - -type Error interface { - Error() string // 包含code和msg - Code() ErrorCode // 错误码 - Desc() string // 错误描述 - Data() interface{} // 附加信息 - WithData(interface{}) // 给错误添加附加信息 - Is(target error) bool - As(target interface{}) bool -} - -type _err struct { - data interface{} // 如果需要包含特定的数据 - code ErrorCode // 错误码 - msg string // 错误描述 -} - -func New(err string) Error { - return &_err{ - code: DefaultErrCode, - msg: err, - } -} - -func NewWithCode(err string, code ErrorCode) Error { - return &_err{ - code: code, - msg: err, - } -} - -func (e *_err) Error() string { - if e == nil { - return "" - } - return fmt.Sprintf("code: %d err: %s", e.code, e.msg) -} - -func (e *_err) Code() ErrorCode { - if e == nil { - return 0 - } - return e.code -} - -func (e *_err) Desc() string { - if e == nil { - return "" - } - return e.msg -} - -func (e *_err) Data() interface{} { - if e == nil { - return nil - } - return e.data -} - -func (e *_err) WithData(data interface{}) { - if data == nil || e == nil { - return - } - e.data = data -} - -func (e *_err) Is(target error) bool { - return errors.Is(e, target) -} - -func (e *_err) As(target interface{}) bool { - return errors.As(e, target) -} - -func (e *_err) Unwrap() error { - return errors.Unwrap(e) -} diff --git a/errpkg/error.go b/errpkg/error.go new file mode 100644 index 0000000..9abd78e --- /dev/null +++ b/errpkg/error.go @@ -0,0 +1,24 @@ +package errpkg + +type Error struct { + err string + code int32 +} + +func New(err string, codes ...int32) error { + e := &Error{ + err: err, + } + if len(codes) > 0 { + e.code = codes[0] + } + return e +} + +func (e *Error) Error() (err string) { + return e.err +} + +func (e *Error) Code() int32 { + return e.code +} diff --git a/files/file.go b/filepkg/file.go similarity index 95% rename from files/file.go rename to filepkg/file.go index 862859f..f59cf67 100644 --- a/files/file.go +++ b/filepkg/file.go @@ -1,4 +1,4 @@ -package files +package filepkg import "os" diff --git a/https/http.go b/httppkg/http.go similarity index 61% rename from https/http.go rename to httppkg/http.go index b551bcd..13a1c1b 100644 --- a/https/http.go +++ b/httppkg/http.go @@ -1,4 +1,4 @@ -package https +package httppkg import ( "io" @@ -6,16 +6,16 @@ import ( "net/http" "strings" - "github.com/pyihe/go-pkg/encoding" - "github.com/pyihe/go-pkg/errors" + "github.com/pyihe/go-pkg/errpkg" + "github.com/pyihe/go-pkg/serialize" ) var ( - ErrInvalidUrl = errors.New("url must start with 'http'") - ErrInvalidEncoder = errors.New("invalid encoder") + ErrInvalidUrl = errpkg.New("url must start with 'http'") + ErrInvalidEncoder = errpkg.New("invalid encoder") ) -// Get +// Get 发起http get请求 func Get(client *http.Client, url string) ([]byte, error) { if url == "" || !strings.HasPrefix(url, "http") { return nil, ErrInvalidUrl @@ -33,17 +33,17 @@ func Get(client *http.Client, url string) ([]byte, error) { return ioutil.ReadAll(response.Body) } -// GetWithObj -func GetWithObj(client *http.Client, url string, encoder encoding.Encoding, obj interface{}) error { +// GetWithObj 发起get请求,并将结果反序列化到指定obj中 +func GetWithObj(client *http.Client, url string, encoder serialize.Serializer, obj interface{}) error { data, err := Get(client, url) if err != nil { return err } - err = encoder.Unmarshal(data, obj) + err = encoder.Decode(data, obj) return err } -// Post +// Post 发起POST请求 func Post(client *http.Client, url string, contentType string, body io.Reader) ([]byte, error) { if url == "" || !strings.HasPrefix(url, "http") { return nil, ErrInvalidUrl @@ -60,12 +60,11 @@ func Post(client *http.Client, url string, contentType string, body io.Reader) ( return ioutil.ReadAll(response.Body) } -// PostWithObj -func PostWithObj(client *http.Client, url string, contentType string, body io.Reader, encoder encoding.Encoding, v interface{}) error { +// PostWithObj 发起POST请求并将结果发序列化到指定obj +func PostWithObj(client *http.Client, url string, contentType string, body io.Reader, encoder serialize.Serializer, v interface{}) error { data, err := Post(client, url, contentType, body) if err != nil { return err } - - return encoder.Unmarshal(data, v) + return encoder.Decode(data, v) } diff --git a/https/https.go b/httppkg/https.go similarity index 57% rename from https/https.go rename to httppkg/https.go index b31fcbc..58602ad 100644 --- a/https/https.go +++ b/httppkg/https.go @@ -1,4 +1,4 @@ -package https +package httppkg import ( "crypto/tls" @@ -7,29 +7,20 @@ import ( "io/ioutil" "net/http" - "github.com/pyihe/go-pkg/encoding" + "github.com/pyihe/go-pkg/serialize" ) -type TLSClient interface { - Get(url string) ([]byte, error) - GetWithObj(url string, obj interface{}) error - Post(url, contentType string, body io.Reader) ([]byte, error) - PostWithObj(url, contentType string, body io.Reader, obj interface{}) error - ListenAndServeTLS(serverCrt, serverKey string) error -} - -// httpClient -type httpClient struct { +type TLSClient struct { client *http.Client ca *x509.CertPool certificate tls.Certificate - encoder encoding.Encoding + encoder serialize.Serializer } -// NewTLSClient -func NewTLSClient(caCrt, clientCrt, clientKey string, encoder encoding.Encoding) { +// NewTLSClient 创建TLS客户端 +func NewTLSClient(caCrt, clientCrt, clientKey string, encoder serialize.Serializer) *TLSClient { var err error - c := &httpClient{ + c := &TLSClient{ encoder: encoder, } @@ -51,11 +42,11 @@ func NewTLSClient(caCrt, clientCrt, clientKey string, encoder encoding.Encoding) }, }, } - + return c } -// ListenAndServeTLS -func (h *httpClient) ListenAndServeTLS(serverCrt, serverKey string) error { +// ListenAndServeTLS start +func (h *TLSClient) ListenAndServeTLS(serverCrt, serverKey string) error { server := &http.Server{ Addr: ":443", TLSConfig: &tls.Config{ @@ -66,8 +57,8 @@ func (h *httpClient) ListenAndServeTLS(serverCrt, serverKey string) error { return server.ListenAndServeTLS(serverCrt, serverKey) } -// Get -func (h *httpClient) Get(url string) ([]byte, error) { +// Get GET请求 +func (h *TLSClient) Get(url string) ([]byte, error) { response, err := h.client.Get(url) if err != nil { return nil, err @@ -78,8 +69,8 @@ func (h *httpClient) Get(url string) ([]byte, error) { return ioutil.ReadAll(response.Body) } -// GetWithObj -func (h *httpClient) GetWithObj(url string, obj interface{}) error { +// GetWithObj GET并反序列化 +func (h *TLSClient) GetWithObj(url string, obj interface{}) error { data, err := h.Get(url) if err != nil { return err @@ -88,11 +79,11 @@ func (h *httpClient) GetWithObj(url string, obj interface{}) error { return ErrInvalidEncoder } - return h.encoder.Unmarshal(data, obj) + return h.encoder.Decode(data, obj) } -// Post -func (h *httpClient) Post(url, contentType string, body io.Reader) ([]byte, error) { +// Post POST请求 +func (h *TLSClient) Post(url, contentType string, body io.Reader) ([]byte, error) { response, err := h.client.Post(url, contentType, body) if err != nil { return nil, err @@ -102,8 +93,8 @@ func (h *httpClient) Post(url, contentType string, body io.Reader) ([]byte, erro return ioutil.ReadAll(response.Body) } -// PostWithObj -func (h *httpClient) PostWithObj(url, contentType string, body io.Reader, obj interface{}) error { +// PostWithObj POST请求并反序列化 +func (h *TLSClient) PostWithObj(url, contentType string, body io.Reader, obj interface{}) error { data, err := h.Post(url, contentType, body) if err != nil { return err @@ -111,10 +102,9 @@ func (h *httpClient) PostWithObj(url, contentType string, body io.Reader, obj in if h.encoder == nil { return ErrInvalidEncoder } - return h.encoder.Unmarshal(data, obj) + return h.encoder.Decode(data, obj) } -// loadCA 加载身份证书 func loadCA(caFile string) (*x509.CertPool, error) { p := x509.NewCertPool() ca, err := ioutil.ReadFile(caFile) diff --git a/listpkg/list_array.go b/listpkg/list_array.go new file mode 100644 index 0000000..752ce4e --- /dev/null +++ b/listpkg/list_array.go @@ -0,0 +1,85 @@ +package listpkg + +import "sync" + +const ( + defaultCap = 128 +) + +// ArrayList 切片实现的队列 +type ArrayList struct { + mu *sync.Mutex + data []interface{} +} + +func NewArrayList() *ArrayList { + return &ArrayList{ + mu: &sync.Mutex{}, + data: make([]interface{}, 0, defaultCap), + } +} + +// LPush 从队首添加元素 +func (array *ArrayList) LPush(datas ...interface{}) { + array.mu.Lock() + defer array.mu.Unlock() + + n := len(datas) + if n == 0 { + return + } + + length := len(array.data) + capacity := cap(array.data) + switch length == capacity { + case true: // 如果已经放满了,需要扩容 + na := make([]interface{}, length+1, capacity+capacity/2) + copy(na[1:], array.data) + na[0] = datas + array.data = na + default: // 没有放满的话 + array.data = append(array.data, nil) + for i := length; i > 0; i-- { + array.data[i] = array.data[i-1] + } + array.data[0] = datas + } +} + +// LPop 从队首取数据 +func (array *ArrayList) LPop() (data interface{}) { + array.mu.Lock() + defer array.mu.Unlock() + if len(array.data) == 0 { + return + } + data = array.data[0] + array.data = array.data[1:] + return +} + +// RPush 从队尾添加元素 +func (array *ArrayList) RPush(data interface{}) { + array.mu.Lock() + array.data = append(array.data, data) + array.mu.Unlock() +} + +// RPop 从队尾取出并删除元素 +func (array *ArrayList) RPop() (data interface{}) { + array.mu.Lock() + defer array.mu.Unlock() + + n := len(array.data) + if n == 0 { + return + } + + data = array.data[n-1] + array.data = array.data[:n-1] + return data +} + +func (array *ArrayList) Data() []interface{} { + return array.data +} diff --git a/listpkg/list_hash.go b/listpkg/list_hash.go new file mode 100644 index 0000000..511e248 --- /dev/null +++ b/listpkg/list_hash.go @@ -0,0 +1,402 @@ +package listpkg + +import ( + "container/list" + "reflect" + "sync" +) + +type HashList struct { + mu *sync.RWMutex + data map[interface{}]*list.List +} + +func NewHList() *HashList { + return &HashList{ + mu: &sync.RWMutex{}, + data: make(map[interface{}]*list.List), + } +} + +// LPush 向队首添加数据 +func (hl *HashList) LPush(key interface{}, data ...interface{}) (n int) { + hl.mu.Lock() + n = hl.push(true, key, data...) + hl.mu.Unlock() + + return +} + +// LPop 从队首取出数据 +func (hl *HashList) LPop(key interface{}) (data interface{}) { + hl.mu.Lock() + data = hl.pop(true, key) + hl.mu.Unlock() + return +} + +// RPush 向队尾添加数据 +func (hl *HashList) RPush(key interface{}, data ...interface{}) (n int) { + hl.mu.Lock() + n = hl.push(false, key, data...) + hl.mu.Unlock() + return +} + +// RPop 从队尾取数据 +func (hl *HashList) RPop(key interface{}) (data interface{}) { + hl.mu.Lock() + data = hl.pop(false, key) + hl.mu.Unlock() + return +} + +// Index 根据索引查找数据 +func (hl *HashList) Index(key interface{}, idx int) (data interface{}) { + hl.mu.RLock() + defer hl.mu.RUnlock() + + record := hl.data[key] + ok, newIndex := validIndex(record, idx) + if !ok { + return + } + + if element := index(record, newIndex); element != nil { + data = element.Value + } + return +} + +// Remove 删除数据 +// count为删除个数 +// count == 0 从队首开始删除所有的data +// count > 0 从队首开始删除count个data +// count < 0 从队尾开始删除count个data +func (hl *HashList) Remove(key interface{}, data interface{}, count int) (rmCount int) { + hl.mu.Lock() + defer hl.mu.Unlock() + + record := hl.data[key] + if record == nil || record.Len() == 0 { + return + } + var es []*list.Element + switch { + case count > 0: + for e := record.Front(); e != nil && len(es) < count; e = e.Next() { + if reflect.DeepEqual(e.Value, data) { + es = append(es, e) + } + } + case count < 0: + for e := record.Back(); e != nil && len(es) < count; e = e.Prev() { + if reflect.DeepEqual(e.Value, data) { + es = append(es, e) + } + } + default: + for e := record.Front(); e != nil; e = e.Next() { + if reflect.DeepEqual(e.Value, data) { + es = append(es, e) + } + } + } + for _, e := range es { + record.Remove(e) + } + rmCount = len(es) + return +} + +func (hl *HashList) UnsafeLInsert(key interface{}, pivot, val interface{}) int { + record := hl.data[key] + pEle := find(record, pivot) + if pEle == nil { + return -1 + } + record.InsertBefore(val, pEle) + return record.Len() +} + +// LInsert 在指定位置前面插入数据 +// 插入失败返回-1 +// 插入成功返回队列长度 +func (hl *HashList) LInsert(key interface{}, mark, val interface{}) int { + hl.mu.Lock() + defer hl.mu.Unlock() + + record := hl.data[key] + pElement := find(record, mark) + if pElement == nil { + return -1 + } + record.InsertBefore(val, pElement) + return record.Len() +} + +// RInsert 在指定位置后面插入数据 +// 插入失败返回-1 +// 插入成功返回队列长度 +func (hl *HashList) RInsert(key interface{}, mark, val interface{}) int { + hl.mu.Lock() + defer hl.mu.Unlock() + + record := hl.data[key] + pElement := find(record, mark) + if pElement == nil { + return -1 + } + record.InsertAfter(val, pElement) + + return record.Len() +} + +// Set 将索引处的数据设置为val +func (hl *HashList) Set(key interface{}, idx int, val interface{}) (ok bool) { + hl.mu.Lock() + defer hl.mu.Unlock() + + record := hl.data[key] + data := index(record, idx) + if data != nil { + data.Value = val + ok = true + } + return +} + +func (hl *HashList) UnsafeRange(key interface{}, start, end int) (result []interface{}) { + record := hl.data[key] + if record == nil || record.Len() == 0 { + return nil + } + length := record.Len() + start, end = handleIndex(length, start, end) + if start > end || start >= length { + return nil + } + + mid := length >> 1 + if end <= mid || end-mid < mid-start { + flag := 0 + for p := record.Front(); p != nil && flag <= end; p, flag = p.Next(), flag+1 { + if flag >= start { + result = append(result, p.Value) + } + } + } else { + flag := length - 1 + for p := record.Back(); p != nil && flag >= start; p, flag = p.Prev(), flag-1 { + if flag <= end { + result = append(result, p.Value) + } + } + if len(result) > 0 { + for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 { + result[i], result[j] = result[j], result[i] + } + } + } + return +} + +// Range 遍历start到end之间的数据 +func (hl *HashList) Range(key interface{}, start, end int) (result []interface{}) { + hl.mu.Lock() + defer hl.mu.Unlock() + + record := hl.data[key] + if record == nil || record.Len() == 0 { + return nil + } + length := record.Len() + start, end = handleIndex(length, start, end) + if start > end || start >= length { + return nil + } + + mid := length >> 1 + if end <= mid || end-mid < mid-start { + flag := 0 + for p := record.Front(); p != nil && flag <= end; p, flag = p.Next(), flag+1 { + if flag >= start { + result = append(result, p.Value) + } + } + } else { + flag := length - 1 + for p := record.Back(); p != nil && flag >= start; p, flag = p.Prev(), flag-1 { + if flag <= end { + result = append(result, p.Value) + } + } + if len(result) > 0 { + for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 { + result[i], result[j] = result[j], result[i] + } + } + } + + return +} + +// Trim 截断 +func (hl *HashList) Trim(key interface{}, start, end int) bool { + hl.mu.Lock() + defer hl.mu.Unlock() + + record := hl.data[key] + if record == nil || record.Len() <= 0 { + return false + } + + length := record.Len() + start, end = handleIndex(length, start, end) + + //start小于等于左边界,end大于等于右边界,不处理 + if start <= 0 && end >= length-1 { + return false + } + + //start大于end,或者start超出右边界,则直接将列表置空 + if start > end || start >= length { + hl.data[key] = nil + delete(hl.data, key) + return true + } + + startEle, endEle := index(record, start), index(record, end) + switch end-start+1 < (length >> 1) { + case true: + newList := list.New() + for p := startEle; p != endEle.Next(); p = p.Next() { + newList.PushBack(p.Value) + } + hl.data[key] = newList + default: + var ele []*list.Element + for p := record.Front(); p != startEle; p = p.Next() { + ele = append(ele, p) + } + for p := record.Back(); p != endEle; p = p.Prev() { + ele = append(ele, p) + } + for _, e := range ele { + record.Remove(e) + } + } + return true +} + +func (hl *HashList) Len(key interface{}) (length int) { + hl.mu.RLock() + length = hl.data[key].Len() + hl.mu.RUnlock() + return +} + +func (hl *HashList) push(front bool, key interface{}, val ...interface{}) int { + record := hl.data[key] + if record == nil { + record = list.New() + hl.data[key] = record + } + + switch { + case front == true: + for _, v := range val { + record.PushFront(v) + } + default: + for _, v := range val { + record.PushBack(v) + } + } + return record.Len() +} + +func (hl *HashList) pop(front bool, key interface{}) interface{} { + record := hl.data[key] + if record == nil || record.Len() == 0 { + return nil + } + var element *list.Element + switch { + case front: + element = record.Front() + default: + element = record.Back() + } + record.Remove(element) + return element.Value +} + +func handleIndex(length, start, end int) (int, int) { + if start < 0 { + start += length + } + if end < 0 { + end += length + } + if start < 0 { + start = 0 + } + if end >= length { + end = length - 1 + } + return start, end +} + +func validIndex(dataList *list.List, index int) (bool, int) { + if dataList == nil || dataList.Len() <= 0 { + return false, index + } + n := dataList.Len() + if index < 0 { + index += n + } + return index >= 0 && index < n, index +} + +func find(dataList *list.List, target interface{}) (result *list.Element) { + if dataList == nil || dataList.Len() == 0 { + return + } + for ele := dataList.Front(); ele != nil; ele = ele.Next() { + if reflect.DeepEqual(ele.Value, target) { + result = ele + break + } + } + return +} + +func index(dataList *list.List, index int) (data *list.Element) { + if dataList == nil || dataList.Len() == 0 { + return + } + ok, newIndex := validIndex(dataList, index) + if !ok { + return + } + index = newIndex + + var element *list.Element + // 如果index在前半段,则从头开始找,否则从后半段查找 + switch index <= ((dataList.Len()) >> 1) { + case true: + val := dataList.Front() + for i := 0; i < index; i++ { + val = val.Next() + } + element = val + default: + val := dataList.Back() + for i := dataList.Len() - 1; i > index; i-- { + val = val.Prev() + } + element = val + } + return element +} diff --git a/listpkg/list_link.go b/listpkg/list_link.go new file mode 100644 index 0000000..b382bff --- /dev/null +++ b/listpkg/list_link.go @@ -0,0 +1,3 @@ +package listpkg + +// 链表实现的队列 diff --git a/listpkg/list_priority.go b/listpkg/list_priority.go new file mode 100644 index 0000000..a92d435 --- /dev/null +++ b/listpkg/list_priority.go @@ -0,0 +1,3 @@ +package listpkg + +// 优先级队列 diff --git a/lists/list.go b/lists/list.go deleted file mode 100644 index 3df9f44..0000000 --- a/lists/list.go +++ /dev/null @@ -1,415 +0,0 @@ -package list - -import ( - "container/list" - "reflect" - "sync" -) - -type HList struct { - mu sync.RWMutex - data map[interface{}]*list.List -} - -func NewHList() *HList { - return &HList{ - data: make(map[interface{}]*list.List), - } -} - -func (hl *HList) UnsafeLPush(key interface{}, data ...interface{}) int { - hl.init() - return hl.push(true, key, data...) -} - -func (hl *HList) LPush(key interface{}, data ...interface{}) int { - hl.mu.Lock() - defer hl.mu.Unlock() - return hl.UnsafeLPush(key, data...) -} - -func (hl *HList) UnsafeLPop(key interface{}) interface{} { - hl.init() - return hl.pop(true, key) -} - -func (hl *HList) LPop(key interface{}) interface{} { - hl.mu.Lock() - defer hl.mu.Unlock() - return hl.UnsafeLPop(key) -} - -func (hl *HList) UnsafeRPush(key interface{}, data ...interface{}) int { - hl.init() - return hl.push(false, key, data...) -} - -func (hl *HList) RPush(key interface{}, data ...interface{}) int { - hl.mu.Lock() - defer hl.mu.Unlock() - return hl.UnsafeRPush(key, data...) -} - -func (hl *HList) UnsafeRPop(key interface{}) interface{} { - hl.init() - return hl.pop(false, key) -} - -func (hl *HList) RPop(key interface{}) interface{} { - hl.mu.Lock() - defer hl.mu.Unlock() - return hl.UnsafeRPop(key) -} - -func (hl *HList) UnsafeIndex(key interface{}, index int) interface{} { - hl.init() - ok, newIndex := hl.validIndex(key, index) - if !ok { - return nil - } - index = newIndex - element := hl.index(key, index) - if element != nil { - return element.Value - } - return nil -} - -func (hl *HList) Index(key interface{}, index int) interface{} { - hl.mu.RLock() - defer hl.mu.RUnlock() - return hl.UnsafeIndex(key, index) -} - -func (hl *HList) UnsafeRem(key interface{}, data interface{}, count int) (rmCount int) { - hl.init() - record := hl.data[key] - if record == nil || record.Len() == 0 { - return - } - var es []*list.Element - if count == 0 { - for e := record.Front(); e != nil; e = e.Next() { - if reflect.DeepEqual(e.Value, data) { - es = append(es, e) - } - } - } - if count > 0 { - for e := record.Front(); e != nil && len(es) < count; e = e.Next() { - if reflect.DeepEqual(e.Value, data) { - es = append(es, e) - } - } - } - - if count < 0 { - for e := record.Back(); e != nil && len(es) < count; e = e.Prev() { - if reflect.DeepEqual(e.Value, data) { - es = append(es, e) - } - } - } - - for _, e := range es { - record.Remove(e) - } - rmCount = len(es) - es = nil - - return -} - -func (hl *HList) Rem(key interface{}, data interface{}, count int) (rmCount int) { - hl.mu.Lock() - defer hl.mu.Unlock() - return hl.UnsafeRem(key, data, count) -} - -func (hl *HList) UnsafeLInsert(key interface{}, pivot, val interface{}) int { - hl.init() - pEle := hl.find(key, pivot) - if pEle == nil { - return -1 - } - - record := hl.data[key] - if record == nil { - record = list.New() - hl.data[key] = record - } - record.InsertBefore(val, pEle) - return record.Len() -} - -func (hl *HList) LInsert(key interface{}, pivot, val interface{}) int { - hl.mu.Lock() - defer hl.mu.Unlock() - return hl.UnsafeLInsert(key, pivot, val) -} - -func (hl *HList) UnsafeRInsert(key interface{}, pivot, val interface{}) int { - hl.init() - pEle := hl.find(key, pivot) - if pEle == nil { - return -1 - } - - record := hl.data[key] - if record == nil { - record = list.New() - hl.data[key] = record - } - record.InsertAfter(val, pEle) - return record.Len() -} - -func (hl *HList) RInsert(key interface{}, pivot, val interface{}) int { - hl.mu.Lock() - defer hl.mu.Unlock() - return hl.UnsafeRInsert(key, pivot, val) -} - -func (hl *HList) UnsafeSet(key interface{}, index int, val interface{}) bool { - hl.init() - element := hl.index(key, index) - if element == nil { - return false - } - element.Value = val - return true -} - -func (hl *HList) Set(key interface{}, index int, val interface{}) bool { - hl.mu.Lock() - defer hl.mu.Unlock() - return hl.UnsafeSet(key, index, val) -} - -func (hl *HList) UnsafeRange(key interface{}, start, end int) (result []interface{}) { - hl.init() - record := hl.data[key] - if record == nil || record.Len() == 0 { - return nil - } - length := record.Len() - start, end = hl.handleIndex(length, start, end) - if start > end || start >= length { - return nil - } - - mid := length >> 1 - if end <= mid || end-mid < mid-start { - flag := 0 - for p := record.Front(); p != nil && flag <= end; p, flag = p.Next(), flag+1 { - if flag >= start { - result = append(result, p.Value) - } - } - } else { - flag := length - 1 - for p := record.Back(); p != nil && flag >= start; p, flag = p.Prev(), flag-1 { - if flag <= end { - result = append(result, p.Value) - } - } - if len(result) > 0 { - for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 { - result[i], result[j] = result[j], result[i] - } - } - } - return -} - -func (hl *HList) Range(key interface{}, start, end int) (result []interface{}) { - hl.mu.Lock() - defer hl.mu.Unlock() - return hl.UnsafeRange(key, start, end) -} - -func (hl *HList) UnsafeTrim(key interface{}, start, end int) bool { - hl.init() - item := hl.data[key] - if item == nil || item.Len() <= 0 { - return false - } - - length := item.Len() - start, end = hl.handleIndex(length, start, end) - - //start小于等于左边界,end大于等于右边界,不处理 - if start <= 0 && end >= length-1 { - return false - } - - //start大于end,或者start超出右边界,则直接将列表置空 - if start > end || start >= length { - hl.data[key] = nil - delete(hl.data, key) - return true - } - - startEle, endEle := hl.index(key, start), hl.index(key, end) - if end-start+1 < (length >> 1) { - newList := list.New() - for p := startEle; p != endEle.Next(); p = p.Next() { - newList.PushBack(p.Value) - } - - item = nil - hl.data[key] = newList - } else { - var ele []*list.Element - for p := item.Front(); p != startEle; p = p.Next() { - ele = append(ele, p) - } - for p := item.Back(); p != endEle; p = p.Prev() { - ele = append(ele, p) - } - - for _, e := range ele { - item.Remove(e) - } - - ele = nil - } - - return true -} - -func (hl *HList) Trim(key interface{}, start, end int) bool { - hl.mu.Lock() - defer hl.mu.Unlock() - return hl.UnsafeTrim(key, start, end) -} - -func (hl *HList) UnsafeLen(key interface{}) int { - hl.init() - record := hl.data[key] - if record != nil { - return record.Len() - } - - return 0 -} - -func (hl *HList) Len(key interface{}) int { - hl.mu.RLock() - defer hl.mu.RUnlock() - return hl.UnsafeLen(key) -} - -func (hl *HList) init() { - if hl.data == nil { - hl.data = make(map[interface{}]*list.List) - } -} - -func (hl *HList) push(front bool, key interface{}, val ...interface{}) int { - record := hl.data[key] - if record == nil { - record = list.New() - hl.data[key] = record - } - - switch { - case front == true: - for _, v := range val { - record.PushFront(v) - } - default: - for _, v := range val { - record.PushBack(v) - } - } - return record.Len() -} - -func (hl *HList) pop(front bool, key interface{}) interface{} { - record := hl.data[key] - if record == nil || record.Len() == 0 { - return nil - } - var element *list.Element - switch { - case front: - element = record.Front() - default: - element = record.Back() - } - record.Remove(element) - return element.Value -} - -func (hl *HList) find(key interface{}, data interface{}) *list.Element { - record := hl.data[key] - if record == nil || record.Len() == 0 { - return nil - } - var e *list.Element - for ele := record.Front(); ele != nil; ele = ele.Next() { - if reflect.DeepEqual(ele.Value, data) { - e = ele - break - } - } - return e -} - -func (hl *HList) index(key interface{}, index int) *list.Element { - ok, newIndex := hl.validIndex(key, index) - if !ok { - return nil - } - index = newIndex - var record = hl.data[key] - if record == nil || record.Len() == 0 { - return nil - } - - var element *list.Element - // 如果index在前半段,则从头开始找,否则从后半段查找 - if index <= ((record.Len()) >> 1) { - val := record.Front() - for i := 0; i < index; i++ { - val = val.Next() - } - element = val - } else { - val := record.Back() - for i := record.Len() - 1; i > index; i-- { - val = val.Prev() - } - element = val - } - return element -} - -func (hl *HList) validIndex(key interface{}, index int) (bool, int) { - record := hl.data[key] - if record == nil || record.Len() <= 0 { - return false, index - } - n := record.Len() - if index < 0 { - index += n - } - return index >= 0 && index < n, index -} - -func (hl *HList) handleIndex(length, start, end int) (int, int) { - if start < 0 { - start += length - } - if end < 0 { - end += length - } - if start < 0 { - start = 0 - } - if end >= length { - end = length - 1 - } - return start, end -} diff --git a/logs/log_log.go b/logpkg/log_log.go similarity index 91% rename from logs/log_log.go rename to logpkg/log_log.go index d713aa5..5187588 100644 --- a/logs/log_log.go +++ b/logpkg/log_log.go @@ -1,4 +1,4 @@ -package logs +package logpkg var ( logger Logger @@ -22,62 +22,50 @@ type Logger interface { WithFields(fields Fields) Logger } -// Debug func Debug(args ...interface{}) { logger.Debug(args...) } -// Debugf func Debugf(format string, args ...interface{}) { logger.Debugf(format, args...) } -// Info func Info(args ...interface{}) { logger.Info(args...) } -// Infof func Infof(format string, args ...interface{}) { logger.Infof(format, args...) } -// Warn func Warn(args ...interface{}) { logger.Warn(args...) } -// Warnf func Warnf(format string, args ...interface{}) { logger.Warnf(format, args...) } -// Error func Error(args ...interface{}) { logger.Error(args...) } -// Errorf func Errorf(format string, args ...interface{}) { logger.Errorf(format, args...) } -// Fatal func Fatal(args ...interface{}) { logger.Fatal(args...) } -// Fatalf func Fatalf(format string, args ...interface{}) { logger.Fatalf(format, args...) } -// Panicf func Panicf(format string, args ...interface{}) { logger.Panicf(format, args...) } -// WithFields func WithFields(fields Fields) Logger { return logger.WithFields(fields) } diff --git a/logs/log_option.go b/logpkg/log_option.go similarity index 99% rename from logs/log_option.go rename to logpkg/log_option.go index 714b5e8..0cafa99 100644 --- a/logs/log_option.go +++ b/logpkg/log_option.go @@ -1,4 +1,4 @@ -package logs +package logpkg // LogOption 日志配置项 type LogOption func(zl *zapLogger) diff --git a/logs/log_zap.go b/logpkg/log_zap.go similarity index 97% rename from logs/log_zap.go rename to logpkg/log_zap.go index cf0ba41..56763c9 100644 --- a/logs/log_zap.go +++ b/logpkg/log_zap.go @@ -1,4 +1,4 @@ -package logs +package logpkg import ( "io" @@ -6,7 +6,7 @@ import ( "strings" "time" - "github.com/pyihe/go-pkg/nets" + "github.com/pyihe/go-pkg/netpkg" rotatelogs "github.com/lestrrat-go/file-rotatelogs" "go.uber.org/zap" @@ -57,7 +57,7 @@ func newZapLogger(opts ...LogOption) (Logger, error) { encoder := getJSONEncoder() - op := zap.Fields(zap.String("ip", nets.GetLocalIP()), zap.String("app", zlogger.name)) + op := zap.Fields(zap.String("ip", netpkg.GetLocalIP()), zap.String("app", zlogger.name)) options = append(options, op) allLevel := zap.LevelEnablerFunc(func(lv zapcore.Level) bool { diff --git a/logs/log.go b/logs/log.go deleted file mode 100644 index 2fe143f..0000000 --- a/logs/log.go +++ /dev/null @@ -1,217 +0,0 @@ -package logs - -import ( - "fmt" - "io" - "os" - "path" - "runtime" - "sync" - "time" -) - -const ( - colorRed = 31 - colorYellow = 33 - colorBlue = 34 - - levelT = "[T] " - levelE = "[E] " - levelW = "[W] " - levelF = "[F] " - - defaultFileSize = 60 * 1024 * 1024 - minFileSize = 1 * 1024 * 1024 - defaultLogDir = "logs" - defaultLogName = "default.logs" -) - -const ( - logTypeStd logType = iota + 1 - logTypeFile -) - -type ( - logType int - - logOption func(log *myLog) - - myLog struct { - sync.Once - sync.Mutex - outs map[logType]io.Writer //writer集合 - file *os.File //文件句柄 - fileName string //日志名 - dir string //日志存放路径 - size int64 //单个日志文件的大小限制 - } -) - -var ( - defaultLogger = &myLog{} -) - -func (m *myLog) init() { - if m.dir == "" { - m.dir = defaultLogDir - } - if m.fileName == "" { - m.fileName = defaultLogName - } - if m.size == 0 { - m.size = defaultFileSize - } else { - if m.size < minFileSize { - panic(fmt.Sprintf("invalid size: %d", m.size)) - } - } - - if m.outs == nil { - m.outs = make(map[logType]io.Writer) - } - if !isExist(m.dir) { - if err := os.Mkdir(m.dir, 0777); err != nil { - panic(err) - } - } - name := path.Join(m.dir, m.fileName) - file, err := os.OpenFile(name, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0755) - if err != nil { - panic(err) - } - - m.file = file - m.outs[logTypeStd] = os.Stdout - m.outs[logTypeFile] = file -} - -func (m *myLog) checkLogSize() { - if m.file == nil { - return - } - m.Lock() - defer m.Unlock() - fileInfo, err := m.file.Stat() - if err != nil { - panic(err) - } - if m.size > fileInfo.Size() { - return - } - //需要分割 - newName := path.Join(m.dir, time.Now().Format("2006_01_02_15:04:03")+".logs") - name := path.Join(m.dir, m.fileName) - - err = os.Rename(name, newName) - if err != nil { - panic(err) - } - - file, err := os.OpenFile(name, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0755) - if err != nil { - panic(err) - } - - m.file.Close() - m.file = file - m.outs[logTypeFile] = file - return -} - -func (m *myLog) writeLog() { - -} - -func (m *myLog) write(msg, timeStr, fileName, prefix string, line, color int) { - m.checkLogSize() - - for k, wr := range m.outs { - if k == logTypeStd { - fmt.Fprintf(wr, "%c[%dm%s[%s %s:%d] %s%c[0m\n", 0x1B, color, prefix, timeStr, fileName, line, msg, 0x1B) - } else { - fmt.Fprintf(wr, "%s[%s %s:%d] %s\n", prefix, timeStr, fileName, line, msg) - } - } -} - -func WithSize(size int64) logOption { - return func(log *myLog) { - log.size = size - } -} - -func WithLogDir(dir string) logOption { - return func(log *myLog) { - log.dir = dir - } -} - -func WithFileName(name string) logOption { - return func(log *myLog) { - log.fileName = name - } -} - -func InitLogger(args ...logOption) { - defaultLogger.Do(func() { - for _, af := range args { - af(defaultLogger) - } - defaultLogger.init() - }) -} - -////Info -func T(format string, v ...interface{}) { - timeStr, fileName, line := getPrefixInfo() - defaultLogger.write(fmt.Sprintf(format, v...), timeStr, fileName, levelT, line, colorBlue) -} - -// -////Error -func E(format string, v ...interface{}) { - timeStr, fileName, line := getPrefixInfo() - defaultLogger.write(fmt.Sprintf(format, v...), timeStr, fileName, levelE, line, colorYellow) -} - -//Warn -func W(format string, v ...interface{}) { - timeStr, fileName, line := getPrefixInfo() - defaultLogger.write(fmt.Sprintf(format, v...), timeStr, fileName, levelW, line, colorRed) -} - -//Fatal -func F(format string, v ...interface{}) { - timeStr, fileName, line := getPrefixInfo() - defaultLogger.write(fmt.Sprintf(format, v...), timeStr, fileName, levelF, line, colorRed) - os.Exit(-1) -} - -func getPrefixInfo() (timeStr, fileName string, line int) { - _, file, line, _ := runtime.Caller(1) - fileName = shortFileName(file) - timeStr = time.Now().Format("2006-01-02 15:04:05.0000") - return timeStr, fileName, line -} - -func isExist(path string) bool { - _, err := os.Stat(path) - if err != nil { - if os.IsExist(err) { - return true - } - return false - } - return true -} - -func shortFileName(file string) string { - short := file - for i := len(file) - 1; i > 0; i-- { - if file[i] == '/' { - short = file[i+1:] - break - } - } - return short -} diff --git a/maps/hash.go b/mappkg/hash.go similarity index 99% rename from maps/hash.go rename to mappkg/hash.go index e7102fe..64c4ca6 100644 --- a/maps/hash.go +++ b/mappkg/hash.go @@ -1,4 +1,4 @@ -package maps +package mappkg import "sync" diff --git a/maps/kv.go b/mappkg/kv.go similarity index 86% rename from maps/kv.go rename to mappkg/kv.go index 95d4031..ada27ef 100644 --- a/maps/kv.go +++ b/mappkg/kv.go @@ -1,9 +1,10 @@ -package maps +package mappkg import ( - "github.com/pyihe/go-pkg/errors" "reflect" "strconv" + + "github.com/pyihe/go-pkg/errpkg" ) type Param map[string]interface{} @@ -38,7 +39,7 @@ func (p Param) Range(fn func(key string, value interface{}) (breakOut bool)) { func (p Param) GetString(key string) (string, error) { value, ok := p.Get(key) if !ok { - return "", errors.New("not exist key: " + key) + return "", errpkg.New("not exist key: " + key) } return reflect.ValueOf(value).String(), nil } @@ -46,7 +47,7 @@ func (p Param) GetString(key string) (string, error) { func (p Param) GetInt64(key string) (n int64, err error) { value, ok := p.Get(key) if !ok { - return 0, errors.New("not exist key: " + key) + return 0, errpkg.New("not exist key: " + key) } t := reflect.TypeOf(value) v := reflect.ValueOf(value) @@ -64,7 +65,7 @@ func (p Param) GetInt64(key string) (n int64, err error) { case reflect.Float32, reflect.Float64: n = int64(v.Float()) default: - err = errors.New("unknown type: " + t.String()) + err = errpkg.New("unknown type: " + t.String()) } return } diff --git a/maps/map.go b/mappkg/map.go similarity index 99% rename from maps/map.go rename to mappkg/map.go index c42a73d..59db30f 100644 --- a/maps/map.go +++ b/mappkg/map.go @@ -1,4 +1,4 @@ -package maps +package mappkg import "sync" diff --git a/maths/factorial.go b/mathpkg/factorial.go similarity index 99% rename from maths/factorial.go rename to mathpkg/factorial.go index 5e33f16..e60006a 100644 --- a/maths/factorial.go +++ b/mathpkg/factorial.go @@ -1,4 +1,4 @@ -package maths +package mathpkg func factorial(m int) (n int) { n = 1 diff --git a/maths/math.go b/mathpkg/math.go similarity index 97% rename from maths/math.go rename to mathpkg/math.go index 2ac6d0a..e82373d 100644 --- a/maths/math.go +++ b/mathpkg/math.go @@ -1,4 +1,4 @@ -package maths +package mathpkg func MaxInt(a, b int) int { if a > b { diff --git a/monitor/file.go b/monitorpkg/file.go similarity index 97% rename from monitor/file.go rename to monitorpkg/file.go index 72e6831..527fb15 100644 --- a/monitor/file.go +++ b/monitorpkg/file.go @@ -1,4 +1,4 @@ -package monitor +package monitorpkg import ( "os" diff --git a/monitor/monitor.go b/monitorpkg/monitor.go similarity index 98% rename from monitor/monitor.go rename to monitorpkg/monitor.go index dc38542..adf7d46 100644 --- a/monitor/monitor.go +++ b/monitorpkg/monitor.go @@ -1,4 +1,4 @@ -package monitor +package monitorpkg import ( "errors" diff --git a/nets/net.go b/netpkg/net.go similarity index 99% rename from nets/net.go rename to netpkg/net.go index 23fe922..ad22a3d 100644 --- a/nets/net.go +++ b/netpkg/net.go @@ -1,4 +1,4 @@ -package nets +package netpkg import ( "net" diff --git a/ptr/ptr.go b/pointerpkg/ptr.go similarity index 98% rename from ptr/ptr.go rename to pointerpkg/ptr.go index 0b1deb9..c67eef2 100644 --- a/ptr/ptr.go +++ b/pointerpkg/ptr.go @@ -1,4 +1,4 @@ -package ptr +package pointerpkg /* 返回各种基本数据类型的指针 diff --git a/rands/rand.go b/randpkg/rand.go similarity index 95% rename from rands/rand.go rename to randpkg/rand.go index a47427a..3e8acde 100644 --- a/rands/rand.go +++ b/randpkg/rand.go @@ -1,10 +1,10 @@ -package rands +package randpkg import ( "math/rand" "time" - "github.com/pyihe/go-pkg/bytes" + "github.com/pyihe/go-pkg/bytepkg" ) const ( @@ -74,7 +74,7 @@ func String(n int) string { cache >>= letterIdxBits remain-- } - return bytes.String(b) + return bytepkg.String(b) } // ShuffleBytes shuffle 随机算法 diff --git a/redis/conn.go b/redispkg/conn.go similarity index 95% rename from redis/conn.go rename to redispkg/conn.go index 1be9bcb..6fa1e87 100644 --- a/redis/conn.go +++ b/redispkg/conn.go @@ -1,21 +1,21 @@ -package redis +package redispkg import ( "github.com/garyburd/redigo/redis" - "github.com/pyihe/go-pkg/encoding" - "github.com/pyihe/go-pkg/errors" + "github.com/pyihe/go-pkg/errpkg" + "github.com/pyihe/go-pkg/serialize" ) var ( - ErrInvalidKey = errors.New("invalid key") - ErrInvalidEncoder = errors.New("not figure encoder") - ErrInvalidConn = errors.New("invalid redis conn") - ErrInvalidParamNum = errors.New("invalid param num") + ErrInvalidKey = errpkg.New("invalid key") + ErrInvalidEncoder = errpkg.New("not figure encoder") + ErrInvalidConn = errpkg.New("invalid redis conn") + ErrInvalidParamNum = errpkg.New("invalid param num") ) type myRedisConn struct { conn redis.Conn //redis连接池 - encoder encoding.Encoding + encoder serialize.Serializer prefix string } @@ -142,7 +142,7 @@ func (conn *myRedisConn) getStruct(key string, data interface{}) (err error) { if err != nil { return err } - err = conn.encoder.Unmarshal(bytes, data) + err = conn.encoder.Decode(bytes, data) if err != nil { return err } @@ -157,7 +157,7 @@ func (conn *myRedisConn) setStruct(key string, data interface{}) error { if conn.encoder == nil { return ErrInvalidEncoder } - bytes, err := conn.encoder.Marshal(data) + bytes, err := conn.encoder.Encode(data) if err != nil { return err } diff --git a/redis/hash.go b/redispkg/hash.go similarity index 97% rename from redis/hash.go rename to redispkg/hash.go index c95c8f5..54747b6 100644 --- a/redis/hash.go +++ b/redispkg/hash.go @@ -1,4 +1,4 @@ -package redis +package redispkg func (conn *myRedisConn) HGet(key string, field string) ([]byte, error) { value, err := conn.hGet(key, field) diff --git a/redis/list.go b/redispkg/list.go similarity index 97% rename from redis/list.go rename to redispkg/list.go index 55d3321..e87e81f 100644 --- a/redis/list.go +++ b/redispkg/list.go @@ -1,4 +1,4 @@ -package redis +package redispkg func (conn *myRedisConn) RPush(key string, values ...interface{}) error { err := conn.rpush(key, values...) diff --git a/redis/pool.go b/redispkg/pool.go similarity index 94% rename from redis/pool.go rename to redispkg/pool.go index 190e1e8..055b9b4 100644 --- a/redis/pool.go +++ b/redispkg/pool.go @@ -1,10 +1,10 @@ -package redis +package redispkg import ( "fmt" "time" - "github.com/pyihe/go-pkg/encoding" + "github.com/pyihe/go-pkg/serialize" "github.com/garyburd/redigo/redis" ) @@ -58,12 +58,12 @@ type myPool struct { pass string db int p *redis.Pool - encoder encoding.Encoding + encoder serialize.Serializer } type InitOptions func(m *myPool) -func WithEncoding(encoder encoding.Encoding) InitOptions { +func WithEncoding(encoder serialize.Serializer) InitOptions { return func(m *myPool) { m.encoder = encoder } @@ -105,7 +105,7 @@ func NewPool(opts ...InitOptions) (RedisPool, error) { op(defaultPool) } if defaultPool.addr == "" { - return nil, fmt.Errorf("no redis address") + return nil, fmt.Errorf("no redispkg address") } if defaultPool.db == 0 { defaultPool.db = 1 diff --git a/redis/set.go b/redispkg/set.go similarity index 96% rename from redis/set.go rename to redispkg/set.go index 2bceb02..4151f1d 100644 --- a/redis/set.go +++ b/redispkg/set.go @@ -1,4 +1,4 @@ -package redis +package redispkg func (conn *myRedisConn) SADD(key string, members ...interface{}) error { err := conn.sAdd(key, members...) diff --git a/redis/string.go b/redispkg/string.go similarity index 98% rename from redis/string.go rename to redispkg/string.go index 0e84ef1..51a47ee 100644 --- a/redis/string.go +++ b/redispkg/string.go @@ -1,4 +1,4 @@ -package redis +package redispkg func (conn *myRedisConn) GetKeys(pattern string) (keys []string, err error) { keys, err = conn.getKeys(pattern) diff --git a/serialize/encoding.go b/serialize/encoding.go new file mode 100644 index 0000000..fa97a9e --- /dev/null +++ b/serialize/encoding.go @@ -0,0 +1,6 @@ +package serialize + +type Serializer interface { + Encode(v interface{}) ([]byte, error) + Decode(data []byte, v interface{}) error +} diff --git a/serialize/gob.go b/serialize/gob.go new file mode 100644 index 0000000..0bffa9c --- /dev/null +++ b/serialize/gob.go @@ -0,0 +1,23 @@ +package serialize + +import ( + "bytes" + "encoding/gob" +) + +type gobSerializer struct{} + +func Gob() Serializer { + return gobSerializer{} +} + +func (gb gobSerializer) Encode(v interface{}) (data []byte, err error) { + buff := bytes.NewBuffer([]byte{}) + err = gob.NewEncoder(buff).Encode(v) + data = buff.Bytes() + return +} + +func (gb gobSerializer) Decode(data []byte, v interface{}) error { + return gob.NewDecoder(bytes.NewReader(data)).Decode(v) +} diff --git a/serialize/json.go b/serialize/json.go new file mode 100644 index 0000000..2409daf --- /dev/null +++ b/serialize/json.go @@ -0,0 +1,17 @@ +package serialize + +import "encoding/json" + +type jsonSerializer struct{} + +func JSON() Serializer { + return jsonSerializer{} +} + +func (js jsonSerializer) Encode(v interface{}) (data []byte, err error) { + return json.Marshal(v) +} + +func (js jsonSerializer) Decode(data []byte, v interface{}) error { + return json.Unmarshal(data, v) +} diff --git a/serialize/msgpack.go b/serialize/msgpack.go new file mode 100644 index 0000000..c3239e3 --- /dev/null +++ b/serialize/msgpack.go @@ -0,0 +1,17 @@ +package serialize + +import "github.com/vmihailenco/msgpack/v5" + +type msgPack struct{} + +func Msgpack() Serializer { + return msgPack{} +} + +func (mp msgPack) Encode(v interface{}) (data []byte, err error) { + return msgpack.Marshal(v) +} + +func (mp msgPack) Decode(data []byte, v interface{}) error { + return msgpack.Unmarshal(data, v) +} diff --git a/serialize/proto.go b/serialize/proto.go new file mode 100644 index 0000000..13e4908 --- /dev/null +++ b/serialize/proto.go @@ -0,0 +1,29 @@ +package serialize + +import ( + "errors" + + "github.com/golang/protobuf/proto" +) + +type protoSerializer struct{} + +func Proto() Serializer { + return protoSerializer{} +} + +func (ps protoSerializer) Encode(v interface{}) (data []byte, err error) { + if m, ok := v.(proto.Message); ok { + return proto.Marshal(m) + } + err = errors.New("not proto.Message") + return +} + +func (ps protoSerializer) Decode(data []byte, v interface{}) (err error) { + if m, ok := v.(proto.Message); ok { + return proto.Unmarshal(data, m) + } + err = errors.New("not proto.Message") + return +} diff --git a/slice/float32.go b/slicepkg/float32.go similarity index 97% rename from slice/float32.go rename to slicepkg/float32.go index c41faa7..e6fe39f 100644 --- a/slice/float32.go +++ b/slicepkg/float32.go @@ -1,9 +1,9 @@ -package slice +package slicepkg import ( "fmt" - "github.com/pyihe/go-pkg/sorts" + "github.com/pyihe/go-pkg/sortpkg" ) type float32Slice []float32 @@ -38,7 +38,7 @@ func (f *float32Slice) Sort() { if f == nil { return } - sorts.SortFloat32s(*f) + sortpkg.SortFloat32s(*f) } func (f *float32Slice) PushBack(x interface{}) (bool, int) { diff --git a/slice/float64.go b/slicepkg/float64.go similarity index 97% rename from slice/float64.go rename to slicepkg/float64.go index ed5d631..8930455 100644 --- a/slice/float64.go +++ b/slicepkg/float64.go @@ -1,9 +1,9 @@ -package slice +package slicepkg import ( "fmt" - "github.com/pyihe/go-pkg/sorts" + "github.com/pyihe/go-pkg/sortpkg" ) type float64Slice []float64 @@ -38,7 +38,7 @@ func (f *float64Slice) Sort() { if f == nil { return } - sorts.SortFloat64s(*f) + sortpkg.SortFloat64s(*f) } func (f *float64Slice) PushBack(x interface{}) (bool, int) { diff --git a/slice/int.go b/slicepkg/int.go similarity index 97% rename from slice/int.go rename to slicepkg/int.go index 6880479..9e31df9 100644 --- a/slice/int.go +++ b/slicepkg/int.go @@ -1,9 +1,9 @@ -package slice +package slicepkg import ( "fmt" - "github.com/pyihe/go-pkg/sorts" + "github.com/pyihe/go-pkg/sortpkg" ) type intSlice []int @@ -38,7 +38,7 @@ func (is *intSlice) Sort() { if is == nil { return } - sorts.SortInts(*is) + sortpkg.SortInts(*is) } func (is *intSlice) PushBack(x interface{}) (bool, int) { diff --git a/slice/int16.go b/slicepkg/int16.go similarity index 97% rename from slice/int16.go rename to slicepkg/int16.go index 22968fb..5bfc8f9 100644 --- a/slice/int16.go +++ b/slicepkg/int16.go @@ -1,9 +1,9 @@ -package slice +package slicepkg import ( "fmt" - "github.com/pyihe/go-pkg/sorts" + "github.com/pyihe/go-pkg/sortpkg" ) type int16Slice []int16 @@ -38,7 +38,7 @@ func (i16 *int16Slice) Sort() { if i16 == nil { return } - sorts.SortInt16s(*i16) + sortpkg.SortInt16s(*i16) } func (i16 *int16Slice) PushBack(x interface{}) (bool, int) { diff --git a/slice/int32.go b/slicepkg/int32.go similarity index 97% rename from slice/int32.go rename to slicepkg/int32.go index 528be4b..ee93ca5 100644 --- a/slice/int32.go +++ b/slicepkg/int32.go @@ -1,9 +1,9 @@ -package slice +package slicepkg import ( "fmt" - "github.com/pyihe/go-pkg/sorts" + "github.com/pyihe/go-pkg/sortpkg" ) type int32Slice []int32 @@ -38,7 +38,7 @@ func (i32 *int32Slice) Sort() { if i32 == nil { return } - sorts.SortInt32s(*i32) + sortpkg.SortInt32s(*i32) } func (i32 *int32Slice) PushBack(x interface{}) (bool, int) { diff --git a/slice/int64.go b/slicepkg/int64.go similarity index 97% rename from slice/int64.go rename to slicepkg/int64.go index 5432e88..747281e 100644 --- a/slice/int64.go +++ b/slicepkg/int64.go @@ -1,9 +1,9 @@ -package slice +package slicepkg import ( "fmt" - "github.com/pyihe/go-pkg/sorts" + "github.com/pyihe/go-pkg/sortpkg" ) type int64Slice []int64 @@ -38,7 +38,7 @@ func (i64 *int64Slice) Sort() { if i64 == nil { return } - sorts.SortInt64s(*i64) + sortpkg.SortInt64s(*i64) } func (i64 *int64Slice) PushBack(x interface{}) (bool, int) { diff --git a/slice/int8.go b/slicepkg/int8.go similarity index 97% rename from slice/int8.go rename to slicepkg/int8.go index 25b237e..328399d 100644 --- a/slice/int8.go +++ b/slicepkg/int8.go @@ -1,9 +1,9 @@ -package slice +package slicepkg import ( "fmt" - "github.com/pyihe/go-pkg/sorts" + "github.com/pyihe/go-pkg/sortpkg" ) type int8Slice []int8 @@ -38,7 +38,7 @@ func (i8 *int8Slice) Sort() { if i8 == nil { return } - sorts.SortInt8s(*i8) + sortpkg.SortInt8s(*i8) } func (i8 *int8Slice) PushBack(x interface{}) (bool, int) { diff --git a/slice/sli.go b/slicepkg/sli.go similarity index 99% rename from slice/sli.go rename to slicepkg/sli.go index ec88ef1..7124ad7 100644 --- a/slice/sli.go +++ b/slicepkg/sli.go @@ -1,4 +1,4 @@ -package slice +package slicepkg import ( "fmt" diff --git a/slice/string.go b/slicepkg/string.go similarity index 97% rename from slice/string.go rename to slicepkg/string.go index 68ac213..5797ac3 100644 --- a/slice/string.go +++ b/slicepkg/string.go @@ -1,9 +1,9 @@ -package slice +package slicepkg import ( "fmt" - "github.com/pyihe/go-pkg/sorts" + "github.com/pyihe/go-pkg/sortpkg" ) type stringSlice []string @@ -38,7 +38,7 @@ func (ss *stringSlice) Sort() { if ss == nil { return } - sorts.SortStrings(*ss) + sortpkg.SortStrings(*ss) } func (ss *stringSlice) PushBack(x interface{}) (bool, int) { diff --git a/slice/uint.go b/slicepkg/uint.go similarity index 97% rename from slice/uint.go rename to slicepkg/uint.go index a4b075b..d3c1df8 100644 --- a/slice/uint.go +++ b/slicepkg/uint.go @@ -1,9 +1,9 @@ -package slice +package slicepkg import ( "fmt" - "github.com/pyihe/go-pkg/sorts" + "github.com/pyihe/go-pkg/sortpkg" ) type uintSlice []uint @@ -38,7 +38,7 @@ func (us *uintSlice) Sort() { if us == nil { return } - sorts.SortUints(*us) + sortpkg.SortUints(*us) } func (us *uintSlice) PushBack(x interface{}) (bool, int) { diff --git a/slice/uint16.go b/slicepkg/uint16.go similarity index 97% rename from slice/uint16.go rename to slicepkg/uint16.go index 919eaa3..357650e 100644 --- a/slice/uint16.go +++ b/slicepkg/uint16.go @@ -1,9 +1,9 @@ -package slice +package slicepkg import ( "fmt" - "github.com/pyihe/go-pkg/sorts" + "github.com/pyihe/go-pkg/sortpkg" ) type uint16Slice []uint16 @@ -38,7 +38,7 @@ func (u16 *uint16Slice) Sort() { if u16 == nil { return } - sorts.SortUint16s(*u16) + sortpkg.SortUint16s(*u16) } func (u16 *uint16Slice) PushBack(x interface{}) (bool, int) { diff --git a/slice/uint32.go b/slicepkg/uint32.go similarity index 97% rename from slice/uint32.go rename to slicepkg/uint32.go index a1fd926..82b68a1 100644 --- a/slice/uint32.go +++ b/slicepkg/uint32.go @@ -1,9 +1,9 @@ -package slice +package slicepkg import ( "fmt" - "github.com/pyihe/go-pkg/sorts" + "github.com/pyihe/go-pkg/sortpkg" ) type uint32Slice []uint32 @@ -38,7 +38,7 @@ func (i32 *uint32Slice) Sort() { if i32 == nil { return } - sorts.SortUint32s(*i32) + sortpkg.SortUint32s(*i32) } func (i32 *uint32Slice) PushBack(x interface{}) (bool, int) { diff --git a/slice/uint64.go b/slicepkg/uint64.go similarity index 97% rename from slice/uint64.go rename to slicepkg/uint64.go index 150c871..eb1f8e3 100644 --- a/slice/uint64.go +++ b/slicepkg/uint64.go @@ -1,9 +1,9 @@ -package slice +package slicepkg import ( "fmt" - "github.com/pyihe/go-pkg/sorts" + "github.com/pyihe/go-pkg/sortpkg" ) type uint64Slice []uint64 @@ -38,7 +38,7 @@ func (i64 *uint64Slice) Sort() { if i64 == nil { return } - sorts.SortUint64s(*i64) + sortpkg.SortUint64s(*i64) } func (i64 *uint64Slice) PushBack(x interface{}) (bool, int) { diff --git a/slice/uint8.go b/slicepkg/uint8.go similarity index 97% rename from slice/uint8.go rename to slicepkg/uint8.go index 9193313..f7aac66 100644 --- a/slice/uint8.go +++ b/slicepkg/uint8.go @@ -1,9 +1,9 @@ -package slice +package slicepkg import ( "fmt" - "github.com/pyihe/go-pkg/sorts" + "github.com/pyihe/go-pkg/sortpkg" ) type uint8Slice []uint8 @@ -38,7 +38,7 @@ func (i8 *uint8Slice) Sort() { if i8 == nil { return } - sorts.SortUint8s(*i8) + sortpkg.SortUint8s(*i8) } func (i8 *uint8Slice) PushBack(x interface{}) (bool, int) { diff --git a/sorts/sli.go b/sortpkg/sli.go similarity index 99% rename from sorts/sli.go rename to sortpkg/sli.go index 7b34467..49b3855 100644 --- a/sorts/sli.go +++ b/sortpkg/sli.go @@ -1,4 +1,4 @@ -package sorts +package sortpkg import "sort" diff --git a/sorts/sort.go b/sortpkg/sort.go similarity index 99% rename from sorts/sort.go rename to sortpkg/sort.go index 50c4f63..f13f73e 100644 --- a/sorts/sort.go +++ b/sortpkg/sort.go @@ -1,4 +1,4 @@ -package sorts +package sortpkg //从小到大排序 // BubbleSort 冒泡排序,每次找出最小的值放在最前面 diff --git a/strings/strings.go b/stringpkg/strings.go similarity index 99% rename from strings/strings.go rename to stringpkg/strings.go index 691e862..a382ec1 100644 --- a/strings/strings.go +++ b/stringpkg/strings.go @@ -1,4 +1,4 @@ -package strings +package stringpkg import ( "reflect" diff --git a/syncs/counter.go b/syncpkg/counter.go similarity index 94% rename from syncs/counter.go rename to syncpkg/counter.go index 3090c30..2d150c4 100644 --- a/syncs/counter.go +++ b/syncpkg/counter.go @@ -1,4 +1,4 @@ -package syncs +package syncpkg import "sync/atomic" diff --git a/times/timer.go b/timepkg/timer.go similarity index 98% rename from times/timer.go rename to timepkg/timer.go index fd80712..1ed5efa 100644 --- a/times/timer.go +++ b/timepkg/timer.go @@ -1,4 +1,4 @@ -package times +package timepkg import "time" diff --git a/zips/zip.go b/zippkg/zip.go similarity index 98% rename from zips/zip.go rename to zippkg/zip.go index 7f61317..5856901 100644 --- a/zips/zip.go +++ b/zippkg/zip.go @@ -1,4 +1,4 @@ -package zips +package zippkg import ( "bytes"