Go 업데이트 로그
유지보수 버전:
- go1.25, 첫 릴리스: 2025-08-12, 최신 업데이트: go1.25.0 (2025-08-12)
- go1.24, 첫 릴리스: 2025-02-11, 최신 업데이트: go1.24.6 (2024-08-06)
Go 언어 공식 업데이트 로그: Release History - The Go Programming Language
Go 공식은 시맨틱 버저닝을 사용하여 버전 식별을 수행하며, 형식은 v주 버전.부 버전.패치 버전입니다 (Semantic Versioning 참조). 주 버전 업데이트는 Breaking Change 가 발생했음을 의미하며, 하위 호환성이 없는 업데이트입니다. 부 버전 업데이트는 새로운 기능이 추가되면서도 하위 호환성을 유지합니다. 패치 버전 업데이트는 문제가 수정되면서 하위 호환성을 유지합니다.
Go 팀은 6 개월마다 2 차 버전을 릴리스하며, 최신 2 차 버전 2 개만 6 개월 동안 장기 유지보수됩니다. Go 의 각 업데이트는 상당히 높은 호환성을 유지하므로, 새 버전이 안정화된 후 적시에 Go 를 최신 버전으로 업그레이드하는 것이 좋습니다.
Go2.0 에 대한 마지막 초안 제안은 2018 년 11 월 19 일이었으며, 당시에는 go1.13 버전이었습니다. 5 년이 지난 후 버전은 go1.21 로 업데이트되었으며, Go2.0 의 다양한 아이디어는 점진적 업데이트를 통해 Go1.0 에 반영되었습니다. 창시자 중 한 명은 미래에 Go2.0 이 없을 것이라고 명시적으로 밝힌 바 있으며, Go 는 하위 호환성을 유지하기 위해 계속 노력할 것입니다 (Go 1 and the Future of Go Programs 참조).
안내
이 페이지는 공식 로그를 간단히 옮긴 것이며, 불규칙적으로 업데이트됩니다. 최신 소식을 원하시면 공식 웹사이트를 방문하세요.
1.25
첫 릴리스: 2025-08-12
최신 업데이트: go1.25.0 (2025-08-12)
go1.25 버전의 자세한 업데이트 로그는 Go 1.24 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.25 - Release Patch 에서 확인할 수 있습니다.
언어 측면
- 제네릭의 코어 타입 (core type) 개념 제거, 공식 블로그 Goodbye core types 참조
표준 라이브러리
test/synctest추가, 동시성 코드 테스트용- 실험적 라이브러리
encoding/json/v2추가, 포함:encoding/json/v2, 역직렬화 속도가 v1 대비 약 2-10 배 향상, 벤치마크는 go-json-experiment/jsonbench 참조encoding/json/jsontext, json 문자열과의 로우 레벨 상호작용 기능 제공
도구 체인
- 향후 Go 배포판에는 소량의 사전 빌드된 바이너리 도구가 포함될 예정
- go mod 에
ignore지시문 추가, go 명령이 무시해야 할 폴더 지정 go doc -http으로 로컬 http 서버를 시작하여 코드 문서 확인 가능- go vet 에
waitgroup및hostport분석기 추가 - go 명령이
go.mod또는go.work의 go 버전을 업데이트할 때 더 이상 go toolchain version 을 추가하지 않음
런타임
GOMAXPROCS 가 컨테이너 환경에서 컨테이너 CPU 제한을 인식
새로운 실험적 GC
greenteagc, GC 의 기본 스케줄링 단위가 object 에서 memory span 으로 변경panic 이 포착되지 않을 때 더 이상 반복해서 인쇄하지 않음
panic: PANIC [recovered] panic: PANIC에서
panic: PANIC [recovered, repanicked]로 변경
runtime/trace.FlightRecorder추가, 런타임 실행 정보를 더 가볍게 지속적으로 캡처 가능
컴파일러
1.21 의 null pointer 지연 검사 (오류 검사 이후로 지연) 버그 수정, 아래 코드는 1.25 버전 이전에는 정상 실행됨
gopackage main import "os" func main() { f, err := os.Open("nonExistentFile") name := f.Name() if err != nil { println("should panic") // 1.25 이전에는 이 줄 출력 return } println(name) }컴파일러가 스택에 있는 slice 를 위해 더 많은 백업 메모리를 예약하여 성능 향상
DWARF5 디버깅 정보 생성 지원
1.24
첫 릴리스: 2025-02-11
최신 업데이트: go1.24.6 (2025-08-06)
go1.24 버전의 자세한 업데이트 로그는 Go 1.24 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.24 - Release Patch 에서 확인할 수 있습니다.
언어 측면
제네릭 타입 별칭, 제네릭 타입에 대한 별칭 생성 허용, 서드파티에서 정의한 제네릭 타입을 참조할 때 유용함
goimport ( "other" ) type MyQuque[T any] = other.Queue[T]
표준 라이브러리
weak패키지 추가: 약한 포인터 (Weak Pointers) 제공, 참조 카운트를 증가시키지 않고 객체를 참조하여 캐시로 인한 메모리 누수 방지,使用前需检查指针是否为nil- 파일 시스템 접근 제한:
os.Root타입 도입, 파일 작업을 특정 디렉토리 내로 제한하여 보안 강화 - 암호화 및 해시 지원:
crypto/mlkem,crypto/hkdf,crypto/pbkdf2,crypto/sha3패키지 추가, 기존 암호화 알고리즘 성능 최적화 - 새로운 벤치마크 함수
testing.B.Loop추가, 루프 테스트 개선 encoding/json:omitzero태그 추가,IsZero()메서드 기반의 제로 값 필터링 지원strings및bytes: 이터레이터 함수 추가 (Lines,SplitSeq,FieldsSeq등)
런타임
- Swiss Tables 을 기반으로 내장 map 리팩토링, 대형 map 접근 속도 30% 향상, 이터레이션 속도 10%-60% 향상
sync.Map이 동시성 해시 트라이 (hash-trie) 로 변경되어 성능 최적화, 특히 동시 쓰기 상황에서- 런타임 내부의 상호 배타적 락이 새로운 spinbit 구현을 사용하여 락 경쟁 감소, 고동시성 시나리오에서 성능 향상
- 작은 객체 할당 전략 최적화, 메모리 단편화 및 GC 일시 중지 시간 감소
runtime.AddCleanup추가하여runtime.SetFinalizer대체, 객체에 대해 여러 개의 정리 함수를 등록하고 독립적인 goroutine 에서 순차적으로 실행 가능
Cgo
#cgo noescape및#cgo nocallback주석 지원, 각각 C 함수가 메모리를 이스케이프하지 않고 Go 함수를 콜백하지 않음을 선언하여 런타임 성능 향상- Cgo 는 이제 여러 개의 호환되지 않는 선언이 있는 C 함수 호출을 거부하며, 파일 간 호환되지 않는 C 함수 선언 (예:
void f(int)및void f(double)) 을 엄격히 검사하여 잘못된 호출 시퀀스 생성 방지
도구 체인
- 모듈 도구 의존성 관리: go.mod 의 tool 지시문을 통해 도구 의존성 추적, 기존 tools.go 빈 import 방식 대체
- 구조화된 출력: go build 및 go test 가 -json 플래그 지원, JSON 형식의 빌드 및 테스트 결과 출력
- 컴파일 및 링크 최적화: 컴파일러가 더 효율적인 코드 생성, 링커가 기본적으로 GNU Build ID(ELF 플랫폼) 및 UUID(macOS) 생성
- CGO 생성 타입에 대한 메서드 정의 제한을 우회하는 별칭 사용 금지
go build가 자동으로 버전 제어 시스템 정보를 바이너리 파일에 임베드 (-buildvcs=false로 비활성화 가능)GOAUTH환경 변수로 개인 모듈 인증 지원go.mod가tool지시문으로 실행 가능한 의존성 관리,tools.go빈 import 대체go get -tool파라미터 및go install tool명령으로 모듈 도구 의존성 관리- 빌드 캐시가
go run및go tool의 바이너리 캐시 지원 objdump가 LoongArch, RISC-V, S390X 역어셈블리 지원vet에tests분석기 추가 (테스트 함수 서명 오류 감지)
플랫폼 호환성
- macOS: Go 1.24 는 macOS 11 Big Sur 를 지원하는 마지막 버전, Go 1.25 는 macOS 12+ 필요
- Windows: 32 비트 ARM 아키텍처를 불완전한 것으로 표시 (GOOS=windows GOARCH=arm), issue #70705 참조
- Linux: 최소 커널 버전 요구 사항이 3.2 로 업그레이드됨
- 부트스트랩 도구 체인으로 Go 1.22.6+ 필요
폐기
math/rand.Seed()완전히 비활성화, 이전 동작 복원을 위해GODEBUG=randseednop=0필요runtime.GOROOT()폐기됨,go env GOROOT으로 경로 가져오기 권장
1.23
첫 릴리스: 2024-08-13
최신 업데이트: go1.23.4 (2024-12-03)
go1.23 버전의 자세한 업데이트 로그는 Go 1.23 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.23 - Release Patch 에서 확인할 수 있습니다.
언어 측면
for range 가 이터레이터 함수 지원, 자세한 내용은 Go Wiki: Rangefunc Experiment 참조
gofunc Upper(s []string) iter.Seq2[int, string] { return func(yield func(int, string) bool) { for i, s1 := range s { if !yield(i, strings.ToUpper(s1)) { return } } return } } func main() { sl := []string{"hello", "world", "golang"} for i, s := range Upper(sl) { fmt.Printf("%d : %s\n", i, s) } } //0 : HELLO //1 : WORLD //2 : GOLANG이는 상당히 실용적인 기능으로, 일반적으로 제네릭과 함께 사용됩니다.
표준 라이브러리
새로운 표준 라이브러리
iter추가, 이터레이터에 대한 자세한 정보 정의 및 설명maps라이브러리에 여러 이터레이터 함수 추가slices라이브러리에 여러 이터레이터 함수 추가새로운
structs라이브러리 추가, 구조체 속성 수정 기능 제공 (예: 메모리 레이아웃)gotype Person struct { Name string Age int _ structs.HostLayout }time표준 라이브러리 구현 최적화
Linker
//go:linkname남용 처리, 자주 인용되는 API 는 일시적으로 허용 (예:runtime.memhash64,runtime.nanotime등), 이후 새로운 인용은 허용되지 않음go//go:linkname gcinit runtime.gcinit func gcinit() func main() { gcinit() }위 코드는 컴파일을 통과할 수 없음
link: main: invalid reference to runtime.gcinit
도구 체인
- 원격 측정 데이터 관리를 위한
go telemetry명령 추가
1.22
첫 릴리스: 2024-02-06
최신 업데이트: go1.22.6 (released 2024-08-06)
go1.22 버전의 자세한 업데이트 로그는 Go 1.22 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.22 - Release Patch 에서 확인할 수 있습니다.
언어 측면
Go 언어 루프 변수 문제 해결
gofunc main() { var wg sync.WaitGroup const n = 10 wg.Add(n) for i := 0; i < n; i++ { go func() { fmt.Println(i) wg.Done() }() } wg.Wait() }위 코드는 1.22 이전에는 10 개의 9 를 출력했지만, 1.22 이후에는 0 에서 9 까지 정상적으로 출력합니다.
for range이 이제 숫자 타입 이터레이션 지원gofor i := range 10 { fmt.Println(i) }
표준 라이브러리
net/http표준 라이브러리 라우팅 강화database/sql에 제네릭 타입sql.Null추가gotype Null[T any] struct { V T Valid bool }사용 예:
gotype Person struct { Name sql.Null[string] Age sql.Null[int] }
1.21
첫 릴리스: 2023-08-08
최신 업데이트: go1.21.13 (released 2024-08-06)
go1.21 버전의 자세한 업데이트 로그는 Go 1.21 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.21 - Release Patch 에서 확인할 수 있습니다.
언어 측면
두 개의 내장 함수
min,max추가, 최댓값 및 최솟값 계산용내장 함수
clear추가, map 및 slice 비우기용package초기화 순서 업데이트- 모든 패키지를 import 경로를 기준으로 정렬
- 패키지 목록이 빌 때까지 반복 실행
- 목록에서 모든 import 가 초기화된 첫 번째 패키지 찾기
- 해당 패키지 초기화 후 목록에서 삭제
타입 추론 능력 및 정밀도 향상 (주로 제네릭 관련)
for range루프 변수 개선 미리보기 버전 출시, Go 개발자를 10 년 가까이 괴롭힌 문제를 공식적으로 해결, 자세한 내용은 LoopvarExperiment · golang/go Wiki (github.com) 및 Proposal: Less Error-Prone Loop Variable Scoping (googlesource.com) 참조recover의 반환 값이nil이 아님을 보장,panic호출 시 파라미터가nil이면 또 다른panic발생,*runtime.PanicNilError반환. 호환성을 위해 컴파일 시GODEBUG=panicnil=1설정으로panic에nil전달 허용
표준 라이브러리
- 새로운
log/slog라이브러리 추가, 표준 구조화 로그 라이브러리 제공 - 새로운
testing/slogtest라이브러리 추가,slog.Handler구현 검증용 - 새로운
slices라이브러리 추가, 슬라이스 조작을 위한 제네릭 함수 제공 - 새로운
maps라이브러리 추가, map 조작을 위한 제네릭 함수 제공 - 새로운
cmp라이브러리 추가, 순서 있는 타입 비교용
기타
- go1.21.0 은 최소한 Windows 시스템에서 Win10 또는 Windows Server 2016 이상 필요, 이전 버전은 더 이상 지원되지 않음
- go1.21.0 은 최소한 macOS 10.15 Catalina 이상 필요, 이전 버전은 더 이상 지원되지 않음
- 실험적 WebAssembly System Interface 출시, Go 는 WASM 분야에서 지속적으로 탐구 중
- 1.20 에서 실험적이었던 PGO(Profile-guided optimization) (Profile-guided optimization - The Go Programming Language 참조) 가 1.21 버전에서 정식 활성화됨. main 패키지에
default.pgo파일 포함 시 활성화되며, 성능이 2%-7% 향상될 수 있음 - 매우 깊은 런타임 호출 스택을 인쇄할 때, 이전에는 첫 100 개 프레임만 인쇄했으나, 이제는 첫 50 개와 마지막 50 개 프레임을 각각 인쇄
- Unix 플랫폼에서 CGO 호출 성능 최적화, 1-3 마이크로초에서 100-200 나노초로 개선
- 1.21 버전에서 컴파일 속도가 약 6% 향상, 이는 주로 컴파일러 자체가 PGO 를 사용하여 빌드되었기 때문
1.20
첫 릴리스: 2023-02-01
최신 업데이트: go1.20.14 (released 2024-02-06)
go1.20 버전의 자세한 업데이트 로그는 Go 1.20 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.20 - Release Patch 에서 확인할 수 있습니다.
언어 측면
- 슬라이스 타입을 배열로 변환할 때, 이전에는 포인터 배열 역참조
*(*[4byte])(x)로 슬라이스와 동일한 기본 배열과 공유하는 것을 피했으나, 이제는[4]byte(x)로 직접 작성 가능 unsafe에SliceData,String,StringData함수 추가, 슬라이스 및 문자열 값 구축용
표준 라이브러리
- 새로운
crypto/ecdh라이브러리 추가, ECDH(Elliptic Curve Diffie-Hellman, 비대칭 암호화 방법) 지원 - go1.20 은 error 래핑 지원 확장, 하나의 error 가 여러 error 를 래핑할 수 있음
- 새로운
net/http.ResponseContorller추가, 각 handler controls 를 추가하는 더 명확하고 발견하기 쉬운 방법 제공 httputil.ReverseProxy에 Director Hook 을 대체하는 새로운 Rewrite Hook 함수 포함
기타
- go1.20 은 Win7, 8, Server2008 및 Server2012 를 지원하는 마지막 버전, 향후 버전에서는 지원되지 않음
- go1.20 은 macOS 10.13 또는 10.14 를 지원하는 마지막 버전, 향후 버전에서는 지원되지 않음
- 1.18 및 1.19 버전에서 제네릭 등장으로 인해 1.17 대비 컴파일 속도가 저하되었으나, go1.20 에서 컴파일 속도가 약 10% 향상됨
- PGO(Profile-guided optimization) 미리보기 버전 출시, 컴퓨터계의 컴파일러 최적화 기술로 런타임 성능 향상 가능
- go1.20 에서 C toolchains 이 없는 시스템에서 go command 가 cgo 비활성화
- 프로그램 코드 커버리지 파일 수집 지원, Coverage profiling support for integration tests - The Go Programming Language 참조
- GC 개선으로 안정성 향상, 메모리 오버헤드 감소, 전체 CPU 성능 2% 향상
1.19
첫 릴리스: 2022-08-02
최신 업데이트: go1.19.13 (released 2023-09-06)
go1.19 버전의 자세한 업데이트 로그는 Go 1.19 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.19 - Release Patch 에서 확인할 수 있습니다.
중요 변경사항
- 메모리 모델이 c/c++ 와 유사하게 변경, TcMollcate 와 유사
sync/atomic패키지에 더 많은 타입 제공runtime/debug.SetMemoryLimit함수로 Go 메모리에 소프트 제한 지원, 특정 상황에서 메모리 활용 효율 제공- 런타임이 goroutine 스택의 평균 사용량을 기반으로 적절한 크기를 선택하여 초기화, 빈번한 스택 확장/축소 방지
1.18
첫 릴리스: 2022-03-15
최신 업데이트: go1.18.10 (released 2023-01-10)
go1.18 버전의 자세한 업데이트 로그는 Go 1.18 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.18 - Release Patch 에서 확인할 수 있습니다.
언어 측면
- 대대적인 업데이트, 제네릭 지원, 타입 집합 인터페이스, 파라미터 타입 제약
기타
append함수의 확장 동작 최적화- 새로운
debug/buildinfo패키지 추가, 런타임에서 Go 프로그램 빌드 정보 가져오기 가능 - gofmt 가 이제 소스 파일을 병렬로 포맷팅
1.17
첫 릴리스: 2021-08-16
최신 업데이트: go1.17.13 (released 2022-08-01)
go1.17 버전의 자세한 업데이트 로그는 Go 1.17 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.17 - Release Patch 에서 확인할 수 있습니다.
언어 측면
- 새로운
unsafe.Add함수 추가, 포인터 연산 지원 - 새로운
unsafe.Slice함수 추가, 슬라이스의 기본 배열 포인터 가져오기 지원 - 슬라이스가 이제 배열 포인터 타입으로 변환 가능,
[]T => *[N]T, 단 배열 길이가 슬라이스 길이 이하여야 함
1.16
첫 릴리스: 2021-02-16
최신 업데이트: go1.16.15 (released 2022-03-03)
go1.16 버전의 자세한 업데이트 로그는 Go 1.16 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.16 - Release Patch 에서 확인할 수 있습니다.
중요 변경사항
이 버전에는 중요한 문법 변경이 없음, 중요한 변경사항은 다음과 같음
ioutil패키지 폐기//go:embed지시문으로 정적 파일을 프로그램에 임베드 지원- 새로운
io/fs.Fs타입 추가, 파일 시스템에 대한 더 나은 추상화 제공
1.15
첫 릴리스: 2020-08-11
최신 업데이트: go1.15.15 (released 2021-08-05)
go1.15 버전의 자세한 업데이트 로그는 Go 1.15 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.15 - Release Patch 에서 확인할 수 있습니다.
중요 변경사항
이 버전에는 중요한 문법 변경이 없음, 중요한 변경사항은 다음과 같음
작은 객체 할당 효율성 최적화
새로운
time/tzdata패키지 추가, 아래 방식으로 프로그램에 타임존 데이터베이스 임베드 지원 (많은 시스템에 로컬 타임존 데이터 정보가 없기 때문)goimprot _ "time/tzdata"Go 링커에 대한 대대적인 개선으로 리소스 사용 감소 및 코드 견고성 향상
특정 상황에서
unsafe.Pointer를uinptr로 변환 허용
1.14
첫 릴리스: 2020-02-25
최신 업데이트: go1.14.15 (released 2021-02-04)
go1.14 버전의 자세한 업데이트 로그는 Go 1.14 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.14 - Release Patch 에서 확인할 수 있습니다.
언어 측면
메서드 집합 인터페이스 타입 중첩 지원
gotype MyIO interface { io.WriteCloser }
기타
- 오픈 코딩 최적화 도입,
defer호출 오버헤드가 네이티브 호출과 거의 동일하게 감소 - goroutine 간 비동기 선점 지원, 함수 호출이 없는 루프는 더 이상 스케줄러를 영구적으로 블로킹하지 않음
1.13
첫 릴리스: 2019-09-03
최신 업데이트: go1.13.15 (released 2020-08-06)
go1.13 버전의 자세한 업데이트 로그는 Go 1.13 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.13 - Release Patch 에서 확인할 수 있습니다.
언어 측면
더 현대적인 숫자 리터럴 지원
go0b101 // 이진수 0o10 // 팔진수 0x1B // 십육진수가독성 향상을 위한 밑줄 구분자 지원
go10_000허수
i접미사가 이제 이진수, 팔진수, 십육진수 또는 부동소수점 숫자가 될 수 있음
기타
GO111MODULE값이 기본적으로auto로 설정- 개인 의존성 소스 지원을 위한 새로운
GOPRIVATE환경 변수 추가 - 새로운
GOSUMDB환경 변수 추가 defer사용 오버헤드가 30% 감소- 인덱스 경계를 초과할 때
panic이 이제 인덱스 정보 출력 - Go 가 의존성을 다운로드할 때 시맨틱 버전 검증 수행
1.12
첫 릴리스: 2019-02-25
최신 업데이트: go1.12.17 (released 2020-02-12)
go1.12 버전의 자세한 업데이트 로그는 Go 1.12 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.12 - Release Patch 에서 확인할 수 있습니다.
중요 변경사항
이 버전에는 중요한 문법 변경이 없음, 중요한 변경사항은 다음과 같음
- 힙 스캔 성능 대폭 향상
- 런타임이 운영체제에 할당된 메모리를 더 적극적으로 반환
- Go 의존성 다운로드 명령이 이제 동시성 안전하게 사용 가능
1.11
첫 릴리스: 2018-08-24
최신 업데이트: go1.11.13 (released 2019-08-13)
go1.11 버전의 자세한 업데이트 로그는 Go 1.11 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.11 - Release Patch 에서 확인할 수 있습니다.
중요 변경사항
이 버전에는 중요한 문법 변경이 없음, 중요한 변경사항은 다음과 같음
- GoMod 첫 릴리스, 이전 의존성 관리의 혼란 종료
- WASM 실험적 지원 시작
- 런타임이 희소 힙 레이아웃 채택, 힙 크기 제한 제거
1.10
첫 릴리스: 2018-02-16
최신 업데이트: go1.10.8 (released 2019-01-23)
go1.10 버전의 자세한 업데이트 로그는 Go 1.10 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.10 - Release Patch 에서 확인할 수 있습니다.
중요 변경사항
이 버전에는 중요한 문법 변경이 없음, 중요한 변경사항은 다음과 같음
go install명령이 이제 명령줄 도구 설치 및 컴파일 전용, 더 이상 의존성 다운로드에 사용되지 않음go get명령이 이제 소스 의존성 다운로드용- Go 테스트가 이제 테스트 결과를 캐시하며, 실행 전 자동으로
go vet실행 - GC 가 활성화될 때 발생하는 지연 대폭 감소
1.9
첫 릴리스: 2017-08-24
최신 업데이트: go1.9.7 (released 2018-06-05)
go1.9 버전의 자세한 업데이트 로그는 Go 1.9 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.9 - Release Patch 에서 확인할 수 있습니다.
언어 측면
- 타입 별칭 지원
기타
- 병렬 컴파일 지원
- 새로운 동시성 안전
sync.Map추가
1.8
첫 릴리스: 2017-02-16
최신 업데이트: go1.8.7 (released 2018-02-07)
go1.8 버전의 자세한 업데이트 로그는 Go 1.8 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.8 - Release Patch 에서 확인할 수 있습니다.
언어 측면
두 구조체 간 타입 변환 시 구조체 tag 차이 무시
gofunc example() { type T1 struct { X int `json:"foo"` } type T2 struct { X int `json:"bar"` } var v1 T1 var v2 T2 v1 = T1(v2) // now legal }
기타
- GC 로 인한 일시 중지 시간이 10 마이크로초 이하로 감소, 대부분의 경우 100 마이크로초 이하 (거의 모든 버전에서 Go 가 GC 개선을 위해 노력하고 있음을 알 수 있음)
defer호출 오버헤드가 약 절반 감소- Go 가 C 를 호출하는 오버헤드가 약 절반 감소
- map 의 동시성 사용 감지 최적화
1.7
첫 릴리스: 2016-08-15
최신 업데이트: go1.7.6 (released 2017-05-23)
go1.7 버전의 자세한 업데이트 로그는 Go 1.7 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.7 - Release Patch 에서 확인할 수 있습니다.
중요 변경사항
golang.org/x/net/context를 표준 라이브러리에 추가- 1.6 대비 GC 시간 대폭 단축
testing패키지가 서브 테스트 지원
1.6
첫 릴리스: 2016-02-17
최신 업데이트: go1.6.4 (released 2016-12-01)
go1.6 버전의 자세한 업데이트 로그는 Go 1.6 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.6 - Release Patch 에서 확인할 수 있습니다.
중요 변경사항
이 버전에는 문법 변경이 없음, 중요한 변경사항은 다음과 같음
- map 에 대한 동시성 사용 감지, map 이 동시성으로 사용 중인 것이 감지되면
fatal발생 panic발생 시 실행 중인 goroutine 의 호출 스택만 인쇄- HTTP/2 지원
1.5
첫 릴리스: 2015-08-19
최신 업데이트: go1.5.4 (released 2016-04-12)
go1.5 버전의 자세한 업데이트 로그는 Go 1.5 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.5 - Release Patch 에서 확인할 수 있습니다.
언어 측면
map 리터럴의 키 초기화 시 요소 타입 생략 허용
gom := map[Point]string{ Point{29.935523, 52.891566}: "Persepolis", Point{-25.352594, 131.034361}: "Uluru", Point{37.422455, -122.084306}: "Googleplex", } // 타입 생략 m := map[Point]string{ {29.935523, 52.891566}: "Persepolis", {-25.352594, 131.034361}: "Uluru", {37.422455, -122.084306}: "Googleplex", }
기타
- 런타임 및 컴파일러가 완전히 Go 로 재작성, 더 이상 C 코드 포함 안 함
- 동시성 가비지 컬렉션 지원, 프로그램 일시 중지 시간 대폭 감소
GOMAXPROCS기본값이 머신의 논리 코어 수로 변경internal패키지의 시맨틱이 모든 곳에 적용 가능, 더 이상 Go 소스 패키지에만 국한되지 않음- vendor 의존성 관리 실험적 지원 (의존성 관리 부분에 대한 작업 시작)
1.4
첫 릴리스: 2014-12-10
최신 업데이트: go1.4.3 (released 2015-09-22)
go1.4 버전의 자세한 업데이트 로그는 Go 1.4 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.4 - Release Patch 에서 확인할 수 있습니다.
언어 측면
for range루프가 하나의 이터레이션 파라미터를 가질 수 있음for i := range x { ... }하지만 하나도 없는 것은 허용되지 않음
이중 참조 타입의 메서드를 호출할 때 자동으로 역참조하지 않음
gotype T int func (T) M() {} var x **T // 허용되지 않음 x.M()
기타
- 1.4 이전에는 Go 런타임이 C 로 작성되었으나, 이제는 모두 Go 로 완성됨
- 패키지 이름을
internal로 변경하여 해당 패키지의 모든 내용이 비공개이며 내보낼 수 없음을 나타낼 수 있음
1.3
첫 릴리스: 2014-06-18
최신 업데이트: go1.3.3 (released 2014-09-30)
go1.3 버전의 자세한 업데이트 로그는 Go 1.3 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.3 - Release Patch 에서 확인할 수 있습니다.
중요 변경사항
이 버전에는 문법 변경이 없음, 중요한 변경사항은 다음과 같음
- goroutine 스택 모델이 세그먼트 스택에서 연속 스택으로 변경, 스택 확장 성능 향상
- 가비지 컬렉터의 포인터 판별 정밀도 향상
- 작은 용량 map 에서 이터레이션 시 순서도 예측 불가능해짐
- 런타임 측면의 개선으로 현재 버전의 Go 프로그램 성능이 상당히 향상됨
1.2
첫 릴리스: 2013-12-01
최신 업데이트: go1.2.2 (released 2014-05-05)
go1.2 버전의 자세한 업데이트 로그는 Go 1.2 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.2 - Release Patch 에서 확인할 수 있습니다.
언어 측면
nil값인 변수에 대한 연산이panic발생슬라이스를 분할할 때 세 번째 파라미터로 분할된 슬라이스 용량 제한 가능, 더 안전하게 슬라이스 사용
govar array [10]int slice := array[2:4:4]
기타
goroutine 스택의 최소 메모리 크기가 4KB 에서 8KB 로 증가
최대 스레드 수가 10000 으로 제한됨
장기간 실행되는 goroutine 이 함수 호출 시 선점됨 (협력적 선점 첫 도입)
1.1
첫 릴리스: 2013-05-13
최신 업데이트: go1.1.2 (released 2013-08-13)
go1.1 버전의 자세한 업데이트 로그는 Go 1.1 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.1 - Release Patch 에서 확인할 수 있습니다.
언어 측면
- 숫자를 0 으로 나누기 전
panic발생, 1.1 에서는 컴파일조차 통과하지 못함 - 메서드가 값으로 존재할 수 있음
- 종료문 개념 도입, 함수 반환 규칙이 더 완화됨, 종료문의 정의 - go-sepc
성능 측면
- go1.1 도구로 컴파일된 Go 프로그램 성능이 약 30%-40% 향상
기타:
- 64 비트 머신에서 힙 메모리 최댓값이 수십 GB 로 증가
- 교차 컴파일 시 기본적으로 cgo 비활성화
1.0
첫 릴리스: 2012-03-28
go1.0 버전의 자세한 업데이트 로그는 Go 1.0 Release Notes 에서 확인할 수 있으며, 유지보수 기간 동안 릴리스된 모든 패치 버전은 Go1.0 - Release Patch 에서 확인할 수 있습니다.
언어 측면
미리보기 버전과 비교하여 문법에 다음과 같은 내용 추가
새로운 내장
append함수 추가, 슬라이스에 요소 추가용새로운 내장
close함수 추가, 파이프 닫기용복합 시맨틱, 슬라이스, map, 구조체 리터럴 요소 초기화 시 타입 생략 가능
go// 타입 선언 holiday1 := []Date{ Date{"Feb", 14}, Date{"Nov", 11}, Date{"Dec", 25}, } // 타입 생략 holiday2 := []Date{ {"Feb", 14}, {"Nov", 11}, {"Dec", 25}, }init함수에서 사용된 goroutine 이 바로 시작되며, 더 이상 모든 패키지가 초기화完毕일 때까지 기다릴 필요 없음새로운
rune타입 추가, UTF-8 문자 표시새로운
error내장 인터페이스 추가, 오류 타입 표시새로운
delete내장 함수 추가, map 에서 키 - 값 쌍 삭제용for range로 map 이터레이션 시 순서가 예측 불가능해짐여러 변수에 동시 할당 지원
a := 1 b := 2 a, b = 3, 4변수 숨김 문제: 함수에 이름 있는 반환 값이 있을 때 반환 값이 숨겨지면
return문에 반환 값이 있어야 함, 그렇지 않으면 컴파일 오류gofunc Bug() (i, j, k int) { for i = 0; i < 5; i++ { for j := 0; j < 5; j++ { // j 재선언 k += i * j if k > 100 { return // 거부됨: j 가 여기서 숨겨짐 } } } return // OK: j 가 여기서 숨겨지지 않음 }비공개 필드가 있는 구조체 값 복사 허용
구조체와 슬라이스가 모두 비교 가능한 요소로 구성된 경우 map 의 키로 사용할 수 있음, 동시에 함수와 map 의 비교 가능성 제거
언어 측면 외에도 go1.0 은 패키지 구성 방식, 표준 라이브러리 및 명령줄 측면에서 미리보기 버전과 비교하여 매우 큰 변화가 있었으나, 내용이 너무 많아 여기서는 더 이상 자세히 설명하지 않겠습니다. 관심이 있으시면 공식 웹사이트에서 직접 확인하세요.
pre
go1 이 정식 릴리스되기 전의 모든 버전은 미리보기 버전으로 불리며, 이러한 미리보기 버전에 대해 공식은 매주 스냅샷 버전을 릴리스했습니다. 그 중 중요한 버전은 다음과 같습니다.
- r60(2011-09-07), else 블록에 이제 괄호가 있어야 함을 규정
- r59(2011-08-01), 새로운 구조체 tag方案设计
- r58(2011-06-29), goto 남용으로 인한 메모리 초기화되지 않은 문제 수정, gui, exec 패키지 추가
- r57(2011-05-03), 짧은 변수 다중 할당 문법 지원, http, reflect 패키지 재설계, gotest 를 shell 스크립트가 아닌 Go 프로그램으로 변경
- r56(2011-03-07), 첫 번째 안정 버전
미리보기 버전 개발은 2009 년 12 월 09 일에 시작되어 go1 이 2012 년 3 월 28 일에 정식 릴리스된 후 중단되었으며, 약 3 년 동안 지속되었습니다. 이후로는 매주 스냅샷 버전을 더 이상 기록하지 않습니다. 이러한 주요 버전 정보는 Pre-Go 1 Release History 에서 확인하세요. 모든 미리보기 버전의 매주 스냅샷 버전 정보는 Weekly Snapshot History 에서 확인하세요.
