Golang의 공식 문서에서는 한 문장으로 Go언어를 “동적 타입의 인터프리터 언어처럼 느껴지는, 빠른 정적 타입의 컴파일 언어” 라고 설명합니다.
1️⃣ 편의성
동시성, '고루틴(goroutines)' 등 Go의 기능 중 일부는 언어 자체에 내장되어 있으며, 추가적인 기능은 Go의 http패키지와 같은 Go 표준 라이브러리 패키지로 제공됩니다. 또 Go는 Python과 마찬가지로 가비지 수집으르 포함한 자동 메모리 관리 기능을 지원합니다. Go는 컴파일 언어로 Python과 같은 스크립팅 언어와 다르게 빠르게 실행되는 네이티브 바이너리로 컴파일됩니다. 같은 컴파일 언어인 C 혹은 C++언어와 다르게 Go의 컴파일 속도는 매우 빠른 편으로 스크립팅 언어 같다고 느껴질 정도입니다.
2️⃣ 이식성
Go Toolchain으로 생성된 실행 파일은 기본적인 외부 종속성 없이 단독으로 실행할 수 있으며, Go Toolchain은 다양한 운영체제 및 하드웨어 플랫폼에서 사용할 수 있습니다.
3️⃣ 상호운용성
Golang (Go 언어)의 상호운용성(Interoperability)은 다른 언어, 특히 C/C++ 언어와의 상호작용을 용이하게 하는 기능을 의미합니다. 이 특징은 Go 프로그램이 기존의 C 라이브러리를 사용하거나, Go 라이브러리를 다른 언어에서 사용할 수 있도록 해줍니다. Go 언어의 상호운용성을 보여주는 몇 가지 예시는 다음과 같습니다.
예시 1: Go에서 C 코드 호출
Go 언어는 cgo라는 도구를 사용하여 C 코드와의 상호운용성을 제공합니다. cgo를 사용하면 C 언어로 작성된 라이브러리 함수를 Go 코드에서 호출할 수 있습니다.
C 코드
#include <stdio.h>
void sayHello() {
printf("Hello from C!\n");
}
Go 코드
/*
#include <stdio.h>
#include <stdlib.h>
void sayHello();
*/
import "C"
func main() {
C.sayHello()
}
이 예제에서는 #include 지시문과 C 함수를 Go 코드의 주석 안에 포함시킴으로써 cgo를 사용하여 C 코드를 호출하고 있습니다. C.sayHello()는 C 코드의 sayHello 함수를 호출합니다.
예시 2: C 코드에서 Go 라이브러리 호출
Go 언어로 작성된 함수를 C 코드에서 호출하는 것도 가능합니다. 이를 위해 Go는 -buildmode=c-shared 옵션을 사용하여 공유 라이브러리를 생성할 수 있습니다.
Go 코드(hello.go)
package main
import "C"
import "fmt"
//export SayHello
func SayHello() {
fmt.Println("Hello from Go!")
}
func main() {}
go build -o hello.so -buildmode=c-shared hello.go
위 코드를 컴파일하여 공유 라이브러리 생성
C 코드
#include <stdio.h>
#include "hello.h"
int main() {
SayHello();
return 0;
}
이제 C 코드에서 Go 언어로 작성된 SayHello 함수를 호출할 수 있습니다.
4️⃣ 지원
Go Toolchain은 리눅스, 맥OS, 윈도우 바이너리 또는 도커 컨테이너로 무료 제공됩니다. Go는 레드햇 엔터프라이즈 리눅스(Red Hat Enterprise Linux)와 페도라(Fedora) 등 여러 인기 리눅스 배포판에 기본으로 포함되어 있어서 Go 소스를 이러한 플랫폼에 배치하기 비교적 용이합니다.
1️⃣ 클라우드-네이티브 개발
Go의 동시성 및 네트워킹 기능, 높은 수준의 이식성을 바탕으로 Go는 클라우드 네이티브 앱을 개발하기에 적합한 편입니다. 실제로 도커, 쿠버네티스, 이스티오 등 여러 클라우드 네이티브 컴퓨팅의 기반을 구축하는데 사용되기도 했습니다.
2️⃣ 분산형 네트워크 서비스
네트워크 애플리케이션의 핵심은 동시성이며, Go의 네이티브 동시성 기능인 고루틴 혹은 채널은 이런 작업에 적합하기 때문에 API, 웹 서버, 웹 어플리케이션을 위한 최소 프레임워크 등 네트워킹, 분산형 기능, 클라우드 서비스에 쓰입니다.
3️⃣ 유틸리티 및 독립형 도구
Go는 외부 종속성이 최소화된 상태에서 바이너리로 컴파일됩니다. 그래서 유틸리티 및 기타 도구 제작에 이상적입니다. 빠르게 실행되고 재배포를 위해 신속하게 패키지화할 수 있기 때문입니다.