Добавление содержимого в шаблоны 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)
}
}