You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:06:04