Connecting

Go 언어 컨셉 이해하기 본문

Go 언어

Go 언어 컨셉 이해하기

팬도라 2020. 7. 7. 12:56
반응형

Go 언어란?

2019년 구글이 개발한 프로그래밍 언어로써, GC (garbage collection)와 병행성 (concurrent)을 잘 지원하는 컴파일 언어입니다. 로버트 그리즈머, 롭 파이크, 케네스 톰슨이 C++의 복잡성이 싫어서 개발되었습니다.

현재도 어떠한 패키지에 무엇을 포함할지는 이 세 사람이 만장일치로 합의해야 이루어진다고 하며, Golang 으로 불리기도 합니다. Go 언어 사용자들을 고퍼(Gopher)라고 부르며, 고퍼들을 위한 연례행사인 고퍼콘(Gophercon)이 열리고 있습니다.

Go 언어 특징

Go 언어의 특징은 다음과 같습니다.

  1. 컴파일 언어이지만 컴파일러가 소스 코드를 해석하는 pass 수를 줄여서 인터프리터 언어처럼 빠르게 동작합니다.
  2. 언어의 문법이 간결하여 접근하기 쉽고 높은 성능을 낼 수 있습니다.
  3. 자료형 체계에서 정적 타입 검사가 이루어지기 때문에 Python 등에 익숙해져 있는 경우 생소할 수 있지만 풍부한 라이브러리를 통해서 다양한 기능을 쉽게 구현할 수 있습니다.
  4. 고루틴이라는 비동기 매커니즘을 제공하여 이벤트 처리 및 병렬 프로그래밍 작성이 쉽습니다.
  5. 고루틴은 OS에서 관리하는 경량 스레드보다 더 가볍기 때문에 CPU 코어갯수와 무관하게 수백, 수천만 고루틴을 작성해도 성능에 문제가 발생하지 않습니다. ( 비동기 처리 부분은 Erlang에서 영향을 받았기 때문 )
  6. 파일 언어인 덕분에, 속도가 느린 스크립트 언어에서 연산 퍼포먼스가 필요한 부분을 Go로 대체해 넣을 수도 있습니다.

2016년 중반부터 CMS (Contents Management System)와 마이크로서비스 부분으로 사용 영역 및 점유율이 급격하게 늘어서 현재 스택오버플로우에서 실시한 2017년 미국 개발자 평균 연봉 1위 (11만불)의 언어로 기록되었습니다.

지원 OS

현재는 리눅스, 윈도우10, macOS 등 여러 플랫폼을 지원합니다. (윈도우 XP, 윈도우 Vista를 지원하지 않습니다.) 바이트코드를 생성하는 언어가 아니기 때문에 바이너리만 배포할 경우 C/C++ 프로그램이 그렇듯 해당 타깃 머신에 맞춰서 각각 컴파일해서 배포하거나 소스코드를 배포해야 합니다.

Go 키워드 및 도구

Go는 단순함과 실용성을 지원하는 언어이기 때문에 키워드가 25개 밖에 되지 않습니다.

  • break

  • default

  • func

  • interface

  • select

  • case

  • defer

  • go

  • map

  • struct

  • chan

  • else

  • goto

  • package

  • switch

  • const

  • fallthrough

  • if

  • range

  • type

  • continue

  • for

  • import

  • return

  • var

    Go는 수많은 언어 배포판들과 동일한 종류의 디버깅, 테스트, 코드 검사도구를 포함하고 있으며, 다음을 포함합니다.

  • go build : 소스 파일 자체의 정보만을 사용하여 Go 바이너리를 빌드한다. 별도의 makefile은 없다.

  • go test : 유닛 테스트 및 마이크로벤치마크

  • go fmt : 코드 서식 지정

  • go get : 원격 패키지의 검색 및 설치

  • go vet : 코드 내의 잠재적인 오류를 찾아내는 정적 분석기

  • go run : 코드를 빌드하고 실행하는 바로 가기

  • godoc : HTTP를 통해 문서 확인

  • gorename : 변수, 함수 등을 type-safe 방식으로 이름 변경

  • go generate : 코드 생성기를 호출하는 표준 방식

Go를 사용하는 프로젝트

Go로 작성되어 사용되는 프로그램은 다음과 같습니다.

  • 라이트닝 네트워크: 비트코인 네트워크.
  • CockroachDB: SQL 데이터베이스.
  • 도커: 리눅스 컨테이너를 배치시키는 도구들의 집합
  • Doozer: 매니지드 호스팅 제공자 헤로쿠의 락 서비스
  • Geth 소프트웨어: 이더리움 프로토콜 블록체인 기술을 이용한 golang 구현체로서, 전 세계 공유 컴퓨팅 플랫폼을 구현한다.
  • Gogs: 셀프 호스팅 Git 서비스.
  • InfluxDB: 고가용성과 고성능 요구사항을 필요로 하는 오픈 소스 데이터베이스.
  • Juju: 캐노니컬이 주관하는 서비스 오케스트레이션 도구. (우분투 리눅스의 패키저)
  • Kubernetes: 컨테이너 관리 소프트웨어
  • 오픈시프트: 클라우드 컴퓨팅 플랫폼 (레드햇이 서비스함)
  • 패커(Packer): 여러 플랫폼을 대상으로 하나의 소스 구성을 통해 동일한 머신 이미지를 만드는 도구.
  • 스내피(Snappy): 우분투 터치용 패키지 관리자 (캐노니컬 제작)
  • Syncthing: 오픈 소스 파일 동기화 클라이언트/서버 애플리케이션
  • GitLab-runner: 오픈 소스 CI/CD 애플리케이션.
  • 이더리움 (geth)

