Golang如何提取APIGateway Usage结构Items map内的数值并计算占比
解决方法
问题核心原因
你不需要使用mapstructure做二次解码,AWS Go SDK返回的*apigateway.Usage结构中Items字段本身已经是强类型的map[string][][]*int64,可以直接遍历取值。你之前的用法错误是因为mapstructure的目标结构定义与源数据结构不匹配,导致解码失败。
正确提取逻辑
直接遍历Items字段即可,需要注意:
- 嵌套数组的层级:每个API Key对应的
[][]*int64中,外层数组的每个元素对应单日用量,你查询的是单日数据,所以取索引为0的元素 - 所有数值都是
*int64类型,需要先解引用才能拿到实际数值 - 必须增加边界检查,避免数组越界或空指针引发panic
修改后的代码示例
首先修改parseUsage函数:
func parseUsage(usage *apigateway.Usage) (map[string]float64, error) { usageRatio := make(map[string]float64) // 直接遍历Items,key就是API Key for apiKey, dailyUsages := range usage.Items { // 检查外层数组是否有数据(单日查询长度为1) if len(dailyUsages) == 0 { continue } usageVals := dailyUsages[0] // 检查是否有两个目标数值 if len(usageVals) < 2 { continue } // 解引用指针,同时做空指针检查 usedPtr, quotaPtr := usageVals[0], usageVals[1] if usedPtr == nil || quotaPtr == nil { continue } used, quota := *usedPtr, *quotaPtr fmt.Printf("API Key %s 已用:%d,配额:%d\n", apiKey, used, quota) // 计算占比,注意转float避免整数除法 if quota == 0 { continue } ratio := float64(used) / float64(quota) usageRatio[apiKey] = ratio // 这里可以加阈值判断,超过阈值触发SNS通知逻辑 // const threshold = 0.8 // 比如阈值80% // if ratio >= threshold { // sendSNSNotification(apiKey, used, quota, ratio) // } } return usageRatio, nil }
你可以把原来的parseUsage调用部分替换成这个实现即可,不需要再定义UsageData结构,也不需要引入mapstructure依赖。
注意事项
- 如果你需要查询多日用量,外层
dailyUsages数组的长度和你查询的日期范围一致,按日期顺序对应即可 - 计算占比时要先判断配额是否为0,避免除以零panic
- 阈值判断可以根据你的业务需求调整,触发SNS的逻辑直接调用AWS SNS SDK的对应接口即可
内容的提问来源于stack exchange,提问作者Will A.
相关产品推荐
相关产品推荐

