You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决Go模板中同名模板块覆盖导致页面渲染异常的问题

Got it, let's fix this template rendering issue for you! The core problem here is duplicate template definitions clashing with each other, which is why both / and /about are showing the same content. Here's how to resolve it while keeping your template parsing efficient (no need to reparse templates in every handler):

1. Fix Your Template Structure

First, split your templates into separate files to avoid overlapping definitions, and use Go's template inheritance with {{block}} to reuse your base layout properly:

templates/base.gohtml (the main layout)

{{ define "base"}} 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <title>{{.Title}}</title> 
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/water.css@2/out/water.css"> 
</head> 
<body> 
    {{template "header" .}} 
    {{block "body" .}}{{end}} <!-- This is the replaceable content block -->
    {{template "footer" .}} 
</body> 
</html> 
{{end}}

templates/header.gohtml

{{define "header"}} 
<h1>Header</h1> 
{{end}}

templates/footer.gohtml

{{define "footer"}} 
<h1>Footer</h1> 
{{end}}

templates/index.gohtml (homepage content)

{{extends "base"}} <!-- Inherit the base layout -->

{{block "body" .}}
<h1>Index</h1>
<p>Welcome to the homepage!</p>
{{end}}

templates/about.gohtml (about page content)

{{extends "base"}} <!-- Inherit the base layout -->

{{block "body" .}}
<h1>About</h1>
<p>This is the about page content.</p>
{{end}}

2. Adjust Your Go Code

You don't need to change your global template parsing logic (it's efficient as-is!), just make sure your handlers call the correct template files and pass any needed data:

main.go (keep your init function as-is)

package main

import (
	"html/template"
	"log"
	"net/http"
)

var tpl *template.Template

func init() {
	tpl = template.Must(template.ParseGlob("templates/*"))
}

func main() {
	http.HandleFunc("/about", about)
	http.HandleFunc("/", index)
	http.HandleFunc("/favicon.ico", doNothing)
	log.Fatal(http.ListenAndServe(":8000", nil))
}

func doNothing(w http.ResponseWriter, r *http.Request) {}

handlerFunctions.go (update to pass data and call the right templates)

package main

import (
	"log"
	"net/http"
)

func index(rw http.ResponseWriter, req *http.Request) {
	log.Println("Index page called")
	// Pass dynamic data like page title
	pageData := map[string]string{"Title": "Home"}
	tpl.ExecuteTemplate(rw, "index.gohtml", pageData)
}

func about(rw http.ResponseWriter, req *http.Request) {
	log.Println("About page called")
	pageData := map[string]string{"Title": "About Us"}
	tpl.ExecuteTemplate(rw, "about.gohtml", pageData)
}

Why This Works

  • No More Definition Conflicts: Each page now overrides only its own body block via {{block}}, so there's no overwriting of template definitions.
  • Efficient Parsing: The init function parses all templates once at startup, so your handlers reuse the pre-parsed template set (no performance hit).
  • Clean Inheritance: The {{extends}} directive ensures each page pulls in the base layout, header, and footer automatically.

内容的提问来源于stack exchange,提问作者R J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:13:12