Go 인터페이스의 nil != nil 트랩
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- Go 언어 개발자 (중급~고급)
- 인터페이스 타입 사용 시 nil 체크 관련 실무 문제 해결 필요자
- Go의 인터페이스 내부 구조 이해가 필요한 경우
핵심 요약
any
(=interface{}
) 타입의 내부 구조 : type과 value 두 부분으로 구성됨. 두 부분이 모두nil
일 때만nil
로 간주됨.- nil 체크의 함정 :
x == nil
은interface{}
타입의 value만 검사하며, type 정보는 무시됨. - 해결책 :
reflect
패키지의IsNil()
메서드를 사용하여 type과 value 모두를 검사해야 함.
섹션별 세부 요약
- 문제 현상
any
타입으로nil
을 전달할 때x == nil
이 예상과 달리false
를 반환하는 현상.- 예시 코드에서
a
는true
로,b
는false
로 출력됨. b == nil
은 직접 비교 시true
를 반환함.
- 인터페이스 내부 구조
interface{}
는 type part (구체적 타입, 예:*int
)와 value part (실제 값, 예:nil
)로 구성됨.x == nil
은 value part만 검사하며, type part가nil
이 아니면false
반환.
- 해결 방법: reflection 사용
reflect.ValueOf(x).IsNil()
을 사용하여 type과 value 모두를 검사.reflect
패키지의Chan
,Func
,Map
,Ptr
등 특정 타입에 대한IsNil()
지원.
결론
- 인터페이스 타입의 nil 체크는
reflect
패키지를 사용해야 정확한 결과를 얻을 수 있음. any
타입으로 전달된 값이nil
인지 확인할 때는reflect.ValueOf(x).IsNil()
을 사용하는 것이 실무적 추천 방법.- Go의
interface{}
내부 구조를 이해하고,==
연산자보다 reflection 기반 검사를 우선 적용해야 함.