gofmt와 Go 진단을 같은 환경에서 실행하기
Go 확장과 gofmt를 연결하고 go vet 진단, 모듈 경로, 포맷 차이를 실패로 바꾸는 CLI 검사를 실습합니다.
자료 확인일: 2026-09-06. 예제는 별도 format-lab 프로젝트에서 순서대로 적용합니다. 명령은 macOS·Linux·WSL의 프로젝트 루트 기준이며, 기존 설정에는 필요한 키를 병합합니다.
gofmt와 gopls의 역할을 나눕니다
Go 확장은 편집기 연결을, gopls는 탐색과 진단 등 언어 기능을, gofmt는 표준 포맷을 제공합니다. 이 실습에서는 저장 포맷을 gofmt로 명시해 CLI와 비교합니다. Go 확장의 기본 포맷 제공자는 gopls이며 필요에 따라 go.formatTool로 직접 선택할 수 있습니다. Go 확장 설정
Go SDK를 설치하고 EditorConfig 실습의 프로젝트 루트에서 모듈을 만듭니다. 기존 go.mod가 있다면 초기화 명령은 생략합니다.
go version
code --install-extension golang.Go
cd go-example
go mod init example.com/format-lab
cd ..VS Code가 도구 설치를 요청하면 Go: Install/Update Tools에서 gopls를 설치합니다. go-example/go.mod가 보이는지 확인하고, 모듈 탐색이 되지 않는 복합 저장소라면 go-example을 workspace folder로 추가하거나 Go 모듈 폴더를 직접 엽니다. 이후 CLI의 작업 폴더도 동일 모듈로 맞춥니다.
저장 시 실행할 변환을 명시합니다
{
"[go]": {
"editor.defaultFormatter": "golang.go",
"editor.insertSpaces": false,
"editor.codeActionsOnSave": {
"source.organizeImports": "never"
}
},
"go.formatTool": "gofmt"
}import를 자동 추가·삭제하는 Organize Imports는 이 실습에서 끕니다. 필요하면 gopls의 import 정리를 별도로 켜되 gofmt만 실행한 결과와는 추가 변환이 있음을 이해합니다. gofmt는 누락된 import를 자동으로 찾아 추가하는 도구가 아닙니다.
.editorconfig의 Go 탭 규칙은 편집 중 입력을 맞추기 위한 것입니다. gofmt를 공백 2칸 스타일로 바꾸는 설정은 만들지 않습니다.
형식이 맞아도 잘못된 Printf는 남습니다
go-example/main.go:
package main
import "fmt"
func main(){fmt.Printf("%d\n", "hello")}다음을 한 줄씩 실행합니다.
gofmt -w go-example/main.go
cd go-example
go vet ./...
go test ./...
cd ..gofmt는 모양을 정리하지만 %d와 문자열의 불일치는 고치지 않습니다. go vet가 이를 진단하고 go test 역시 기본 vet 검사에서 실패할 수 있습니다. %s로 수정합니다.
package main
import "fmt"
func main() {
fmt.Printf("%s\n", "hello")
}다시 vet와 test를 실행합니다. 이 작은 예제의 go test는 테스트가 없다고 표시할 수 있습니다. 명령 통과가 동작 테스트를 작성했다는 뜻은 아닙니다.
gofmt 검사 결과를 CI의 실패로 바꿉니다
gofmt -l go-example은 바뀔 파일 이름을 출력하지만 포맷 차이만으로 실패 코드를 반환하지 않습니다. 다음을 scripts/check-go-format.sh에 저장하고 bash scripts/check-go-format.sh로 실행합니다. 구문 오류는 set -e가, 포맷 차이는 명시적 조건이 실패로 만듭니다. gofmt 명령
#!/usr/bin/env bash
set -euo pipefail
unformatted=$(gofmt -l go-example)
if [[ -n "$unformatted" ]]; then
printf '%s\n' "$unformatted"
exit 1
fi실습용 go-example에는 직접 작성한 파일만 둡니다. 실제 저장소의 vendor와 생성 코드는 별도 파일 목록으로 범위를 정합니다. Go SDK 버전도 CI와 개발 환경에서 맞춥니다. gofmt는 별도 --version 대신 같은 SDK의 go version과 실행 파일 경로를 확인합니다.
완료 실험은 main.go를 한 줄로 바꿔 검사 script가 실패하는지 확인하고, 저장 또는 gofmt -w 후 같은 script가 통과하는지 보는 것입니다. 편집기 진단이 다르면 Go: Locate Configured Go Tools와 gopls Output에서 실제 실행 환경을 확인합니다.