Go语言 如何在围棋模板中赋值围棋模板的变量?

qyyhg6bp  于 2023-05-20  发布在  Go
关注(0)|答案(2)|浏览(203)

我刚刚开始使用golang和模板系统来重新开发我的网络服务器。现在我只想为每个网站写常量变量,但我甚至不知道我在搜索什么。希望有人能帮上忙。
我有这个gohtml文件作为每个html文件的“基础”

{{define "topdoc"}}
    <!DOCTYPE html>
    <html lang="en" data-bs-theme="dark">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>{{.title}}</title>
        <!-- Bootstrap -->
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet"
              integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ"
              crossorigin="anonymous">
    </head>
    <body>
{{end}}

{{define "botdoc"}}
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"
            integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe"
            crossorigin="anonymous"></script>
    </body>
    </html>
{{end}}

然后我想改变标题和稍后的例子 meta数据描述和类似的东西一样的方式。

{{template "topdoc" .}}
{{template "navbar"}}
HOME

{{template "botdoc"}}

导航栏在另一个文件中定义。
现在我想给予这个文件中的变量

{{template "topdoc" .title="Home" .otherParam="Checking..."}}
{{template "navbar"}}
HOME

{{template "botdoc"}}

也许有人能帮我解决这个微不足道的问题。
当我用这个方法的时候

{{define "title"}}Home{{end}}
{{template "topdoc"}}
{{template "navbar"}}
HOME

{{template "botdoc"}}

并先加载基础文件,它显示一个空白的网站。
我像这样加载模板文件:

func main() {
    r := gin.Default()

    tmpl = make(map[string]*template.Template)

    // Load templates files
    templateFiles := []string{}

    fmt.Println("Loading templates...")
    // Walk through the "templates" folder and all its subdirectories
    nerr := filepath.Walk("main/web/assets/templates", func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }

        // Check if the file is an HTML templates
        if !info.IsDir() && strings.HasSuffix(info.Name(), ".gohtml") {
            // Replace backslashes with forward slashes (for Windows compatibility)
            templateName := strings.Replace(path, "\\", "/", -1)

            // Parse the file and add it to the "tmpl" map
            templateFiles = append(templateFiles, path)

            //console log
            fmt.Print(templateName + " ")
        }
        return nil
    })

    if nerr != nil {
        panic(nerr)
    }

    fmt.Println("\n\nLoading sites...")

    // Walk through the "public" folder and all its subdirectories
    err := filepath.Walk("main/web/public", func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }

        // Check if the file is an HTML templates
        if !info.IsDir() && strings.HasSuffix(info.Name(), ".gohtml") {
            // Get the directory path (relative to the "public" folder)
            relPath, err := filepath.Rel("main/web/public", filepath.Dir(path))
            if err != nil {
                return err
            }
            // Replace backslashes with forward slashes (for Windows compatibility)
            templateName := strings.Replace(relPath, "\\", "/", -1)

            // Parse the file and add it to the "tmpl" map
            parsing := []string{}
            parsing = append(parsing, templateFiles...)
            parsing = append(parsing, path)

            fmt.Println(parsing)

            tmpl[templateName] = template.Must(template.ParseFiles(parsing...))

            // If the path is empty, default to "index"
            if templateName == "." {
                templateName = ""
            }

            // Register the templates with the appropriate route
            r.GET("/"+templateName, handler)
        }

        return nil
    })
    if err != nil {
        panic(err)
    }

    r.Run()
}
aurhwmvo

aurhwmvo1#

这通常使用模板组合来实现。在您的“topdoc”模板中,只需调用其他模板:

{{define "topdoc"}}
...
{{template "title"}}
...
{{end}}

并将“title”模板定义为

{{define "title"}}Default title{{end}}

然后,您可以在单独的文件中重新定义“title”模板:

{{define "title"}}New title{{end}}
{{define "someTemplate}}
{{template "topdoc"}}
...
{{end}}

您必须组合这些不同的模板文件,以便您首先加载“topdoc”(定义默认的“title”),然后加载重新定义“title”的模板。

pdtvr36n

pdtvr36n2#

为了在go模板中使用“常量”,最简单的方法就是使用模板来定义它们。因此,首先加载基础模板文件是非常重要的,这样它就可以被重写。当这样做时,定义一个“内容”模板很重要,这样就可以显示实际的网站。
所以基地golang看起来会是这样

{{define "topdoc"}}
    <!DOCTYPE html>
    <html lang="eng" data-bs-theme="dark">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>{{template "title"}}</title>
        <!-- Bootstrap -->
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet"
              integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ"
              crossorigin="anonymous">
    </head>
    <body>
{{end}}

{{define "title"}} Default Title {{end}}
{{template "content"}}

{{define "botdoc"}}
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"
            integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe"
            crossorigin="anonymous"></script>
    </body>
    </html>
{{end}}

网站文件应该是这样的

{{define "title"}}Home{{end}}
{{define "content"}}
{{template "topdoc"}}

{{template "navbar"}}
Home

{{template "botdoc"}}
{{end}}

相关问题