> 백엔드 개발 > Golang > Go 템플릿 내에서 Go 템플릿의 변수를 할당하는 방법은 무엇입니까?

Go 템플릿 내에서 Go 템플릿의 변수를 할당하는 방법은 무엇입니까?

PHPz
풀어 주다: 2024-02-05 22:12:07
앞으로
1117명이 탐색했습니다.

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&#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}}
로그인 후 복사

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

{{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()
}
로그인 후 복사


正确答案


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

{{define "topdoc"}}
...
{{template "title"}}
...
{{end}}
로그인 후 복사

并将“标题”模板定义为

{{define "title"}}default title{{end}}
로그인 후 복사

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

{{define "title"}}New title{{end}}
{{define "someTemplate}}
{{template "topdoc"}}
...
{{end}}
로그인 후 복사

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

위 내용은 Go 템플릿 내에서 Go 템플릿의 변수를 할당하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