피드로 돌아가기
Pointer or Value Receiver in Go? The 3 Cases That Settle the Argument
Dev.toDev.to
Backend

Go Receiver 선택 기준: 상태 변경, 동기화, 64B 임계치 기반 설계

Pointer or Value Receiver in Go? The 3 Cases That Settle the Argument

Gabriel Anhaia2026년 5월 4일9intermediate

Context

Go 언어의 Pointer 및 Value Receiver 선택을 단순 스타일 문제로 간주하여 발생하는 런타임 오류와 성능 저하 분석. 잘못된 Receiver 선택으로 인한 상태 업데이트 실패, 데이터 레이스, 불필요한 메모리 복사 등의 기술적 부채 발생.

Technical Solution

  • Mutation 필요 시 Pointer Receiver를 채택하여 복사본이 아닌 원본 상태의 변경 보장
  • sync.Mutex 등 sync primitive 포함 구조체에 Pointer Receiver를 강제하여 Lock 복사로 인한 Concurrency Bug 방지
  • 구조체 크기가 64 bytes를 초과할 경우 Pointer Receiver를 사용하여 Call Stack의 메모리 복사 비용 제거
  • 동일 타입 내 Receiver 혼용을 지양하여 Interface 구현의 일관성 유지 및 코드 가독성 확보
  • go vet의 copylocks analyzer를 CI 파이프라인에 통합하여 Lock 복사 오류의 자동 검출 체계 구축

1. 상태 변경 여부 확인 -> 변경 시 Pointer Receiver 적용

2. sync.Mutex/WaitGroup 포함 여부 확인 -> 포함 시 모든 메서드에 Pointer Receiver 강제

3. 구조체 크기 64 bytes 초과 여부 확인 -> 초과 시 Pointer Receiver 적용 후 Benchmark 검증

4. CI 파이프라인 내 'go vet ./...' 실행 단계 추가

원문 읽기