[Go 공식문서 한국어 정리] ②38. Go 프로그래밍 언어 사양
Go 프로그래밍 언어 사양 (The Go Programming Language Specification)
https://go.dev/ref/spec
Go 언어의 공식 참조 문서로, 언어 버전 go1.26을 기준으로 작성되었습니다. 이 문서는 Go 컴파일러와 가상 머신의 구현을 위한 최종 기준이며, 모든 언어 기능의 정확한 정의를 담고 있습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① 서론
Go는 시스템 프로그래밍을 고려하여 설계된 강력 타입(strongly typed) 바이네어를 제공하는 일반 용도 언어입니다. 가비지 컬렉션(garbage-collected)을 지원하며 동시적 프로그래밍을 위한 명시적인 지원을 가지고 있습니다. 프로그램은 패키지로 구성되며, 패키지의 특성을 통해 효율적인 의존성 관리가 가능합니다.
② 핵심 개념
1. 소스 코드 표현: UTF-8로 인코딩된 Unicode 텍스트이며, NUL 문자(U+0000)은 금지될 수 있습니다.
2. 어희 요소(Lexical Elements): 식별자(Identifiers), 키워드(Keywords), 연산자/구두점, 리터럴이 있습니다.
3. 세미콜론 삽입: 대부분의 세미콜론은 생략 가능합니다. 특정 토큰(식별자, 리터럴, break/continue/fallthrough/return, ++/--/),)/]/})이 하나의 라인 끝에 오면 자동으로 세미콜론이 삽입됩니다.
4. 키워드: break, default, func, interface, select, case, defer, go, map, struct, chan, else, goto, package, switch, const, fallthrough, if, range, type, continue, for, import, return, var 등 25개가 예약되어 있습니다.
③ 주요 내용 상세
타입 시스템
- Boolean: bool (true/false)
- Numeric: uint8~64, int8~64, float32/64, complex64/128, byte(uint8), rune(int32), uint, int, uintptr
- String: 불변(immutable) 바이트 시퀀스
- Array: 고정 길이의 동일한 타입 요소 수열
- Slice: 배열의 연속된 세그먼트에 대한 기사서로, len/cap을 가짖
- Struct: 명명된 필드의 시퀀스. 임베디드 필드로 메서드를 프로모트할 수 있습니다.
- Pointer: *T 형태로 기준 타입 T에 대한 참조를 가징니다.
- Function: func 시그니처로 정의되며, 변인수(variadic: ...T)를 지원합니다.
- Interface: 타입 집합(type set)을 정의하며, any는 빈 인터페이스의 별칭입니다.
- Map: map[KeyType]ElementType로 정의되며, 키는 비교가능해야 합니다.
- Channel: chan T(양방향), chan<- T(송신), <-chan T(수신)으로 동시성 통신을 지원합니다.
인터페이스와 제네릭
- 기본 인터페이스(basic interface): 메서드 목록으로 타입 집합을 정의합니다.
- 임베디드 인터페이스(embedded interface): 다른 인터페이스를 임베디드해 타입 집합의 교집합을 생성합니다.
- 일반 인터페이스(general interface): 타입 터음(~T, T1|T2)을 포함할 수 있으며, 이는 제네릭 제약조건(type constraint)으로만 사용될 수 있습니다.
할당가능성(Assignability)
값 x(타입 V)이 변수(타입 T)에 할당되려면 다음 조건 중 하나를 만족해야 합니다:
1. V와 T이 동일한 타입
2. 동일한 기본 타입을 가지며 하나 이상이 명명된 타입이 아님
3. T가 인터페이스이고 x가 T를 구현함
4. x가 nil이고 T가 포인터/함수/슬라이스/맵/채널/인터페이스
5. x가 타입없는 상수이고 T의 값으로 표현가능
④ 실전 활용
- 컴파일러 구현자나 언어 도구 개발자는 이 사양을 기준으로 구현해야 합니다.
- 인터페이스의 타입 집합(type set)은 Go 1.18의 제네릭을 이해하는 핵심 개념입니다.
- 임베디드 필드와 임베디드 인터페이스는 코드 재사용과 조합을 위한 강력한 기능입니다.
- 변수의 시작 타입(static type)과 동적 타입(dynamic type)의 차이를 이해하면 인터페이스의 동작 원리를 정확히 알 수 있습니다.
⑤ 정리
Go 언어 사양은 모든 Go 프로그래밍의 최종 참조 문서입니다. 타입 시스템, 인터페이스의 타입 집합, 제네릭 제약조건, 할당 가능성을 정확히 알면 더 운 높은 형태의 코드를 작성할 수 있습니다. 새로운 언어 기능이 추가될 때마다 이 사양을 참조하는 것이 범용 구현을 회피하는 방법입니다.
#Go #Golang #Specification #사양 #언어사양 #타입시스템 #인터페이스 #공식문서

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30