Maison > développement back-end > Golang > Comment attribuer des variables du modèle go à l'intérieur du modèle go ?

Comment attribuer des variables du modèle go à l'intérieur du modèle go ?

PHPz
Libérer: 2024-02-05 22:12:07
avant
1224 Les gens l'ont consulté

Comment attribuer des variables du modèle go à lintérieur du modèle go ?

问题内容

我刚刚开始使用 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/[email&#160;protected]/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/[email&#160;protected]/dist/js/bootstrap.bundle.min.js"
            integrity="sha384-enjdo4dr2bkbifxqpeotz1hicje39wm4jdkdf19u8gi4ddq3gyns7ntkfadvqsze"
            crossorigin="anonymous"></script>
    </body>
    </html>
{{end}}
Copier après la connexion

我想更改标题,然后以相同的方式更改例如元数据描述和类似的内容。

{{template "topdoc" .}}
{{template "navbar"}}
home

{{template "botdoc"}}
Copier après la connexion

导航栏在另一个文件中定义。

现在我想在这个文件中给出变量

{{template "topdoc" .title="home" .otherparam="checking..."}}
{{template "navbar"}}
home

{{template "botdoc"}}
Copier après la connexion

也许有人可以帮助我解决这个非常琐碎的问题。

当我使用这个方法时

{{define "title"}}home{{end}}
{{template "topdoc"}}
{{template "navbar"}}
home

{{template "botdoc"}}
Copier après la connexion

首先加载基本文件,它显示一个空白网站。

我像这样加载模板文件:

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()
}
Copier après la connexion


正确答案


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

{{define "topdoc"}}
...
{{template "title"}}
...
{{end}}
Copier après la connexion

并将“标题”模板定义为

{{define "title"}}default title{{end}}
Copier après la connexion

然后,您可以通过在单独的文件中重新定义“标题”模板来覆盖它:

{{define "title"}}New title{{end}}
{{define "someTemplate}}
{{template "topdoc"}}
...
{{end}}
Copier après la connexion

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal