最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 如何在go模板内部分配go模板的变量?

    如何在go模板内部分配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 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 protected]/dist/js/bootstrap.bundle.min.js"
                integrity="sha384-enjdo4dr2bkbifxqpeotz1hicje39wm4jdkdf19u8gi4ddq3gyns7ntkfadvqsze"
                crossorigin="anonymous"></script>
        </body>
        </html>
    {{end}}
    

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

    {{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("nnLoading 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()
    }
    

    正确答案

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

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

    并将“标题”模板定义为

    {{define "title"}}default title{{end}}

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

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

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

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 如何在go模板内部分配go模板的变量?
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情