Go 개발 패턴
필수 워크플로
리뷰 시 관련 스킬 호출: security-audit (OWASP), enterprise-readiness (OpenSSF/SLSA), github-project (브랜치 보호). 모두 필수입니다.
핵심 원칙
타입 안전성
- 피해야 할 것:
interface{}(any사용),sync.Map, 분산된 타입 단언, 리플렉션 - 선호: 제네릭
[T any],errors.AsType[T](Go 1.26), 구체적 타입 - 업그레이드 후
go fix ./...실행
일관성
- 문제 도메인당 하나의 패턴
- 기존 코드베이스 패턴과 일치
- 전체적으로 리팩터링하거나 전혀 하지 않음
- 설정 우선순위: 기본값 < 설정 파일 < 환경 변수 < 플래그
테스팅
- 빌드 태그로 테스트 계층 격리: unit (기본값),
integration,e2e - 항상
t.Parallel(),t.Helper(), 테이블 기반 서브테스트 사용 log/slog를 직접 사용 — 사용자 정의 Logger 인터페이스로 감싸지 않음
규칙
- 오류: 소문자, 구두점 없음 (
errors.New("invalid input")) - 명명: ID, URL, HTTP (Id, Url, Http 아님)
- 오류 래핑:
fmt.Errorf("failed to process: %w", err)
참조 자료
Git 훅: ls lefthook.yml 2>/dev/null && lefthook install || echo "lefthook을 추가하세요 — references/lefthook-template.md 참조"
필요 시 로드:
| 참조 | 목적 |
|---|---|
references/architecture.md | 패키지 구조, 설정 관리, 미들웨어 체인 |
references/logging.md | log/slog를 사용한 구조적 로깅, logrus에서 마이그레이션 |
references/cron-scheduling.md | go-cron 패턴: 명명된 작업, 런타임 업데이트, 컨텍스트, 복원력 |
references/resilience.md | 재시도 로직, 정상 종료, 컨텍스트 전파 |
references/docker.md | Docker 클라이언트 패턴, 버퍼 풀링 |
references/ldap.md | LDAP/Active Directory 통합 |
references/testing.md | 테스트 전략, 빌드 태그, 테이블 기반 테스트 |
references/linting.md | golangci-lint v2, staticcheck, 코드 품질 |
references/api-design.md | 비트마스크 옵션, 함수형 옵션, 빌더 |
references/fuzz-testing.md | Go 퍼징 패턴, 보안 시드 |
references/contracts-and-invariants.md | 계약, 불변 조건, 속성 테스트 |
references/mutation-testing.md | Gremlins 설정, 테스트 품질 측정 |
references/makefile.md | CI/CD용 표준 Makefile 인터페이스 |
references/modernization.md | Go 1.26 모더나이저, go fix, errors.AsType[T], wg.Go() |
references/lefthook-template.md | Go 프로젝트 Git 훅을 위한 바로 사용 가능한 lefthook.yml |
references/reusable-workflows.md | 재사용 가능한 Actions 워크플로 호출자, 권한 전파, 릴리스 게이트 출력 |
references/single-build-release.md | 단일 빌드 릴리스: 한 번 크로스 컴파일하여 릴리스+컨테이너에 재사용 |
references/awesome-go-submission.md | awesome-go 제출: CI 구문 분석 PR 본문, 항목 형식, 이름 충돌 |
품질 게이트
리뷰 완료 전에 다음을 실행:
golangci-lint run --timeout 5m # 린팅
go vet ./... # 정적 분석
staticcheck ./... # 추가 검사
govulncheck ./... # 취약점 스캔
go test -race ./... # 경쟁 조건 탐지
Stdlib 취약점 수정
govulncheck에서 stdlib 취약점이 보고된 경우: vuln.go.dev를 통해 수정 버전 확인, go.mod에서 go X.Y.Z 업데이트, go mod tidy 실행. 브랜치 보호가 있는 리포지토리는 PR 브랜치를 사용하세요.
기여: https://github.com/netresearch/go-development-skill 에 개선 사항 제출