从terraform模式访问Golang中的排版并在地图上迭代

从terraform模式访问Golang中的排版并在地图上迭代,go,terraform,Go,Terraform,我正试图通过terraform配置文件访问Golang中具有以下模式的关键元素: "vehicles": { Type: schema.TypeSet, Optional: true, MaxItems: 5, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ "car": { Type: schema

我正试图通过terraform配置文件访问Golang中具有以下模式的关键元素:

"vehicles": {
    Type:     schema.TypeSet,
    Optional: true,
    MaxItems: 5,
    Elem: &schema.Resource{
        Schema: map[string]*schema.Schema{
            "car": {
                Type:     schema.TypeList,
                Optional: true,
                MaxItems: 2,
                Elem: &schema.Resource{
                    Schema: map[string]*schema.Schema{
                        "make": {
                            Type:     schema.TypeString,
                            Optional: true,
                        },
                        "model": {
                            Type:     schema.TypeString,
                            Optional: true,
                        },
                    },
                },
            },
        },
    },
}
在配置文件中

resource "type_test" "type_name" {
  vehicles {
      car {
        make = "Toyota"
        model = "Camry"
      }

      car {
        make = "Nissan"
        model = "Rogue"
      }
  }
}
我想迭代列表,并通过Golang访问车辆地图

地形崩溃,代码如下:

vehicles_map, ok = d.getOK("vehicles")
if ok {
vehicleSet := vehicles_d.(*schema.Set)List()

for i, vehicle := range vehicleSet {
  mdi, ok = vehicle.(map[string]interface{})
  if ok {
   log.Printf("%v", mdi["vehicles"].(map[string]interface{})["car"])
 }
}
事故日志:

2019-12-25T21 [DEBUG] plugin.terraform-provider: panic: interface conversion: interface {} is nil, not map[string]interface {} 
对于第
行“log.Printf(“%v”,mdi[“vehicles”]。(映射[字符串]接口{})[“car”])”

我想打印并访问配置文件中的每个vehicles元素,如有任何帮助,将不胜感激。

d.getOK(“vehicles”)
已使用
“vehicles”
键执行索引,这将导致。调用它的方法,您将得到一个切片(类型为
[]接口{}
)。对其元素进行迭代将得到表示
car
的值,该值使用类型
map[string]接口{}
建模。因此,在循环内部,您只需将assert键入此类型,而不必使用
“vehicles”
“car”
再次索引

大概是这样的:

for i, vehicle := range vehicleSet {
    car, ok := vehicle.(map[string]interface{})
    if ok {
        log.Printf("model: %v, make: %v\n", car["model"], car["make"])
    }
}

然后,
mdi
没有钥匙
“vehicles”
。@icza是的,你是对的,当我打印时,我得到以下信息:map[car:[map[model:Toyota make:Camry]map[model:Nissan make:Rogue]],你知道如何迭代和打印每个内部元素吗?@KaranKotabagi你能发布你的精确输出吗?我试图在内部for循环中打印一个值,如car[“model”],只需在终端中为这个特定日志获取输出为“”。@KaranKotabagi你能像这样打印:
fmt.Printf(“%T%v”,车辆,车辆)