언어 버전
언어 버전
Go 언어는 버전이 올라가면서 기능이 하나씩 추가돼요. 그런데 "새 버전 자료로 짠 코드가 예전 컴파일러에선 안 돌아가면 어떡하지?" 싶은 마음이 들기도 하죠. 그걸 지켜 주는 게 바로 언어 버전 규칙이에요. 이번 챕터에서는 어떤 기능이 어느 버전부터 쓸 수 있는지, 그리고 그 기준이 어떻게 정해지는지 살펴볼게요.
출처: Go Specification
본문
Go 1 호환성 보장(Go 1 compatibility guarantee)은 Go 1 스펙에 맞춰 작성된 프로그램이 그 스펙이 살아 있는 동안 계속해서 그대로 컴파일되고 정확하게 실행되도록 보장해요. 더 나아가 언어에 조정이 가해지고 기능이 추가될수록, 그 호환성 보장은 특정 Go 언어 버전에서 동작하던 프로그램이 이후의 어떤 버전에서도 계속 동작할 것을 보장해 줘요.
예를 들어 이진 정수 리터럴에 접두사 0b를 쓰는 기능은 Go 1.13에서 도입됐어요. 그건 정수 리터럴 챕터에서 [Go 1.13]로 표시되어 있죠. 0b1011 같은 정수 리터럴을 담은 소스 코드는, 컴파일러가 쓰는(요구하는) 언어 버전이 Go 1.13보다 오래된 경우 거부돼요.
아래 표는 Go 1 이후에 도입된 기능이 요구하는 최소 언어 버전을 설명해요.
Go 1.9
- 별칭 선언(alias declaration)으로 타입에 별칭 이름을 선언할 수 있어요.
Go 1.13
- 정수 리터럴(Integer literals)은 각각 이진·팔진 리터럴을 위해 접두사
0b,0B,0o,0O를 쓸 수 있어요. - 16진수 부동소수점 리터럴(floating-point literals)은 접두사
0x와0X로 작성할 수 있어요. - 허수 접미사(imaginary suffix)
i를 10진수 리터럴뿐 아니라 (이진·십진·십육진) 정수 또는 부동소수점 리터럴 어떤 것과도 함께 쓸 수 있어요. - 어떤 숫자 리터럴의 자릿수도 밑줄
_을 써 분리(그룹화)할 수 있어요. - 시프트 연산(shift operation)의 시프트 횟수는 부호 있는 정수 타입일 수 있어요.
Go 1.14
- 서로 다른 임베디드 인터페이스(embedded interfaces)를 통해 메서드를 두 번 이상 임베딩하는 것은 오류가 아니에요.
Go 1.17
- 슬라이스와 배열 요소 타입이 일치하고 배열이 슬라이스보다 길지 않다면, 슬라이스를 배열 포인터로 변환할 수 있어요.
- 내장 패키지
unsafe에 새 함수Add와Slice가 포함돼요.
Go 1.18
1.18 릴리스는 언어에 다형 함수와 타입("제네릭")을 더해요. 구체적으로는:
- 연산자와 구두점(operators and punctuation)의 집합에 새 토큰
~이 포함돼요. - 함수·타입 선언이 타입 매개변수(type parameters)를 선언할 수 있어요.
- 인터페이스 타입은 (인터페이스 타입 이름뿐 아니라) 임의의 타입을 임베딩할 수 있고, 합집합과
~T타입 요소도 가질 수 있어요. - 사전 선언된(predeclared) 타입의 집합에 새 타입
any와comparable이 포함돼요.
Go 1.20
- 슬라이스와 배열 요소 타입이 일치하고 배열이 슬라이스보다 길지 않다면, 슬라이스를 배열로 변환할 수 있어요.
- 내장 패키지
unsafe에 새 함수SliceData,String,StringData가 포함돼요. - (일반 인터페이스 같은) 비교 가능한 타입(Comparable types)은 타입 인수가 엄격하게 비교 가능하지 않더라도
comparable제약 조건을 충족할 수 있어요.
Go 1.21
- 사전 선언된(predeclared) 함수의 집합에 새 함수
min,max,clear가 포함돼요. - 타입 추론(Type inference)은 추론에 인터페이스 메서드의 타입을 사용해요. 또한 변수에 할당되거나 다른 (어쩌면 제네릭) 함수에 인자로 전달되는 제네릭 함수에 대한 타입 인자도 추론해요.
Go 1.22
- "for" 문(for statement)에서 각 반복은 매번 같은 변수를 공유하는 대신 각자의 반복 변수 집합을 가져요.
- "range" 절(range clause)이 있는 "for" 문은 0부터 상한까지의 정수 값을 반복할 수 있어요.
Go 1.23
- "range" 절(range clause)이 있는 "for" 문은 range 표현식으로 반복자(iterator) 함수를 받아들여요.
Go 1.24
- 별칭 선언(alias declaration)이 타입 매개변수(type parameters)를 선언할 수 있어요.
Go 1.27
- 함수 타입 추론(type inference)이 함수와 관련된 모든 할당 맥락(assignment contexts)에서 적용돼요.
- 메서드 선언(method declaration)이 타입 매개변수(type parameters)를 선언할 수 있어요.
- 구조체 복합 리터럴(composite literal)의 키는 구조체 타입에 대한 (최상위) 필드 이름뿐 아니라 유효한 필드 셀렉터(selector)라면 무엇이든 될 수 있어요.
더 알아보기
- Go 1 호환성 보장 문서 (Go 1 compatibility guarantee) — 버전 간 호환성이 왜, 어떻게 지켜지는지 자세히 볼 수 있어요.
- Go Specification — Language versions — 이 챕터의 원문이에요.