GO: html / template 를 통 해 include 서브 템 플 릿 실현
생각:
또한 관찰 치 를 설정 하여 재 귀적 include 를 진행 할 때 재 귀적 으로 자신 을 포함 하 는 순환 이 나타 나 지 않도록 해 야 합 니 다.
코드 구현:
func RenderWithTemplate(writer io.Writer, templateName string, data map[string]interface{}) error {
rawTemplate, err := LoadTemplate(templateName)
if err != nil {
return err
}
tmpl, err := template.New("new").Parse(rawTemplate)
if err != nil {
return err
}
return tmpl.Execute(writer, data)
}
var TemplateCache map[string]string = nil
var gRecursiveLoadTemplateCount = 0
// Load template with file name templateName under 'templates' dir
// If it contains {% include xxx %}, it will load content of that
// template into current template.
// **Note**: template name inside include directive should not be wrapped with ''
func LoadTemplate(templateName string) (string, error) {
if result, ok := TemplateCache[templateName]; ok {
return result, nil
}
templatePath := "templates/" + templateName
file, err := os.Open(templatePath)
if err != nil {
return "", err
}
stat, err := file.Stat()
if err != nil {
return "", err
}
buffer := make([]byte, stat.Size())
_, err = file.Read(buffer)
if TemplateCache == nil {
TemplateCache = make(map[string]string)
}
rawTemplate := string(buffer)
re := regexp.MustCompile("{%\\s*include\\s+(.*?)\\s*%}")
matches := re.FindAllStringSubmatchIndex(rawTemplate, -1)
if len(matches) > 0 {
newTemplate := ""
start := 0
for _, m := range matches {
if len(m) == 4 {
newTemplate += rawTemplate[start:m[0]]
includeName := rawTemplate[m[2]:m[3]]
gRecursiveLoadTemplateCount ++
if gRecursiveLoadTemplateCount > 10 {
log.Fatal("Possible dead include loop in file: ", templateName)
}
includedTemplate, err := LoadTemplate(includeName)
gRecursiveLoadTemplateCount --
if err != nil {
fmt.Println("Failed to include file ", includeName, " from ", templateName, "err:", err)
includedTemplate = rawTemplate[m[0]:m[1]] // Keep it as original
}
start = m[1]
newTemplate += includedTemplate
}
}
if start < len(rawTemplate) {
newTemplate += rawTemplate[start:]
}
rawTemplate = newTemplate
}
TemplateCache[templateName] = rawTemplate
return rawTemplate, nil
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.