TutorialVS Code

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에서 실제 실행 환경을 확인합니다.

이전 실습 · 다음 실습