기능 소개
Go 포매터는 Go 소스 코드를 Go 커뮤니티 전체가 사용하는 단 하나의 표준 스타일로 다시 작성합니다. 파일이나 코드 조각을 붙여넣으면 gofmt 방식의 들여쓰기, 공백, import 그룹, 정렬된 구조체 필드와 주석으로 정리된 코드가 돌아옵니다.
Go 툴체인의 진짜 gofmt를 WebAssembly로 컴파일해 실행합니다. 흉내 낸 것이 아니므로 여기서 보이는 결과는 go fmt가 작성하는 것과 정확히 같고, 포맷한 코드를 커밋해도 CI에서 diff가 생기지 않습니다.
사용 방법
- Go 코드를 붙여넣거나
.go파일을 엽니다. - 입력하는 동안 오른쪽에 포맷된 코드가 나타납니다.
- 커밋할 코드라면 탭 들여쓰기를 유지합니다. 탭이 너무 넓게 렌더링되는 문서, 슬라이드, 사이트에 넣을 코드라면 공백 2칸이나 공백 4칸을 고릅니다.
- 결과를 복사하거나 다운로드합니다.
코드를 파싱할 수 없으면 expected ')', found '{'처럼 첫 번째 오류를 줄과 열과 함께 보여주며, 해당 줄로 바로 이동할 수 있습니다.
예시
예시는 최대한 적은 줄에 욱여넣은 짧은 프로그램입니다. import는 세미콜론으로 구분되어 있고, 구조체는 두 줄에 걸쳐 있으며, 함수의 연산자 주변에는 공백이 없습니다. 포맷하고 나면 다음과 같이 바뀝니다.
- import가 괄호로 묶인 블록이 되어 한 줄에 패키지 하나씩 들어갑니다.
- 구조체 필드가 각자 한 줄을 차지하고 타입이 한 열로 정렬됩니다.
if u.Age<18{가if u.Age < 18 {가 되고 본문은 별도의 줄로 내려갑니다.- 복합 리터럴의 쉼표와 콜론 뒤에 공백이 들어갑니다.
gofmt가 바꾸는 것과 바꾸지 않는 것
gofmt는 레이아웃만 바꿉니다. 식별자 이름을 바꾸거나, 선언 순서를 바꾸거나, 사용하지 않는 import를 지우지 않습니다. 그런 작업은 goimports나 go vet 같은 도구의 몫입니다. 의미 있는 줄바꿈도 그대로 두므로 여러 줄로 나눈 긴 인자 목록은 나뉜 상태로 유지됩니다.
주석은 유지되며 주변 코드에 맞춰 다시 들여쓰기됩니다. 연속된 줄의 끝에 붙은 주석은 구조체 필드처럼 한 열로 정렬됩니다.
팁
- 포맷은 빠진 중괄호를 찾는 빠른 방법입니다. 오류 위치는 보통 실수한 곳 바로 다음 줄을 가리킵니다.
- 이슈나 리뷰에 코드를 공유하기 전에 포매터를 실행하세요. 리뷰어가 코드의 모양 대신 동작에 집중할 수 있습니다.
- 에디터에서 gopls로 “저장 시 포맷”을 켜 두면 파일이 항상 이 출력과 같은 상태로 유지됩니다.
자주 묻는 질문
› 진짜 gofmt인가요?
네. 포매터는 Go 툴체인의 gofmt 코드를 WebAssembly로 컴파일한 것이므로, 출력은 내 컴퓨터에서 `gofmt`나 `go fmt`가 출력하는 결과와 바이트 단위까지 같습니다.
› package 선언이 꼭 있어야 하나요?
아니요. 파일 전체를 넣는 것이 가장 좋지만, gofmt는 선언 목록이나 몇 개의 문장도 받아들이므로 블로그 글이나 채팅에서 복사한 코드 조각을 정리할 때 편리합니다.
› 들여쓰기에 탭을 쓰는 이유는 무엇인가요?
gofmt는 항상 탭으로 들여쓰고 공백으로 정렬합니다. 이것이 Go의 관례이며, 에디터에서는 탭을 원하는 너비로 표시할 수 있습니다. 문서나 슬라이드용으로 공백이 필요하다면 공백 2칸이나 4칸을 고르세요. 줄 앞쪽의 탭만 바뀝니다.
› 코드가 업로드되나요?
아니요. WebAssembly 모듈은 한 번만 다운로드되고, 포맷은 브라우저에서 로컬로 실행됩니다.