3 Star 1 Fork 0

NightTC / Gobige

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
1IArgs.go 1.52 KB
一键复制 编辑 原始数据 按行查看 历史
buguang 提交于 2023-08-09 15:29 . 协议更新
package protomsg
import (
"database/sql"
"encoding/binary"
math "math"
"reflect"
)
type IArgs interface {
// 新的使用字段名就可以更新数据的逻辑
UpdateField(keyname, field string) error
}
// 单个字段解包数据
func UnPackMsgDataToField(f reflect.Value, msgdata *FieldData) {
switch f.Kind() {
case reflect.Struct:
if v, ok := f.Addr().Interface().(sql.Scanner); ok {
v.Scan(msgdata.Buffer)
}
case reflect.Ptr:
if v, ok := f.Interface().(sql.Scanner); ok {
v.Scan(msgdata.Buffer)
}
case reflect.Float32:
v, _ := binary.Uvarint(msgdata.Buffer)
f.SetFloat(float64(math.Float32frombits(uint32(v))))
case reflect.Float64:
v, _ := binary.Uvarint(msgdata.Buffer)
f.SetFloat(float64(math.Float64frombits(uint64(v))))
case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
v, _ := binary.Varint(msgdata.Buffer)
f.SetInt(v)
case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
v, _ := binary.Uvarint(msgdata.Buffer)
f.SetUint(v)
case reflect.String:
f.SetString(string(msgdata.Buffer))
case reflect.Slice:
//如果是切片类型,一般都是[]byte
//如果不是还不知道要怎么处理
if f.Type().Elem().Kind() == reflect.Uint8 {
f.SetBytes(msgdata.Buffer)
}
case reflect.Bool:
f.SetBool(msgdata.Buffer[0] == 1)
default:
}
}
// 设置数据到差量中去
func SetDataModel(md interface{}, msgdata *TableData) {
vmd := reflect.ValueOf(md).Elem()
for k, v := range msgdata.Datas {
f := vmd.FieldByName(k)
UnPackMsgDataToField(f, v)
}
}
Go
1
https://gitee.com/night-tc/gobige.git
git@gitee.com:night-tc/gobige.git
night-tc
gobige
Gobige
00125336c61c

搜索帮助