고 (프로그래밍 언어)
1. 개요
1. 개요
고는 구글에서 개발한 정적 타입의 컴파일 언어이다. 로버트 그리즈머, 롭 파이크, 켄 톰슨이 설계에 참여했으며, 2009년 11월 10일에 처음 공개되었다. 이 언어는 C++의 복잡성과 자바의 느린 컴파일 속도 같은 기존 언어의 단점을 해결하고자 만들어졌다.
고의 주요 설계 목표는 간결한 문법, 효율적인 컴파일, 쉬운 동시성 프로그래밍, 그리고 효과적인 메모리 관리를 통한 안정성 확보이다. 이 언어는 특히 시스템 프로그래밍, 네트워크 서버, 클라우드 인프라, 그리고 명령줄 도구 개발에 널리 사용된다. 고는 명령형 프로그래밍과 구조적 프로그래밍 패러다임을 따르며, 언어 수준에서 동시성 프로그래밍을 강력히 지원하는 것이 큰 특징이다.
2. 특징
2. 특징
고 언어는 구글의 로버트 그리즈머, 롭 파이크, 켄 톰슨이 설계한 정적 타입의 컴파일 언어이다. 이 언어는 C++와 같은 기존 언어의 복잡성을 줄이면서도 현대적인 하드웨어에서 효율적으로 실행되도록 만들어졌다. 주요 목표는 간결한 문법, 효율적인 컴파일, 쉬운 동시성 프로그래밍 지원, 그리고 견고한 표준 라이브러리를 제공하는 데 있다.
고의 가장 두드러진 특징은 언어 수준에서 지원하는 간단하면서도 강력한 동시성 모델이다. 고루틴이라는 경량 스레드를 사용하여 함수를 동시에 실행할 수 있으며, 채널을 통해 고루틴 간에 안전하게 데이터를 교환한다. 이 모델은 전통적인 스레드와 락 기반 프로그래밍보다 훨씬 이해하고 사용하기 쉽다.
또한 고는 빠른 컴파일 속도와 간결한 문법을 지향한다. 의존성 분석을 통한 빠른 컴파일, 불필요한 기능(예: 상속 계층)의 제거, 그리고 강제적인 코드 포맷팅 도구를 통해 코드의 명확성과 유지보수성을 높였다. 가비지 컬렉션을 제공하여 메모리 관리를 단순화하면서도 네이티브 코드로 컴파일되어 C 언어에 준하는 성능을 보인다.
이 언어는 시스템 프로그래밍, 특히 대규모 네트워크 서버와 클라우드 인프라, 분산 시스템 개발에 널리 사용된다. 크로스 플랫폼 지원이 뛰어나 리눅스, macOS, 윈도우 등 다양한 운영체제와 프로세서 아키텍처에서 동일한 코드로 동작한다.
3. 문법
3. 문법
3.1. 변수 선언
3.1. 변수 선언
고 언어에서 변수는 값을 저장하는 메모리 공간에 이름을 붙인 것이다. 변수를 사용하려면 먼저 변수를 선언해야 하며, 고는 명시적인 변수 선언을 요구하는 정적 타입 언어이다. 변수 선언은 var 키워드를 사용하거나 짧은 변수 선언 구문을 통해 이루어진다.
var 키워드를 사용한 선언은 var 변수명 자료형 형식으로, 변수의 이름과 타입을 명시한다. 예를 들어 var count int는 정수형 변수 count를 선언한다. 선언과 동시에 초기값을 할당할 수도 있으며, 이 경우 자료형을 생략할 수 있다. 예를 들어 var message = "Hello"라고 선언하면 컴파일러가 문자열 타입으로 추론한다. 여러 변수를 한 번에 선언할 때는 괄호를 사용하여 그룹화하는 것이 일반적이다.
함수 내부에서는 더 간결한 짧은 변수 선언 구문을 주로 사용한다. 이는 := 연산자를 사용하여 변수명 := 값 형식으로 작성한다. 예를 들어 name := "Go"는 문자열 변수 name을 선언하고 초기값을 할당한다. 이 구문은 자료형 추론을 통해 변수의 타입을 자동으로 결정하므로 타입을 명시할 필요가 없다. 그러나 이 방식은 함수 내부에서만 사용 가능하며, 패키지 수준의 전역 변수 선언에는 var 키워드를 사용해야 한다.
고는 사용하지 않는 변수를 허용하지 않는다. 선언된 변수는 반드시 사용되어야 하며, 그렇지 않으면 컴파일 에러가 발생한다. 이는 컴파일 언어로서의 엄격함을 보여주는 특징 중 하나이다. 또한, 변수의 스코프는 선언된 블록 내부로 제한되며, 패키지 수준에서 선언된 변수는 해당 패키지 전체에서 접근 가능하다.
3.2. 자료형
3.2. 자료형
고 언어는 정적 타입 언어로, 변수나 표현식의 자료형이 컴파일 시간에 결정된다. 기본 자료형은 정수형, 부동소수점형, 불리언형, 문자열형이 있다. 정수형에는 int, int8, int16, int32, int64와 그에 상응하는 부호 없는 uint 계열이 있으며, 부동소수점형에는 float32와 float64가 있다. 문자열은 내부적으로 바이트 시퀀스로 표현되며, 한번 생성되면 내용을 변경할 수 없는 불변의 성질을 가진다.
복합 자료형으로는 배열, 슬라이스, 맵, 구조체가 있다. 배열은 고정된 길이를 가지는 반면, 슬라이스는 동적으로 크기가 변할 수 있는 배열의 일부를 가리키는 참조 타입이다. 맵은 연관 배열로, 키와 값을 매핑한다. 구조체는 서로 다른 타입의 필드들을 하나의 타입으로 묶을 수 있다.
그 외에도 포인터, 함수, 인터페이스, 채널과 같은 특수한 타입이 존재한다. 함수는 일급 객체로 취급되어 변수에 할당하거나 다른 함수의 인자 및 반환값으로 사용될 수 있다. 인터페이스는 메서드의 집합을 정의하여 다형성을 구현하는 데 사용된다. 채널은 고루틴 간의 통신을 위한 타입이다.
고 언어에는 타입 추론 기능이 있어, 변수 선언 시 var 키워드와 함께 자료형을 생략하고 := 연산자를 사용하면 초기화값으로부터 자료형을 자동으로 추론한다. 또한 사용자 정의 타입을 생성하기 위해 type 키워드를 제공한다.
3.3. 제어 구조
3.3. 제어 구조
고 언어의 제어 구조는 C 언어와 유사하지만, 괄호를 생략하고 강제적인 들여쓰기를 요구하지 않는 등 더 간결한 문법을 가진다. 기본적인 제어 흐름을 위한 if, for, switch 문이 있으며, while 문은 for 문으로 대체된다. 이러한 구조들은 코드 블록을 중괄호({})로 감싸야 한다.
if 문은 조건을 평가하고, 선택적으로 else 절을 가질 수 있다. 조건식 주변에 괄호는 필요하지 않다. for 문은 고 언어의 유일한 루프 구조로, 전통적인 for 루프, 조건만 있는 while 스타일 루프, 그리고 컬렉션을 순회하는 range 절과 함께 사용된다. switch 문은 다른 언어의 switch보다 더 유연하며, 표현식의 타입과 값을 비교할 수 있고, 각 케이스는 자동으로 종료되므로 break 문이 필요하지 않다.
고 언어는 goto 문을 지원하지만, 일반적으로 권장되지 않는다. 또한 루프를 중단하는 break와 현재 반복을 건너뛰는 continue 문을 제공한다. 이러한 제어 구조들은 동시성을 위한 고루틴 및 채널과 함께 사용되어 복잡한 프로그램 흐름을 명확하고 효율적으로 구성할 수 있게 한다.
3.4. 함수
3.4. 함수
고 언어에서 함수는 func 키워드를 사용하여 선언한다. 함수는 이름, 매개변수 목록, 반환 타입 목록, 그리고 함수 본문으로 구성된다. 매개변수와 반환 값은 타입을 명시해야 하며, 여러 값을 반환할 수 있는 것이 특징이다. 이는 에러 처리와 같은 상황에서 유용하게 활용된다.
함수의 기본 구조는 func 함수명(매개변수) 반환타입 { 본문 } 이다. 반환 값이 없을 경우 반환 타입을 생략할 수 있다. 매개변수나 반환 값이 여러 개일 경우 괄호로 묶어서 나열한다. 예를 들어, func swap(x, y string) (string, string) { return y, x } 와 같이 두 개의 문자열을 받아 서로 바꿔 반환하는 함수를 정의할 수 있다.
고 언어는 일급 함수를 지원하며, 함수를 변수에 할당하거나 다른 함수의 인자로 전달하고 반환 값으로 사용할 수 있다. 또한 익명 함수를 정의하여 즉시 실행하거나 클로저를 생성할 수 있다. 이러한 기능은 고차 함수를 구현하는 데 필수적이다.
함수 내에서 지역 변수를 선언할 수 있으며, 함수의 스코프 규칙에 따라 접근이 제한된다. 패키지 수준에서 선언된 함수는 해당 패키지 내에서 접근 제어 지시자(대문자로 시작하면 공개, 소문자로 시작하면 비공개)에 따라 외부로 노출될 수 있다.
3.5. 패키지와 모듈
3.5. 패키지와 모듈
고 언어에서 패키지는 코드를 구성하고 재사용하는 기본 단위이다. 모든 고 소스 코드는 패키지에 속하며, 패키지 이름은 해당 디렉토리의 이름과 일치한다. package 키워드로 선언하며, 실행 가능한 프로그램은 main이라는 이름의 패키지를 진입점으로 사용한다. 패키지는 하나 이상의 .go 파일로 구성되며, 같은 디렉토리 내의 파일들은 모두 동일한 패키지에 속해야 한다.
패키지 외부로 공개하려는 함수, 변수, 상수, 구조체, 인터페이스 등의 식별자는 첫 글자를 대문자로 작성해야 한다. 이는 공개 식별자로, 다른 패키지에서 임포트하여 사용할 수 있다. 반면 소문자로 시작하는 식별자는 패키지 내부에서만 사용 가능한 비공개 식별자가 된다. 이는 캡슐화를 위한 간단한 메커니즘을 제공한다.
외부 패키지를 사용하기 위해서는 import 문을 사용한다. 표준 라이브러리에 속한 패키지나 외부에서 다운로드한 모듈의 패키지를 임포트할 수 있다. 임포트 경로는 패키지가 위치한 디렉토리의 경로를 문자열로 지정한다. 고 언어는 모듈 시스템을 통해 패키지의 의존성 관리를 지원한다. go.mod 파일을 프로젝트 루트에 생성하여 모듈을 정의하고, 필요한 외부 패키지의 버전을 명시할 수 있다.
패키지 초기화 함수인 init 함수를 정의할 수 있다. 이 함수는 패키지가 임포트될 때, main 함수 실행 전에 자동으로 호출되어 패키지 수준 변수의 초기화나 기타 설정 작업을 수행한다. 하나의 패키지 내 여러 파일에 여러 개의 init 함수를 정의할 수 있으며, 컴파일러가 이들의 실행 순서를 보장한다.
4. 주요 기능
4. 주요 기능
4.1. 동시성 (고루틴, 채널)
4.1. 동시성 (고루틴, 채널)
고 언어는 동시성 프로그래밍을 언어 설계의 핵심으로 삼고 있으며, 이를 위해 고루틴과 채널이라는 두 가지 기본 요소를 제공한다. 이는 전통적인 스레드 기반 접근 방식보다 훨씬 가볍고 효율적인 동시성 모델을 구현한다.
고루틴은 고 언어의 경량 실행 스레드이다. 운영체제의 스레드보다 훨씬 적은 메모리를 사용하며, 고 런타임에 의해 스케줄링된다. go 키워드를 함수 호출 앞에 붙여서 간단히 생성할 수 있으며, 수천, 수만 개의 고루틴을 동시에 실행하는 것이 가능하다. 이는 네트워크 서버나 분산 시스템과 같이 많은 수의 연결을 동시에 처리해야 하는 프로그램에 매우 적합하다.
고루틴 간의 통신과 동기화는 주로 채널을 통해 이루어진다. 채널은 파이프와 같은 구조로, 한 고루틴이 채널에 데이터를 보내고 다른 고루틴이 이를 받아 처리하는 방식으로 동작한다. 채널은 기본적으로 블로킹 방식으로 작동하여, 데이터를 보내거나 받을 준비가 될 때까지 고루틴의 실행을 일시 중지시킨다. 이는 뮤텍스나 세마포어와 같은 명시적인 락을 사용하지 않고도 안전한 데이터 교환을 가능하게 한다.
고의 동시성 모델은 "공유 메모리를 통한 통신이 아닌, 통신을 통해 메모리를 공유하라"는 철학을 따른다. 이는 고루틴이 데이터를 직접 공유하기보다는 채널을 통해 소유권을 이전하는 방식을 장려함으로써, 경쟁 상태나 데드락과 같은 전통적인 동시성 문제의 발생 가능성을 크게 줄인다. 이러한 설계는 클라우드 인프라와 같은 복잡한 동시성 시스템을 구축하는 데 강력한 기반을 제공한다.
4.2. 인터페이스
4.2. 인터페이스
고 언어의 인터페이스는 메서드 시그니처의 집합을 정의하는 타입이다. 다른 언어의 인터페이스와 달리, 고의 인터페이스는 암시적으로 충족된다. 즉, 타입이 인터페이스가 요구하는 모든 메서드를 구현하기만 하면, 별도의 선언 없이도 해당 인터페이스 타입으로 사용될 수 있다. 이는 덕 타이핑과 유사한 개념으로, 타입의 계층 구조를 강제하지 않으면서도 다형성을 제공한다.
인터페이스는 interface 키워드로 정의한다. 가장 널리 사용되는 인터페이스 중 하나는 표준 라이브러리에 정의된 error 인터페이스로, Error() string이라는 단 하나의 메서드를 요구한다. 어떤 타입이든 이 메서드를 구현하면 자동으로 error 타입이 되어 함수의 반환 값으로 사용될 수 있다. 빈 인터페이스인 interface{}는 메서드를 전혀 요구하지 않으므로 모든 타입을 담을 수 있어, 제네릭 프로그래밍이 도입되기 전에는 유연한 함수나 컬렉션을 작성하는 데 활용되었다.
인터페이스는 특히 동시성 프로그래밍과 표준 라이브러리 설계에서 강력한 힘을 발휘한다. 예를 들어, 입출력 작업을 위한 io.Reader와 io.Writer 인터페이스는 파일, 네트워크 연결, 메모리 버퍼 등 다양한 소스와 대상에 대해 일관된 API를 제공한다. 이를 통해 데이터 처리 파이프라인을 쉽게 구성할 수 있으며, 테스트 시 실제 구현 대신 모의 객체를 사용하는 것도 용이해진다.
4.3. 포인터
4.3. 포인터
고 언어는 C 언어와 유사하게 포인터를 지원한다. 포인터는 메모리 주소를 저장하는 변수로, 변수나 데이터 구조의 메모리 위치를 직접 참조할 수 있게 한다. 고의 포인터는 C 언어의 포인터와 기본 개념은 같지만, 메모리 안전성을 높이기 위해 몇 가지 제약과 단순화를 도입했다.
고에서 포인터는 * 연산자를 사용하여 선언한다. 예를 들어 var p *int는 정수형 포인터 변수 p를 선언한다. & 연산자는 변수의 주소를 가져오고, * 연산자는 포인터가 가리키는 메모리 위치의 값을 역참조한다. 고는 포인터 연산을 허용하지 않는다. 즉, C 언어처럼 포인터에 산술 연산(예: p++)을 수행하여 메모리를 임의로 이동할 수 없으며, 이는 버퍼 오버플로와 같은 메모리 관련 오류를 방지하는 데 도움이 된다.
고의 포인터는 가비지 컬렉션과 밀접한 관계가 있다. 힙에 할당된 객체는 포인터를 통해 참조되며, 더 이상 사용되지 않을 때 가비지 컬렉터에 의해 자동으로 회수된다. 또한 고에는 널 포인터가 존재하지만, 언어 설계상 널 포인터 역참조를 방지하려는 노력이 있으며, 에러 처리를 위해 다중 반환 값과 함께 에러 상태를 명시적으로 반환하는 방식을 더 권장한다.
포인터는 주로 구조체와 같은 큰 데이터 구조를 함수에 효율적으로 전달할 때, 또는 함수 내부에서 호출자의 데이터를 수정해야 할 때 사용된다. 이를 통해 값에 의한 복사 오버헤드를 줄이고 메모리 사용을 최적화할 수 있다. 고의 포인터 시스템은 C 언어의 강력함과 유연성을 일부 유지하면서도, 언어 전체의 목표인 간결함과 안전성 사이의 균형을 잘 보여준다.
4.4. 가비지 컬렉션
4.4. 가비지 컬렉션
고 언어의 가비지 컬렉션은 프로그래머가 명시적으로 메모리를 관리할 필요 없이 자동으로 사용하지 않는 힙 메모리를 회수하는 기능이다. 이는 C 언어나 C++와 같은 언어에서 수동으로 메모리를 할당하고 해제해야 하는 번거로움을 덜어주며, 메모리 누수와 댕글링 포인터와 같은 일반적인 오류를 방지하는 데 도움이 된다. 고의 가비지 컬렉터는 언어의 핵심 런타임에 통합되어 있으며, 컴파일된 실행 파일에 포함된다.
고의 가비지 컬렉터는 주로 동시성 마크-스윕 방식을 사용한다고 알려져 있다. 이 방식은 프로그램 실행을 완전히 멈추지 않고(스톱 더 월드 현상을 최소화하며), 고루틴과 병렬로 동작하여 가비지 컬렉션으로 인한 프로그램 지연을 줄이도록 설계되었다. 특히 낮은 지연 시간을 목표로 하여, 웹 서버나 네트워크 서비스와 같이 실시간 응답이 중요한 애플리케이션에 적합하다.
가비지 컬렉션의 대상은 주로 포인터를 통해 참조되는 구조체나 슬라이스, 맵과 같은 동적으로 할당된 데이터이다. 스택에 할당된 지역 변수 등은 일반적으로 가비지 컬렉션의 대상이 되지 않는다. 개발자는 runtime.GC() 함수를 호출하여 가비지 컬렉션을 강제로 실행할 수 있지만, 대부분의 경우 런타임이 자동으로 최적의 시점에 수집을 수행하므로 직접 개입할 필요는 거의 없다.
이 자동 메모리 관리 기능은 생산성을 높이는 동시에 메모리 안전성을 보장하는 고 언어의 주요 특징 중 하나이다. 이를 통해 개발자는 복잡한 메모리 관리보다는 비즈니스 로직과 동시성 처리와 같은 애플리케이션의 본질적인 문제 해결에 더 집중할 수 있게 된다.
5. 표준 라이브러리
5. 표준 라이브러리
고 언어의 표준 라이브러리는 풍부하고 실용적으로 설계되어, 외부 의존성을 최소화하면서도 강력한 애플리케이션을 구축할 수 있는 기반을 제공한다. 이 라이브러리는 언어와 함께 배포되며, 네트워크 프로그래밍, 파일 시스템 조작, 암호화, 텍스트 처리, 테스트 등 광범위한 기능을 포괄한다. 특히 HTTP 서버와 클라이언트 구현, JSON 및 XML 같은 데이터 형식의 인코딩과 디코딩을 위한 포괄적인 패키지가 포함되어 있어 웹 서비스 개발에 매우 효과적이다.
표준 라이브러리의 구조는 명확하고 일관된 설계 철학을 반영한다. 주요 패키지로는 입출력을 담당하는 io와 bufio, 네트워크 프로그래밍의 핵심인 net과 net/http, 동시성을 지원하는 sync와 atomic, 그리고 암호학 관련 기능을 제공하는 crypto 계열 패키지들이 있다. 또한 fmt 패키지는 형식화된 입출력을, strings와 strconv 패키지는 문자열 조작을 담당한다. 이처럼 잘 정리된 패키지 구조는 개발자가 필요한 기능을 쉽게 찾고 활용할 수 있게 한다.
고의 표준 라이브러리는 실용성과 성능에 중점을 두고 개발되었다. 대표적인 예로 net/http 패키지는 단 몇 줄의 코드로 고성능 HTTP 서버를 구현할 수 있게 하며, testing 패키지는 내장된 단위 테스트 및 벤치마크 도구를 제공하여 코드 품질 관리에 기여한다. 컨테이너화된 마이크로서비스나 클라우드 네이티브 애플리케이션을 구축할 때 이러한 표준 라이브러리의 효율성은 큰 장점으로 작용한다.
표준 라이브러리의 품질과 완성도는 고 언어 생태계의 강력한 초석이 되었다. 공식 문서가 상세하고 예제가 풍부하여 학습이 용이하며, 대부분의 일반적인 개발 요구사항을 표준 패키지만으로 충족시킬 수 있다. 이는 프로젝트의 복잡성을 줄이고 유지보수성을 높이는 데 기여하며, 고가 시스템 프로그래밍과 네트워크 서버 개발에 널리 채택되는 이유 중 하나이다.
6. 개발 환경
6. 개발 환경
6.1. 설치
6.1. 설치
고의 개발 환경을 구성하기 위해서는 먼저 공식 웹사이트에서 설치 프로그램을 내려받아 설치한다. 주요 운영체제인 윈도우, macOS, 리눅스를 모두 지원하며, BSD 계열 운영체제나 솔라리스와 같은 다른 유닉스 계열 시스템에서도 사용할 수 있다. 설치 과정은 시스템에 맞는 바이너리 배포판이나 소스 코드를 이용해 진행된다.
설치가 완료되면 go 명령어를 통해 다양한 작업을 수행할 수 있다. go version 명령으로 설치된 고 (프로그래밍 언어)의 버전을 확인할 수 있으며, go run 명령은 소스 코드 파일을 컴파일하고 바로 실행한다. 프로젝트를 빌드할 때는 go build 명령을, 외부 패키지를 다운로드하고 관리할 때는 go get 명령을 주로 사용한다.
또한, 통합 개발 환경이나 텍스트 에디터에서 고 언어를 지원하기 위해 별도의 플러그인이나 확장 기능을 설치할 수 있다. 대표적인 코드 편집기인 비주얼 스튜디오 코드에는 공식 고 확장 도구가 제공되어, 코드 자동 완성, 디버깅, 서식 지정 등의 기능을 활용할 수 있다.
6.2. 도구 (go 명령어)
6.2. 도구 (go 명령어)
7. 사용 사례
7. 사용 사례
고는 시스템 프로그래밍, 네트워크 서버, 클라우드 인프라, 명령줄 도구 등 다양한 분야에서 널리 사용된다. 특히 네트워크 서버와 마이크로서비스 아키텍처 구축에 적합한 언어로 평가받으며, Docker와 Kubernetes와 같은 현대 클라우드 컴퓨팅 생태계의 핵심 도구들이 고로 작성되었다는 점이 대표적인 사용 사례이다. 이는 고의 뛰어난 동시성 처리 능력과 간결한 문법이 대규모 분산 시스템 개발에 효과적임을 보여준다.
고는 또한 명령줄 인터페이스 도구 개발에 많이 활용된다. 빠른 컴파일 속도와 단일 실행 파일로 배포가 가능한 특징 덕분에, 크로스 플랫폼 CLI 도구를 만들기에 매우 적합하다. Terraform과 같은 인프라 관리 도구의 백엔드 엔진이나, Prometheus와 같은 모니터링 시스템의 핵심 구성 요소들이 고로 구현되어 있다.
웹 백엔드 개발 분야에서도 고는 중요한 위치를 차지하고 있다. 높은 성능과 효율적인 메모리 사용, 그리고 강력한 표준 라이브러리를 바탕으로 API 서버나 고성능 웹 애플리케이션을 구축하는 데 사용된다. Uber와 같은 글로벌 기업들도 특정 서비스의 백엔드를 고로 전환하여 성능을 개선한 사례가 있다.
마지막으로, 고는 시스템 유틸리티나 데브옵스 도구, 심지어 임베디드 시스템 및 블록체인 프로젝트의 핵심 구현체에서도 그 활용도를 보여주고 있다. 이처럼 고는 현대 소프트웨어 개발, 특히 서버 사이드와 인프라 영역에서 실용적이고 효율적인 솔루션을 제공하는 언어로 자리 잡았다.
8. 장단점
8. 장단점
고 언어는 시스템 프로그래밍과 대규모 네트워크 서버 개발에 적합하도록 설계된 언어로서, 현대 소프트웨어 개발의 요구를 반영한 뚜렷한 장점과 일부 단점을 가지고 있다.
고의 가장 큰 장점은 언어 설계 자체에 녹아든 간결함과 실용성이다. 문법이 의도적으로 단순하고 직관적이어서 학습 곡선이 비교적 완만하며, 코드의 가독성이 높다. 이는 대규모 코드베이스와 팀 협업에서 유지보수성을 크게 향상시킨다. 또한, 정적 타입 언어이면서도 타입 추론을 지원하여 불필요한 타입 명시를 줄이고, 강력한 표준 라이브러리가 풍부하게 내장되어 있어 외부 의존성을 최소화하면서도 생산성을 높일 수 있다. 가장 주목받는 특징은 경량 스레드인 고루틴과 통신 채널인 채널을 기반으로 한 동시성 프로그래밍 모델이다. 이는 멀티스레딩보다 훨씬 적은 메모리 오버헤드로 수천, 수만 개의 동시 작업을 효율적으로 처리할 수 있게 하여, 클라우드 컴퓨팅과 마이크로서비스 아키텍처에 매우 적합하다. 컴파일 속도가 빠르고 단일 실행 파일로 컴파일되는 점도 배포와 실행을 간편하게 만드는 장점이다.
반면, 고 언어는 비교적 젊은 언어이기 때문에 생태계가 자바나 파이썬과 같은 성숙한 언어에 비해 상대적으로 작다. 특정 분야의 고급 프레임워크나 라이브러리 선택지가 제한적일 수 있다. 또한, 언어 설계 철학상 기능을 최소화하는 것을 지향하기 때문에 제네릭 프로그래밍이 오랫동안 공식적으로 지원되지 않았으며, 2022년에 추가된 이후에도 다른 언어들에 비해 제한적인 구현을 가지고 있다. 예외 처리 메커니즘도 전통적인 try-catch 구문 대신 함수가 다중 반환 값을 통해 오류를 명시적으로 반환하는 방식을 채택했는데, 이는 코드 흐름을 명확하게 하지만 모든 오류 상황을 일일이 처리해야 하는 번거로움을 초래할 수 있다. 마지막으로, 가비지 컬렉션이 존재하기 때문에 실시간 시스템이나 극한의 성능과 제어가 필요한 저수준 시스템 프로그래밍에는 C++이나 러스트에 비해 적합하지 않을 수 있다.
9. 여담
9. 여담
고 언어는 개발 초기부터 구글의 내부 프로젝트에서 효율적인 시스템 소프트웨어를 구축하기 위한 목적으로 시작되었다. 언어의 이름은 단순히 "고(Go)"이지만, 검색 시 혼동을 피하기 위해 종종 "Golang"으로 불리기도 한다. 이는 언어의 공식 웹사이트 도메인이 golang.org인 데서 기인한 관행이다.
고 언어의 설계 철학은 단순함, 실용성, 그리고 효율적인 대규모 소프트웨어 개발에 중점을 두고 있다. 이는 C++의 복잡성을 피하면서도 현대적인 하드웨어에서 뛰어난 성능을 내는 언어를 만들고자 한 구글의 필요에서 비롯되었다. 언어의 창시자인 로버트 그리즈머, 롭 파이크, 켄 톰슨은 모두 유닉스와 C 언어 전통에서 중요한 업적을 남긴 인물들로, 그들의 경험이 고의 실용적인 설계에 큰 영향을 미쳤다.
고는 공식 마스코트인 "고퍼(Gopher)"로 잘 알려져 있다. 이 친근한 설치류 캐릭터는 고 커뮤니티와 관련 행사, 상품에서 널리 사용되며, 언어의 접근성과 커뮤니티 문화를 상징한다. 고의 릴리스 주기는 예측 가능하고 안정적으로 유지되는데, 매년 두 차례의 주요 버전이 발표된다는 점이 특징이다.
고 언어는 Docker, Kubernetes, Terraform과 같은 현대 클라우드 컴퓨팅 및 데브옵스 생태계의 핵심 인프라 도구들을 구축하는 데 광범위하게 사용되면서 그 입지가 크게 강화되었다. 이로 인해 백엔드 개발과 분산 시스템 구축을 위한 주요 언어 중 하나로 자리 잡았다.
