1. 간단한 문자열
"단순한"문자열 (일반적으로 줄에 맞는 것)의 경우 가장 간단한 솔루션은 fmt.Sprintf()
친구 ( fmt.Sprint()
, fmt.Sprintln()
)를 사용하는 것입니다. 이것들은 시작 S
문자가 없는 함수와 유사 하지만 이러한 Sxxx()
변형은 결과를 string
표준 출력으로 인쇄 하는 대신 결과를 반환합니다 .
예를 들면 다음과 같습니다.
s := fmt.Sprintf("Hi, my name is %s and I'm %d years old.", "Bob", 23)
변수 s
는 다음 값으로 초기화됩니다.
Hi, my name is Bob and I'm 23 years old.
팁 : 다른 유형의 값을 연결하려는 경우 정확히 이와 Sprintf()
같이 자동으로 형식 문자열이 필요 하지 않을 수 있습니다 Sprint()
. 이 예제를보십시오 :
i := 23
s := fmt.Sprint("[age:", i, "]") // s will be "[age:23]"
string
s 만 연결 strings.Join()
하는 경우 사용자 지정 구분 기호를 지정할 수 string
있는 위치 (연결할 문자열 사이에 위치)를 사용할 수도 있습니다.
Go Playground 에서 사용해보십시오 .
2. 복잡한 문자열 (문서)
만들려는 문자열이 더 복잡하면 (예 : 여러 줄 전자 메일 메시지) fmt.Sprintf()
읽기 어렵고 효율성이 떨어집니다 (특히 여러 번 수행해야하는 경우).
이를 위해 표준 라이브러리는 패키지를 제공 text/template
하고 html/template
. 이 패키지는 텍스트 출력을 생성하기위한 데이터 기반 템플릿을 구현합니다. html/template
코드 삽입에 대해 안전한 HTML 출력을 생성하기위한 것입니다. 패키지 text/template
와 동일한 인터페이스를 제공하며 text/template
출력이 HTML 일 때마다 대신 사용해야합니다 .
template
패키지를 사용하려면 기본적으로 string
정적 텍스트를 포함 할 수 있는 값 (파일 이름 만 제공하는 경우 파일에서 시작될 수 있음) 형식으로 정적 템플릿을 제공해야합니다. 엔진은 템플릿을 처리하고 출력을 생성합니다.
정적 템플릿에 포함 / 대체되고 출력 생성 프로세스를 제어 할 수있는 매개 변수를 제공 할 수 있습니다. 그러한 파라미터의 전형적인 형태는 중첩 될 수있는 struct
s 및 map
값이다.
예:
예를 들어 다음과 같은 이메일 메시지를 생성한다고 가정 해 보겠습니다.
Hi [name]!
Your account is ready, your user name is: [user-name]
You have the following roles assigned:
[role#1], [role#2], ... [role#n]
이와 같은 이메일 메시지 본문을 생성하려면 다음 정적 템플릿을 사용할 수 있습니다.
const emailTmpl = `Hi {{.Name}}!
Your account is ready, your user name is: {{.UserName}}
You have the following roles assigned:
{{range $i, $r := .Roles}}{{if $i}}, {{end}}{{.}}{{end}}
`
실행을 위해 다음과 같은 데이터를 제공하십시오.
data := map[string]interface{}{
"Name": "Bob",
"UserName": "bob92",
"Roles": []string{"dbteam", "uiteam", "tester"},
}
일반적으로 템플릿의 출력은에 작성 io.Writer
되므로 결과를로 string
작성하려면 bytes.Buffer
(구현하는 io.Writer
)에 작성하고 씁니다 . 템플릿을 실행하고 결과를 string
다음 과 같이 얻습니다 .
t := template.Must(template.New("email").Parse(emailTmpl))
buf := &bytes.Buffer{}
if err := t.Execute(buf, data); err != nil {
panic(err)
}
s := buf.String()
결과는 다음과 같습니다.
Hi Bob!
Your account is ready, your user name is: bob92
You have the following roles assigned:
dbteam, uiteam, tester
Go Playground 에서 사용해보십시오 .
또한 이동 1.10 이후 새로운,보다 빠르고 전문 대안에 사용할 수 있음을 참고 bytes.Buffer
인 : strings.Builder
. 사용법은 매우 유사합니다.
builder := &strings.Builder{}
if err := t.Execute(builder, data); err != nil {
panic(err)
}
s := builder.String()
Go Playground 에서 이것을 사용해보십시오 .
참고 : os.Stdout
대상으로 제공하면 템플릿 실행 결과를 표시 할 수도 있습니다 (또한 구현 함 io.Writer
).
t := template.Must(template.New("email").Parse(emailTmpl))
if err := t.Execute(os.Stdout, data); err != nil {
panic(err)
}
결과를에 직접 씁니다 os.Stdout
. Go Playground 에서 이것을 시도하십시오 .