장점

정적 타입 언어

Go는 정적 타입 언어입니다.

컴파일 언어

컴파일 결과로 바이너리 파일이 나오는 컴파일 언어입니다. 이로 인해 Python 같은 인터프리터 언어보다 더 빠릅니다.

간결한 언어

적은 수의 키워드, 간결한 문법으로 코드가 단순하고 배우기 쉽습니다.

Go루틴/경량쓰레드

Go는 Go루틴으로 비동기 매커니즘을 지원합니다. 고루틴은 멀티스레드 메커니즘이지만 자체적인 스케줄러에 의해 관리되는 경량 스레드이며 수백 수천개의 Go루틴이 생성되어도 큰 무리없이 동작한다고 합니다.

기본 패키지

OS를 가리지 않는 강력한 기본 제공 패키지가 제공됩니다. 파일, 입출력, 네트워크, http, 암호화, hash, 압축, sql, json, 이미지등 OS를 가리지 않는 강력한 패키지를 제공합니다.

크로스 컴파일

Go 코드로 Window, Mac, Linux등 여러 OS에 컴파일 됩니다.

GC

Go는 동적으로 할당된 메모리를 자동으로 관리하고 해체해 줍니다.

인터페이스

개인적으로 생각하는 Go의 가장 강력한 기능 중 하나 입니다. 인터페이스로 코드를 추상화 할 수 있습니다.

탈중앙화, 오픈 소스

탈중앙화, 오픈소스 패키지가 활성화 되어있습니다. go.pkg.dev 에서 원하는 패키지를 쉽게 찾을 수 있습니다.

모듈

GOPATH 의 대안으로 나온 모듈 시스템으로 의존성, 라이브러리등 프로젝트를 관리하기 쉬워졌읍니다.

CGO

C언어 라이브러리를 사용하기 위한 인터페이스를 제공합니다. 심지어 Go코드에 C 코드를 삽입할 수 있습니다.

단점

예외 처리

throw, catch 처럼 많은 다른 언어가 제공하는 예외 처리가 없습니다. 함수의 리턴 결과를 분석하여 함수의 에러를 핸들링 해야합니다.

많은 if문이 사용되고, 코드가 방대하고 복잡해집니다.

제네릭

제네릭을 지원하지 않습니다. 물론 interface{} 와 형 변환을 사용하면 되지만, 명시적이지 않고 복잡합니다. 불필요한 박싱, 언박싱으로 연산이 복잡해집니다. 현재 일반화 프로그래밍을 지원하기 위해 협의중이라고 합니다.

GOPATH

모듈 시스템 도입 전, Go 는 프로젝트를 GOPATH 환경변수로 관리 했습니다. 이는 작업 프로젝트가 변경될 때 마다 GOPATH 값을 수정해야 했고, 매우 번거로웠습니다. 모듈로 대체되었지만, 모듈을 지원하지 않는 패키지는 GOPATH를 사용하거나, 사용을 포기해야 합니다.

탬플릿 매크로 부재

탬플릿과 매크로의 부재로 비슷한 코드를 반복 작성해야 하는 단점이 있습니다.

타 컴파일 언어보다 느림

GC등의 이유로 Go는 C, C++, Rust보다 느립니다.

GC

GC를 사용하는 언어의 공통된 단점이다. GC가 런타입에 작동되어 성능과 메모리가 매우매우매우 중요한 환경에서는 적합하지 않을 수 있습니다.

입문은 쉬우나 잘 활용하기 위해 배울 것이 많음

Go도 기본적으로 컴파일/시스템 언어 인지라 포인터, 메모리등 기본적인 컴퓨터 지식이 요구됩니다.

그리고 Go에서 사용되는 알아야 할 각종 기법들이 많다고 생각합니다. 다른 언어에서 지원하지만, Go에서 지원을 하지 않는 기능이 많다 보니 각종 꼼수들이 존재하는데, 이를 배우기가 쉽지 않았습니다.