(๐ญGo) Syntax
ํ๋ฅญํ ์ธ์ด๋ฅผ ์ดํดํ ๋ฅ๋ ฅ์ ์์ง๋ง(?) ์ข์ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๊ธฐ๋ฅผ ์ํ๋ ์ ์ ํ๋ก๊ทธ๋๋จธ๋ฅผ ์ํด
Overview
C++ ๊ฐ๋ฐ์์์๋ C๋ฅผ ๋ณ๋ก ์ข์ํ์ง๋ ์๋๋ค. ๊ฐ์ฒด์งํฅ๋ง์ ์ํ ์ธ์ด๋ ์๋์ง๋ง ์์ฐํ C++๋ ๊ฐ์ฒด์งํฅ ์ธ์ด์ด๊ณ C์ธ์ด๋ ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฐ๋ฐ์ง ๋ชจ๋๊ฐ C++์ ๋ณต์ก์ฑ์ด ์ซ์ด์ Go๋ฅผ ๊ฐ๋ฐํ๋ค๊ณ ๋ง์ ํ์ง๋ง, ๋๋ Go์ ๋ฌธ๋ฒ์ ์๊น์๋ API๋ค์ ์๊ทธ๋์ณ๋ ๋ณด๊ธฐ๊ฐ ์ซ๋ค. ๋ง์น C์ธ์ด ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ผ์๋ Go๋ ๋ฐ์ด๋ ์ฅ์ ๋ค์ด ์์ด ๋ฉ๋ฆฌ ๋ ์๊ฐ ์๋๋ฐ, ๊ทธ์ค ์ ์ผ์ ๋ง์ ํ์ฌ๋ค์์ Golang์ ์ฑ์ฉํ๊ณ ์ฌ์ฉํ๊ธฐ ์์ํ๊ธฐ ๋๋ฌธ์ด๋คใ ํนํ๋ ์ธํ๋ผ ๊ฐ๋ฐ์ ์์ด์ Go๋ ์ข์ ๋๊ตฌ๋ก ์ฌ๊ฒจ์ง๊ณ ์๋ค. docker์ kubernates ์ญ์ golang์ผ๋ก ๊ฐ๋ฐ๋์๋ค.
๋ ๋ฒ์งธ๋ ๋ ๋ฒ์งธ๋ก ์ธ๊ธ๋๊ฒ ์ต์ธํ ์ ๋๋ก ์ข์ ๊ธฐ๋ฅ์ธ goroutine
์ด๋ค.
**[๋ฏธ] MuliThreadProgramming [mสฬ ltiฮธred-|proสgrำmษชล]** : 1. ํ๋ง์ , ๋ง๊ณต 2. ์๋ ฅ์ด ๊ฐ๋ํ๋ ๋ค๋ฃจ๊ธฐ ์ด๋ ค์ ์ ์ฐ์ด์ง ์๋ ๊ธฐ์
๋ฉํฐ์ฐ๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ง๋ํจ์ ๊ฒฝํํ ํ๋ก๊ทธ๋๋จธ๋ goroutine ํ๋๋ง์ผ๋ก๋ go๋ฅผ ์ฌ์ฉํ ์ด์ ๊ฐ ์ถฉ๋ถํ๋ค. goroutine์ ์ฌ์ฉ๋ฒ์ ๋ํด์๋ ๋ณ๋์ ํฌ์คํธ๋ก ๊ฐ๋จํ๊ฒ ์๊ฐํ ์์ ์ด๋ค.
์ธ ๋ฒ์งธ๋ ๊ฐ๊ฒฐํจ
์ด๋ค. ์ฌ์ค ๊ฐ์ฅ ์ค์ํ ์์์ผ ์ ์๋ค. ๋๋ถ๋ถ์ ๋ด์ฅ API๋ง์ ์ฌ์ฉํด์ ๊ตฌํํ ์ ์๊ธฐ์ repository์์ ์ด์ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ฐฐํฌํ๋ ์ผ์ด ๋ณ๋ก ํ์์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌด์๋ณด๋ค ๋ฌธ๋ฒ ๋ํ ๊ฐ๋จํ๋ค. ์ด์๊ฒ ๋ค์ด์ดํธ๋ฅผ ํ๋๊ฑธ ๋์ด์ ์์ฃผ ๋ผ๋ง ๋จ์ ๋๋์ด๋ค.
์ด์ธ์๋ GC๋ฅผ ํตํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, ์ข์ ์ํ๊ณ์ ๋๊ตฌ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์ฅ์ ์ด ์๋ค.
Rival
์ฒ์์๋ Golang
์ ๋ผ์ด๋ฒ์ Rust
๋ผ๊ณ ์๊ฐํ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ ์ธ์ด ๋ชจ๋ C/C++์ ๋์ฒดํ๊ธฐ ์ํ ์์คํ
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์๋ ค์ ธ ์์๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ์ค์ ๋ก Golang์ ๊ทธ๋ฌํ ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ๊ณ ์์ง ์์ผ๋ฉฐ ์ฌ์ฉ๋ฒ์ ์๊ฐํด๋ณด๋ฉด ์คํ๋ ค Python
์ ์คํฌ๋ฆฝํ
์ฉ๋๋ฅผ ๋์ฒดํ๊ณ ์๋๊ฒ ์๋๊ฐ ์ถ๋ค. Python์ ์ํ๊ณ๊ฐ ์์ง ํจ์ฌ ์ปค๋ณด์ด์ง๋ง ์ฑ๋ฅ์ Go์ ์์น์ด๋ค. ๊ทธ๋ฆฌ๊ณ Rust๋ ์ง์ ํ ์์คํ
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ๊ฐ๊ณ ์๋๊ฒ ์๋์งโฆ(๊ฐ์ธ์ ์ผ๋ก ํธ๊ฐ๋๋ Rust์ ์์น์ด๋ค)
Syntax
Python๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ฃผ ๋ํ ์ผํ ๋ฌธ๋ฒ์ฌํญ์ ์ ๋ฆฌํ์ง๋ ์์ ์๊ฐ์ด๋ค. ์๋ง์ ์๋ฃ์ ์ฑ ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋๋ Python๋งํผ ๊ฐ๋จํ์ง๋ ์๊ธฐ ๋๋ฌธ์ ๋ด์ฉ์ ๋ ๋ง์ ๊ฒ ๊ฐ๋ค.
package์ main ํจ์
package main // ์ด ํ์ผ์ด main ํจํค์ง์ ํฌํจ๋๋ค๋ ๋ป์ด๋ค
import "fmt" // built in ํจํค์ง๋ฅผ importํ์ฌ ์ฌ์ฉํ๋ค
func main() {
fmt.Println("Hello world!")
}
main ํจ์๊ฐ ์์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋
์ผ๋ก ๋ค๋ฅธ๊ณณ์์ ์ฌ์ฉํ ์ ์์ง๋ง,
๊ทธ๋ฐ ๊ฒฝ์ฐ ๋จ๋
์ผ๋ก ์ปดํ์ผ์ ๋์ง ์๋๋ค.
์ ๊ทผ ์ง์ ์ ๊ฐ๋
package something
import "fmt"
func SayHello() {
fmt.Println("Hello")
}
๋ณ๋์ ํ์ผ์ something ํจํค์ง์ ํฌํจ๋ ๋ด์ฉ์ ์์ฑํด๋ณด์๋ค.
์ฌ๊ธฐ์ ์ ๊ทผ์ง์ ์ ๊ฐ๋
์ด ๋์ค๋๋ฐ,
- sayHello =>
private
- SayHello =>
public export
๋์๋ฌธ์์ ์ํด export ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. ์ธ๋ป๋ณด๋ฉด ์ด์ํ์ง๋ง Convention rule์ ๊ฒธํ๋ ๋ฌธ๋ฒ์ด๋ผ ์ข์๊ฑฐ ๊ฐ๊ธฐ๋ ํ๋ค. ์ด๊ฒ์ ์ด์ฉํด์ ํ๋์ package๋ฅผ ๋ค๋ฅธ ์ธ์ด์ ํด๋์ค, ๋๋ฌธ์๋ก ์์ํ๋ ํจ์๋ฅผ interface๋ผ๊ณ ์๊ฐํด๋ณผ ์๋ ์๊ฒ ๋ค.
Structure
type Account struct {
owner string
Balance int // ๋๋ฌธ์๋ผ ์ธ๋ถ์์ ์ฐธ์กฐ ๊ฐ๋ฅ
}
Structure์์๋ member์ ๊ฐ์์ฑ์ ์ฒซ ๋ฌธ์์ ๋์๋ฌธ์๋ฅผ ํตํด ๊ตฌ๋ถํ ์ ์๋ค.
์ ๊ฒฝ์ฐ Balance๋ง ๋ฐ์์ ์ ๊ทผํ ์ ์๋ค.
Implicit type determine :=
package main
import "fmt"
func main() {
name := "hoo"
name = "lynn"
fmt.Println(name)
}
:=๋ ๋ฌด์ฒ ์ด์ํ๊ฒ ์๊ฒผ์ง๋ง ์์์ ์ผ๋ก ํ์ ์ ๊ฒฐ์ ํ ์ ์๋ ์ฐ์ฐ์์ด๋ค. ์ด ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ณ์๋ฅผ ์ถ์ ํ์ฌ ํ์ ์์ด ๋ฐ๋ก ์ ์ธ๊ณผ ์ด๊ธฐํ๋ฅผ ํ ์ ์์ผ๋ฉฐ, ํจ์ ์์์๋ง ์ ์ธ๊ฐ๋ฅํ๊ณ ์ ์ญ์ ์ผ๋ก๋ ์ ์ธํ ์ ์๋ค.
:=
์ด๋ ๊ฒ ๋จ๋
์ผ๋ก ์จ๋ณด๋ ์ฝ๊ฐ ๊ท์ฌ์ด๊ฑฐ ๊ฐ๊ธฐ๋ ํ๋ค. ์์ฒญ ๋ง์ด ์ฌ์ฉํ๋ ๋ฌธ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ๋ชจ๋ฅด๊ณ ์ฝ๋๋ฅผ ๋ดค์๋, ์ด๊ฑฐ๋๋ฌธ์ ์ฝ๋๊ฐ ์์ฒญ ์ธ๊ณ์ด์ฒ๋ผ ๋ณด์์๋ค.
Function
package main
import (
"fmt"
"strings"
)
// ๋ค์ ๊ดํธ์ ๋ฆฌํดํ์ ์ง์ ํ๊ณ ๋ฉํฐ ๋ฆฌํด์ด ๊ฐ๋ฅํ๋ค!
func lenAndUpper(name string) (int, string) {
return len(name), strings.ToUpper(name)
}
// ...์ผ๋ก ๊ฐ๋ณ ์ธ์๊ฐ ๊ฐ๋ฅํ๋ค
func repeatMe(words ...string) {
fmt.Println(words)
}
func main() {
totalLenght, _ := lenAndUpper("hoo")
fmt.Println(totalLenght)
}
Multi return๊ณผ ๊ฐ๋ณ ์ธ์๋ฅผ ์ง์ํ๋ค. ์ด๊ฑด ์๋นํ ํฐ ํธ์๋ฅผ ์ ๊ณตํ ๊ฒ ๊ฐ๋ค.
naked return๊ณผ defer
func lenAndUpper(name string) (length int, uppercase string) { // ๋ฆฌํด ๋ณ์๋ฅผ ๋ฐ๋ก ์ ์ธ ๊ฐ๋ฅ
defer fmt.Println("I'm done") // ํจ์๊ฐ ๋๋ ๋ค ์ฝ๋๊ฐ ์คํ๋๋๋ก ํ๋ค
length = len(name)
uppercase = strings.ToUpper(name)
return
}
๋ ๋ฒ์งธ ๊ดํธ์์ ๋ณ์๋ช ์ง์ ์ naked return ์ด๋ผ๋ ๊ธฐ๋ฅ์ด๋ค. ๋ฆฌํด ๋ณ์๋ฅผ ๋ฐ๋ก ๊ดํธ์์ ์ง์ ํด์ ํจ์๋ด์์ ๋ฐ๋ก ์ ์ธ์ ํ ํ์๊ฐ ์๋ค. ๋ฆฌํดํ ๋ณ์๋ฅผ ๋ฏธ๋ฆฌ ์ ์ธํ๊ณ ๊ฐ์ ์ฑ์๋ฃ๋ ํจํด์ ๋ง์ด ์ฌ์ฉํ์ํ ๋ฐ ๊ทธ๋ด๋ ์ ์ฉํ๋ค.
๊ทธ๋ฆฌ๊ณ defer ํค์๋๋ ๋ค์ ์๋ ๋ฌธ์ฅ์ ํจ์๊ฐ ๋๋๋ค์ ์คํํ๋๋ก ํด์ค๋ค. Post process๋ฅผ ์ ์ํ๋๋ฐ ์ ์ฉํ๋ค.
๋ฐ๋ณต๋ฌธ๊ณผ ์กฐ๊ฑด๋ฌธ
// ๋ฐ๋ณต๋ฌธ์ ์ค์ง for๋ฌธ ๋ฟ์ด๋ค
total := 0
for index, number := range numbers { // index๋ฅผ ์ฌ์ฉํ์ง ์์๋๋ _, number ์ด๋ฐ์์ผ๋ก ์ฌ์ฉ
total += number
}
if koreanAge := age + 2; koreanAge < 18 {
return false
}
Variable expression
switch koreanAge := age + 2; koreanAge {
case 10:
return false
case 18:
return true
case koreanAge > 18:
return true;
}
modern c++์์๋ ์ถ๊ฐ๋์๋ ์ฌํญ์ด๋ค. ๋ด์ฉ์ฒ๋ผ if๋ฌธ ์์์ ๋ณ์๋ฅผ ์ ์ธํ ์ ์๋ค. if ๋ธ๋ก ์์์๋ง ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ ์จ๊ธธ ์ ์์ด ์ข๋ค. switch์์๋ variable expression์ ์ฌ์ฉํ ์ ์๊ณ , case์์ ์กฐ๊ฑด๋ ๊ฐ๋ฅํ๋ฏ๋ก if~else๋ฅผ ๋์ฒดํ ์ ์๋ค.
Pointer
func main() {
fmt.Println(canIDrink(18))
a := 2
b := &a
*b = 2020;
fmt.Println(a, *b)
}
๊ฐ๋ ๊ณผ ์ฐ์ฐ์ ๋ฑ ๋ชจ๋ C์ธ์ด์์์ ์ฌ์ฉ๋ฒ๊ณผ ๋์ผํ๋ค.
Array์ Slice
import "fmt"
func main() {
names := [5]string{"hoo", "lynn", "dal"} // ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ฉด Array
names := []string{"hoo", "lynn", "dal"} // ํฌ๊ธฐ๋ฅผ ๋น์๋๋ฉด Slice
names = append(names, "flynn")
fmt.Println(names)
}
Golang์ ํ์์ ๊ณ ๋ คํ ๋, c์ธ์ด์ ์ต์ํ๋ฉด ์์ฃผ ๊ฐ๋ ์ด ์ ๋ฌ๋ผ๋ถ๋๋ค. Array๋ ํฌ๊ธฐ๊ฐ ๋ถ๋ณ์ธ C์ธ์ด์ Array์ ๋์ผํ๋ฉฐ, Slice๋ append ํจ์๋ฅผ ํตํด STL์ vector์ฒ๋ผ ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํ๋ค. ๋ค๋งโฆappend์ ์ฌ์ฉ๋ฒ์ ์ ํ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๋ณด์ด์ง ์๋๋ค.
Map
import "fmt"
func main() {
hoo := map[string]int{"name": 3, "age": 7}
value, exist := hoo["name"]
for key, value := range hoo {
fmt.Println(key, value)
}
}
func (d Dictionary) Delete(word string) {
delete(d, word)
}
์๋ฌ์ฒ๋ฆฌ
func (a *Account) Withdraw(amount int) error {
if a.balance < amount {
return errNoMoney
}
a.balance -= amount
return nil
}
golang์๋ try/catch์ ๊ฐ์ ๋ฌธ๋ฒ์ด ์๋ค. if ๋ฌธ์ ํตํด ์๋ฌ ์ฒ๋ฆฌ๋ ์์ ๊ฐ์ด ํ๋ค.
์๋ฌ๊ฐ ์๋ ๋ nil
์ ๋ฐํํ๋ ๊ฒ์ ์ฃผ๋ชฉํ๋ค.
toString
func (a Account) String() string {
return fmt.Sprint(a.Owner(), "โs account.\nHas: ", a.Balance())
}
structure์ ์์ ๊ฐ์ด ์ ์ํ๋ฉด ์๋ฐ์ toString()์ฒ๋ผ ํธ์ถ๋๋ค.
type
package mydict
import "errors"
// Dictionary type
type Dictionary map[string]string
var errNotFound = errors.New("Not Found")
// Search for a word
func (d Dictionary) Search(word string) (string, error) {
value, exists := d[word]
if exists {
return value, nil
}
return "", errNotFound
}
type
์ C์ธ์ด์ typedef
์ ๊ฐ์ ๊ฐ๋
์ธ๋ฐ ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ ์๋ค.
์ด๋ค ๊ฒ์ด๋ ํ์
์ผ๋ก ์ด๋ ํ ์ด๋ฆ์ ์ง๊ณ ๊ทธ๊ฒ์ ๋ํ ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ ์๋ ๊ฒ์ด๋ค.
๋ค์ค ๋ณ์ ์ด๊ธฐํ
// ์ฌ๋ฌ ๋ณ์๋ฅผ ์ด๋ ๊ฒ ์ด๊ธฐํํ ์๋ ์๋ค
var (
errNotFound = errors.New("Not Found")
errCantUpdate = errors.New("Cant update non-existing word")
errWordExists = errors.New("That word already exists")
)
// ํ๋ผ๋ฉํฐ์ ๋ณ์๊ฐ ๋์ผํ ๊ฒฝ์ฐ ํ๋ฒ๋ง ์์ฑํด๋ ๋๋ค
func (a, b int) Balance() int {
return a.balance
}
Example
์ํ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋จํ๊ฒ ๊ตฌํํ๋ ๊ฒ์ ์ฝ๋๋ก ๊ตฌํํด๋ณด๋๋ก ํ์.
import "fmt"
type person struct {
name string
age int
favFood []string
}
func main() {
favFood := []string{"kimchi", "ramen"}
hoo := person{name: "hoo", age: 18, favFood: favFood}
fmt.Println(hoo.name)
}
package accounts
// Account struct
type Account struct {
owner string
balance int
}
// NewAccount creates Account
func NewAccount(owner string) *Account {
account := Account{owner: owner, balance: 0}
return &account
}
Golang์๋ ์์ฑ์ ๊ฐ๋ ์ด ์๊ธฐ๋๋ฌธ์ ์ NewAccount์์์ฒ๋ผ ์ฌ์ฉํ๋ ํจํด์ ์ฌ์ฉํ๋ค. ์ structure์์ owner, balance๋ ์๋ฌธ์๋ก ์์ํ๊ธฐ ๋๋ฌธ์ ์ด๊ธฐํํ ์ ์๋ค. ๋์ ๊ฐ์ package๋ด์ NewAccount์์ ์์ฑํ๊ณ ์ฃผ์๋ฅผ ๋ฐํํ๋ฉด์ ์ฐธ์กฐ๋ฅผ ๋ฐ๋ ๊ฒ์ด๋ค.
account := accounts.NewAccount("hoo")
์ด๋ฐ ์์ผ๋ก ํธ์ถํ์ฌ ์์ฑํ๋ค. accounts๋ ํจํค์ง ์ด๋ฆ์ด๋ค.
// Deposit x amount on your account
func (a Account) Deposit(amount int) { // ์์ ๊ดํธ๋ Receiver๋ผ๋ ๋
์์ด๋ค
a.balance += amount
}
// Balance of your account
func (a Account) Balance() int {
return a.balance
}
structure์ ๋ํ method๋ ์ด๋ ๊ฒ ๊ตฌํํ ์ ์๋ค. ์ถฉ๋ถํ ๊ฐ์ฒด์งํฅ์ ์ธ ๊ตฌํ์ด ๊ฐ๋ฅํ๊ณ ์ต์ํ C์ธ์ด์ ๊ฐ์ ์คํ๊ฒํฐ ์ฝ๋๋ ํผํ๊ณ ๋ ๋จ๋๋ค. ์์์ด ์์ด๋ ์บก์ํ, ์ ๋ณด์๋ ๊ทธ๋ฆฌ๊ณ ๋ ํ์ดํ(Duck typing)
์ ์ด์ฉํ ๋คํ์ฑ ์ ๋๋ ๊ฐ๋ฅํ ๊ฑฐ ๊ฐ๋ค.
๊ทธ๋ฐ๋ฐ ์ ์๊ฐํด๋ณด๋ฉด Deposit์ ์์๋ํ์ง ์๋๋ค.
C์ธ์ด ๊ธฐ์ด๋ฅผ ์๊ฐํด๋ณด๋ฉด ์์์๋ค. a๋ ๋ณต์ฌ๋ณธ์ด๋ค.
func (a *Account) Deposit(amount int) {
a.balance += amount
}
C์ธ์ด๋ฅผ ์๋ค๋ฉด ์ต์ํ ๊ฒ์ด๋ค. ์ ๋งค๊ฐ๋ณ์์ *๋ ์ฐธ์กฐ๊ฐ ์๋๋ผ ํฌ์ธํฐ๋ฅผ ์๋ฏธํ๋ค. ๋ณ๊ฒ๋ ์๋๋ฐ ๊ทธ๋ ๊ฒ ์ฌ๋๋ค์ ๊ดด๋กญํ๋ค๋ Call by pointer. ๊ทธ๋ฆฌ๊ณ Balance์ ๊ฒฝ์ฐ์๋ ๊ทธ๋ ๋ค๊ณ ํ๋๋ผ๋ ์ ๋์ํ ๊ฒ์ด๋ค.