본문 바로가기

IT

[Go/Golang] Go 언어는 무엇이고 왜 쓰고 언제쓸까?

최근에 Go 언어로 개발을 하면서 한 번은 정리해야겠다고 생각했다.

Go 언어는 무엇이고, 언제 쓰면 좋을까? 

개발을 하면서 이런 고민을 한번쯤은 해봤을 거라고 생각한다.

 

Go 는 무엇인가?

Go 마스코트 gopher (출처: https://golang.org/doc/gopher/fiveyears.jpg)

2009년 구글에서 일하는 로버트 그리즈머, 롭 파이크, 켄 톰프슨이 개발한 프로그래밍 언어이다.

구문이 C 와 비슷하지만 (개인적으로 나는 세미콜론이 안붙어서 Python 과 비슷하다고 생각했다) Memory Safety, Garbage Collection, Structural Type System, Communicating Sequential Processes(CSP) 스타일의 병행성(Concurrency) 를 제공한다.

 

간단하게 하나씩 살펴보면 다음과 같다. (개별 특징에 대한 자세한 글을 포스팅 해도 좋을 것 같다)

  • Memory Safety: 메모리 오류를 유발시킬 수 있는 취약점을 회피하는 것, 유효하지 않은 메모리에 접근하는 것을 피하기 위해 포인터 연산이 없음
  • Garbage Collection(GC): 사용하지 않는 메모리를 지워줌, 포인터 연산이 없어서 GC 의 구현을 단순화 할 수 있었음
  • Structural Type System: 타입 시스템의 적합성, 동일성이 타입의 실제 구조 또는 정의에 의해 결정됨 (Struct A, B의 구조가 동일하면 A 에 B를 배치할 수 있음) 
  • Communicating Sequential Processes(CSP): 순차 프로세스 통신, 프로세스간의 통신을 동시성 프로그래밍의 핵심으로 봄, go 에서는 channel 로 프로세스간의 통신을 지원함

 

사람들이 Go 를 왜 쓸까?

출처: http://kirael-art.deviantart.com/art/Go-lang-Mascot-458285682

Go 언어의 사용목적은 정적 타입 컴파일 언어의 효율성과 동적언어의 쉬운 프로그래밍을 할 수 있도록 하는 것이다.

또한 안전성(정적 타입이기 때문에 타입에 대한 안전성, 메모리 안전성), 병행성(concurrency), 가비지 컬렉션, 빠른 컴파일을 목적으로 한다.

Go 의 런타임에서 관리하는 고루틴(goroutine) 이라는 경량스레드와 고루틴간 메시지를 통신할 수 있는 매체인 채널(channel) 로 병행성(concurrency)를 지원해주고 있다.

 

위의 사용 목적들로 Go 를 왜 쓰는지 정리하면 다음과 같다.

1. 키워드가 많지 않아 사용하기 쉬워서 쓰게 되더라.

2. 병행성 프로그램을 쉽게 개발할 수 있어서 쓰게 되더라. 

 

 

Go 는 언제쓰면 좋을까?

사용목적과 같은 맥락이라 생각한다.

Go 에서 강조하는 CSP 기반의 프로세스간 통신으로 비동기성 입출력, 멀티스레딩, 병렬컴퓨팅이 주요하게 쓰이는 프로그램 개발에서 사용된다. (다들 현업에서 강조하는 부분들이다)

나는 현업에서 고성능이 요구되는 플랫폼백엔드 서버 개발에서 사용하고 있다.

 

아직 한국은 Java 공화국이지만… 전 세계적으로 Go 를 사용한 프로젝트와 사용 중인 기업은 늘어나고 있다. 

일단 Go 를 사용하는 프로젝트는 정말 많지만 몇 개만 나열하면 아래와 같다. (대부분이 들어보거나 쓰고있는 소프트웨어 일 것이다.)

  • GitLab-runner
  • Docker (초기에 Docker 개발 언어로 유명세를 타기도 했다.)
  • Kubernetes
  • Geth

 

Go 를 사용하는 기업과 사이트도 정말 많다. (대세언어라는 이유가 있다.)

  • Dropbox
  • Google (Go 를 만든 기업이니까… 쩝)
  • Netflix
  • MongoDB
  • Twitch
  • Uber

 

Go 를 사용하면서 더 알고싶은 것도 많아진다.

현업에서 이런 기능을 만들기 위해 작성한 코드, 더 궁금한 부분들로 포스팅 할 예정이다.

 

참고자료

https://ko.wikipedia.org/wiki/Go_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4