Template
붕어빵을 만드는 틀에다 넣는 내용물에 따라 팥 붕어빵, 슈크림 붕어빵 피자 붕어빵으로 결과가 달라진다. 이때 붕어빵을 만드는 틀을 template이라고 한다.
go는 자체 api에서 제공하는 강력한 template이 있다.
web서버가 html을 만들때 변경되지 않는 부분과 변경되는 부분이 있다. 이 때 변경되지 않는 부분은 탬플릿화 하고 변경되는 부분을 채워나 갈 수 있도록 탬플릿을 만들어 나간다.
ex)
package main
import (
"fmt"
"os"
"text/template"
)
type User struct {
Name string
Email string
Age int
}
func main() {
user := User{Name: "jinsoo", Email: "jinzza456@gmail.com", Age: 30}
user2 := User{Name: "aaa", Email: "asdf@gmail.com", Age: 25}
tmpl, err := template.New("Tmpl1").Parse("Name: {{.Name}}\nEmail: {{.Email}}\nAge: {{.Age}}")
//template패키지
//.New("탬플릿명") 새 탬플릿을 만든다.
//.Parse("탬플릿에 들어갈 내용 추가")
// {{.Name}} user에 있는 Name에 들어갈 내용
if err != nil {
panic(err) //프로그램 종료
}
tmpl.Execute(os.Stdout, user)
fmt.Println()
tmpl.Execute(os.Stdout, user2)
//tmpl에 user정보를 채워서 출력
}
----------------------------------
Name: jinsoo
Email: jinzza456@gmail.com
Age: 30
Name: aaa
Email: asdf@gmail.com
Age: 25
ex) tmpl1.tmpl
Name: {{.Name}}
Email: {{.Email}}
Age: {{.Age}}
ex) main
package main
import (
"fmt"
"os"
"text/template"
)
type User struct {
Name string
Email string
Age int
}
func main() {
user := User{Name: "jinsoo", Email: "jinzza456@gmail.com", Age: 30}
user2 := User{Name: "aaa", Email: "asdf@gmail.com", Age: 25}
tmpl, err := template.New("Tmpl1").ParseFiles("template/tmpl1.tmpl")
//template패키지
//.New("탬플릿명") 새 탬플릿을 만든다.
//.ParseFile 해당경로의 파일을 불러온다
if err != nil {
panic(err) //프로그램 종료
}
tmpl.ExecuteTemplate(os.Stdout, "tmpl1.tmpl", user)
fmt.Println()
tmpl.ExecuteTemplate(os.Stdout, "tmpl1.tmpl", user2)
// ParseFiles로 템플릿을 만들 경우
// 어떤 파일을 실행 할것인지
// 어떤 내용을 채울것인지를 정해야됨
}
------------------------------
Name: jinsoo
Email: jinzza456@gmail.com
Age: 30
Name: aaa
Email: asdf@gmail.com
Age: 25
ex)tmpl1.tmpl
Name: {{.Name}}
Email: {{.Email}}
{{if .IsOld -}} // if문 - 는 공백 제거
OldAge: {{.Age}}
{{else -}} // else문
Age: {{.Age}}
{{- end}} // 끝내기
ex)main
package main
import (
"fmt"
"os"
"text/template"
)
type User struct {
Name string
Email string
Age int
}
// User의 매서드로 나이를 비교하는 기능
func (u User) IsOld() bool {
return u.Age > 30
}
func main() {
user := User{Name: "jinsoo", Email: "jinzza456@gmail.com", Age: 30}
user2 := User{Name: "aaa", Email: "asdf@gmail.com", Age: 40}
tmpl, err := template.New("Tmpl1").ParseFiles("template/tmpl1.tmpl")
//template패키지
//.New("탬플릿명") 새 탬플릿을 만든다.
//.ParseFile 해당경로의 파일을 불러온다
if err != nil {
panic(err) //프로그램 종료
}
tmpl.ExecuteTemplate(os.Stdout, "tmpl1.tmpl", user)
fmt.Println()
tmpl.ExecuteTemplate(os.Stdout, "tmpl1.tmpl", user2)
// ParseFiles로 템플릿을 만들 경우
// 어떤 파일을 실행 할것인지
// 어떤 내용을 채울것인지를 정해야됨
}
--------------------------------
Name: jinsoo
Email: jinzza456@gmail.com
Age: 30
Name: aaa
Email: asdf@gmail.com
OldAge: 40
ex) tmpl1.tmpl
Name: {{.Name}}
Email: {{.Email}}
{{if .IsOld -}}
OldAge: {{.Age}}
{{else -}}
Age: {{.Age}}
{{- end}}
<a href="/user?email={{.Email}}">user</a>
<script>
var email={{.Email}}
var name={{.Name}}
var age={{.Age}}
</script>
ex) tmpl2.tmpl
<html>
<head>
<title>Template</title>
</head>
<body>
{{range .}} // 아래 항목만큼 돌림
{{template "tmpl1.tmpl" .}}
{{end}}
</body>
</html>
ex) main
package main
import (
"html/template"
"os"
)
type User struct {
Name string
Email string
Age int
}
// User의 매서드로 나이를 비교하는 기능
func (u User) IsOld() bool {
return u.Age > 30
}
func main() {
user := User{Name: "jinsoo", Email: "jinzza456@gmail.com", Age: 30}
user2 := User{Name: "aaa", Email: "asdf@gmail.com", Age: 40}
users := []User{user, user2}
// User의 리스트를 만들어서 user와 user2의 내용을 집어 넣음
tmpl, err := template.New("Tmpl1").ParseFiles("template/tmpl1.tmpl", "template/tmpl2.tmpl")
//template2개 추가
if err != nil {
panic(err) //프로그램 종료
}
tmpl.ExecuteTemplate(os.Stdout, "tmpl2.tmpl", users)
//tmpl2.tmpl만 출력
}
-----------------------------------
<html>
<head>
<title>Template</title>
</head>
<body> // body 안에 내용이 들어감
Name: jinsoo
Email: jinzza456@gmail.com
Age: 30
<a href="/user?email=jinzza456%40gmail.com">user</a>
<script>
var email="jinzza456@gmail.com"
var name="jinsoo"
var age= 30
</script>
Name: aaa
Email: asdf@gmail.com
OldAge: 40
<a href="/user?email=asdf%40gmail.com">user</a>
<script>
var email="asdf@gmail.com"
var name="aaa"
var age= 40
</script>
</body>
</html>
틀안에 틀을 만들어서 각각 분리 시킴으로서 변경된 내용을 수정하기 용이하다.