Go 함수가 첫 번째 등급 시민: 올바른 사용법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발, DevOps
대상자
Go 개발자 및 시스템 설계자
핵심 요약
- Go에서 함수는 변수에 할당, 인자로 전달, 반환 값으로 사용 가능 (첫 번째 등급 시민 특성)
- 클로저를 통해 상태를 유지하는 함수를 구현 가능 (예:
makeEndpointFunc
,SharedInformerOption
) - 함수의 복잡도를 줄이기 위해 스타일 구조체 사용 및 단일 책임 원칙 적용 (예:
CreateOrder
→ProcessOrder
분리)
섹션별 세부 요약
1. 첫 번째 등급 시민 정의 및 예시
- Ward Cunningham의 정의: 제한 없이 생성 및 사용 가능한 언어 요소가 첫 번째 등급 시민
- Go에서
makeEndpointFunc
은ipvs
,nftables
,iptables
에서 공통 인터페이스로 사용 NewEndpointsChangeTracker
함수는makeEndpointInfo
를 인자로 받아 캐시를 초기화
2. 클로저의 활용
- 클로저는 함수 내부에서 정의된 변수를 참조하며, 실행 완료 후 메모리 해제
ResourceEventHandlerFuncs
에서logger
를 클로저로 활용하여 반복적 인자 전달 방지WithNamespace
함수는 클로저를 통해sharedInformerFactory
의namespace
설정
3. 제네릭 Functor와 Go 1.18
Functor[T any]
타입으로 제네릭 Functor 구현 (예:Map
메서드로 컨테이너 요소 변환)User
구조체에Map
함수 적용하여 이름을 대문자로 변환- 제네릭 지원으로 Functor의 코드 재사용성 향상
4. 함수 설계 최적화
- 많은 인자 사용 시
User
구조체로 집합화 (예:createUser
함수 리팩토링) - 가변 인자 사용으로 기본값 제공 및 호출자 부담 완화
- 함수의 역할 분리 (예:
CreateOrder
→ValidateOrder
,CalculateTotalPrice
,ProcessInventory
분리) - 단위 테스트로 복잡도 평가: 복잡한 함수는 테스트 작성 어려움 → 스프리팅 권장
결론
- 함수는 첫 번째 등급 시민으로 유연한 설계 가능 (인자 전달, 클로저 활용, 제네릭 Functor)
- 복잡한 함수는 스타일 구조체로 인자 집합화 및 단일 책임 원칙 적용
- 단위 테스트를 통해 함수 복잡도 측정하고, 필요 시 분리하여 유지보수성 향상
- Go 1.18 제네릭을 활용한 Functor 적용으로 코드 재사용성 극대화