Golang 특징

1. 특징

1) 정적 컴파일 언어

JVM을 이용하는 Java와 같이 Runtime에 환경에 맞는 기계어로 번역을 하는 동적 컴파일 언어가 아닌 c나 c++와 같이 한번 compile을 통해 특정환경에 맞는 실행파일을 만들어내는 정적 컴파일 언어이다.

정적 컴파일 언어는 환경(Os, CPU종류)들이 다양해지면서 NxM개의 수만큼 많은 번역기가 존재했어야 하는 단점이 존재해 동적 컴파일 언어가 많은 인기였지만, 정적 컴파일 언어보다는 비교적 속도가 떨어지고 환경이 과거에 비해 비교적 고착화 되어감에 따라 다시 빠른 성능을 보여주는 정적 컴파일언어 형태로 GO가 만들어졌다.

또한, 환경에 맞게 다른 코드를 짜는 것처럼 번거로웠던 단점을 고쳐 Go는 OS에 맞는 환경변수를 바꿔주기만 하면 쉽게 다른 환경의 프로그램으로 build가 가능하다.

  • go build : 현재 운영체제(GOOS환경변수)에 맞는 실행 파일 build
  • go env : Go의 환경변수목록을 보여주는 명령어
    • GOOS : build할 운영체제

window -> linux

$Env:GOOS = "linux" go build

powerShell의 $Env 명령어로 GOOS를 linux로 바꿔주면 linux실행파일로 build가 된다.

linux -> window

GOOS="windows" go build

2) 강타입 언어

타입이 다른 연산을 해도 자동으로 형변환을 해서 연산을 수행하는 약타입 언어가 아닌 GO는 무조건 타입이 같아야 하는 최강타입 언어 이다.

강타입 언어이기 때문에 제네릭도 존재하지 않는데 이것이 현재 뜨거운 논란 주제라고 한다.


3) GarbageCollector 존재

정적 타입언어임에도 c,c++과 같이 GC가 없는 것이 아닌 Java와 같이 GC가 존재한다.

메모리를 지우는데 1ms미만의 시간이 걸리는 빠른 GC를 가지고 있다.


4) 클래스 x, 상속 x, 메서드 o, 인터페이스 o

기본적으로 class가 없고 class가 없기 때문에 상속도 없다. 상속과 클래스가 없다고 GO는 OOP가 안된다라는 말이 있는데 이는 나는 개인적으로 틀린 생각이다.

클래스가 없는 대신 c와 비슷한 struct를 이용해 클래스와 같이 사용할 수 있고 상속은 오히려 결합도를 높이기도 하고 많은 문제를 갖을 수 있어 상속이 없다고 OOP가 아닌 것은 아니다.

C처럼 struct은 필드밖에 가지지 못하지만 함수앞에 특별한 인자로 구조체에 함수를 할당하는 식으로 메서드를 갖을 수 있어 이것이 클래스 기능을 수행하고 상속은 없지만 인터페이스는 존재한다.


5) 익명 함수

js의 익명함수와 같이 go도 익명함수를 제공한다.


6) 동시성 지원

GoRutine이라고 부르는 go 함수와 같이 go키워드를 통해 쉽게 동시성(스레드)를 지원하고 Native(OS) 스레드에 매칭되는 Java의 스레드와 달리 Go런타임이 스레드를 관리하며 Multiplexing을 이용해 훨씬 적은 os쓰레드를 사용하고 스택의 사이즈도 매우 작으며 필요시에 동적으로 증가한다.

또한, go채널(chan)을 이용해 go루틴간의 통신을 제공하고, runtime.GOMAXPROCS() 를 이용하면 병렬 처리도 할 수 있게 제공한다. GO는 기본적으로 CPU 1개를 사용하나 이 명령어를 이용하면 다수의 CPU를 이용할 수 있다.

In programming, concurrency is the composition of independently executing processes, while parallelism is the simultaneous execution of (possibly related) computations. Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.

- golang.org -

이때 동시성을 위한 go루틴과 병렬성을 위한 runtime.GOMAXPROCS() 는 엄연히 개념이 다르고 golang공식 문서에서는 위와 같이 말하고 있다.

동시성은 독립적으로 실행되는 프로세스 구성이고 병렬성은 한가지나 특정 목적을 위한 계산을 동시에 여러군데에서 실행하는 것. 한마디로, 동시성은 많은 작업들을 동시에 처리하는 것이고 병렬성은 많은 것들을 여러개가 동시에 하는 것


7) 패키지 관리

npm이나 maven, gradle…와 같은 패키지 관리를 go에서도 지원하고 있는데 go get이나 go install로 패키지를 설치 할 수 있고 import명령어로 패키지를 사용할 수 있다.

또한 네임스페이스는 존재하지 않고 모든 코드는 패키지 단위로 분리한다.





Reference

Tucker의 Go 강좌

Tags :

Related Posts

Red Black Tree

Red Black Tree

BST (이진 탐색 트리)를 기반으로 둔 Tree. Tree의 Rebalancing 방법 중 하나로 balanced한 트리이다. 각 노드는 값(key)말고도 색을 갖고 있으며, 색은 레드 or 블랙 2종류이다. 1. Red Black Tree가 갖는 특성 Root Property : 루트(root)노드는 블랙(black)이다. External Property : 모든 외부 노드 (external node)는 블랙이다. Depth Property : 모든 단말 노드(leaf node)의 경우 루트부터 외부 노드 까지 방문하는 블랙 노드의 수가 같다. Internal Property : 빨강 노드의 자식은 블랙이다. == No Double Red : 레드 노드는 두개가 연속해서 올 수 없다....

Read More
[WSL2] 포트포워딩과 window에서 workbench로 접속하기

[WSL2] 포트포워딩과 window에서 workbench로 접속하기

WSL2를 이용하여 개발을 진행서 외부에서 접근하고 싶거나, 배포를 위해 접근하고 싶을 수가 있는데, 문제가 되는 것이 WSL2는 VM과 같은 환경이라 별도의 IP를 갖는다는 점이다. 그러면 포트포워딩을 하면 되지 않느냐라고 할 수 있는데 맞다 포트포워딩을 하면된다 하지만 재부팅을 할때마다 변경되는 IP에 매번 포트 포워딩을 할 수 없는 노릇이기에 Powershell 파일을 이용하여 재부팅마다 wsl2의 ip를 잡아 특정 포트를 포트포워딩 하는 방법을 남기려고 한다....

Read More
문자열

문자열

문자의 집합(배열)이라는 의미이다. 기존의 문자는 ASCII코드로 1byte를 갖기 때문에 0255로 총 255개의 문자를 표현할 수 있었는데 이 수로는 현재 존재하는 언어(문자)들을 모두 표시할 수 없기 때문에 더 큰 byte의 문자가 필요해졌다. 대표적으로 UTF-8이 있는데 이는 한 문자당 14byte를 갖고 UTF-16은 2byte를 갖는다....

Read More