언어 버전

언어 버전

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

Go 1.13

Go 1.14

Go 1.17

  • 슬라이스와 배열 요소 타입이 일치하고 배열이 슬라이스보다 길지 않다면, 슬라이스를 배열 포인터로 변환할 수 있어요.
  • 내장 패키지 unsafe에 새 함수 AddSlice가 포함돼요.

Go 1.18

1.18 릴리스는 언어에 다형 함수와 타입("제네릭")을 더해요. 구체적으로는:

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

Go 1.24

Go 1.27

더 알아보기