Go web 6. Template

JINSOO PARK·2021년 10월 27일
0

Go 로 만드는 웹

목록 보기
5/16

Template

붕어빵을 만드는 틀에다 넣는 내용물에 따라 팥 붕어빵, 슈크림 붕어빵 피자 붕어빵으로 결과가 달라진다. 이때 붕어빵을 만드는 틀을 template이라고 한다.

go는 자체 api에서 제공하는 강력한 template이 있다.

template를 사용하는 이유

web서버가 html을 만들때 변경되지 않는 부분과 변경되는 부분이 있다. 이 때 변경되지 않는 부분은 탬플릿화 하고 변경되는 부분을 채워나 갈 수 있도록 탬플릿을 만들어 나간다.

Parse()

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



ParseFiles()

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



{{if}} {{else} {{end}}

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



template2개 활용

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>

틀안에 틀을 만들어서 각각 분리 시킴으로서 변경된 내용을 수정하기 용이하다.

profile
개린이

0개의 댓글