1. Go ์ธ์ด๋?
Go ์ธ์ด(์ค์ฌ์ Golang)๋ Google์์ 2009๋
์ ๊ฐ๋ฐํ ์คํ์์ค ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์
๋๋ค.
์ค๊ณ์๋ Rob Pike, Ken Thompson, Robert Griesemer โ C ์ธ์ด์ Unix๋ฅผ ๋ง๋ ์ ์ค์ ์ธ ๊ฐ๋ฐ์๋ค์ด์ฃ .
Go๋ โC์ ์ฑ๋ฅ + Python์ ๊ฐ๊ฒฐํจโ์ ๋ชฉํ๋ก ๋ง๋ค์ด์ก์ต๋๋ค.
์ฆ, ๋น ๋ฅด๊ณ ์์ ์ ์ธ ์์คํ
ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ๋ฉด์๋ ์์ฐ์ฑ์ด ๋์ ์ธ์ด์
๋๋ค.
2. Go ์ธ์ด์ ์ฃผ์ ํน์ง
โ ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ธ ๋ฌธ๋ฒ
Go๋ ๋ฌธ๋ฒ์ด ๋จ์ํ๊ณ , ๋ค์ฌ์ฐ๊ธฐ๋ ๊ดํธ ์คํ์ผ์ด ํต์ผ๋์ด ์์ต๋๋ค.
์๋ ์ฝ๋ ํฌ๋งทํฐ(go fmt) ๋๋ถ์ ํ ๋ด ์ฝ๋ ์คํ์ผ์ด ํญ์ ๋์ผํฉ๋๋ค.
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
โก ๋น ๋ฅธ ์ปดํ์ผ๊ณผ ๋จ์ผ ๋ฐ์ด๋๋ฆฌ
Go๋ ์ ์ ์ปดํ์ผ ์ธ์ด๋ก, ๋น๋ ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ฉฐ, ์คํ ํ์ผ ํ๋๋ก ๋ชจ๋ ์์กด์ฑ์ด ํฌํจ๋ฉ๋๋ค.
์ด๋ ์๋ฒ ๋ฐฐํฌ๋ CLI ๋๊ตฌ ์ ์์ ํฐ ์ฅ์ ์ด ๋ฉ๋๋ค.
๐งต ๊ณ ๋ฃจํด(Goroutine) ๊ธฐ๋ฐ์ ๋์์ฑ
Go์ ํต์ฌ์ ๊ณ ๋ฃจํด(Goroutine) ์
๋๋ค.
์์ฒ ๊ฐ์ ํจ์๋ฅผ ๋์์ ์คํํ ์ ์์ผ๋ฉฐ, ์์คํ
์์์ ๊ฑฐ์ ์๋ชจํ์ง ์์ต๋๋ค.
func say(msg string) {
fmt.Println(msg)
}
func main() {
go say("Hello")
go say("World")
time.Sleep(time.Second)
}
๐งฑ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ (GC)
Go๋ ๊ฐ๋น์ง ์ปฌ๋ ์
(GC)์ ์ง์ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ถ๋ด์ ๋์ด์ค๋๋ค.
C/C++์ฒ๋ผ ์๋ ํด์ ๊ฐ ํ์ ์์ง๋ง, ์ฑ๋ฅ์ ์ฌ์ ํ ๋น ๋ฆ
๋๋ค.
3. JSON ์ฒ๋ฆฌ โ Go์ ํ์ค์ ์ธ ๋ถํธํจ
Go ์ธ์ด๋ฅผ ์ฒ์ ๋ฐฐ์ฐ๋ ์ฌ๋๋ค์๊ฒ ๊ฐ์ฅ ์์ฃผ ๋์ค๋ ๋ง์ด ์์ต๋๋ค:
โGo์์ JSON ๋ค๋ฃจ๋ ๊ฑด Python๋ณด๋ค ์ด๋ ต๋ค.โ
์ด๊ฑด ์ฌ์ค์ ๋๋ค.
๐ Python์ JSON ์ฒ๋ฆฌ (๊ฐ๋จํจ)
Python์ ๋์ ํ์ดํ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์, JSON์ ๋ค๋ฃฐ ๋ ๋งค์ฐ ์ง๊ด์ ์ ๋๋ค.
import json
data = '{"name": "Heejune", "age": 35}'
obj = json.loads(data)
print(obj["name"]) # Heejune
obj["age"] = 36
print(json.dumps(obj))
๋ณ๋์ ๊ตฌ์กฐ์ฒด๋ ํ์ ์ ์ ์์ด ๋ฐ๋ก ๋์ ๋๋ฆฌ๋ก ์ ๊ทผํ ์ ์์ฃ .
๐น Go์ JSON ์ฒ๋ฆฌ (๋ช ์์ ํ์ ํ์)
Go๋ ์ ์ ํ์ดํ ์ธ์ด๋ผ์, JSON ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ ์ ๊ตฌ์กฐ์ฒด(struct)๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค.
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
jsonData := []byte(`{"name":"Heejune","age":35}`)
var p Person
if err := json.Unmarshal(jsonData, &p); err != nil {
panic(err)
}
fmt.Println(p.Name) // Heejune
// ๋ค์ JSON์ผ๋ก ๋ณํ
newData, _ := json.Marshal(p)
fmt.Println(string(newData))
}
์ด์ฒ๋ผ Go์์๋:
- ๊ตฌ์กฐ์ฒด ํ๋๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํด์ผ ํ๊ณ ,
- JSON ํ๊ทธ(
json:"name")๋ฅผ ๋ถ์ฌ์ผ ํ๋ฉฐ, Unmarshal/Marshal๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
๐ค ์ ์ด๋ ๊ฒ ๋ณต์กํ ๊น?
Go๋ **๋ช
์์ ํ์
์์ ์ฑ(type safety)**์ ๋งค์ฐ ์ค์ํ๊ฒ ์ฌ๊น๋๋ค.
Python์ฒ๋ผ ์์ ๋กญ๊ฒ ๋ค๋ฃจ๋ ๋์ , ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ปดํ์ผ ์์ ์ ๋ณด์ฅ๋ฐ์ต๋๋ค.
๊ทธ๋์ ๋ฐํ์ ์ค๋ฅ๋ ์ค์ด๋ค์ง๋ง, ์ฝ๋ ์์ฑ๋์ ๋์ด๋๋ ๋จ์ ์ด ์์ต๋๋ค.
๐ก ์ค๋ฌด ํ: interface{}๋ฅผ ์ด์ฉํ ์ ์ฐํ ํ์ฑ
์ ํํ ๊ตฌ์กฐ์ฒด๊ฐ ์ ํด์ ธ ์์ง ์๋ค๋ฉด ์๋์ฒ๋ผ map[string]interface{}๋ก ์ฒ๋ฆฌํ ์๋ ์์ต๋๋ค.
var data map[string]interface{}
json.Unmarshal([]byte(`{"x":10,"y":20}`), &data)
fmt.Println(data["x"]) // 10
ํ์ง๋ง ์ด ๊ฒฝ์ฐ์๋ ํ์ ์บ์คํ ์ด ํ์ํฉ๋๋ค:
x := data["x"].(float64)
์ฆ, Go๋ JSON์ โ์์ ํ๊ฒโ ๋ค๋ฃจ๊ธฐ ์ํด ์๋์ ์ผ๋ก ๋ณต์กํ๊ฒ ๋ง๋ค์ด๋ ์ ์ ๋๋ค.
4. Go์ ์ค์ ํ์ฉ ๋ถ์ผ
| ๋ถ์ผ | ์ค๋ช |
|---|---|
| ๋ฐฑ์๋ ์๋ฒ | ๊ณ ์ฑ๋ฅ REST API, gRPC ์๋ฒ |
| DevOps ๋๊ตฌ | Terraform, Docker, Kubernetes |
| ํด๋ผ์ฐ๋ ์๋น์ค | ๋ง์ดํฌ๋ก์๋น์ค ๊ธฐ๋ฐ ์์คํ |
| CLI ์ ํธ๋ฆฌํฐ | ๋จ์ผ ์คํํ์ผ ๋ฐฐํฌํ ๋๊ตฌ |
| ๋ณด์ ๋ฐ ๋คํธ์ํฌ | ์ค์บ๋, ๋ก๊ทธ ํ์, ํ๋ก์ ์๋ฒ |
5. Go vs Python โ JSON๊ณผ ๊ฐ๋ฐ ๊ฒฝํ ๋น๊ต
| ํญ๋ชฉ | Go | Python |
|---|---|---|
| ๋ฌธ๋ฒ ๋์ด๋ | ์ค๊ฐ | ์ฌ์ |
| ํ์ ์์ ์ฑ | ๊ฐํจ (์ ์ ํ์ดํ) | ์ฝํจ (๋์ ํ์ดํ) |
| JSON ์ฒ๋ฆฌ | ๊ตฌ์กฐ์ฒด ์ ์ ํ์ | ๋ฐ๋ก dict ์ ๊ทผ ๊ฐ๋ฅ |
| ์คํ ์๋ | ๋น ๋ฆ | ๋๋ฆผ |
| ์ ์ง๋ณด์ | ์์ ์ | ์ ์ฐํ์ง๋ง ์ํ |
| ๋ฐํ์ ์ค๋ฅ | ๊ฑฐ์ ์์ | ๋ฐ์ ๊ฐ๋ฅ |
โก ์ ๋ฆฌํ์๋ฉด:
- Go๋ ๋ช ์์ ์ด๊ณ ์์ ํ ์ธ์ด,
- Python์ ์ ์ฐํ๊ณ ๋น ๋ฅธ ์ธ์ด์ ๋๋ค.
๋ ๋ค JSON์ ์ ๋ค๋ฃจ์ง๋ง,
Go๋ โ์์ ์ฑโ์ ์ํด ๋ณต์กํด์ก๊ณ ,
Python์ โ๊ฐ๋ฐ ์๋โ๋ฅผ ์ํด ๋จ์ํด์ก๋ค๊ณ ํ ์ ์์ต๋๋ค.
6. ๊ฒฐ๋ก โ ๋จ์ํจ ์์ ์์ ์ฑ
Go๋ ์ฒ์์ ์ฝ๊ฐ์ ๋ถํธํจ์ด ์์ต๋๋ค.
ํนํ JSON ์ฒ๋ฆฌ์ฒ๋ผ โ๋์ ๋ฐ์ดํฐโ๋ฅผ ๋ค๋ฃฐ ๋ Python๋ณด๋ค ๋ ๋ง์ ์ฝ๋๋ฅผ ์จ์ผ ํ์ฃ .
ํ์ง๋ง ์ผ๋จ ์ต์ํด์ง๋ฉด, Go์ ๋ช ์์ ์ธ ์ค๊ณ๋ ๋ฒ๊ทธ๋ฅผ ์๋ฐฉํ๊ณ ๋๊ท๋ชจ ์๋น์ค๋ฅผ ์์ ์ ์ผ๋ก ์ ์งํ๊ฒ ํด์ค๋๋ค.
์๋, ์์ ์ฑ, ๋ฐฐํฌ์ ๋จ์ํจ โ ์ด ์ธ ๊ฐ์ง๊ฐ Go์ ํต์ฌ ๊ฐ์น์ ๋๋ค.
๋๊ธ ๋จ๊ธฐ๊ธฐ