Как анализировать вложенные массивы/подтаблицы в TOML?

Я начинаю с Go, и официальная документация кажется больше для людей, которые знают Иди уже и просто хочу посмотреть материал. Я надеюсь на небольшой толчок в правильном направлении здесь.

Что я хочу сделать: разобрать файл конфигурации TOML с помощью анализатора TOML BuntSushi, который состоит из нескольких элементов, имеющих одинаковые базовые характеристики.

На чем я застрял. Я хочу, чтобы соответствующие части каждого элемента были перечислены вместе с элементом. Пока я могу получить только один из них по его индексу. Я ищу, как настроить его таким образом, чтобы перечислялись все части соответствующего индекса, а не только конкретный. Я могу получить список JSON с помощью [:], но не могу адаптировать его для получения нормального вывода.

Первоначально я рассматривал [[item.part.001]] и так далее, потому что это выглядело правильно в онлайн-парсерах JSON, но не смог понять, как правильно прочитать это в Go. Поскольку я все равно застрял, я открыт для обоих типов, что работает лучше.

Заранее спасибо. Вот файлы в качестве сокращенного минимального рабочего примера.


demo.toml

# — — — — —  — — — — — — — — — — — — — — — — — — 
#                   First Item
# — — — — —  — — — — — — — — — — — — — — — — — — 

[[item]]
itemname = "Fragments"
itemdesc = "This one can get a bit longer."

    [item.attributes]
    material = "Basematname"
    light    = "Lightname"
    transpc  = "full"
    displace = "height"

    [[item.part]]
    partname = "Shard"
    partlink = "active"

    [[item.part]]
    partname = "Tear"
    partlink = "deferred"

    [[item.part]]
    partname = "crater"
    partlink = "disabled"


# — — — — —  — — — — — — — — — — — — — — — — — — 
#                   Second Item
# — — — — —  — — — — — — — — — — — — — — — — — — 

[[item]]
itemname = "Splash"
itemdesc = "This one also can get a bit longer."

    [item.attributes]
    material = "Other Basematname"
    light    = "Other Lightname"
    transpc  = "half"
    displace = "bump"

    [[item.part]]
    partname = "Drops"
    partlink = "active"

    [[item.part]]
    partname = "Wave"
    partlink = "deferred"

демо.го

package main 

import (
    "fmt"
    "github.com/BurntSushi/toml"
)

type item struct {
    ItemName    string
    ItemDesc    string
    Attributes  attributes
    Part        []part
}

type part struct {
    PartName    string
    PartLink    string
}

type attributes struct {
    Material    string
    Light       string
    TransPC     string
    Displace    string
}

type items struct {
    Item    []item
}



func main() {


    var allitems items

    if _, err := toml.DecodeFile("demo.toml", &allitems); err != nil {
        fmt.Println(err)
        return
    }

    fmt.Printf("\n")

    for _, items := range allitems.Item {
        fmt.Printf("    Item Name: %s \n", items.ItemName)
        fmt.Printf("  Description: %s \n\n", items.ItemDesc)

        fmt.Printf("     Material: %s \n", items.Attributes.Material)
        fmt.Printf("     Lightmap: %s \n", items.Attributes.Light)
        fmt.Printf(" TL Precision: %s \n", items.Attributes.TransPC)
        fmt.Printf("   DP Channel: %s \n", items.Attributes.Displace)


        fmt.Printf("    Part Name: %s \n", items.Part[0].PartName)
        fmt.Printf("    Part Link: %s \n", items.Part[0].PartLink)
        #                                             ^
        #                              That's where [:] won't do it.   

        fmt.Printf("\n────────────────────────────────────────────────────┤\n\n")


    }

    fmt.Printf("\n")


}

person Voodoopants    schedule 18.12.2017    source источник
comment
Поскольку part является подмассивом item, если вы хотите распечатать все item.part для каждого элемента, вам нужен вложенный цикл.   -  person rjsberry    schedule 18.12.2017
comment
Это почти то, где я потерпел неудачу. Я пока не знаю, как получить эти данные. Я попытался настроить структуру parts наподобие items и поместить для нее итерацию for в структуру for _, items. Неа. Я думаю, что проблема связана с чтением demo.toml в allitems и незнанием того, как я могу правильно добраться до этого мешка данных из цикла. ... означает: Помогите!   -  person Voodoopants    schedule 19.12.2017


Ответы (1)


Как указано в комментариях, вам нужен вложенный цикл. Вместо этого:

    fmt.Printf("    Part Name: %s \n", items.Part[0].PartName)
    fmt.Printf("    Part Link: %s \n", items.Part[0].PartLink)

использовать это:

    for _, part := range items.Part {
        fmt.Printf("    Part Name: %s \n", part.PartName)
        fmt.Printf("    Part Link: %s \n", part.PartLink)
    }
person dvk    schedule 20.12.2017
comment
На самом деле это намного проще, чем все, что я пробовал, и гораздо более прямолинейно. Лес против деревьев. Спасибо большое за вашу помощь. - person Voodoopants; 20.12.2017