Go 함수: 첫 번째 등급 시민과 올바른 사용법
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

Go 함수가 첫 번째 등급 시민: 올바른 사용법

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발, DevOps

대상자

Go 개발자 및 시스템 설계자

핵심 요약

  • Go에서 함수는 변수에 할당, 인자로 전달, 반환 값으로 사용 가능 (첫 번째 등급 시민 특성)
  • 클로저를 통해 상태를 유지하는 함수를 구현 가능 (예: makeEndpointFunc, SharedInformerOption)
  • 함수의 복잡도를 줄이기 위해 스타일 구조체 사용 및 단일 책임 원칙 적용 (예: CreateOrderProcessOrder 분리)

섹션별 세부 요약

1. 첫 번째 등급 시민 정의 및 예시

  • Ward Cunningham의 정의: 제한 없이 생성 및 사용 가능한 언어 요소가 첫 번째 등급 시민
  • Go에서 makeEndpointFuncipvs, nftables, iptables에서 공통 인터페이스로 사용
  • NewEndpointsChangeTracker 함수는 makeEndpointInfo를 인자로 받아 캐시를 초기화

2. 클로저의 활용

  • 클로저는 함수 내부에서 정의된 변수를 참조하며, 실행 완료 후 메모리 해제
  • ResourceEventHandlerFuncs에서 logger를 클로저로 활용하여 반복적 인자 전달 방지
  • WithNamespace 함수는 클로저를 통해 sharedInformerFactorynamespace 설정

3. 제네릭 Functor와 Go 1.18

  • Functor[T any] 타입으로 제네릭 Functor 구현 (예: Map 메서드로 컨테이너 요소 변환)
  • User 구조체에 Map 함수 적용하여 이름을 대문자로 변환
  • 제네릭 지원으로 Functor의 코드 재사용성 향상

4. 함수 설계 최적화

  • 많은 인자 사용 시 User 구조체로 집합화 (예: createUser 함수 리팩토링)
  • 가변 인자 사용으로 기본값 제공 및 호출자 부담 완화
  • 함수의 역할 분리 (예: CreateOrderValidateOrder, CalculateTotalPrice, ProcessInventory 분리)
  • 단위 테스트로 복잡도 평가: 복잡한 함수는 테스트 작성 어려움 → 스프리팅 권장

결론

  • 함수는 첫 번째 등급 시민으로 유연한 설계 가능 (인자 전달, 클로저 활용, 제네릭 Functor)
  • 복잡한 함수는 스타일 구조체로 인자 집합화 및 단일 책임 원칙 적용
  • 단위 테스트를 통해 함수 복잡도 측정하고, 필요 시 분리하여 유지보수성 향상
  • Go 1.18 제네릭을 활용한 Functor 적용으로 코드 재사용성 극대화