Go 인터페이스 nil != nil 트랩과 해결책
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

Go 인터페이스의 nil != nil 트랩

카테고리

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

서브카테고리

개발 툴

대상자

  • Go 언어 개발자 (중급~고급)
  • 인터페이스 타입 사용 시 nil 체크 관련 실무 문제 해결 필요자
  • Go의 인터페이스 내부 구조 이해가 필요한 경우

핵심 요약

  • any(=interface{}) 타입의 내부 구조 : typevalue 두 부분으로 구성됨. 두 부분이 모두 nil일 때만 nil로 간주됨.
  • nil 체크의 함정 : x == nilinterface{} 타입의 value만 검사하며, type 정보는 무시됨.
  • 해결책 : reflect 패키지의 IsNil() 메서드를 사용하여 typevalue 모두를 검사해야 함.

섹션별 세부 요약

  1. 문제 현상
  • any 타입으로 nil을 전달할 때 x == nil이 예상과 달리 false를 반환하는 현상.
  • 예시 코드에서 atrue로, bfalse로 출력됨.
  • b == nil은 직접 비교 시 true를 반환함.
  1. 인터페이스 내부 구조
  • interface{}type part (구체적 타입, 예: *int)와 value part (실제 값, 예: nil)로 구성됨.
  • x == nilvalue part만 검사하며, type partnil이 아니면 false 반환.
  1. 해결 방법: reflection 사용
  • reflect.ValueOf(x).IsNil()을 사용하여 typevalue 모두를 검사.
  • reflect 패키지의 Chan, Func, Map, Ptr 등 특정 타입에 대한 IsNil() 지원.

결론

  • 인터페이스 타입의 nil 체크는 reflect 패키지를 사용해야 정확한 결과를 얻을 수 있음.
  • any 타입으로 전달된 값이 nil인지 확인할 때는 reflect.ValueOf(x).IsNil()을 사용하는 것이 실무적 추천 방법.
  • Go의 interface{} 내부 구조를 이해하고, == 연산자보다 reflection 기반 검사를 우선 적용해야 함.