Kubernetes, Docker 등은 문서화가 잘되어 있으나, 계속 진보 중이기 때문에 변화무쌍하기도 하다.
코드 레벨의 확인을 할 수 있다면 보다 해당 사안들에 대해 이점이 있을 것이기 때문이다.
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 언어란
장점
Java 대비 Go의 장점
DevOps 커리어 추천 언어이다. Roadmap.sh
Go 기반 오픈소스 프로젝트 -> 컨테이너, 분산형 데이터베이스, 웹 서버 ...
코드 레벨로 컨테이너 실행 환경을 봐야하는 이유?
Go 간략하게 맛보기
주요 go 명령