장점1. 고루틴
코루틴? 멀티스레드? 멀티프로세스?
그런 건 다 잊고 고루틴 하나로 대동단결이다.
go 키워드 하나로 비동기 적용, 성능 향상 등 다양한 효과를 다 이뤄낸다.
가성비와 절대성능 모두 훌륭하다.
Go를 쓰는 이유의 99%.
장점2. 퍼포먼스와 편의성의 적절한 균형
퍼포먼스 : C++ >> Go > Java >>>>>>>> Python
편의성 : Python >> Go >> Java >>>>>>>> C++
참고로 Go와 Java의 퍼포먼스 차이는 계속해서 벌어지는 중이다.
컴파일러가 덜 성숙되어 꾸준히 향상되고 있기 때문이다.
극초창기에는 자바보다 느렸다.
장점3. 강력한 도구들
gofmt
내맘대로 코딩하고 한 번 실행하면 표준화된 형식으로 변환해준다.
보통 IDE에서 저장시 자동으로 변환하게 설정한다.
godoc
레퍼런스를 매우 편리하게 검색하게 해준다.
아예 레퍼런스 서버를 띄울 수도 있다.
goimports
실행시키면 소스에 쓰인 패키지들을 자동으로 import 해준다.
예를 들어 fmt.Println 함수를 어딘가에 쓰고 저장하면 문서 상부에 import "fmt"를 자동으로 적어준다.
이외에도 다양한 도구들을 공식적으로 지원한다.
https://godoc.org/golang.org/x/tools/cmd
장점4. 강력한 기본 패키지
비교적 신생언어라 그런지 기본 패키지를 열심히 갈고닦아 나온 편이다.
특히 웹개발에 사용되는 패키지들이 기가 막히다.
장점5. 편리한 크로스 컴파일
명령어 한줄로 macOS/AMD64에서 Windows/i386 바이너리를 컴파일 할 수 있다.
예시
env GOOS=linux GOARCH=arm go build -v package-path
리눅스/ARM 플랫폼 용으로 패키지를 빌드하라는 뜻
이걸 윈도우/리눅스/맥 어디서도 할 수 있다
단점1. 지저분한 예외처리
Go의 함수는 내부적으로 에러가 일어났을 시
에러값을 반환하거나, 패닉을 일으키거나, 무시한다.
반환된 에러값은 에러값에 조건문을 걸어 처리하거나 무시한다.
패닉이 일어나면 패닉을 일으킨 함수를 호출한 함수로 패닉이 전달되고,
다시 그 함수를 호출한 함수로 패닉이 전달된다.
이 과정 중에 지연 실행된 작업들이 역순으로 실행된다든가,
패닉의 전달을 restore하여 끊는다든가 하는 일이 일어난다.
단순히 생각해봐도 try/catch가 있는 경우보다 복잡하고,
자신이 작성하지 않은 함수는 어떤 경우 패닉이 일어날지 쉽게 예측할 수 없어 골아프다.
예외처리를 빡시게 하면 코드도 상당히 더러워 보인다.
단점2. 중앙 저장소의 부재
Go에서는 깃헙 등의 원격 저장소에 올라온 패키지를 go get 명령어로 다운로드 및 설치해 쓴다.
잘 필터링된 중앙 저장소가 없어 옥석을 고르는데 품이 든다.
아무데서나 파일 다운 받아 쓰는 과정을 좀더 편하게 해놓았다는 의미밖에 안 된다.
단점3. GUI 프레임워크의 부재
닷넷 같은 편리한 녀석은 커녕, Qt 등의 준수한 대안조차 없다.
이런저런 사람들이 찔끔 해보다만 녀석들 뿐이다.
Go를 만든 목적이 데스크탑 어플리케이션 개발에 있지 않고,
코어 사용자들도 그방면에 관심이 없기에,
앞으로도 쉽게 해결되지 않을 문제다.
단점4. 제네릭의 부재
제네릭의 남용을 불편해하는 사람들도 있지만,
일단 있어야 고민이라도 해보는 거다.
Go팀에서 이 문제를 고려 중이라니 기다리면 나올지도.
장점도 단점도 아닌데 중요한 점
클래스 대신 구조체/함수리시버/인터페이스를 이용한 OOP를 구현
어쩌면 위의 장단점들보다 이 특징이 Go를 대변하는 중요한 포인트일지도 모르겠다.
...... 그래도 고의 간판은 고루틴이다.
qt 같은 거 되면 하꾜 프로젝트 같은 거에 열심히 써먹을텐데...ㅜ
ㄴ 그게 참 아쉬움..
시선이 좋다 개추