Go를 사용한 일부 저명한 오픈 소스 소프트웨어 프레임워크는 다음과 같다.

  • Beego: 고성능 웹 프레임워크
  • Martini: 웹 애플리케이션/서비스용 패키지.
  • 고릴라: Go용 웹 툴킷.
  • Enduro/X ASG: 클러스터 미들웨어, 애플리케이션 서버, 분산 트랜잭션, 멀티 프로세싱 프레임워크

Go를 사용하는 저명한 기업 및 사이트는 다음과 같다(일반적으로 다른 언어와 함께 사용

부록

겨울왕국의 Let it Go를 패러디한 Write in Go라는 노래가 공개되었습니다. 영상 링크와 가사는 아래에서 확인하세요.

Write in Go : https://youtu.be/yhC-361QGJw

The schedule's tight on the cluster tonight
분산환경에서 해야 할 일로 쉴 틈 없을 오늘밤
So I parallelized my code
그래서 나는 병렬화된 코드를 작성했어
All those threads and continuations
그 모든 스레드와 컨티뉴에이션들로
My head's going to explode
머리는 폭발하기 일보직전이야
And all that boilerplate
심지어 그 모든 의례적인 코드들
That FactoryBuilderAdapterDelegateImpl
그 모든 "괴상한디자인패턴의복잡다단한구현"
Seems unjustified
이건 맞는 방법이 아닌 것 같아
Give me something simple
제발 알려줘 좀 더 간단한 방법을

Don't write in Scheme
스킴(Scheme)은 쓰지 마
Don't write in C
[C](https://namu.wiki/w/C(프로그래밍 언어))로 짜지 마
No more pointers that I forget to free()
해제하길 깜빡한 포인터여 이제 그만 안녕
Java's verbose, Python's too slow
자바(Java)는 장황하고, 파이썬(Python)은 느려터졌단 걸
It's time you know
이제 깨달을 때가 왔어

Write in Go! Write in Go!
Go로 짜! Go로 짜!
No inheritance anymore
클래스 상속이여 이제 그만 안녕
Write in Go! Write in Go!
Go로 짜! Go로 짜!
There's no do or while, just for
do도 while도 없어, 오직 for뿐
I don't care what your linters say
당신의 린터가 뭐라고 말하든 상관없어
I've got tools for that
내겐 수정툴이 있다고
The code never bothered me anyway
코드는 더 이상 날 괴롭힐 수 없어

It's funny how some features Make every change seem small
몇 개의 함수가 재수정을 작게 보이게 만드니 재밌어
And the errors that once slowed me Don't get me down at all
느리게 하던 에러들도 더 이상 날 새로 짜게 만들지 못해

It's time to see what Go can do
이제 Go가 뭘 할 수 있는지 알아볼 시간야
'Cause is seems too good to be true
왜냐면 믿기 어렵도록 너무 좋아보이니까
No long compile times for me.
더 이상 기나긴 컴파일 타임은 없어
I'm free!
난 자유야!

Write in Go! Write in Go!
Go로 짜! Go로 짜!
Kiss your pointer math goodbye
포인터 산술과 작별의 키스를 해
Write in Go! Write in Go!
Go로 짜! Go로 짜!
Time to give GC a try
GC가 알아서 정리하게 할 시간이야
I don't care if my structures stay On the heap or stack
난 상관 안 해 내 구조체가 힙이나 스택 영역에 남아 있어도

My program spawns its goroutines without a sound
내 프로그램이 단 하나의 에러 사운드 없이 Go 루틴을 생성한다
Control is spiraling through buffered channels all around
버퍼링 된 채널들을 통해 제어가 나선형처럼 진행된다
I don't remember why I ever once subclassed
내가 왜 옛날엔 서브 클래스를 생성했는지 기억도 안 나
I'm never going back My tests all build and pass!
다신 돌아가지 않을 거야, 내 모든 테스트 빌드가 잘 돌아가!

Write in Go! Write in Go!
Go로 짜! Go로 짜!
You won't use Eclipse anyomore
넌 이클립스를 다시는 안 쓰게 될 거야
Write in Go! Write in Go!
Go로 짜! Go로 짜!
Who cares what Boost is for?
부스트 라이브러리가 알 게 뭐야?

I don't care what the tech lead say
난 상관 안 해 기술 책임자가 뭐라 말하든
I'll rewrite it all!
내가 전부 다시 짤 거야!
Writing code never bothered me anyway
코드 짜기는 더 이상 날 괴롭힐 수 없으니까

Comments