it-swarm-ko.tech

인쇄하지 않고 Go 문자열을 포맷 하시겠습니까?

문자열을 인쇄하지 않고 Go에서 문자열을 포맷하는 간단한 방법이 있습니까?

내가 할 수있는:

bar := "bar"
fmt.Printf("foo: %s", bar)

하지만 난 그것을 조작 할 수 있도록 인쇄보다 형식의 문자열을 반환합니다.

나는 또한 다음과 같이 할 수있다 :

s := "foo: " + bar

그러나 형식 문자열이 복잡 할 때 읽기가 어려워지고 하나 또는 여러 개의 부분이 문자열이 아니며 먼저 변환해야하는 경우 성가시다.

i := 25
s := "foo: " + strconv.Itoa(i)

이 작업을 수행하는 더 간단한 방법이 있습니까?

313
Carnegie

Sprintf 는 당신이 찾고있는 것입니다.

fmt.Sprintf("foo: %s", bar)

또한 "A Tour of Go"의 일환으로 오류 예제 에서 사용중인 것을 볼 수 있습니다.

return fmt.Sprintf("at %v, %s", e.When, e.What)
384
Sonia

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 만 연결하려면 string (결합 할 문자열 사이에 배치)을 지정할 수있는 strings.Join() 을 사용할 수도 있습니다.

Go 놀이터 에서 시도하십시오.

2. 복잡한 문자열 (문서)

만들려는 문자열이 더 복잡한 경우 (예 : 여러 줄 이메일 메시지) fmt.Sprintf()은 읽기 쉽지 않고 효율성이 떨어집니다 (특히 여러 번해야하는 경우).

이를 위해 표준 라이브러리는 패키지 text/templatehtml/template 를 제공합니다. 이 패키지는 텍스트 출력을 생성하기 위해 데이터 기반 템플릿을 구현합니다. html/template는 코드 삽입에 대비 한 HTML 출력을 생성하기위한 것입니다. 패키지 text/template와 동일한 인터페이스를 제공하며 출력이 HTML 일 때마다 text/template 대신 사용해야합니다.

template 패키지를 사용하려면 기본적으로 고정 텍스트가 포함될 수있는 string 값 (파일 이름에서만 제공되는 파일에서 비롯 될 수 있음)과 처리되고 실행되는 작업의 형태로 정적 템플릿을 제공해야합니다 엔진이 템플릿을 처리하고 출력을 생성 할 때.

정적 템플릿에 포함/대체되고 출력 생성 프로세스를 제어 할 수있는 매개 변수를 제공 할 수 있습니다. 이러한 매개 변수의 일반적인 형태는 중첩 될 수있는 structs 및 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 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 에서 시도하십시오.

170
icza

귀하의 경우에는 형식 문자열에 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)

출력은 다음과 같습니다.

안녕하세요, 존입니다. 지난 20 년간 이곳에 살고 있습니다.

1
Kabeer Shaikh

fmt.SprintF 함수는 문자열을 반환하며 문자열을 fmt fmt와 똑같이 형식화 할 수 있습니다. PrintF

0
Mo-Gang