Go by Example: 문자열 포맷팅

Go는 printf 전통에서 문자열 포맷팅을 훌륭하게 제공합니다. 여기에 일반적인 문자열 포맷팅 예시가 몇 가지 있습니다.

package main
import "fmt"
import "os"
type point struct {
	x, y int
}
func main() {

Go는 일반적인 값들을 포맷팅 하기 위해 설계된 몇 가지 출력 "verbs"를 제공합니다. 예를 들어, 다음은 point 구조체의 인스턴스를 출력합니다.

	p := point{1, 2}
	fmt.Printf("%v\n", p)

값이 구조체인 경우, %+v 변형은 구조체의 필드명까지 포함합니다.

	fmt.Printf("%+v\n", p)

%#v 변형은 값의 Go 구문 표현 즉, 해당 값을 생성하는 소스코드 스니펫을 출력합니다.

	fmt.Printf("%#v\n", p)

값의 타입을 출력하기 위해선, %T를 사용합니다.

	fmt.Printf("%T\n", p)

불리언 포맷팅은 직관적입니다.

	fmt.Printf("%t\n", true)

정수 포맷팅에는 여러가지 옵션이 있습니다. 표준적인 10진수 포맷팅은 %d를 사용합니다.

	fmt.Printf("%d\n", 123)

다음은 바이너리 표현을 출력합니다.

	fmt.Printf("%b\n", 14)

다음은 주어진 정수에 해당하는 문자를 출력합니다.

	fmt.Printf("%c\n", 33)

%x는 16진수 인코딩을 제공합니다.

	fmt.Printf("%x\n", 456)

실수에 대해서도 몇 가지 포맷팅 옵션이 있습니다. 기본적인 십진수 포맷팅에 대해서는 %f를 사용합니다.

	fmt.Printf("%f\n", 78.9)

%e%E(약간 다른 버전인)는 실수를 과학적 표기법으로 포맷팅합니다.

	fmt.Printf("%e\n", 123400000.0)
	fmt.Printf("%E\n", 123400000.0)

기본적인 문자열 출력에는 %s를 사용합니다.

	fmt.Printf("%s\n", "\"string\"")

Go 소스에서와 같이 문자열을 쌍따옴표로 묶으려면, %q를 사용합니다.

	fmt.Printf("%q\n", "\"string\"")

앞에서 본 정수와 마찬가지로, x는 입력값의 바이트당 두 개의 출력문자와 함께 문자열을 16진수로 렌더링합니다.

	fmt.Printf("%x\n", "hex this")

포인터의 표현(메모리 표현)을 출력하기 위해선, %p를 사용합니다.

	fmt.Printf("%p\n", &p)

숫자를 포맷팅할때 결과 형태의 너비와 정확도를 조정하고 싶을때가 종종 있습니다. 정수의 너비를 지정하려면, 숫자를 % 다음에 씁니다. 기본값으로 결과는 우측 정렬이며 공백으로 채워집니다.

	fmt.Printf("|%6d|%6d|\n", 12, 345)

출력된 실수에 너비를 지정할 수도 있지만, 일반적으로는 windth.precision 구문을 사용해 정밀도를 제한하고자 합니다.

	fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45)

좌측 정렬을 위해선, - 플래그를 사용합니다.

	fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45)

문자열을 포맷팅할 때, 특히 테이블같은 형태로 정렬하기 위해 너비를 조정하고 싶을때도 있습니다. 다음은 기본적인 우측 정렬 너비의 예입니다.

	fmt.Printf("|%6s|%6s|\n", "foo", "b")

숫자에서와 마찬가지로 좌측 정렬을 위해선 - 플래그를 사용합니다.

	fmt.Printf("|%-6s|%-6s|\n", "foo", "b")

이제까지 우린 os.Stdout에 포맷팅된 문자열을 출력하는 Printf를 살펴봤습니다. Sprintf는 문자열을 출력하지 않고 이를 포맷팅 한 후 반환합니다.

	s := fmt.Sprintf("a %s", "string")
	fmt.Println(s)

Fprintf를 사용하여 os.Stdout 이외의 다른 io.Writers를 포맷팅하고 출력할 수 있습니다.

	fmt.Fprintf(os.Stderr, "an %s\n", "error")
}
$ go run string-formatting.go
{1 2}
{x:1 y:2}
main.point{x:1, y:2}
main.point
true
123
1110
!
1c8
78.900000
1.234000e+08
1.234000E+08
"string"
"\"string\""
6865782074686973
0x42135100
|    12|   345|
|  1.20|  3.45|
|1.20  |3.45  |
|   foo|     b|
|foo   |b     |
a string
an error

다음 예제: 정규표현식.