当我的值是结构类型时,如何填充map [string]接口{}?

use*_*878 -3 go

我想构建与以下PurchaseOrder结构等效的JSON :

type PurchaseOrder struct {
    State      string
    FsmName    string
    Supplier   string
    Receiver   string
    TradeItems map[string]PRTradeItem
}

type PRTradeItem struct {
    Quantity float64 `json:"quantity"`
    Supplier string  `json:"supplier"`
    Receiver string  `json:"receiver"`

    PricePerUnit float64 `json:"pricePerUnit"`
}
Run Code Online (Sandbox Code Playgroud)

为了做到这一点,我做了以下工作:

po := make(map[string]interface{})
po["Sender"] = "org2"
po["Receiver"] = "org1"
po["TradeItems"] = make(map[string]PRTradeItem)
po["TradeItems"]["sku1"] = PRTradeItem{Quantity: 100, Supplier: "org2", Receiver: "org1", PricePerUnit: 10.5}
poAsBytes, _ := JSON.Marshal(po)
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

无效的操作:po [“ TradeItems”] [“ sku1”](类型接口{}不支持索引)。

在四处浏览后,我在代码中添加了以下几行,并且可以正常工作。

internalMap, ok := po["TradeItems"].(map[string]PRTradeItem)
if !ok{

    panic("why???")
}
if ok{  
    internalMap["sku1"] = PRTradeItem{Quantity:100,Supplier:"org2", Receiver:"org1", PricePerUnit:10.5}
}
Run Code Online (Sandbox Code Playgroud)

我不太明白这行是什么意思

internalMap, ok := po["TradeItems"].(map[string]PRTradeItem)
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

Fli*_*mzy 6

我想在下面构建与PurchaseOrder结构等效的JSON:

type PurchaseOrder struct {
    State      string
    FsmName    string
    Supplier   string
    Receiver   string
    TradeItems map[string]PRTradeItem
}
Run Code Online (Sandbox Code Playgroud)

最简单的方法是:

po := PurchaseOrder{
    State:      "paid",
    Supplier:   "Acme, Inc.",
    TradeItems: map[string]PRTradeItem{
        "sku1": PRTradeItem{Quantity: 100, Supplier: "org2", ... },
    },
}
poAsBytes, err := json.Marshal(po)
Run Code Online (Sandbox Code Playgroud)

忘记您po := make(map[string]interface{})对地图的手动操作。

如果您需要控制PurchaseOrder对象中的JSON键,请jsonPRTradeItem定义一样添加适当的标签。