Language/Golang

Golang 개요

아르비스 2019. 3. 6. 09:42

■ Go 언어 개요 

1. 컴파일 기반의 정적 타입 언어 (compiled language)

•Go언어는 컴파일 기반의 정적 타입언어임

•컴파일로 인해 파이썬(Python)이나 루비(Ruby)같은 인터프리터(interpreter) 언어로 개발할 때보다 버그 요소가 많이 줄어듬

•Go언어의 컴파일러는 C언어에서의 warning(예를 들면, 사용하지 않는 변수나 패키지를 import했을시에 Go 컴파일러는 오류를 발생시킵니다.) 에 해당하는 문제들도 모두 error로 만듬.

•Go언어는 컴파일 언어지만, C/C+의 해더파일이 없어서 헤더파일이 조금만 수정되어도 모두 다시 컴파일하는 그런 문제가 없고, 소스코드를 패키지화하여 변경된 부분만 컴파일하기 때문에 컴파일 시간이 엄청나게 빠름


2. 하지만 동적 언어 특성도 가진다

•Go언어는 interface가 있지만 따로 선언은 하지 않음 -> Duck Typing

•선언이 없이 인터페이스의 함수를 구현하면 그 인터페이스를 사용한다고 간주함.


3. 상속이 없다 (composition만 존재)

•Go언어는 상속이 없음.

•Go언어에서 일반적인 객체 지향 언어에서의 class의 역할을 struct가 맡고 있음.

•Go의 struct는 상속이 되지 않음. 

•대신 composition이라는 것이 존재함.


(정보) composition이란 : 한 타입과 다른 타입을 결합해서 사용할 수 있게 해주는 것을 의미. 이는 각 타입간의 결합도를 낮춰주는 효과가 있음. 일반적으로 상속을 사용해서 코딩을 하게 되면 class간의 관계가 tree형태로 만들어짐 따라서 상속을 계속 할수록 계층 구조가 점점 복잡해지고, 그 상황에서 여러가지 문제점이 발생할 수 있음.


4. 실행시 가비지 콜렉터 탑재 (Garbage Collection)  

•Go언어는 바이너리 빌드시 가비지 콜렉터를 내장함.

•C/C++처럼 개발자가 메모리 할당 및 해제를 신경쓰지 않아도 됩 

•Java처럼 가상머신이 필요하지도 않기 때문에, C/C++처럼 빠른 성능을 기대할 수 있음 


5. 멀티코어 환경 지원 (goroutine, channel)

•최근은 대부분의 컴퓨터가 멀티코어인 시대

•Go언어는 멀티코어 환경 지원을 위해 만들어진 언어 

•Go는 Goroutine이라는 논리적 쓰레드(Thread)를 기본적으로 제공 

•사용자는 멀티코어 및 쓰레드 사용에 대해 고민하지 않고, Goroutine을 사용하면 Go 런타임이 알아서 현재 cpu의 코어에 맞춰서 동시에 코드를 실행 

•Thread를 만들고 실행하고 종료하고 하는 별도의 불편한 과정이 필요없음 

•사용자는 손쉽게 멀티코어를 이용


■ Go 언어에 대하여

•구글이 2009년에 만든 비교적 새로운 프로그래밍 언어

•V8 자바스크립트 엔진 개발에 참여했던 Robert Griesemer, UTF-8을 만든 Rob Pike, 초창기 유닉스 운영체제를 설계했으며 B언어(C언어의 전신)를 개발한 Ken Thompson등 쟁쟁한 개발자들이 만든 언어

•구글이 개발 했다는 프리미엄과 함께 도커(Docker)의 개발 언어라는게 알려지면서 유명세

•Python이나 Java와 같은 범용 프로그래밍 언어이며, 시스템 프로그래밍과 네트워크 프로그램의 개발을 목표로 만들어진 언어

•최근에 만들어진 언어답게 C++, Java, Python 언어들의 장점을 상당 부분 수용

•최신 프로그래밍 언어들의 트랜드를 따를 것 같지만 코드는 C 언어와 매우 비슷한 느낌

•C 언어 처럼 컴파일이 되며, 컴파일 시간에 타입을 체크하는 정적 타입 언어

•C 언어처럼 단순하다. 약 25개 정도의 키워드만이 제공되는데, 실제 코드를 만들다 보면 10개 내외의 키워드 만으로 프로그래밍이 가능


  ■ Go 언어 목적

•Go는 정적 타입 컴파일 언어의 효율성과 동적 언어처럼 쉬운 프로그래밍을 할 수 있도록 하는 것을 목표

•안전성 : 타입 안전성과 메모리 안전성

•병행성과 통신을 위한 훌륭한 지원

•효과적인 가비지 컬렉션

•빠른 컴파일


■ Go 언어 도구


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

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

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

•go fmt: 코드 서식 지정

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

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

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

•go doc: 문서를 표시. HTTP를 통해 문서 확인.

•go rename: 변수, 함수 등을 형 안전(type-safe) 방식으로 이름 변경

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


프로파일링 및 디버깅 지원, 런타임 인스트루먼테이션(이를테면 가비지 컬렉션 일시 정지 등을 위해) 및 레이스 컨디션 테스터(race condition tester)도 포함