인쇄하지 않고 Go 문자열을 포맷 하시겠습니까?
Go에서 문자열을 인쇄하지 않고 문자열을 포맷하는 간단한 방법이 있습니까?
내가 할 수있는:
bar := "bar"
fmt.Printf("foo: %s", bar)
그러나 형식화 된 문자열을 인쇄하지 않고 반환하여 더 조작 할 수 있기를 원합니다.
나는 또한 다음과 같은 것을 할 수있다 :
s := "foo: " + bar
그러나 형식 문자열이 복잡하면 읽기가 어렵고 하나 이상의 부품이 문자열이 아니고 먼저 변환 해야하는 경우 번거 롭습니다.
i := 25
s := "foo: " + strconv.Itoa(i)
더 간단한 방법이 있습니까?
Sprintf 는 당신이 찾고있는 것입니다.
예
fmt.Sprintf("foo: %s", bar)
"A Tour of Go"의 일부로 오류 예제 에서 사용중인 것을 볼 수도 있습니다 .
return fmt.Sprintf("at %v, %s", e.When, e.What)
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 ne $i 0}}, {{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 에서 이것을 시도하십시오 .
귀하의 경우 형식 문자열에 Sprintf ()를 사용해야합니다.
func Sprintf(format string, a ...interface{}) string
Sprintf는 형식 지정자에 따라 형식을 지정하고 결과 문자열을 반환합니다.
s := fmt.Sprintf("Good Morning, This is %s and I'm living here from last %d years ", "John", 20)
출력은 다음과 같습니다.
좋은 아침입니다. 저는 John이며 지난 20 년 동안 이곳에 살고 있습니다.
fmt.SprintF 함수는 문자열을 반환하며 fmt.PrintF 와 동일한 방식으로 문자열을 형식화 할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/11123865/format-a-go-string-without-printing
'Programing' 카테고리의 다른 글
Razor에서 지역 변수를 선언하는 방법? (0) | 2020.03.04 |
---|---|
람다 사용시기, Proc.new 사용시기 (0) | 2020.03.04 |
Java 프로그램은 어떻게 자체 프로세스 ID를 얻을 수 있습니까? (0) | 2020.03.04 |
Java에서 Android에 대한 HttpResponse 시간 초과를 설정하는 방법 (0) | 2020.03.04 |
카메라 의도를 사용하여 캡처 한 이미지가 Android의 일부 기기에서 회전되는 이유는 무엇입니까? (0) | 2020.03.04 |