개요
2009년 구글에서 발표된 프로그래밍 언어. Docker, Kubernetes를 작성하는 데 사용되었음
컴파일러 언어지만 컴파일 속도가 매우 빨라 인터프리터 언어처럼 사용할 수 있다.
GC(Garbage Collection)이 실행파일 안에 내장되어 있음
언어 설계
Go의 문법은 대체로 C와 비슷하다: 코드 블록들은 중괄호로 둘러싸고 for, switch, if를 포함한 일반적인 제어구조를 가지고 있다. C와 다르게, 한 라인 끝의 세미콜론은 필수가 아닌 옵션
변수 선언은 다르게 작성되고 대개 옵션이다. 형 변환은 명시적으로 해야 한다. 병행 컴퓨팅을 다루기 위해 go와 select 키워드가 사용된다. 새로운 타입은 map, 유니코드 문자열, 배열 slice, 그리고 내부 쓰레드 통신을 위한 채널(channel)이 있다.
Go는 그리 좋지 않은 하드웨어에서도 빠르게 컴파일될 수 있도록 디자인되었다. Go는 가비지 컬렉션이 되는 언어이다.
동시성 (Go Routine)
Go Routine은 프로그램의 진입점 함수를 비롯하여 다른 Go Routine과 함께 동시에 실행되는 함수
만약 다른 프로그래밍에서 이런 일을 가능하게 하려면 스레드를 사용해야 하지만, go에서는 여러 개의 Go Routine이 하나의 스레드에서 동작
Go Routine은 스레드보다 적은 메모리를 사용하여 go런타임이 설정 한 논리 프로세스의 개수에 따라 자동적으로 Go Routine을 실행하게 된다고 함
func main() {
fmt.Println("main 함수 시작", time.Now())
go long()
go short()
time.Sleep(5 * time.Second)
fmt.Println("main 함수 종료", time.Now())
}
func long() {
fmt.Println("long 함수 시작", time.Now())
time.Sleep(3 * time.Second)
fmt.Println("long 함수 시작", time.Now())
}
func short() {
fmt.Println("short 함수 시작", time.Now())
time.Sleep(1 * time.Second)
fmt.Println("short 함수 시작", time.Now())
}
타입 시스템
golang은 계층구조가 없는 유연한 타입 시스템을 제공하기 때문에 리팩토링에 대한 부담을 최소화하면서 코드를 재사용할 수 있다.
객체지향에 비하여 훨씬 간편하게 객체지향 프로그래밍이 가능하다는 것
type Item struct {
name string
price string
}
func (t Item) Cost() float64 {
return t.price * float64(t.price)
}
func main() {
shirt := Item{name: 'a' price: 2000}
fmt.Println(shirt.Cost())
}
go는 합성이라고 부르는 디자인 패턴과 마찬가지로 방법으로, 기능을 재사용하기 위해 타입을 임베드한다.
다른 언어들도 합성패턴을 사용하지만 종종 상속과 너무 강하게 연결되어 결국에는 코드 재사용이 복잡하고 어려워지는 경향이 있다.
또한 golang은 모델의 타입을 모델링하는 것이 아니라 동작을 모델링할 수 있는 독특한 인터페이스를 구현할 수 있다.
장점
- 매우 간단한 문법으로 배우기 쉬습니다.
- loop 문법으로 while이 없고 오직 for만 있습니다.
- class 문법이 없습니다.
- 정적타입 / 강타입 언어입니다.
- 컴파일속도가 빠른 컴파일 언어입니다.
- 컴파일 속도가 빨라서 인터프리터 언어처럼 쓸 수 있습니다.
- 속도가 빠릅니다.
- 여러분이 Go로 알고리즘 문제를 해결한다면 다른 언어와 비교할 수 없는 빠른 속도로 해결할 수 있습니다.
- 고루틴이 있습니다.
- 고루틴은 쓰레드보다 매우 가볍고 쉽게 이용이 가능합니다.
- 풍부한 기본 모듈을 제공합니다.
- 자체 제공하는 패키지들이 강력해서 별도의 웹 프레임워크를 사용하지 않아도 웹을 개발할 수 있습니다. 파이썬으로 순수 웹 개발이 힘들기에 장고, 플라스크 프레임워크를 사용하는 것에 대조됩니다.
- 신뢰할 수 있는 제작사, 대기업들의 사용합니다.
- 구글이 만들었고 YouTube 개발에 사용하는 언어입니다. 해외에는 우버, 넷플릭스, BBC 가 사용하고 있으며 도커 또한 Go로 개발하였습니다. 국내는 카카오엔터프라이즈, 당근마켓, 왓차, 버즈빌 등 대기업, 스타트업이 사용하는 언어입니다.
- 컨벤션이 통일되어 있습니다.
- 컨벤션에 맞추어 코드를 수정해주는 go fmt 기능이 있다.
- VS Code에서 저장을 누르는 순간 formatter가 포멧을 바로 맞추어줍니다.
- 채널 기반 언어입니다.
- Go는 대표적인 채널 기반 언어입니다. 스레드라는 것을 명시적으로 주지 않고 고루틴을 생성하면 알아서 스레드를 생성해주고 적절한 스레드에 고루틴을 할당합니다. goroutine 사이의 커뮤니케이션을 전부 채널을 통해서 한다면 동기화 문제를 신경 쓰지 않아도 된됩니.
- 네이티브 바이너리가 나온다.
- 결과를 배포하는 입장에서 네이티브 바이너리가 나온다는 것은 매우 큰 장점입니다. 요즘은 대부분 서버에 파이썬이나 JVM이 설치되어 있지만, 역시 배포는 네이티브 바이너리로 하는 것이 가장 편합니다.
- 그러나 바이트 코드를 생성하는 언어가 아니므로 바이너리만 배포하는 경우 (C와 C++처럼) 타겟 머신에 맞추어 각각 컴파일을 해야해야합니다.
- 인터페이스 기반의 폴리모피즘
- Go에서 폴리모픽한 코드를 작성하는 유일한 방법은 인터페이스를 인자로 넘기는 것입니다. 이 덕분에 인터페이스 단위의 추상화가 자연스럽게 이루어집니다.
단점
- 없는게 산더미입니다.
- 제네릭 문법 없음. 클래스 문법 없음(OOP 안녕~), 예외 처리 문법 없음, Public, Private 키워드 없음, this 문법 없음
- 메서드를 만들 수 있으며 인터페이스를 이용해서 다형성을 구현할 수 있습니다. Composition으로 상속을 대신할 수 있습니다.
- 덱과 같은 자료형이 제공되지 않습니다. (알고리즘 풀때 눈물....)
- 코드가 깔끔해 지지 못합니다.
- 예외 처리 문법이 없기에 if 문이 상당히 많이 사용됩니다. 읽기 힘든 지저분한 코드가 생깁니다.
- 좋은 IDE가 없습니다.
- C는 DEV C++, Visual Studio 등등, Java의 이클립스가 있지만 Go는 VS Code, Goland 말고 별다른 선택지가 없습니다.
- verbose 한 코드
- Go는 템플릿도 매크로도 없습니다. 이는 Go의 코드를 단순하게 만들어주는 장점도 있지만, 하지만 템플릿도 매크로도 없어서 단순한 코드가 반복해서 등장합니다.
- 중앙 저장소의 부재
- Go에서는 깃헙 등의 원격 저장소에 올라온 패키지를 go get 명령어로 다운로드 및 설치해서 사용합니다.
- 강력한 라이브러리 부재
- GORM 등 있지만 뭔가 아쉽습니다. 자바 진형의 강력한 JPA가 그립습니다.
- 파이썬의 Django, Flask와 같이 지배적인 라이브러리가 있는 것이 아니라 고만고만한 Echo, Gin, Beego 프레임워크가 있습니다.
- 버전관리
- 코드를 작성하면 formatter가 코드를 수정하는데 단순히 공백이 추가된 것을 git에서 수정된 라인으로 잡을 때가 있습니다. 커밋의 호읍이 길다면 실제 수정된 로직을 파악하기는 힘들어집니다.
- 우리나라 한정.. Go를 도입한 회사가 많이 없습니다.
- 자바 진형이 대세인 우리나라에서는 타 언어에 비해서 인럭풀이 많지 않습니다.
- 하지만 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)
- https://velog.io/@veloss/GoLang-%ED%83%90%EB%B0%A9%EA%B8%B0-golang%EC%9D%B4%EB%9E%80-vpjmr8weoa
- https://covenant.tistory.com/204