Golang의 포함 (include) 대응 템플릿 (goingtpl) 을 만들어 보았습니다

7144 단어 GoGitHubtemplate
Golang 표준html/template은 기술이 포함되는 것을 지원하지 않기 때문에 스스로 만들어 보았습니다.html/template했다고는 하지만 랩으로 살짝 확장했을 뿐이다.(웃음)
계속할 수도 있어요. 가능하면 하세요.
Golang의 계승 (extends) 대응 템플릿 (goingtpl) 을 만들어 보았습니다

goingtpl

  • 템플릿 파일에서 다른 템플릿 파일에 대한 포함 설명
  • 템플릿 캐시 기능
  • 아래 GitHub 공개에서
    https://github.com/playree/goingtpl
    사용 방법 등 상세한 상황은 다음과 같다.
    https://github.com/playree/goingtpl/blob/master/README.JP.md
    기능을 간단히 소개합니다.

    템플릿 기능 포함


    템플릿 파일에서 다른 템플릿 파일을 투시할 수 있습니다.
    템플릿 파일에는 {{include "xxx.html"}} 로 설명되어 있습니다.
    parent.html
    <!DOCTYPE html>
    <html><body>
        <h1>Test code</h1>
    {{template "footer"}}{{include "footer.html"}}
    </body></html>
    
    footer.html
    {{define "footer"}}
        <p>Footer</p>
    {{end}}
    
    그리고 전용 투시 방법으로 부모 템플릿 파일을 투시하면include가 지정한 파일도 함께 투시합니다.
    투시법
    tpl := template.Must(goingtpl.ParseFile("parent.html"))
    
    html/template 호환 또는 원근 템플릿 파일의 결과는 template.Template 입니다.
    견본
    package main
    
    import (
        "fmt"
        "html/template"
        "log"
        "net/http"
        "time"
    
        "github.com/playree/goingtpl"
    )
    
    func main() {
        // テンプレートのディレクトリを設定
        goingtpl.SetBaseDir("./templates")
    
        http.HandleFunc("/test", handleTest)
        log.Fatal(http.ListenAndServe(":8088", nil))
    }
    
    func handleTest(w http.ResponseWriter, r *http.Request) {
        start := time.Now().UnixNano()
    
        // parent.htmlをパース
        tpl := template.Must(goingtpl.ParseFile("parent.html"))
        tpl.Execute(w, nil)
    
        fmt.Printf("ExecTime=%d MicroSec\n",
            (time.Now().UnixNano()-start)/int64(time.Microsecond))
    }
    
    실행 결과는 이런 느낌이다.
    footer.html의 내용도 투시되었는지 알고 싶습니다.

    템플릿 캐시 기능


    사용 방법은 간단합니다. 아래와 같이 기능을 ON으로 설정하기만 하면 됩니다.
    이렇게 하면 원근 템플릿 파일이 메모리에 캐시되고 다음부터 메모리에서 불러옵니다.
    디스크 액세스를 줄일 수 있으므로 성능 향상을 기대할 수 있습니다.
    반면 캐시에서 템플릿 파일을 변경해도 반영되지 않기 때문에 개발 중에 닫는 것이 효율적일 수 있습니다.
    캐시 기능 ON
    goingtpl.EnableCache(true)
    
    아까 퍼스의 샘플 코드로 해봐.
    다음은 원본 (고속 캐시 기능 종료) 을 여러 번 접근할 때의 로그입니다.
    API server listening at: 127.0.0.1:36704
    ExecTime=568 MicroSec
    ExecTime=495 MicroSec
    ExecTime=496 MicroSec
    
    그러면 캐시 기능을 켜보세요.
    수정은 다음과 같다.
    캐시 기능 열기
    func main() {
        // テンプレートのディレクトリを設定
        goingtpl.SetBaseDir("./templates")
        goingtpl.EnableCache(true)
    
    몇 번 방문할게요.
    API server listening at: 127.0.0.1:41719
    ExecTime=597 MicroSec
    ExecTime=0 MicroSec
    ExecTime=0 MicroSec
    
    첫 방문 이후의 처리 시간이 단축되었는지 알고 싶습니다.
    캐시 기능을 ON으로 설정하면 프로그램이 실행되는 동안 실제 템플릿 파일을 편집해도 반영되지 않습니다.(메모리에 캐시된 것을 참조하기 위해)
    따라서 캐시를 지우는 방법도 준비되어 있다.
    캐시 제거 방법
    goingtpl.ClearCache()
    

    좋은 웹페이지 즐겨찾기