代码拉取完成,页面将自动刷新
package msgpack
import (
"bytes"
"io"
"reflect"
"time"
"github.com/liangdas/mqant/utils/msgpack.v2/codes"
)
type writer interface {
io.Writer
WriteByte(byte) error
WriteString(string) (int, error)
}
type byteWriter struct {
io.Writer
}
func (w byteWriter) WriteByte(b byte) error {
_, err := w.Write([]byte{b})
return err
}
func (w byteWriter) WriteString(s string) (int, error) {
return w.Write([]byte(s))
}
// Marshal returns the MessagePack encoding of v.
func Marshal(v ...interface{}) ([]byte, error) {
var buf bytes.Buffer
err := NewEncoder(&buf).Encode(v...)
return buf.Bytes(), err
}
type Encoder struct {
w writer
buf []byte
sortMapKeys bool
structAsArray bool
}
func NewEncoder(w io.Writer) *Encoder {
bw, ok := w.(writer)
if !ok {
bw = byteWriter{Writer: w}
}
return &Encoder{
w: bw,
buf: make([]byte, 9),
}
}
// SortMapKeys causes the Encoder to encode map keys in increasing order.
// Supported map types are:
// - map[string]string
// - map[string]interface{}
func (e *Encoder) SortMapKeys(v bool) *Encoder {
e.sortMapKeys = v
return e
}
// StructAsArray causes the Encoder to encode Go structs as MessagePack arrays.
func (e *Encoder) StructAsArray(v bool) *Encoder {
e.structAsArray = v
return e
}
func (e *Encoder) Encode(v ...interface{}) error {
for _, vv := range v {
if err := e.encode(vv); err != nil {
return err
}
}
return nil
}
func (e *Encoder) encode(v interface{}) error {
switch v := v.(type) {
case nil:
return e.EncodeNil()
case string:
return e.EncodeString(v)
case []byte:
return e.EncodeBytes(v)
case int:
return e.EncodeInt64(int64(v))
case int64:
return e.EncodeInt64(v)
case uint:
return e.EncodeUint64(uint64(v))
case uint64:
return e.EncodeUint64(v)
case bool:
return e.EncodeBool(v)
case float32:
return e.EncodeFloat32(v)
case float64:
return e.EncodeFloat64(v)
case []string:
return e.encodeStringSlice(v)
case time.Duration:
return e.EncodeInt64(int64(v))
case time.Time:
return e.EncodeTime(v)
case Marshaler:
b, err := v.MarshalMsgpack()
if err != nil {
return err
}
_, err = e.w.Write(b)
return err
case CustomEncoder:
return v.EncodeMsgpack(e)
}
return e.EncodeValue(reflect.ValueOf(v))
}
func (e *Encoder) EncodeValue(v reflect.Value) error {
encode := getEncoder(v.Type())
return encode(e, v)
}
func (e *Encoder) EncodeNil() error {
return e.w.WriteByte(codes.Nil)
}
func (e *Encoder) EncodeBool(value bool) error {
if value {
return e.w.WriteByte(codes.True)
}
return e.w.WriteByte(codes.False)
}
func (e *Encoder) write(b []byte) error {
_, err := e.w.Write(b)
if err != nil {
return err
}
return nil
}
func (e *Encoder) writeString(s string) error {
n, err := e.w.WriteString(s)
if err != nil {
return err
}
if n < len(s) {
return io.ErrShortWrite
}
return nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。