gpt4 book ai didi

go - terraform 提供程序中 TypeList 的类型断言

转载 作者:行者123 更新时间:2023-12-01 21:11:49 26 4
gpt4 key购买 nike

我正在编写一个 Terraform 提供程序,并且当我有一个包含 TypeString 元素的 TypeList 时,我试图找出进行类型断言的最佳方法。

资源定义如下:

    return &schema.Resource{
Create: resourceConfigObjectCreate,
Read: resourceConfigObjectRead,
Update: resourceConfigObjectUpdate,
Delete: resourceConfigObjectDelete,

Schema: map[string]*schema.Schema{
"name": &schema.Schema{
Type: schema.TypeString,
Required: true,
},
"notification_options": &schema.Schema{
Type: schema.TypeList,
Optional: true,
Elem: schema.Schema{
Type: schema.TypeString,
},
},
},
}
}

我想将这些值加载到这样定义的自定义类型中:
type ConfigObject struct {
Name string `json:"name,omitempty"`
NotificationOptions []string `json:"notification_options,omitempty"`

}

由于 schema.ResourceData.Get 返回一个 interface{},因此需要类型断言。
    item := thruk.ConfigObject{
Name: schema.ResourceData.Get("name").(string),
NotificationOptions: extractSliceOfStrings(schema.ResourceData.Get("notification_options")),
}

我已经为字符串轻松完成了,但字符串 slice 更复杂,我创建了以下函数:
func extractSliceOfStrings(i interface{}) (slice []string) {
s := reflect.ValueOf(i)
if !s.IsValid() {
return
}
for i := 0; i < s.Len(); i++ {
slice = append(slice, s.Index(i).String())
}
return
}

这是正确的方法吗?

最佳答案

使用 ResourceData 时Terraform 提供程序中的 API,了解每种模式类型对应的 Go 类型会很有帮助。你已经推断出 schema.TypeString对应于 string .这是一个完整的列表:

  • TypeBoolbool
  • TypeStringstring
  • TypeIntint
  • TypeList[]interface{}
  • TypeMapmap[string]interface{}
  • TypeSet*schema.Set
  • Elem 时的元素类型设置为 *schema.Resource : map[string]interface{}

  • 上面的翻译记录在 Schema Types SDK 的文档页面,在每个标题下显示为“数据结构:”。

    每当您处理集合时,从 Go 的角度来看,元素类型始终是 interface{}以反射(reflect)元素类型直到运行时才决定的事实。但是,上面定义的相同映射规则也适用于这些元素值,因此要转换 TypeList谁的 ElemTypeString您首先要断言 slice 类型,然后依次断言每个元素:

    itemsRaw := d.Get("example").([]interface{})
    items := make([]string, len(itemsRaw))
    for i, raw := range itemsRaw {
    items[i] = raw.(string)
    }

    不幸的是,没有办法直接从 []interface{}[]string由于 Go 接口(interface)和类型断言的设计,一步到位。

    您可以对 TypeMap 采取类似的方法, 如果你最终需要 map[string]string :

    itemsRaw := d.Get("example").(map[string]interface{})
    items := make(map[string]string, len(itemsRaw))
    for k, raw := range itemsRaw {
    items[k] = raw.(string)
    }
    TypeSet由于自定义 *schema.Set,稍微复杂一些容器,但您可以调用 List集合的方法来获得 []interface{}然后你可以像对待 TypeList 一样对待它多于:

    itemsRaw := d.Get("example").(*schema.Set).List()
    items := make([]string, len(itemsRaw))
    for i, raw := range itemsRaw {
    items[i] = raw.(string)
    }

    关于go - terraform 提供程序中 TypeList 的类型断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59714262/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com