tonykang22 / study

0 stars 0 forks source link

[나만의 컨테이너 환경 만들기] go언어로 준비하기 #103

Open tonykang22 opened 1 year ago

tonykang22 commented 1 year ago

go 언어란


장점


Java 대비 Go의 장점

image


DevOps 커리어 추천 언어이다. Roadmap.sh


Go 기반 오픈소스 프로젝트 -> 컨테이너, 분산형 데이터베이스, 웹 서버 ...


코드 레벨로 컨테이너 실행 환경을 봐야하는 이유?



Go 간략하게 맛보기


# Go 언어 맛보기를 진행할 디렉토리를 생성한다.
ubuntu@ip-172-31-47-152:~$ mkdir -p ~/projects/box

# Linux 환경용 Go 언어를 다운받는다.
ubuntu@ip-172-31-47-152:~$ wget https://go.dev/dl/go1.19.1.linux-amd64.tar.gz

# 해당 명령어를 통해 기존의 Go에 대한 파일들을 삭제하고 새로 받은 tar의 압축을 풀어준다.
ubuntu@ip-172-31-47-152:~$ sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.19.1.linux-amd64.tar.gz

# profile 파일에 export PATH=$PATH:/usr/local/go/bin 로 path 설정
ubuntu@ip-172-31-47-152:~$ vi HOME/.profile

# 해당 profile 파일을 source 명령어로 바로 적용한다.
ubuntu@ip-172-31-47-152:~/projects/box$ source ~/.profile

# go version을 확인해본다.
ubuntu@ip-172-31-47-152:~$ go version
go version go1.19.1 linux/amd64

# 프로젝트 초기화 및 Go 모듈 생성
ubuntu@ip-172-31-47-152:~/projects/box$ go mod init example/box

# go mod init 명령어를 통해 생성된 go.mod 파일을 확인 (go.mod 파일은 오직 모듈의 루트 안에 존재한다.)
ubuntu@ip-172-31-47-152:~/projects/box$ cat go.mod

# Hello World 를 출력하는 main.go 를 작성해본다.
ubuntu@ip-172-31-47-152:~/projects/box$ vi main.go
package main

import "fmt"

func main() {
        fmt.Println("Type a word, then hit Enter.")
}
# go run 을 통해 실행할 수 있다.
ubuntu@ip-172-31-47-152:~/projects/box$ go run main.go
Hello World

# 외부 패키지를 포함하는 코드 실행
ubuntu@ip-172-31-47-152:~/projects/box$ vi main.go
package main

import (
    "fmt"
    "rsc.io/quote" // 외부 패키지
)

func main() {
    fmt.Println(quote.Hello())
}
# 패키지 의존성 관리 (필요 의존성 추가 및 필요없는 의존성 삭제 : go.mod 확인)
ubuntu@ip-172-31-47-152:~/projects/box$ go mod tidy

ubuntu@ip-172-31-47-152:~/projects/box$ go run main.go
Ahoy, world!

# 동시성 프로그램 작성해보기
ubuntu@ip-172-31-47-152:~/projects/box$ vi main.go
package main

import (
    "fmt"
    "time"
)

// 입력받은 word를 ch로 전달하는 함수 
func readword(ch chan string) {
    fmt.Println("Type a word, then hit Enter.")
    var word string
    fmt.Scanf("%s", &word)
    ch <- word
}

// 2초마다 "." 을 찍는 함수로 for문은 Java의 while문과 유사하다고 볼 수 있다.
func printchar() {
    for {
        fmt.Printf(".")
        time.Sleep(2 * time.Second)
    }
}

func main() {
        // code를 지연해서 사용할 수 있는 예약어로 해당 프로그램이 종료되기 전까지 지연되었다가 defer로 지정된 명령들을 수행하고 어플리케이션이 종료된다. 
        defer fmt.Println("===== BYE..")
        // 고루틴을 생성하는 방식으로 함수형 앞에 go 예약어를 지정하면 된다.
        go printchar()

        // make는 쓰레드간에 통신을 할 수 있는 채널을 만드는 것
    ch := make(chan string)
        // 그 이후 readword라는 함수 실행
    go readword(ch)

        // Java의 switch와 같은 역할로, ch 를 받아 case를 수행할 수 있다.
    select {
    case word := <-ch:
        fmt.Println("\nReceived: ", word)
    }
}
ubuntu@ip-172-31-47-152:~/projects/box$ go run .
Type a word, then hit Enter.
....hi

Received:  hi
# defer 명령어에 의해 프로그램이 종료되기 전까지 지연되었다가 실행됨을 볼 수 있다.
===== BYE..


주요 go 명령