代码之家  ›  专栏  ›  技术社区  ›  jaxxstorm

映射结构内的[string]字符串

go
  •  0
  • jaxxstorm  · 技术社区  · 6 年前

    为这个标题道歉,但这是一个奇怪的标题,而且超出了我的理解能力。

    我正在使用一个已经完成的Go库,但不是:

    https://github.com/yfronto/go-statuspage-api

    statusPage.io API在发布事件时支持以下参数:

    incident[components][component_id] - Map of status changes to apply to affected components.
    

    例如:

    "incident[components][ftgks51sfs2d]=degraded_performance"
    

    不幸的是,库中定义的结构 doesn't support that particular field :

    type NewIncidentUpdate struct {
        Name               string
        Status             string
        Message            string
        WantsTwitterUpdate bool
        ImpactOverride     string
        ComponentIDs       []string
    }
    
    func (i *NewIncidentUpdate) String() string {
        return encodeParams(map[string]interface{}{
            "incident[name]":                 i.Name,
            "incident[status]":               i.Status,
            "incident[message]":              i.Message,
            "incident[wants_twitter_update]": i.WantsTwitterUpdate,
            "incident[impact_override]":      i.ImpactOverride,
            "incident[component_ids]":        i.ComponentIDs,
        })
    }
    

    如何更新此结构(和 the associated encodeParams function )是否支持传递组件和关联状态的任意映射?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Adam Smith jeffpkamp    6 年前

    你可以嵌入一个 NewIncidentUpdate 在定义组件状态更改的结构中。

    type MyIncidentUpdate struct {
        NewIncidentUpdate
        ComponentStatusChanges map[string]string
    }
    

    然后定义 String 以同样的方式,同时满足您的 ComponentStatusChanges 地图。

    func (i *MyIncidentUpdate) String() string {
        params := map[string]interface{}{
            "incident[name]":                 i.Name,
            "incident[status]":               i.Status,
            "incident[message]":              i.Message,
            "incident[wants_twitter_update]": i.WantsTwitterUpdate,
            "incident[impact_override]":      i.ImpactOverride,
            "incident[component_ids]":        i.ComponentIDs,
        }
        for k, val := range i.ComponentStatusChanges {
            key := fmt.Sprintf("incident[components][%s]", k)
            params[key] = val
        }
    
        return encodeParams(params)
    }