할당 가능성
할당 가능성 (Assignability)
어떤 값을 변수에 담을 때, 그 값의 타입이 변수의 타입과 정확히 일치해야만 담을 수 있는 건 아니에요. Go는 "이 값은 이 타입의 변수에 담아도 된다"라는 판단 기준을 따로 갖고 있는데, 이 기준을 **할당 가능성(assignability)**이라고 부르죠. 지금부터 이 기준이 정확히 어떻게 작동하는지 하나씩 살펴볼게요.
출처: Go Specification
본문
타입 V의 값 x는, 다음 조건 중 하나가 성립할 때 타입 T의 변수에 할당 가능하다고(assignable) 합니다. 흔히 "x는 T에 할당 가능하다"라고 표현하죠.
V와T가 서로 동일(identical)한 타입인 경우.V와T가 동일한 기본 타입(underlying type)을 갖지만 둘 다 타입 파라미터가 아니고,V나T중 적어도 하나가 명명된 타입(named type)이 아닌 경우.V와T가 요소 타입이 동일한 채널 타입이고,V가 양방향(bidirectional) 채널이며,V나T중 적어도 하나가 명명된 타입이 아닌 경우.T가 인터페이스 타입이되 타입 파라미터가 아니고,x가T를 구현(implements)하는 경우.x가 (부분적으로만 인스턴스화되었을 수도 있는) 제네릭 함수이고,T가 함수 타입이며,x에 대해 명시적으로 제공되지 않은 타입 인자가 (완전한 인스턴스화 후에)x와T가 동일한 기본 타입을 갖도록 추론(infer)될 수 있는 경우 Go 1.27.x가 선언된 식별자nil이고,T가 포인터, 함수, 슬라이스, 맵, 채널 또는 인터페이스 타입이되 타입 파라미터가 아닌 경우.x가 타입T의 값으로 표현 가능(representable)한 무타입(untyped) 상수인 경우.
추가로, x의 타입 V나 T가 타입 파라미터인 경우에는, 다음 조건 중 하나가 성립할 때 x를 타입 T의 변수에 할당할 수 있어요.
x가 선언된 식별자nil이고,T가 타입 파라미터이며,x가T의 타입 집합(type set)에 속한 각 타입에 할당 가능한 경우.V가 명명된 타입이 아니고,T가 타입 파라미터이며,x가T의 타입 집합에 속한 각 타입에 할당 가능한 경우.V가 타입 파라미터이고T가 명명된 타입이 아니며,V의 타입 집합에 속한 각 타입의 값들이T에 할당 가능한 경우.
더 알아보기
- Go Specification — Assignability (영문 원문)
- 변수 (Variables): 할당의 대상이 되는 변수의 의미
- 기본 타입 (Underlying types): 명명된 타입과 별칭의 기반이 되는 타입
- 타입 (Types): 명명된 타입의 정의
- Go 1.27: 제네릭 함수 할당 규칙이 추가된 버전