Go 란?

쌈지몬·2023년 6월 5일
0

1. Go 이란?

  • 2009년에 구글에서 일하는 로버트 그리즈머, 롭 파이크, 켄 톰프슨이 개발한 프로그래밍 언어
  • 개발자 중 한명인 켄 톰프슨은 Unix와 C언어의 개발자 중 한명이기도 하여 Go 언어는 C 언어의 영향을 많이 받았음
  • 이 언어는 이름이 이름이다보니 종종 고랭(Golang)으로 많이 검색하거나 발음하지만 정확한 명칭은 Go 이다.

2. Go 특징

Go 언어는 다른 프로그래밍 언어 (C++, Java, Python)의 장점들을 뽑아 만들어졌다.

1. 정적 타입, 강 타입

  • 정적 타입: 파이썬과 달리 C언어처럼 int a=1 방식으로 자료형을 정적으로 선언
  • 강 타입: 약 타입은 값의 자료형을 바꿀 수 있고 강 타입은 자료형을 바꿀 수 없음을 의미
  • 정적 타입, 강 타입 -> 안정성

2. 컴파일 언어 / 빠른 컴파일 속도

  • 컴파일 속도가 빨라서 인터프리터 언어처럼 쓸 수 있음 (vs. C, C++)
  • 컴파일 결과물로 네이티브 바이너리가 생성되기 때문에 별도의 실행 패키지 없이 실행 가능 (vs. Java - JVM, Python)

3. 간단한 문법 체계

  • Go는 단순하고 간결한 프로그래밍 언어를 지향
  • Java의 절반에 해당하는 25개의 키워드만으로 프로그래밍이 가능
  • ex 1> loop 문법으로 while이 없고 오직 for만 존재
  • ex 2> class 문법이 없음

4. 가비지 컬렉션

  • Java와 같이 Go는 Garbage Collection 기능을 제공
  • 사용자가 메모리 관리에 신경쓸 필요 없이 필요한 로직 개발에 집중하면 됨

5. 병행성 (Concurency)

  • 병행 처리를 위해 고루틴 (GoRoutine)이라는 경량 쓰레드 제공
  • 병행성 (Concurency)는 병렬성 (Parellism)과 다른 개념
병행성

동시 처리의 논리적인 개념(구조, 설계)
단일(또는 멀티) 코어에서 스레드 여러 개가 시간을 쪼개어 순차적(시분할)으로 실행됨
사람이 느끼기에 동시로 느껴짐

병렬성
동시 처리의 물리적인 개념(실행)
작업을 여러 CPU에 나눠서 동시에 처리하는 상태
실제로도 실행이 동시적인 시점을 가짐

6. 모듈화 및 패키지 시스템

  • 코드의 재사용을 위한 모듈화 시스템, 인터넷을 통해 패키지 사용 가능
  • 다른 패키지 기반의 언어 (e.g Java)와 비교했을 때, 사용자가 별도의 패키지 업로드 과정을 진행하지 않아도 소스코드 push만으로 해당 모듈 활용 가능
    • Github과 같은 Public VCS (Version Control System)에 소스코드를 push하게 되면 해당 코드 내용을 기반으로 하는 모듈이 Go 모듈 미러 저장소에 게시됨 (pkg.go.dev는 모듈 저장소가 아닌 모듈에 대한 정보를 제공하는 사이트 / 참고: https://pkg.go.dev/about#best-practices-h2)
    • Go 설정을 통해 모듈을 미러 저장소가 아닌 VCS에서 직접 가져올 수 있음 (GOPROXY, GOPRIVATE)
  • 예시) Terraform 라이브러리 활용을 위해 terraform github 주소를 설정하여 import 가능

