Добавление содержимого в шаблоны Go в определенном разделе

Я заинтересован в добавлении содержимого в шаблон Go, но в определенном разделе шаблона. Поскольку шаблон имеет определенную структуру, всякий раз, когда я пытаюсь добавить новый контент при выполнении шаблона, он добавляет новый контент к ранее выполненному контенту шаблона:

Пример шаблона:

 type Client struct {
    Opts    *ClientOpts
    Schemas *Schemas
    Types   map[string]Schema

    Container *{{.schema.Id}}Client

  }

Фактический вывод:

type Client struct {
        Opts    *ClientOpts
        Schemas *Schemas
        Types   map[string]Schema

        Container *abcClient

      }

type Client struct {
        Opts    *ClientOpts
        Schemas *Schemas
        Types   map[string]Schema

        Container *xyzClient

      }
}

Желаемый результат:

type Client struct {
        Opts    *ClientOpts
        Schemas *Schemas
        Types   map[string]Schema

        Container *abcClient
        Container *xyzClient

      }

Мой текущий код Go выглядит следующим образом:

func appendToFile(filename string, template *template.Template, schema client.Schema) error {
    output, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0600)
    if err != nil {
        panic(err)
    }
    defer output.Close()

    data := map[string]interface{}{
        "schema": schema,
    }
    err = template.Execute(output, data)
    return err

}

Одно из решений, которое я могу придумать, - это каждый раз искать предыдущий добавленный контент и писать новый контент там. Но я не уверен, как это сделать в Go. Может ли кто-нибудь предоставить мне фрагмент кода для этого или предложить лучшую стратегию?

1 ответ

Решение

Вместо добавления данных сгенерируйте вывод с одним выполнением шаблона:

package main

import (
    "fmt"
    "os"
    "text/template"
)

var t = template.Must(template.New("").Parse(` type Client struct {
    Opts    *ClientOpts
    Schemas *Schemas
    Types   map[string]Schema

{{range .}}
    Container *{{.schema.Id}}Client{{end}}

}
`))

type schema struct {
    Id string
}

func main() {
    data := []map[string]interface{}{
        {"schema": schema{Id: "abcClient"}},
        {"schema": schema{Id: "xyzClient"}},
    }
    if err := t.Execute(os.Stdout, data); err != nil {
        fmt.Println(err)
    }
}

Попробуйте это на детской площадке.

Другие вопросы по тегам