golang struct to buf

flyking · · 3470 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

struct to buf

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, binary.LittleEndian, 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, binary.LittleEndian, 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
}



有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:flyking

查看原文:golang struct to buf

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3470 次点击  
加入收藏 微博
1 回复  |  直到 2018-05-17 11:19:27
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传