GO 通过映射解析字段信息

这篇博客讲述了如何在Golang中利用映射解析和处理集群报警规则的定制化字段。通过创建特殊报警规则map,以特定格式的键值表示集群和规则,然后与标准规则比较,覆盖已配置的值,从而简化配置工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集群的报警是通过程序批量注入的,大多集群使用相同的报警规则,有些集群需要根据业务使用特点及其敏感程度等因素定制化合适的报警规则,这些定制化的报警项配置通过配置中心来配置,由于单个配置项字段繁多,手动配置繁琐,为了简化工作量,只配置需要定制化的字段,这时在校验的时候就需要识别哪些是配置了值的字段,就需要用到映射

直接上代码
specialAlarmRules 是map类型,key格式为KaTeX parse error: Expected group after '_' at position 6: {集群名}_̲_{规则唯一字段1}__${规则唯一字段2}
遍历定制化的报警规则specialRule与当前待注入的报警规则rule做比较,如果同一报警项就取出specialRule设置了值的字段覆盖rule对应的字段


//将定制化配置的报警规则字段覆盖rule的字段
for key, specialRule := range specialAlarmRules {
	keyList := strings.Split(key, "__")
	if len(keyList) >= 3 {
		key1, key2 := keyList[1], keyList[2]
		if strings.Contains(rule.Name, key1) && strings.Contains(rule.Name, key2) {
			//获取specialRule结构体中所有字段的名称及类型信息
			specialRuleType := reflect.TypeOf(specialRule)
			//获取specialRule结构体中所有字段的名称及其值信息
			specialRuleValue := reflect.ValueOf(specialRule)
			//获取待注入的规则实体种字段值的存放地址
			ruleValueAddr := reflect.ValueOf(&rule).Elem()
			for i := 0; i < specialRuleType.NumField(); i++ {
				fieldType := specialRuleType.Field(i)
				valueType := fieldType.Type
				value := specialRuleValue.FieldByName(fieldType.Name)
				if (valueType.String() == "int" && value.Int() != 0) || (valueType.String() == "string" && value.String() != "") {	
					ruleValueAddr.FieldByName(fieldType.Name).Set(value)//更改内存中值
				}
			}
		}
	} else {
		logs.Error("specialRule format is wrong,specialRuleName=%v", key)
		continue
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值