쉽Go 편리하GO (Go를 배워야 하는 이유)
Go를 왜 배워야 하는가?
간결한 문법
Go언어는 loop 문법으로 while이 없고 오직 for만 있고 또한 Class를 배제함으로써 언어 자체가 단순해졌습니다. 또한 keyword가 25개밖에 되지 않아 문법 또한 간결해 입문이 쉬운 편입니다.
컴파일 언어 / 빠른 컴파일 속도
Go 언어의 특징은 컴파일 언어이지만 컴파일러의 컴파일 속도가 매우 빨라 인터프리터 언어처럼 쓸 수 있다는 점에 있습니다. Go 는 컴파일 언어인 동시에 C와 달리 헤더가 아닌 패키지 개념을 사용해 컴파일 속도가 빠릅니다. 이로 인해 Go로 알고리즘 문제를 해결한다면 다른 언어와 비교할 수 없는 빠른 속도로 해결할 수 있습니다.
간편한 동시성 제어 (병행성)
Go는 대표적인 채널 기반 언어입니다. 스레드라는 것을 명시적으로 주지 않고 고루틴을 생성하면 알아서 스레드를 생성해주고 적절한 스레드에 고루틴을 할당합니다. Go는 이를 사용하여 다중 스레드를 간단하게 구현 가능 합니다. 또한 goroutine을 하나 생성하는데 초기에 필요한 메모리가 2KB 밖에 안되기 때문에, 기존 OS thread를 생성하는데 필요한 1MB와 비교했을 때, 비교가 안될 만큼 작습니다. 단, 병렬화된 고루틴의 동기화 문제는 프로그래머가 다뤄야 하며 동기화를 무시할 경우 프로그램이 비정상 종료될 수도 있다. 예를 들어 부모 루틴이 자식 루틴보다 먼저 끝나버리면 자식 루틴은 OS에 의해 메모리에서 강제로 사출되어 버립니다.
가비지 컬렉션
C 에선 제공하지 않지만, Go 에선 제공하는 것이 바로 가비지 컬렉션입니다. C 를 사용해본 사람이라면 알겠지만, 메모리를 동적으로 할당하고 나면 메모리 릭을 막기 위해서 소스 코드의 차원에서 반드시 메모리를 풀어주어야 했습니다. 하지만 Go 에선 수동적으로 해제하지 않고도 알아서 메모리에서 해제 해주는 가비지 컬렉션이 있기 때문에 알아서 관리해줍니다.
Java GC vs Go GC (WOW GC 또한 굉장히 단순하다.. )
Go 언어의 GC에 대해 - LINE ENGINEERING
모듈화 및 패키지
Go는 다양 패키지를 보유하여, 웬만한 것은 모듈로 해결 가능합니다. 또한 Go 의 경우 패키지를 레지스트리에 등록하지 않고, 깃허브에 코드를 올려놓기만 해도 프로그램에 포함 시켜 사용할 수 있습니다. Go 의 경우 패키지를 레지스트리에 등록하지 않고, 깃허브에 코드를 올려놓기만 해도 프로그램에 별도로 구성된 패키지 매니저의 도움은 필요 없습니다다. 그저 go get 명령어만 있으면 패키지를 다운로드 받을 수 있습니다.
공식 문서에서 패키지 찾기 Go 의 내장 패키지는 공식 홈페이지 패키지 문서쪽에서 찾을 수 있습니다. 패키지 목록은 외우는 것이 아닙니다. 어떠한 패키지가 있고 이 패키지가 무엇을 하는 것인지, 어떨 때 써야 할지만 살펴보면 됩니다.
공식 문서에서 패키지 찾기
go get으로 패키지 다운로드 하기
go get github.com/headfirstgo/keyboard
package main
import (
"github.com/headfirstgo/keyboard"
)
func main() {
keyboard.GetFloat()
}
Go를 사용하는 회사
Go lang SDK 설치하기
Go Land IDE 설치하기
Go 입문하기
https://codingnuri.com/golang-book/
여담
# Write go 가사
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
스킴은 쓰지 마
Don't write in C
C로 짜지 마
No more pointers that I forget to free()
해제하길 깜빡한 포인터여 이제 그만 안녕
Java's verbose, Python's too slow
자바는 장황하고, 파이썬은 느려터졌단 걸
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 it 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
코드 짜기는 더 이상 날 괴롭힐 수 없으니까