3. Go 문법

  • Go 에서 중요한 문법 사항 정리 (그외 자세한 문법 내용은 http://golang.site/ 참고)

(1) 변수와 상수

1. 변수

  • 변수는 Go 키워드 var 를 사용하여 선언한다.
  • var 키워드 뒤에 변수명을 적고, 그 뒤에 변수타입을 적는다.
var a int 
  • 변수 선언문에서 변수 초기값을 할당할 수도 있다.
var f float32 = 11.
  • 변수를 선언하면서 초기값을 지정하지 않으면, Go는 Zero Value를 기본적으로 할당한다. (
    숫자형에는 0, bool 타입에는 false, 그리고 string 형에는 "")
  • 변수를 선언하는 또 다른 방식으로 Short Assignment Statement ( := ) 를 사용
i := 1 

2. 상수

  • 상수는 Go 키워드 const 를 사용하여 선언한다.
  • const 키워드 뒤에 상수명을 적고, 그 뒤에 상수타입, 그리고 상수값을 할당한다.
const c int = 10
const s string = "Hi"
  • Go 에서는 할당되는 값을 보고 그 타입을 추론하는 기능이 제공
  • 타입 int, string 을 생략하면 Go에서 자동으로 그 타입을 추론
const c = 10
const s = "Hi"
  • 여러 개의 상수들 묶어서 지정할 수 있는데, 아래와 같이 괄호 안에 상수들을 나열하여 사용할 수 있다.
const (
    Visa = "Visa"
    Master = "MasterCard"
    Amex = "American Express"
)

3. Go 키워드

  • Go 프로그래밍 언어는 다음과 같은 25개의 예약 키워드들을 갖는다.
  • 이들 Go 키워드들은 변수명, 상수명, 함수명 등의 Identifier로 사용할 수 없다.
break        default      func         interface    select
case         defer        go           map          struct
chan         else         goto         package      switch
const        fallthrough  if           range        type
continue     for          import       return       var

(2) 조건문

  • if 문은 해당 조건이 맞으면 { } 블럭안의 내용을 실행한다.
  • Go의 if 조건문은 아래 예제에서 보듯이 조건식을 괄호( )로 둘러 싸지 않아도 된다. 그리고 반드시 조건 블럭 시작 브레이스({)를 if문과 같은 라인에 두어야 한다. 이를 다음 라인에 두게 되면 에러를 발생시킨다.
  • 그리고 한가지 주목할 점은 if 문의 조건식은 반드시 Boolean 식으로 표현되어야 한다는 것이다. 이점은 C/C++ 같은 다른 언어들이 조건식에 1, 0 과 같은 숫자를 쓸 수 있는 것과 대조적이다.
if k == 1 {  //같은 라인
    println("One")
}
  • if 문과 마찬가지로 else if 혹은 else 문의 블럭 시작 브레이스는 같은 라인에 있어야 한다.
if k == 1 {
    println("One")
} else if k == 2 {  //같은 라인
    println("Two")
} else {   //같은 라인
    println("Other")
}

(3) 반복문

  • Go 프로그래밍 언어에서 반복문은 for 루프를 이용한다. Go는 반복문에 for 하나 밖에 없다. - for 루프는 다른 언어와 비슷하게 "for 초기값; 조건식; 증감 { ... }" 의 형식을 따른다.
  • 초기값, 조건식, 증감식 등은 경우에 따라 생략할 수 있다.
package main
 
func main() {
    sum := 0
    for i := 1; i <= 100; i++ {
        sum += i
    }
    println(sum)
}

* 조건식만 쓰는 for 루프

package main
 
func main() {
    n := 1
    for n < 100 {
        n *= 2      
        //if n > 90 {
        //   break 
        //}     
    }
    println(n)
}

* for range 문

  • for range 문은 컬렉션으로 부터 한 요소(element)씩 가져와 차례로 for 블럭의 문장들을 실행한다. 이는 다른 언어의 foreach와 비슷한 용법이다.
names := []string{"홍길동", "이순신", "강감찬"}
 
for index, name := range names {
    println(index, name)
}

(4) 함수

  • 함수는 여러 문장을 묶어서 실행하는 코드 블럭의 단위이다. Go에서 함수는 func 키워드를 사용하여 정의한다.
  • func 뒤에 함수명을 적고 괄호 ( ) 안에 그 함수에 전달하는 파라미터들을 적게 된다. 함수 파라미터는 0개 이상 사용할 수 있는데, 각 파라미터는 파라미터명 뒤에 int, string 등의 파라미터 타입을 적어서 정의한다.
  • 함수의 리턴 타입은 파라미터 괄호 ( ) 뒤에 적게 되는데, 이는 C와 같은 다른 언어에서 리턴 타입을 함수명 앞에 쓰는 것과 대조적이다. 함수는 패키지 안에 정의되며 호출되는 함수가 호출하는 함수의 반드시 앞에 위치해야 할 필요는 없다.
package main
func main() {
    msg := "Hello"
    say(msg)
}
 
func say(msg string) {
    println(msg)
}

(5) defer (지연실행)

  • Go 언어의 defer 키워드는 특정 문장 혹은 함수를 나중에 (defer를 호출하는 함수가 리턴하기 직전에) 실행하게 한다.
  • 일반적으로 defer는 C#, Java 같은 언어에서의 finally 블럭처럼 마지막에 Clean-up 작업을 위해 사용된다.
  • Kuberentes Operator에서 리소스를 최종적으로 업데이트하기 위해서 주로 사용
package main
 
import "os"
 
func main() {
    f, err := os.Open("1.txt")
    if err != nil {
        panic(err)
    }
 
    // main 마지막에 파일 close 실행
    defer f.Close()
 
    // 파일 읽기
    bytes := make([]byte, 1024)
    f.Read(bytes)
    println(len(bytes))
}

(6) 고루틴

  • Go루틴(goroutine)은 Go 런타임이 관리하는 Lightweight 논리적 (혹은 가상적) 쓰레드(주1)이다. Go에서 "go" 키워드를 사용하여 함수를 호출하면, 런타임시 새로운 goroutine을 실행한다.
  • 여기서 goroutine들은 그 실행순서가 일정하지 않으므로 프로그램 실행시 마다 다른 출력 결과를 나타낼 수 있다.
package main
 
import (
    "fmt"
    "time"
)
 
func say(s string) {
    for i := 0; i < 10; i++ {
        fmt.Println(s, "***", i)
    }
}
 
func main() {
    // 함수를 동기적으로 실행
    say("Sync")
 
    // 함수를 비동기적으로 실행
    go say("Async1")
    go say("Async2")
    go say("Async3")
 
    // 3초 대기
    time.Sleep(time.Second * 3)
}

Reference

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)
http://golang.site/go/basics
https://m.blog.naver.com/dsz08082/221970891331

profile
What goes around comes around.

0개의 댓글