Golang Templates Cheatsheet
Go 표준 라이브러리는 출력을 생성하기 위한 패키지 세트를 제공합니다. text/template 패키지는 텍스트 출력을 생성하기 위한 템플릿을 구현하고, html/template 패키지는 특정 공격으로부터 안전한 HTML 출력을 생성하기 위한 템플릿을 구현합니다. 두 패키지 모두 동일한 인터페이스를 사용하지만 다음의 핵심 기능 예제는 HTML 애플리케이션을 대상으로 합니다.
Table of Contents
Parsing and Creating Templates
Executing Templates
Template Encoding and HTML
Template Variables
Template Actions
Template Functions
Template Comparison Functions
Nested Templates and Layouts
Templates Calling Functions
Parsing and Creating Templates
Naming Templates
Go 템플릿에 대해 정의된 파일 확장자는 없습니다. 가장 인기 있는 것 중 하나는 vim-go에서 지원하고 text/template godocs에서 참조되는 .tmpl
입니다. .gohtml
확장자는 Atom과 GoSublime 편집기 모두에서 구문 강조를 지원합니다. 마지막으로 대규모 Go 코드베이스 분석에서는 개발자들이 자주 .tpl
을 사용하는 것으로 나타났습니다. 확장자가 중요하지는 않지만 명확성을 위해 프로젝트 내에서 일관성을 유지하는 것이 좋습니다.
Creating a Template
tpl, err := template.Parse(filename)
은 filename에서 템플릿을 가져와 tpl에 저장합니다. 그런 다음 tpl을 실행하여 템플릿을 표시할 수 있습니다.
Parsing Multiple Templates
template.ParseFiles(filenames)
는 파일 이름 목록을 사용하고 모든 템플릿을 저장합니다. template.ParseGlob(pattern)
은 패턴과 일치하는 모든 템플릿을 찾아 템플릿을 저장합니다.
Executing Templates
Execute a Single Template
템플릿이 파싱되면 실행할 수 있는 두 가지 옵션이 있습니다. 단일 템플릿 tpl
은 tpl.Execute(io.Writer, data)
를 사용하여 실행할 수 있습니다. tpl의 내용은 io.Writer에 작성됩니다. Data는 템플릿에 전달되어 템플릿에서 사용할 수 있는 인터페이스입니다.
Executing a Named Template
tpl.ExecuteTemplate(io.Writer, name, data)
는 실행과 동일하게 작동하지만 사용자가 실행하려는 템플릿의 문자열 이름을 허용합니다.
Template Encoding and HTML
Contextual Encoding
Go의 html/template 패키지는 코드의 컨텍스트에 따라 인코딩을 수행합니다. 결과적으로 html/template은 올바르게 렌더링되기 위해 인코딩해야 하는 모든 문자를 인코딩합니다.
예를 들어 "<h1>A header!</h1>"
의 <와 >는 <h1>A header!</h1>
로 인코딩됩니다.
template.HTML
유형을 사용하면 문자열이 안전하다고 Go에 알려주어 인코딩을 건너뛸 수 있습니다. template.HTML("<h1>A Safe header</h1>")
은 <h1>A Safe header</h1>
이 됩니다. 사용자 입력에 이 유형을 사용하면 위험하며 애플리케이션이 취약해집니다.
Go html/template
패키지는 템플릿 내의 속성을 인식하고 속성에 따라 값을 다르게 인코딩합니다.
Go 템플릿은 자바스크립트에서도 사용할 수 있습니다. 구조체와 맵은 JSON 객체로 확장되고 함수 매개변수로 사용하거나 변수 값으로 사용하기 위해 문자열에 따옴표가 추가됩니다.
Safe Strings and HTML Comments
html/template
패키지는 기본적으로 템플릿에서 모든 주석을 제거합니다. 이로 인해 Internet Explorer 감지와 같이 주석이 필요한 경우 문제가 발생할 수 있습니다.
주석을 보존하는 html을 반환하는 함수를 만들기 위해 사용자 정의 함수 방법(전역)을 사용할 수 있습니다. 템플릿의 FuncMap에서 htmlSafe
함수를 정의합니다.
이 함수는 문자열을 가져와 변경되지 않은 HTML 코드를 생성합니다. 이 함수는 <!--[if IE 6]>
와 <![endif]-->
주석을 보존하기 위해 템플릿에서 다음과 같이 사용할 수 있습니다:
Template Variables
The dot character (.)
템플릿 변수는 Go 구문의 부울, 문자열, 문자, 정수, 부동 소수점, 허수 또는 복소수 상수일 수 있습니다. 템플릿에 전달된 데이터는 점 {{ . }}
을 사용하여 액세스할 수 있습니다.
데이터가 복잡한 유형인 경우 해당 필드에 점과 필드 이름을 사용하여 액세스할 수 있습니다 {{ .FieldName }}
.
데이터에 여러 복잡한 구조가 포함된 경우 점을 함께 연결할 수 있습니다. {{ .Struct.StructTwo.Field }}
Variables in Templates
템플릿에 전달된 데이터는 변수에 저장되어 템플릿 전체에서 사용할 수 있습니다. {{$number := .}}
우리는 $number
를 사용하여 변수를 만든 다음 템플릿에 전달된 값으로 초기화합니다. 변수를 사용하려면 템플릿에서 {{$number}}
로 호출합니다.
이 예제에서 템플릿에 23을 전달하고 $number
변수에 저장하면 템플릿 어디에서나 사용할 수 있습니다.
Template Actions
If/Else Statements
Go 템플릿은 많은 프로그래밍 언어와 마찬가지로 if/else 문을 지원합니다. if 문을 사용하여 값을 확인할 수 있으며, 값이 없는 경우 else 값을 사용할 수 있습니다. 빈 값은 false, 0, nil 포인터 또는 인터페이스 값, 길이가 0인 배열, 슬라이스, 맵 또는 문자열입니다.
.Name이 있으면 Hello, Name
이 출력되고(name 값으로 대체됨), 그렇지 않으면 Hello, Anonymous
가 출력됩니다.
템플릿은 if 후에 다른 옵션을 평가하는 데 사용할 수 있는 else if 문 {{else if .Name2 }}
도 제공합니다.
Removing Whitespace
템플릿에 다른 값을 추가하면 다양한 양의 공백이 추가될 수 있습니다. 영향을 무시하거나 최소화하도록 템플릿을 변경하거나 템플릿 내에서 마이너스 기호 -
를 사용할 수 있습니다.
<h1>Hello, {{if .Name}} {{.Name}} {{- else}} Anonymous {{- end}}!</h1>
여기서는 템플릿에게 Name
변수와 그 뒤에 오는 내용 사이의 모든 공백을 제거하도록 지시합니다. end 키워드에도 동일한 작업을 수행합니다. 이를 통해 템플릿에서는 더 쉽게 읽을 수 있도록 공백을 사용하지만 프로덕션에서는 제거할 수 있습니다.
Range Blocks
Go 템플릿에는 구조의 모든 객체를 반복하는 range
키워드가 있습니다. 다음과 같은 Go 구조가 있다고 가정해 보겠습니다:
이름과 가격이 있는 Item과 템플릿으로 전송되는 ViewData 구조가 있습니다. 다음을 포함하는 템플릿을 고려해 보겠습니다:
Items 범위(ViewData 구조에서)의 각 Item에 대해 해당 항목의 Name과 Price를 가져와 각 Item에 대한 html을 자동으로 생성합니다. range 내에서 각 Item은 {{.}}
가 되고, 따라서 이 예제에서 item 속성은 {{.Name}}
또는 {{.Price}}
가 됩니다.
Template Functions
템플릿 패키지는 미리 정의된 전역 함수 목록을 제공합니다. 아래는 가장 많이 사용되는 함수 중 일부입니다.
Indexing structures in Templates
템플릿에 전달된 데이터가 맵, 슬라이스 또는 배열인 경우 템플릿에서 인덱싱할 수 있습니다. {{index x number}}
를 사용하는데, 여기서 index는 키워드이고 x는 데이터이며 number는 인덱스 값에 대한 정수입니다. {{index names 2}}
가 있으면 names[2]
와 동일합니다. 더 깊이 있는 데이터를 인덱싱하기 위해 정수를 더 추가할 수 있습니다. {{index names 2 3 4}}
는 names[2][3][4]
와 동일합니다.
이 코드 예제는 person 구조를 전달하고 FavNums 슬라이스에서 3번째로 좋아하는 숫자를 가져옵니다.
The and
Function
and
Functionand 함수는 첫 번째 빈 인수 또는 마지막 인수를 반환하여 인수의 부울 AND를 반환합니다. and x y
는 논리적으로 if x then y else x
와 같이 동작합니다. 다음 go 코
Last updated