go - 将内容 append 到特定部分中的 Go 模板

标签 go append go-templates

我有兴趣将内容 append 到 Go 模板,但在模板的特定部分内。由于模板定义了结构,每当我尝试在执行模板时 append 新内容时,它都会将新内容 append 到先前执行的模板内容中:

示例模板:

 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

}

我能想到的一个解决方案是每次都对以前 append 的内容进行查找,然后在那里写入新内容。但我不确定如何在 Go 中做到这一点。有人可以为此提供代码片段或建议更好的策略吗?

最佳答案

不是 append 数据,而是通过一次模板执行生成输出:

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)
    }
}

Try it on the playground .

关于go - 将内容 append 到特定部分中的 Go 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27136114/

相关文章:

docker - Go 可执行文件是如何在 Docker 中创建的?

python - 将 Pandas Series 添加为 DataFrame 中的一行,忽略不匹配的列

jquery - 将 JS 移至 head 标签之间

bash - 搜索和追加

go - 将数据和变量传递到模板

GoLang 链接 io.Reader

go - 我应该如何使用 protoc-gen-go-grpc?

go - 如果values.yaml 文件中不存在属性,如何返回默认 false?

docker - Golang - Docker API - 解析 ImagePull 的结果

go - 模板不必要地将 `<` 转义为 `&lt;` 但不是 `>`