加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

GO语言-struct to buf

发布时间:2020-12-16 18:59:24 所属栏目:大数据 来源:网络整理
导读:golangstruct to buf自留笔记 /** * Created with IntelliJ IDEA. * User: liaojie * Date: 13-7-4 * Time: 下午1:42 * To change this template use File | Settings | File Templates. */package mainimport ("bytes""encoding/binary""reflect""io""error

golangstruct to buf自留笔记

/**
 * Created with IntelliJ IDEA.
 * User: liaojie
 * Date: 13-7-4
 * Time: 下午1:42
 * To change this template use File | Settings | File Templates.
 */
package main

import (
	"bytes"
	"encoding/binary"
	"reflect"
	"io"
	"errors"
	"fmt"
)

func writeBuf(w io.Writer,v reflect.Value) (n int,err error){
	newBuf := bytes.NewBuffer(nil)
	for i := 0; i < v.NumField(); i++ {
		switch v.Field(i).Type().Kind() {
		case reflect.Struct:
			n,err := writeBuf(newBuf,v.Field(i))
			if err != nil {
				return n,err
			}
		case reflect.Bool:
			boolByte := []byte{0}
			if v.Field(i).Bool() {
				boolByte = []byte{1}
			}
			newBuf.Write(boolByte)
		case reflect.String:
			newBuf.WriteString(v.Field(i).String())
		case reflect.Slice:
			newBuf.Write(v.Field(i).Bytes())
		case reflect.Int:
			binary.Write(newBuf,binary.LittleEndian,int32(v.Field(i).Int()))
		case reflect.Uint:
			binary.Write(newBuf,uint32(v.Field(i).Uint()))
		case reflect.Uint8,reflect.Uint16,reflect.Uint32,reflect.Uint64,reflect.Int8,reflect.Int16,reflect.Int32,reflect.Int64,reflect.Float32,reflect.Float64,reflect.Complex64,reflect.Complex128:
			binary.Write(newBuf,v.Field(i).Interface())
		}
	}
	return w.Write(newBuf.Bytes())
}

func WriteStructToBuffer(w io.Writer,data interface{}) ( error ) {
	v := reflect.Indirect(reflect.ValueOf(data))
	if v.Kind() == reflect.Struct {
		fmt.Println("test")
		_,err := writeBuf(w,v)
		return err
	}
	return errors.New("invalid type Not a struct")
}

func StringFixedLength(s string,length int) []byte {
	sLength := len(s)
	if sLength >= length {
		return []byte(s[:length])
	} else {
		b := make([]byte,length-sLength)
		return append([]byte(s),b...)
	}
	return nil
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读