go反射解析protobuf协议

1.通过反射message名称获取message对象

//根据类型名称获取json数据
func findTypeByName(str string) (su protoreflect.ProtoMessage) {
	messageType1 := proto.MessageType(str)

	// 获取message实例
	rsp := reflect.New(messageType1.Elem())
	req := reflect.New(messageType1.Elem()).Interface().(protoreflect.ProtoMessage)
	descriptor := proto.MessageV2(req).ProtoReflect().Descriptor()
	fd := descriptor.Fields()
	for i := 0; i < fd.Len(); i++ {
		field := fd.Get(i)
		if field.Kind().String() == "uint64" {
			if field.IsList() {
				var num []uint64
				u := proto.Uint64(0)
				u2 := append(num, *u)
				rsp.Elem().FieldByName(changString(field.Name())).Set(reflect.ValueOf(u2))
			} else {
				rsp.Elem().FieldByName(changString(field.Name())).Set(reflect.ValueOf(proto.Uint64(0)))
			}

		} else if field.Kind().String() == "bool" {
			rsp.Elem().FieldByName(changString(field.Name())).Set(reflect.ValueOf(proto.Bool(false)))
		} else if field.Kind().String() == "int32" {
			if field.IsList() {
				var num []int32
				u := proto.Int32(0)
				u2 := append(num, *u)
				rsp.Elem().FieldByName(changString(field.Name())).Set(reflect.ValueOf(u2))
			} else {
				rsp.Elem().FieldByName(changString(field.Name())).Set(reflect.ValueOf(proto.Int32(0)))
			}
		} else if field.Kind().String() == "int64" {
			if field.IsList() {
				var num []int64
				u := proto.Int64(0)
				u2 := append(num, *u)
				rsp.Elem().FieldByName(changString(field.Name())).Set(reflect.ValueOf(u2))
			} else {
				rsp.Elem().FieldByName(changString(field.Name())).Set(reflect.ValueOf(proto.Int64(0)))
			}
		} else if field.Kind().String() == "uint32" {
			if field.IsList() {
				var num []uint32
				u := proto.Uint32(0)
				u2 := append(num, *u)
				rsp.Elem().FieldByName(changString(field.Name())).Set(reflect.ValueOf(u2))
			} else {
				rsp.Elem().FieldByName(changString(field.Name())).Set(reflect.ValueOf(proto.Uint32(0)))
			}
		} else if field.Kind().String() == "message" {
			if field.IsList() {
				t := rsp.Elem().FieldByName(changString(field.Name())).Type().String()
				s := strings.Split(t, ".")
				pm2 := findTypeByName("hiproto." + s[1])
				if s[1] == "Party" {
					var u2 []*hiproto.Party
					p, _ := pm2.(*hiproto.Party)
					u2 = append(u2, p)
					rsp.Elem().FieldByName(changString(field.Name())).Set(reflect.ValueOf(u2))
				} else if s[1] == "PartyUser" {
					var u2 []*hiproto.PartyUser
					p, _ := pm2.(*hiproto.PartyUser)
					u2 = append(u2, p)
					rsp.Elem().FieldByName(changString(field.Name())).Set(reflect.ValueOf(u2))
				}
			} else {
				t := rsp.Elem().FieldByName(changString(field.Name())).Type().String()
				s := strings.Split(t, ".")
				// fmt.Println("s1", s[1])
				// fmt.Println("field.Name()", field.Name())
				pm2 := findTypeByName("hiproto." + s[1])
				rsp.Elem().FieldByName(changString(field.Name())).Set(reflect.ValueOf(pm2))
			}
		} else if field.Kind().String() == "bytes" {
			var num []uint8
			var u uint8 = 0
			u2 := append(num, u)
			rsp.Elem().FieldByName(changString(field.Name())).Set(reflect.ValueOf(u2))
		}
		//fmt.Printf("Field %d: Name=%s, JSONName=%s, Number=%d, Type=%s\n", i, field.Name(), field.JSONName(), field.Number(), field.Kind())

	}
	pm := rsp.Interface().(protoreflect.ProtoMessage)
	if str == "hiproto" {
		req := reflect.New(messageType1.Elem()).Interface().(*hiproto.GetMyPartyRequest)
		fmt.Print("req", req)
	}
	return pm
}

//根据类型名称获取解析详情数据
func findTypeByDetial(str string, list []protocol.CmdIdDetial) (result []protocol.CmdIdDetial) {
	messageType1 := proto.MessageType(str)
	messageType2 := proto.MessageType(str)
	// 获取message实例
	rsp := reflect.New(messageType2.Elem())
	req := reflect.New(messageType1.Elem()).Interface().(protoreflect.ProtoMessage)
	descriptor := proto.MessageV2(req).ProtoReflect().Descriptor()
	fd := descriptor.Fields()
	for i := 0; i < fd.Len(); i++ {
		var cmdId protocol.CmdIdDetial
		field := fd.Get(i)
		if field.HasOptionalKeyword() {
			cmdId.Constraint = constants.Constraint_Optional
		} else {
			cmdId.Constraint = constants.Constraint_Repeated
		}
		cmdId.Field = field.JSONName()
		cmdId.Type = fmt.Sprintf("%s", field.Kind())
		if field.Kind().String() == "uint64" {
			if field.IsList() {

			} else {
				cmdId.Default = "0"
			}

		} else if field.Kind().String() == "bool" {
			cmdId.Default = "false"
		} else if field.Kind().String() == "uint32" {
			cmdId.Default = "0"
		} else if field.Kind().String() == "message" {
			t := rsp.Elem().FieldByName(changString(field.Name())).Type().String()
			s := strings.Split(t, ".")
			//fmt.Println("s1", s[1])
			list = findTypeByDetial("hiproto."+s[1], list)

		}
		list = append(list, cmdId)
		//fmt.Printf("Field %d: Name=%s, JSONName=%s, Number=%d, Type=%s\n", i, field.Name(), field.JSONName(), field.Number(), field.Kind())
		if str == "hiproto" {
			req := reflect.New(messageType1.Elem()).Interface().(*hiproto.GetMyPartyRequest)
			fmt.Print("req", req)
		}
	}
	return list
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值