第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

terraform 提供程序中 TypeList 的類型斷言

terraform 提供程序中 TypeList 的類型斷言

Go
阿波羅的戰(zhàn)車 2022-05-05 16:07:49
我正在編寫一個(gè) Terraform 提供程序,當(dāng)我有一個(gè)包含 TypeString 元素的 TypeList 時(shí),我試圖找出進(jìn)行類型斷言的最佳方法。資源定義如下:    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 返回一個(gè) interface{},因此需要類型斷言。    item := thruk.ConfigObject{        Name: schema.ResourceData.Get("name").(string),        NotificationOptions: extractSliceOfStrings(schema.ResourceData.Get("notification_options")),    }我已經(jīng)為字符串輕松完成了,但字符串切片更復(fù)雜,我創(chuàng)建了以下函數(shù):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}這是正確的方法嗎?
查看完整描述

1 回答

?
汪汪一只貓

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊

在 Terraform 提供程序中使用ResourceDataAPI 時(shí),了解每種模式類型對(duì)應(yīng)的 Go 類型會(huì)很有幫助。您已經(jīng)推斷出schema.TypeString對(duì)應(yīng)于string. 這是一個(gè)完整的列表:

  • TypeBool?bool

  • TypeString?string

  • TypeInt?int

  • TypeList?[]interface{}

  • TypeMap?map[string]interface{}

  • TypeSet?*schema.Set

  • Elem設(shè)置為 a時(shí)的元素類型*schema.Resourcemap[string]interface{}

上面的翻譯記錄在 SDK 的模式類型文檔頁面上,在每個(gè)標(biāo)題下作為“數(shù)據(jù)結(jié)構(gòu):”。

每當(dāng)您處理集合時(shí),從 Go 的角度來看,元素類型始終interface{}反映了元素類型直到運(yùn)行時(shí)才確定的事實(shí)。TypeList但是,上面定義的相同映射規(guī)則也適用于這些元素值,因此要轉(zhuǎn)換 a Elem,TypeString您首先要斷言切片類型,然后依次斷言每個(gè)元素:

itemsRaw := d.Get("example").([]interface{})

items := make([]string, len(itemsRaw))

for i, raw := range itemsRaw {

    items[i] = raw.(string)

}

不幸的是,由于 Go 接口和類型斷言的設(shè)計(jì),無法一步直接從[]interface{}到。[]string


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由于自定義容器,有點(diǎn)復(fù)雜,但是您可以調(diào)用Listset 的方法來獲取 a[]interface{}然后您可以像TypeList上面一樣對(duì)待它:


itemsRaw := d.Get("example").(*schema.Set).List()

items := make([]string, len(itemsRaw))

for i, raw := range itemsRaw {

    items[i] = raw.(string)

}


查看完整回答
反對(duì) 回復(fù) 2022-05-05
  • 1 回答
  • 0 關(guān)注
  • 307 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)