Go란?

Go 로고

Go란?

Golang은 2007년 구글에서 개발한 언어인데, 정확한 이름은 Go 언어이다.
Golang의 정식 웹 사이트에 따르면 Go는 간결하고 신뢰성 있으며 효율적인 소프트웨얼르 손쉽게 만들기 위한 오픈소스 프로그래밍 언어다.

Go 언어의 사용자들은 고퍼(Gopher)라고 부른다. 전반적으로 C에서 영향을 많이 받았으며, 컨테이너 기반 가상화 도구인 Docker를 개발하는 데에 사용된 언어이다. 또한 Go 언어를 이용해서 안드로이드와 iOS 앱을 제작할 수 있게 적용 중이다.

Python이 그렇듯 웹 개발에도 쓰이고 있고 특히 서버 사이드 언어로서 좋은 평가를 받고 있다. 또한, Go가 자체적으로 지원하는 라이브러리만으로도 간결하게 웹 사이트를 만들어 낼 수 있다.

Go의 주요기능

  • 정적 입력
    • Go는 정적으로 입력된다. 즉, 컴파일 시 변수의 데이터 유형이 확인된다. 이렇게 하면 프로그램이 실행되기 전에 잠재적인 오류를 탐지하고 성능을 향상시킬 수 있다.
  • 단순성
    • Golang은 작고 이해하기 쉬운 문법으로 단순하고 미니멀한 것을 목표로 한다. 이것은 개발자들이 배우고 사용하는 것을 더 쉽게 만든다.
  • 동시성
    • Go는 고루틴과 채널을 통해 동시 프로그래밍을 지원한다.
    • 루틴은 독립적으로 실행할 수 있는 경량 동시 기능인 반면 채널은 고루틴 간의 안전한 통신을 가능하게 한다.
  • 가비지 컬렉션
    • Go에는 자동 메모리 관리 기능이 있는데, 이는 언어가 메모리 할당 및 할당 해제를 처리한다는 것을 의미한다. 이를 통해 메모리 누수 위험을 줄이고 안전하고 효율적인 코드를 쉽게 작성할 수 있다.

      가비지 컬렉션: 프로그램이 동적으로 할당한 메모리 중에서 더 이상 사용되지 않는 부분을 자동으로 찾아내어 해제하는 기술이다. 쉽게 말해, 프로그램에서 더 이상 필요하지 않은 “쓰레기” 메모리를 자동으로 청소해 주는 역할을 한다.

  • 빠른 컴파일
    • Go는 빠르게 컴파일 되므로 코드가 빌드되기를 기다리는 시간을 줄여 개발자 생산성을 향상시킬 수 있다.
  • 표준 라이브러리
    • Go는 파일 처리, 네트워킹 및 데이터 조작을 포함한 광범위한 기능을 포함하는 풍부한 표준 라이브러리를 가지고 있다.

Go의 장단점

  • 장점
    • 단순성
      • Golang은 깔끔하고 최소주의적인 구문으로 단순하도록 설계되었다. 따라서 개발자들이 코드를 배우고, 읽고, 유지보수하는 것을 더 쉽게 만든다.
    • 동시성 지원
      • Go는 고루틴과 채널을 이용한 동시 프로그래밍 지원이 내장되어 있어 동시, 병렬, 분산 시스템 개발에 적합하다.
    • 성능
      • Go는 네이티브 머신 코드로 컴파일되어 종종 고성능 실행 파일을 생성한다. 또한 가비지 수집기와 메모리 관리 시스템은 지연 시간을 최소화하도록 설계되었다.
    • 빠른 컴파일
      • Go는 빠르게 컴파일되므로 코드가 빌드되기를 기다리는 시간을 줄여 개발자 생산성을 향상시킬 수 있다.
    • 교차 플랫폼 호환성
      • Go는 크로스 컴파일을 지원하여 개발자들이 단일 코드베이스에서 다양한 플랫폼(윈도우즈, macOS, 리눅스 등)을 위한 실행 파일을 구축할 수 있게 한다.
    • 강력한 표준 라이브러리
      • Go는 네트워킹, 파일 처리 및 데이터 조작과 같은 광범위한 기능을 포함하는 포괄적인 표준 라이브러리를 포함한다.
    • 정적 타이핑
      • Go는 정적으로 입력된 언어로, 컴파일 시 잠재적인 오류를 감지하고 성능을 향상시키며 코드를 더 읽기 쉽고 유지 관리할 수 있게 한다.
  • 단점
    • 제한된 언어 기능
      • Generics (Go 1.18에서 추가되었지만)와 예외아 같은 다른 현대 프로그래밍 언어에서 발견되는 일부 언어 기능은 의도적으로 생략한다. 이는 일부 작업을 구현하기가 더 어렵거나 장황하게 만들 수 있다.
    • 소규모 에코 시스템
      • Go의 생태계는 성장하고 있지만, 자바, 파이썬 또는 자바스크립트와 같은 더 확립된 언어들과 비교하면 여전히 작다. 즉, 특정 작업에 사용할 수 있는 라이브러리와 도구가 적을 수 있다.
    • GUI 개발
      • Go는 GUI 개발에 널리 사용되지 않으며 그래픽 데스크톱 애플리케이션을 만드는 생태계가 다른 언어에 비해 성숙하지 못하다.
    • 모바일 개발
      • 모바일 개발을 위해 Golang을 사용하는 것은 가능하지만, 이 언어는 자바, 코틀린, 스위프트와 같은 다른 언어들만큼 대중적이거나 잘 지원되지 않는다.
    • 학습 곡선
      • 비록 Golang이 단순하도록 설계되었지만, 일부 개발자들은 동시성, 오류 처리 및 언어의 다른 측면에 대한 고유한 접근법에 익숙하지 않으면 학습 곡선이 더 가파르다고 생각할 수 있다.

고루틴(Goroutine)과 채널

고루틴

고루틴은 Go 언어에서 동시성을 구현하기 위한 가변운 “스레드”와 같은 개념이다. 하지만 실제로는 스레드보다 훨씬 가볍고, 시스템 리소스를 덜 사용한다.
고루틴은 함수를 동시에 실행할 수 있게 해주며, 그렇기 때문에 I/O 바운드나 CPU 바운드 작업을 효율적으로 처리할 수 있다.
go 키워드를 사용하여 간단하ㅣ 고루틴을 생성할 수 있다.

  go doSomething()    // doSomething 함수를 고루틴으로 실행

채널(Channel)

채널은 Go에서 고루틴들 간에 데이터를 안전하게 전송할 수 있는 통신 메커니즘이다. 채널을 통해 데이터를 전송하면, 한 고루틴이 채널에 데이터를 보내고 다른 고루틴이 그 데이터를 받아 처리할 수 있다.
채널은 고루틴들 사이에 데이터를 주고받는 것을 동기화하는 역할도 하기 때문에, 멀티 스레딩 환경에서 발생할 수 있는 여러 문제를 예방하는 데에 유용하다.

  ch := make(chan int)    // int 타입을 전송할 수 있는 채널 생성

  go func() {
    ch <- 42    // 채널에 42를 보냄
  }()

  value := <-ch     // 채널에서 값을 받음 (value는 이제 42)

요악하자면 고루틴은 여러 일을 동시에 처리하게 해주고, 채널은 그 일들 사이에서 안전하게 정보를 주고받을 수 있게 도와주는 기능이다.

출처
https://brownbears.tistory.com/147
https://mzguide.com/entry/Golang%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

* TOC {:toc}

© 2021. All rights reserved.