-
Go
Go는 2007년에 구글에서 개발한 언어로 Golang 혹은 Go언어로 불린다.
Go는 간결하고 신뢰성이 있으며, 효율적인 소프트웨어를 손쉽게 만들기 위한 오픈소스 프로그래밍 언어다.
Go는 프로그래밍 언어로 간결한 문법과 생산성을 제공하는 프로그래밍을 할 수 있다. 또한 언어자체에서 GC(Galbage collection)을 지원하고, 정적타입과 동적타입을 동시에 제공하고 스레드와 비슷한 개념인 Goroutine을 통해 좀 더 쉬운 동시성 프로그래밍을 제공한다.
Go 특징
간결한 문법
Go언어는 다른 언어 대비 키워드 수가 적다. Java나 C++, C#, PHP등 키워드의 수가 많으며, 학습하는데 꽤 시간이 걸리지만 Go는 상대적으로 키워드 수가 적기 때문에 상당히 간결하고 배우는데 오랜시간이 걸리지 않는다.
개발 속도 및 컴파일 언어
인터프리터 방식이 언어가 아닌 컴파일 방식의 언어로 개발을하게 되면 애플리케이션을 컴파일하면 정말 많은 시간이 걸린다. Go는 간결한 의존성 해석 알고리즘을 통해서 다른 컴파일 언어에 비해 빠르게 동작하는 컴파일러를 제공한다.
즉, Go에서는 직접적인 참조를 하는 라이브러리만을 해석한다는 뜻이다. 사용하지 않는 라이브러리는 해석을 하지 않기 때문에 좀 더 빠르게 해석하는 것이다.
동적언어, 정적언어
Go는 컴파일 기반 정적 타입 언어다. 하지만 동적 언어의 특성도 수용하기 때문에 Go는 컴파일러의 안정성을 보장 받으면서 동적언어의 유연함과 자유도를 얻을 수 있다는 것이다.
Galbage collection (GC - 메모리 관리)
Go에는 메모리를 직접 관리할 필요가 없다. 왜냐하면 Galbage collection이 존재하기 때문이다.
Galbage collection은 C, C++에서는 메모리를 할당하면 반드시 메모리를 해제 해주어야한다. 로직 작성보다 메모리 관리에 더 많은 노력과 시간을 소모하게 되어 생산성이 떨어진다.
이러한 문제로 메모리를 알아서 관리해주는 Galbage collection 기술이 나왔고, Java, C#에 등장하게 된 것이다.
Go는 메모리를 관리해주는 Galbage collector가 실행 파일안에 내장되어 있어서, 가상머신위에서 실행되는 언어들처럼 가상 머신이 메모리를 관리해주는 것과 차이가 있다.
동시성
Go는 동시성 프로그래밍에 대한 지원은 정말 강력한 기능중 하나다. Go는 동시성을 지원하기 위해서 Goroutine이라는 것을 지원한다.
Goroutine은 스레드와 유사하지만 더 적은 메모리를 소비하여 더 적은 양의 코드로 구현할 수 있는 데이터 구조다. 또한 Goroutine들이 필요한 데이터를 먼저 사용하기 위해서 경쟁하는 것이 아니라 Goroutine간에 데이터를 서로 전송할 수 있기 때문에 프로그래밍 모델이 더 간결해진다.
Goroutine은 프로그램의 진입점 함수를 비롯하여 다른 Goroutine과 함께 동시에 실행되는 함수다. 만약 다른 프로그래밍에서 이런 일을 가능하게 하려면 스레드를 사용해야하지만 Go에서는 여러개의 Goroutine이 하나의 스레드에서 동작한다.
Go에서는 대표적인 고루틴 이용예시는 net/http다. net/http는 Go에 있는 라이브러리인데 net/http는 Goroutine을 이용한 동시성 기능을 자체적으로 지원하는데, 만약 서버로 유입된 각각의 요청들이 자동적으로 각자의 Goroutine에서 동작하게 된다.
Goroutine은 스레드보다 적은 메모리를 사용하여 Go런타임이 설정한 논이 프로세스의 개수에 따라 자동적으로 Goroutine을 실행하게 된다.
Type System
Go는 계층구조가 없는 유연한 Type System을 제공하기 때문에 리팩토링에 대한 부담을 최소화하면서 코드를 재사용할 수 있다. 객체지행에 비해서 훨씬 간편하게 객체지향 프로그래밍이 가능하다는 것이다.
Go는 합성이라고 부르는 디자인 패턴과 마찬가지의 방법으로, 기능을 재사용하기 위해 Type을 임베드한다. 다른 언어들도 합성패턴을 사용하지만 종종 상속과 너무 강하게 연결되어 결국에는 코드 재사용이 복잡하고 어려워지는 경향이 있다. 또한 Go는 모델의 Type을 모델링하는 것이 아니라 동작을 모델링할 수 있는 독특한 interface를 구현할 수 있다.
출처: https://velog.io/@veloss/GoLang-%ED%83%90%EB%B0%A9%EA%B8%B0-golang%EC%9D%B4%EB%9E%80-vpjmr8weoa
'Go' 카테고리의 다른 글
[Go] Go String Formatting (0) 2022.04.28