Go | Template(템플릿)

Go | Template(템플릿)

템플릿이란?

대부분의 서버사이드 언어들은 정적인 페이지에 스크립팅을 지원하기 위해 JSP나 PHP와 같은 언어들을 제공한다. Go에서는 이와 유사한 스크립팅 언어로 template 패키지를 제공한다. 템플릿은 정적인 텍스트에 리스트와 같은 오브젝트들을 결합하여 동적인 컨텐츠를 만드는 것이다.

HTML을 만들어 내기 위해서는 html/template 라는 패키지를 사용한다. text/template 패키지와 유사한 기능을 제공하며, 브라우저에서 보안상의 문제를 해결하고 이스케이프 문자와 같은 것들을 안전하게 변환해 주는 기능을 제공한다.

템플릿은 정적인 텍스트와 내장된 커맨드들로 구성된다. 커맨드는 JSP나 PHP와 유사하게 {{ … }} 형식의 구분자로 표기된다. 템플릿에 적용된 Go객체는 '.'으로 표현된다. 객체가 문자열 이라면 {{.}} 으로 템플릿에 표시할 수 있다.

예를 들어, 다음과 같은 구조체가 있다고 한다면,

type User struct { Name string }

이름을 표시하려면 {{.Name}} 과 같이 표현할 수 있다.

정의(Define)

템플릿은 변하지 않는 정적인 텍스트의 특정 부분을 치환하기 위해 사용된다 . 이렇게 변하지 않은 부분을 정의할 때 define문을 사용한다. define문은 'define'과 'end'사이에 템플릿을 선언하여 사용한다.

`{{define “T1”}}Hello{{end}} {{define “T2”}}World{{end} {{define “T3”}}{{template “T1”}} {{template “T2”}}{{end}} {{template “T3”}}`

T1, T2 두 개의 템플릿을 정의하고 T3에 두 템플릿을 사용하여 정의한다. 그리고 T3을 출력하여 'Hello World'라는 결과를 출력한다.

병합(Merge)

템플릿 패키지 내의 Parse, ParseFile, Execute와 같은 메서드를 사용해서 템플릿을 로드하고, 객체와 병합한다. 결국 컨텐츠는 정의된 타입과 객체의 필드들을 이용하여 만들어진다.

package main import ( "os" "text/template" ) type User struct { Name string } func main() { s := User{"Jin"} // 인스턴스 정의 tmpl := template.New("test") // 새 템플릿 생성 tmpl, err := tmpl.Parse("Hello {{.Name}}!") // 문자열을 템플릿 객체로 변환 if err != nil { panic(err) } err1 := tmpl.Execute(os.Stdout, s) // 템플릿에 데이터 객체 병합 if err1 != nil { panic(err1) } }

파이프라인 ('|')

파이프라인은 '|' 문자로 구분되는 명령어의 나열이다. 각 커맨드의 결과가 다음 커맨드의 마지막 인자로 넘어가 최종 커맨드에 의해 출력되는 값이 파이프라인의 값이 된다.

{{"put" | printf "%s%s" "out" | printf "%q"}}

range

package main import ( "os" "text/template" ) type Person struct { Name string Emails []string } const tmpl = `The name is {{.Name}}. {{range .Emails}} Email id is {{.}} {{end}} ` func main() { person := Person{ Name: "Jin", Emails: []string{"[email protected]", "[email protected]"}, } t := template.New("Person template") t, err := t.Parse(tmpl) if err != nil { panic(err) } err = t.Execute(os.Stdout, person) if err != nil { panic(err) } }

range 커맨드는 person.Emails 슬라이스를 순환하면서 값을 출력한다.

The name is Jin. Email id is [email protected] Email id is [email protected]

변수

템플릿 패키지는 변수를 정의하고 사용할 수 있다. 위의 예제에서 이메일 주소 앞에 이름을 함께 출력하려면 다음과 같이 코드를 수정할 수 있다.

{{$name := .Name}} {{range .Emails}} Name is {{$name}}, email is {{.}} {{end}

range scope에서 '.'은 person.Email 이므로 person.Name을 사용하기 위해서는 해당 scope 밖에서 미리 변수를 정의하고, range scope에서 사용하면 된다. 변수는 '$'를 접두사로 사용하여 정의하고 range scope 안에서 접근하여 사용한다.

html/template

html/template는 HTML결과를 출력하기 위한 템플릿 패키지이다. text/template과 사용법이 비슷하며, 코드 인젝션(code injection)으로부터 안전한 출력을 위한 함수들을 추가로 지원한다.

Go의 template 패키지는 Regular Expression과 같은 강력한 기능을 제공하지는 않지만, 사용법이 간단하고 일반적인 텍스트 치환에는 가볍게 사용할 수 있는 용도로 쓰인다.

Reference

from http://havving-do-it.tistory.com/242 by ccl(A) rewrite - 2021-10-14 22:00:37