Go는 구글이 개발한 프로그래밍 언어로서 2009년 처음 발표되었다.
Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.
Go is expressive, concise, clean, and efficient. Its concurrency mechanisms make it easy to write programs that get the most out of multicore and networked machines, while its novel type system enables flexible and modular program construction. Go compiles quickly to machine code yet has the convenience of garbage collection and the power of run-time reflection. It's a fast, statically typed, compiled language that feels like a dynamically typed, interpreted language.
Go의 심플하고, 신뢰성있으며 효율적인 특징으로 저명한 오픈소스 프로젝트와 IT기업들에서도[Kubernates, Docker, uber, 넷플릭스, 이더리움, 네이버, 카카오, 왓챠, 당근마켓 등... ] 백앤드에 부분적으로 Go를 도입하는 케이스가 증가하고 있다.
오랜 기간동안 Java는 백앤드 시장의 대부분을 차지해왔다.
하지만, 최근들어 javascript, phyton, go 등의 다른 언어 기반 시스템들의 점유율이 증가하고 있다.
개인적으로,
백앤드 생태계 변화의 근본적인 이유는 서비스의 발달이라 생각한다.
모바일 세상이 시작되며 서비스의 다양성과 질이 기하급수적으로 증가했다.
수많은 종류의 서비스가 생겨났고, 수많은 사용자가 생겼다.
서비스 생태계가 변화하면서 우리는 보다 빠르고 정확하며 복잡한 처리가 동반되는 서비스를, 많은 사람들에게 제공해야할 요건이 생겼다.
scale-up만으로는 더이상 복잡한 연산과 많은 양의 트래픽을 처리하기 어렵다는 결론에 도달하면서 scale-out으로 인프라 방향성이 바뀌고 있다.
그리고 scale-out과 함께 마이크로서비스 아키텍처가 주목받으면서 이제 우리는 하나의 서버에서 모든 것을 처리할 필요가 없다는 것을 깨달았다.
기존 모놀리틱 시스템 구조에서 서비스를 작은 단위로 쪼개고 독립적이게 구성하게 되면서 보다 적재적소에 가장 적합한 기술을 적용할 수 있게 되었다.
변화하는 시장의 요구에 안정성을 이유로 경쟁성을 잃어버릴 기회비용을 내지 않아도 된다.
마이크로서비스 아키텍처 패러다임으로 이제 적재적소에 가장 효율적인 방식으로 서비스를 디자인 할 수 있게 되었다.
Go는 마이크로 서비스 환경에서 유연하고 높은 성능을 낼 수 있다.
Go 언어의 초기 설계자 로버트 그리즈머, 롭 파이크, 켄 톰프슨 3명은 C++의 복잡성이 싫어 새로운 언어를 만들게 되었다고 한다. 설계자들의 목표에 맞게 Go의 가장 큰 특징 중 하나는 단순함이다.
Go의 단순함은 빈약함을 뜻하진 않는다. 모던 프로그래밍 언어들에서 좋은 장점들을 많이 가져와 반영시켰고 다른 언어에서 할 수 있는 것들을 충분히 해낸다. 단숨함이 깔려있는 코드 스타일로 Go는 생산성과 가독성이 좋다.
Go는 컴파일 언어다. 컴파일이 중간언어를 생성하는 것이 아니고 기계어를 생성하므로 VM 같은 별도의 프레임워크 필요없이 바로 실행이 가능하므로 빠르다.
그러면서 동시에 VM에서 지원하는 garbage collection 기능도 갖추고 있기에, 개발자가 직접 컨트롤 하는 것 보다 메모리 할당과 해제가 안정적이다.
Go의 가장 큰 특징은 Go-routine이다.
Go-routine은 스레드와는 조금 다르다. JAVA와 같은 언어에서 스레드 생성시 약 2MB 메모리 공간이 신규로 할당된다. Go-routine의 경우 1KB를 차지한다. 2000배 가까운 메모리 용량 차이는 메모리 할당시 더 오랜 시간이 걸리고 및 페이지 교체가 더 빈번하게 일어나 오버헤드가 증가함으로 이어진다.
Go-routine의 이러한 장점으로 Go는 다중처리가 필요한 작업, 멀티스레딩 환경에서 최적화된 언어이다. 또한 다른언어에서 스레드간 통신의 어려움을 Go에서는 채널이라는 통로로 쉽게 데이터를 공유할 수 있다.