Alert
์ด ๊ธ์ Claude Code์ ๋์์ ๋ฐ์ ์์ฑ๋์์ต๋๋ค
TL;DR
- Go ํจ์๋ ํ๋ผ๋ฏธํฐ ํ์ ๊ณผ ๋ฐํ ํ์ ์ ๋ฐ๋์ ๋ช ์ํด์ผ ํ๋ฉฐ, ์ ํ์ ํ๋ผ๋ฏธํฐ๊ฐ ์์
...๋ฌธ๋ฒ์ผ๋ก ๊ฐ๋ณ ์ธ์๋ฅผ ๋ฐ์ ์ ์๊ณ , Python์*args์ ๋์- ๋ค์ค ๋ฐํ๊ฐ์ด ๊ธฐ๋ณธ์ด๋ฉฐ,
result, errํจํด์ด Go ์๋ฌ ์ฒ๋ฆฌ์ ํต์ฌ ๊ด์ฉ๊ตฌ- ํจ์๋ first-class citizen์ด๋ผ ๋ณ์์ ๋ด๊ฑฐ๋ ์ธ์๋ก ์ ๋ฌ ๊ฐ๋ฅํ๊ณ , ํด๋ก์ ๋ ์ง์
defer๋ ์์ ์ ๋ฆฌ๋ฅผ ํจ์ ๋๊น์ง ๋ฏธ๋ฃจ๋ฉฐ, ํ์ ์ ์ถ(LIFO)๋ก ์คํ๋๊ณ ์ธ์๋ ๋ฑ๋ก ์์ ์ ํ๊ฐ๋จ- Go๋ ๊ฐ์ ์ํ ํธ์ถ(call by value)์ด๋ผ ๊ตฌ์กฐ์ฒด๋ ๋ณต์ฌ๋์ง๋ง, ๋งตยท์ฌ๋ผ์ด์ค๋ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํด ์์ ์ด ๋ฐ์๋จ
1. ๊ธฐ๋ณธ ํจ์ ์ ์ธ
Go์ ํจ์ ์ ์ธ์ func ํค์๋๋ก ์์ํ๋ค. Python๊ณผ ๋ฌ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์
๊ณผ ๋ฐํ ํ์
์ ๋ฐ๋์ ๋ช
์ํด์ผ ํ๋ค.
func add(a int, b int) int {
return a + b
}Python์ด๋ผ๋ฉด ์ด๋ ๊ฒ ์ด๋ค.
def add(a, b):
return a + b์ฐจ์ด์ ์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์
๋ช
์ ํ์ : Go๋ ํ๋ผ๋ฏธํฐ ํ์
(
int)๊ณผ ๋ฐํ ํ์ (int)์ ์๋ตํ ์ ์๋ค. Python์ ํ์ ํํธ(a: int)๋ ์ ํ์ด์ง๋ง Go์์๋ ๊ฐ์ ๋ค. - ๊ฐ์ ํ์
์ถ์ฝ : ์ฐ์๋ ํ๋ผ๋ฏธํฐ๊ฐ ๊ฐ์ ํ์
์ด๋ฉด
func add(a, b int) int์ฒ๋ผ ๋ง์ง๋ง์ ํ ๋ฒ๋ง ์ ์ ์ ์๋ค. - ์ ํ์ ํ๋ผ๋ฏธํฐ ์์ : Python์
def add(a, b=0):์ฒ๋ผ ๊ธฐ๋ณธ๊ฐ์ ์ค ์ ์์ง๋ง, Go๋ ๋ชจ๋ ํ๋ผ๋ฏธํฐ๊ฐ ํ์๋ค. ์ ํ์ ์ค์ ์ด ํ์ํ๋ฉด ๊ตฌ์กฐ์ฒด๋ฅผ ์ฐ๋ ํจํด์ด ์ผ๋ฐ์ ์ด๋ค. - ์ค๊ดํธ ์์น : ์ฌ๋ ์ค๊ดํธ
{๋ ๋ฐ๋์func์ ์ธ๊ณผ ๊ฐ์ ์ค์ ์์ด์ผ ํ๋ค. ๋ค์ ์ค๋ก ๋ด๋ฆฌ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋๋ค.
2. ๊ฐ๋ณ ์ ๋ ฅ ํ๋ผ๋ฏธํฐ
์ธ์ ๊ฐ์๊ฐ ์ ๋์ ์ผ ๋ ... ๋ฌธ๋ฒ์ ์ด๋ค. Python์ *args์ ๋์ํ๋ ๊ฐ๋
์ด๋ค.
func addTo(base int, vals ...int) []int {
out := make([]int, 0, len(vals))
for _, v := range vals {
out = append(out, base+v)
}
return out
}ํธ์ถํ ๋๋ ์ธ์๋ฅผ ๋์ดํ๊ฑฐ๋, ์ฌ๋ผ์ด์ค๋ฅผ ํผ์ณ์ ๋๊ธธ ์ ์๋ค.
addTo(3, 2, 4, 6) // [5, 7, 9]
a := []int{4, 3}
addTo(3, a...) // ์ฌ๋ผ์ด์ค ํผ์น๊ธฐ โ [7, 6]Python์ผ๋ก ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด ์ด๋ ๋ค.
def add_to(base, *vals):
return [base + v for v in vals]
add_to(3, 2, 4, 6) # [5, 7, 9]
a = [4, 3]
add_to(3, *a) # ๋ฆฌ์คํธ ์ธํจํน โ [7, 6]
**kwargs๋ ์๋คPython์
**kwargs(ํค์๋ ๊ฐ๋ณ ์ธ์)์ ๋์ํ๋ Go ๋ฌธ๋ฒ์ ์๋ค. ์ด๋ฆ ๋ถ์ ์ ํ์ ํ๋ผ๋ฏธํฐ๊ฐ ํ์ํ๋ฉด ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํด์ ๋๊ธฐ๋ ํจํด์ ์ด๋ค. ์ด ๋ถ๋ถ์ ๊ตฌ์กฐ์ฒด ํธ์์ ๋ค๋ฃฌ๋ค.
3. ๋ค์ค ๋ฐํ๊ฐ
Go ํจ์์ ๊ฐ์ฅ ํฐ ํน์ง ์ค ํ๋๋ค. ์ฌ๋ฌ ๊ฐ์ ๋์์ ๋ฐํํ ์ ์๊ณ , ์ด๋ฅผ ํตํด ์๋ฌ ์ฒ๋ฆฌ ํจํด์ด ๋ง๋ค์ด์ง๋ค.
func divAndRemainder(num, den int) (int, int, error) {
if den == 0 {
return 0, 0, errors.New("cannot divide by zero")
}
return num / den, num % den, nil
}
result, remainder, err := divAndRemainder(5, 2)
// result=2, remainder=1, err=nilPython์์ ๋น์ทํ ์ฝ๋๋ฅผ ์ฐ๋ฉด ์ด๋ ๋ค.
def div_and_remainder(num, den):
if den == 0:
raise ValueError("cannot divide by zero")
return num // den, num % den
result, remainder = div_and_remainder(5, 2)
# ๋๋ ํํ๋ก ํ ๋ฒ์ ๋ฐ๊ธฐ
result = divmod(5, 2) # (2, 1)ํต์ฌ์ ์ธ ์ฐจ์ด๊ฐ ์๋ค.
- ๊ฐ๋ณ ๋ณ์๋ก ๋ฐ์์ผ ํจ : Python์
result = divmod(5, 2)์ฒ๋ผ ํํ ํ๋๋ก ๋ฌถ์ด ๋ฐ์ ์ ์์ง๋ง, Go๋ ๋ฐํ๊ฐ ๊ฐ์๋งํผ ๋ณ์๋ฅผ ์ ์ธํด์ผ ํ๋ค. - ์ ์ฐ๋ ๊ฐ์
_๋ก ๋ฌด์ : ๋ฐํ๊ฐ ์ค ํ์ ์๋ ๊ฒ์ด ์์ผ๋ฉด_์ ํ ๋นํ๋ค. Python๋ ๊ฐ์ ๊ด๋ก๋ฅผ ์ด๋ค.
result, _, err := divAndRemainder(5, 2) // remainder ๋ฌด์result, errํจํด : Go๋ ์์ธ(exception) ๋์ ์๋ฌ๋ฅผ ๋ฐํ๊ฐ์ผ๋ก ๋๋ ค์ฃผ๋ ๋ฐฉ์์ ์ด๋ค. ๋ง์ง๋ง ๋ฐํ๊ฐ์errorํ์ ์ผ๋ก ๋๊ณ , ํธ์ถ ์ธก์์err != nil์ ํ์ธํ๋ ๊ฒ์ด Go์ ๊ธฐ๋ณธ ์๋ฌ ์ฒ๋ฆฌ ๊ด์ฉ๊ตฌ๋ค.
result, remainder, err := divAndRemainder(5, 0)
if err != nil {
fmt.Println(err) // "cannot divide by zero"
return
}์๋ฌ ์ฒ๋ฆฌ๋ ๋ณ๋ ํธ์์
Go์ ์๋ฌ ์ฒ๋ฆฌ(
error์ธํฐํ์ด์ค,errors.New,fmt.Errorf, ๋ํ ๋ฑ)๋ ๋ด์ฉ์ด ๋ง์ ๋ณ๋ ๊ธ์์ ๋ค๋ฃฌ๋ค. ์ฌ๊ธฐ์๋ โ๋ง์ง๋ง ๋ฐํ๊ฐ์ผ๋ก ์๋ฌ๋ฅผ ๋๋ ค์ค๋คโ๋ ํจํด๋ง ๊ธฐ์ตํ๋ฉด ๋๋ค.
4. ํจ์๋ ๊ฐ์ด๋ค (first-class function)
Go์์ ํจ์๋ first-class citizen(์ผ๊ธ ๊ฐ์ฒด)์ด๋ค. ์ด๋ค ๊ฐ์ด first-class๋ผ๋ ๊ฑด ๋ค์์ ๋ชจ๋ ํ ์ ์๋ค๋ ๋ป์ด๋ค.
- ๋ณ์์ ๋ด์ ์ ์๋ค
- ํจ์์ ์ธ์๋ก ๋๊ธธ ์ ์๋ค
- ํจ์์ ๋ฐํ๊ฐ์ผ๋ก ์ธ ์ ์๋ค
- ์ฌ๋ผ์ด์ค๋ ๋งต ๊ฐ์ ์๋ฃ๊ตฌ์กฐ์ ๋ฃ์ ์ ์๋ค
ํจ์๊ฐ ์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด โ๊ทธ ์ธ์ด๋ ํจ์๋ฅผ first-class๋ก ์ทจ๊ธํ๋คโ๊ณ ๋งํ๊ณ , ์ด๋ฐ ํจ์๋ฅผ first-class function์ด๋ผ ๋ถ๋ฅธ๋ค. Go์ Python ๋ชจ๋ ์ฌ๊ธฐ์ ํด๋นํ๋ค. ๋ฐ๋ฉด C๋ ํจ์ ํฌ์ธํฐ๋ก ๋น์ทํ๊ฒ ํ๋ด ๋ผ ์๋ ์์ง๋ง, ์ต๋ช ํจ์๋ ํด๋ก์ ๊ฐ ์์ด์ ํจ์๋ฅผ ์์ ํ first-class๋ก ๋ณด๊ธฐ๋ ์ด๋ ต๋ค.
ํท๊ฐ๋ฆฌ๋ ์ฉ์ด ์ ๋ฆฌ
ํจ์๋ฅผ ๊ฐ์ผ๋ก ๋ค๋ฃจ๋ ์ด์ผ๊ธฐ์๋ ๋น์ทํด ๋ณด์ด๋ ์ฉ์ด๊ฐ ์ฌ๋ฟ ๋์จ๋ค. ๊ด๊ณ๋ฅผ ์ ๋ฆฌํ๋ฉด ์ด๋ ๋ค.
์ฉ์ด ๋ฌด์์ ๊ฐ๋ฆฌํค๋ first-class function ํจ์๋ฅผ ๊ฐ์ฒ๋ผ ๋ค๋ฃฐ ์ ์๋ค๋ ์ธ์ด์ ์ฑ์ง. ์๋ ๊ฐ๋ ๋ค์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํ ๋ function value ๋ณ์์ ๋ด๊ฑฐ๋ ์ ๋ฌ๋๋ ๊ฐ์ผ๋ก์์ ํจ์. Go ๊ณต์ ๋ฌธ์์์ ์ฐ๋ ํํ higher-order function(๊ณ ์ฐจ ํจ์) ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ฑฐ๋ ๋ฐํํ๋ ํจ์ anonymous function(์ต๋ช ํจ์) ์ด๋ฆ ์์ด ์ฆ์์์ ์ ์ํ ํจ์. Go์ func(){...}, Python์lambdaclosure(ํด๋ก์ ) ์ต๋ช ํจ์๊ฐ ๋ฐ๊นฅ ์ค์ฝํ ๋ณ์๋ฅผ ์บก์ฒํ ๊ฒ ํต์ฌ์ first-class function์ด โ์ฑ์งโ์ด๊ณ , ๋๋จธ์ง๋ ๊ทธ ์ฑ์ง ์์์ ๋ง๋ค์ด์ง๋ ํ์ฉ ํจํด์ด๋ผ๋ ์ ์ด๋ค. ์ต๋ช ํจ์์ ํด๋ก์ ๋ ๊ฐ์ด ๋ฑ์ฅํ ๋๊ฐ ๋ง์ง๋ง ์๋ฐํ๋ ๋ค๋ฅด๋ค. ์ต๋ช ํจ์๊ฐ ๋ฐ๊นฅ ๋ณ์๋ฅผ ๋ถ์ก์ง ์์ผ๋ฉด ํด๋ก์ ๊ฐ ์๋๋ค.
๋์ ์๋ก ๋ค๋ฅธ ์ถ์ผ๋ก ๋ณด๋ฉด ๊น๋ํ๋ค. ์ต๋ช ํจ์๋ โ์ด๋ฆ์ด ์๋ ์๋โ(ํํ)์ ๋ฌธ์ ๊ณ , ํด๋ก์ ๋ โ๋ฐ๊นฅ ๋ณ์๋ฅผ ์บก์ฒํ๋โ(๋์)์ ๋ฌธ์ ๋ค. ๊ทธ๋์ ์ด๋ก ์ ์ผ๋ก๋ ์ด๋ฆ ์๋ ํจ์๋ ๋ฐ๊นฅ ๋ณ์๋ฅผ ์บก์ฒํ๋ฉด ํด๋ก์ ๊ฐ ๋ ์ ์๋ค(Python์
nonlocal์ด ๊ทธ ์๋ค). ๋ค๋ง Go๋ ํจ์ ์์์ ์ด๋ฆ ์๋ ํจ์๋ฅผ ์ ์ธํ ์ ์์ด์, Go์ ํด๋ก์ ๋ ์ฌ์ค์ ํญ์ ์ต๋ช ํจ์๋ค.
// ๋ณ์์ ํจ์ ํ ๋น
add := func(a, b int) int { return a + b }
fmt.Println(add(3, 4)) // 7Python์ด๋ผ๋ฉด lambda๋ฅผ ์ฐ๊ฑฐ๋, ์ผ๋ฐ ํจ์๋ฅผ ๋ณ์์ ํ ๋นํ๋ค.
add = lambda a, b: a + b
print(add(3, 4)) # 7ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ์์๋ ๋ณด์.
func apply(a, b int, op func(int, int) int) int {
return op(a, b)
}
result := apply(3, 4, func(a, b int) int {
return a + b
})
// result=7def apply(a, b, op):
return op(a, b)
result = apply(3, 4, lambda a, b: a + b)
# result=7Go์์ ํจ์ ํ์
์๊ทธ๋์ฒ(func(int, int) int)๋ฅผ ๋งค๋ฒ ์ฐ๋ ๊ฒ์ด ๋ฒ๊ฑฐ๋ก์ฐ๋ฉด type์ผ๋ก ๋ณ์นญ์ ๋ง๋ค ์ ์๋ค.
type mathFunc func(int, int) int
func apply(a, b int, op mathFunc) int {
return op(a, b)
}์ apply๋ ์ค๋ช
์ฉ ์์์ง๋ง, ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ๋ ํจํด์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์์ฃผ ๋ง๋๋ค. ๋ํ์ ์ธ ๊ฒ์ด sort.Slice๋ค. ์ ๋ ฌ ๊ธฐ์ค์ ํจ์๋ก ๋ฐ์์, โ๋ ์์ ์ค ์ด๋ ์ชฝ์ด ์์ ์์ผ ํ๋๊ฐโ๋ฅผ ํธ์ถ ์ธก์ด ๊ฒฐ์ ํ๊ฒ ํ๋ค.
type Person struct {
Name string
Age int
}
people := []Person{
{Name: "Alice", Age: 30},
{Name: "Bob", Age: 25},
{Name: "Carol", Age: 35},
}
// ๋์ด ์ค๋ฆ์ฐจ์ ์ ๋ ฌ โ ๋น๊ต ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})Python์์ sort์ key ์ธ์์ ํจ์๋ฅผ ๋๊ธฐ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐ์์ด๋ค.
people.sort(key=lambda p: p.age)์ด ์์๋ ์ฌ์ค ํด๋ก์ ๋ค
sort.Slice์ ๋๊ธด ์ต๋ช ํจ์๋ ๋ฐ๊นฅ์people๋ณ์๋ฅผ ์บก์ฒํ๊ณ ์๋ค. ์ฆ ๋จ์ํ ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธด ๊ฒ์ ๋์ด, ๋ฐ๊นฅ ๋ณ์๋ฅผ ๋ถ์ก์ ํด๋ก์ ๋ฅผ ๋๊ธด ๊ฒ์ด๋ค. ์ค๋ฌด์์ ํจ์๋ฅผ ์ธ์๋ก ๋๊ธธ ๋๋ ์ด๋ ๊ฒ ํด๋ก์ ์ธ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ค. ํด๋ก์ ์์ฒด๋ ๋ฐ๋ก ๋ค์ ์น์ ์์ ๋ค๋ฃฌ๋ค.
5. ํด๋ก์
ํด๋ก์ ๋ ํจ์๊ฐ ์์ ์ด ์ ์ธ๋ ๋ฐ๊นฅ ์ค์ฝํ์ ๋ณ์๋ฅผ ์บก์ฒํด์ ์ ์งํ๋ค. Go์ Python ๋ชจ๋ ํด๋ก์ ๋ฅผ ์ง์ํ๋ค.
func makeCounter() func() int {
count := 0
return func() int {
count++
return count
}
}
counter := makeCounter()
fmt.Println(counter()) // 1
fmt.Println(counter()) // 2
fmt.Println(counter()) // 3Python ๋ฒ์ ์ ์ด๋ ๋ค.
def make_counter():
count = 0
def counter():
nonlocal count
count += 1
return count
return counter
counter = make_counter()
print(counter()) # 1
print(counter()) # 2
print(counter()) # 3- Go๋ ๋ฐ๊นฅ ๋ณ์๋ฅผ ์๋์ผ๋ก ์บก์ฒํ๋ค. Python์ฒ๋ผ
nonlocal๊ฐ์ ํค์๋๊ฐ ํ์ ์๋ค. makeCounter()๋ฅผ ํธ์ถํ ๋๋ง๋ค ๋ ๋ฆฝ์ ์ธcount๊ฐ ์๊ธฐ๋ฏ๋ก, ์นด์ดํฐ ์ธ์คํด์ค๋ผ๋ฆฌ ์ํ๊ฐ ์์ด์ง ์๋๋ค.
5-1. ์ ํด๋ก์ ๋ฅผ ์ฐ๋๊ฐ โ ๋ฒ์๋ฅผ ์ขํ๋ค
ํด๋ก์ ์ ํจ์ฉ์ด ์ ์๋ฟ์ง ์์ ์ ์๋ค. ๊ฐ์ฅ ์ค์ฉ์ ์ธ ์ด์ ํ๋๋ ํจ์์ ๋ฒ์๋ฅผ ์ขํ๋ ๊ฒ์ด๋ค.
Go ํจ์๋ ๋ณดํต ํจํค์ง ๋ ๋ฒจ(ํ์ผ ์ต์์)์ ์ ์ธํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ค ํฌํผ ํจ์๊ฐ ๋ฑ ํ ํจ์ ์์์๋ง ์ฐ์ธ๋ค๋ฉด, ๊ตณ์ด ํจํค์ง ๋ ๋ฒจ์ ๋ ์ด์ ๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด process ์์์๋ง ์ฐ๋ double์ด ์๋ค๊ณ ํ์.
// ๋ฐฉ๋ฒ 1: ํจํค์ง ๋ ๋ฒจ์ ์ ์ธ โ ํจํค์ง ์ ์ฒด์ ๋
ธ์ถ๋จ
func double(x int) int {
return x * 2
}
func process(nums []int) []int {
out := make([]int, 0, len(nums))
for _, n := range nums {
out = append(out, double(n))
}
return out
}์ด๋ ๊ฒ ํ๋ฉด double์ด ๊ฐ์ ํจํค์ง์ ๋ค๋ฅธ ํจ์, ๋ค๋ฅธ ํ์ผ์์๋ ์ ๋ถ ๋ณด์ธ๋ค. ์ค์ ๋ก๋ process์์๋ง ์ฐ๋๋ฐ๋ ํจํค์ง ๋ค์์คํ์ด์ค๋ฅผ ์ฐจ์งํ๋ค. ๋ด๋ถ ํจ์๋ก ๊ฐ๋๋ฉด ํธ์ถ ๋ฒ์๊ฐ process ์์ผ๋ก ์ ํ๋๋ค.
// ๋ฐฉ๋ฒ 2: process ์์ ๊ฐ๋ โ ๋ฐ๊นฅ์์๋ ์กด์ฌ์กฐ์ฐจ ๋ชจ๋ฆ
func process(nums []int) []int {
double := func(x int) int {
return x * 2
}
out := make([]int, 0, len(nums))
for _, n := range nums {
out = append(out, double(n))
}
return out
}์ด๊ฒ ์ ์ด๋์ธ์ง๋ 02ํธ์์ ๋ค๋ฃฌ ๋ด์ฉ๊ณผ ์ฐ๊ฒฐ๋๋ค.
- ํจํค์ง ๋ ๋ฒจ ์ ์ธ ์๊ฐ ์ค์ด๋ ๋ค : Go ์ปดํ์ผ๋ฌ๋ ํจํค์ง ๋ ๋ฒจ์ ๋ฏธ์ฌ์ฉ ํจ์/๋ณ์๋ฅผ ์๋ฌ๋ก ์ก์์ฃผ์ง ์๋๋ค. ํจํค์ง ๋ ๋ฒจ์ ์ด๋ฆ์ด ๋ง์์๋ก โ์ด๊ฑฐ ์์ง ์ฐ๋?โ๋ฅผ ํ๋จํ๊ธฐ ์ด๋ ค์์ง๋๋ฐ, ํ ๊ณณ์์๋ง ์ฐ๋ ํฌํผ๋ฅผ ํจ์ ์์ผ๋ก ๋ฃ์ผ๋ฉด ๊ทธ๋งํผ ํจํค์ง ๋ ๋ฒจ์ด ๊น๋ํด์ง๋ค.
- ์ ์ฐ๋ ์ด๋ฆ์ ์ฐพ๊ธฐ ์ฌ์์ง๋ค : ํจ์ ๋ด๋ถ์ ์ง์ญ ๋ณ์๋ ๋ด๋ถ ํจ์๋ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋๋ค. ์ฆ ๋ด๋ถ๋ก ๊ฐ๋๋ฉด โ์ ์ฐ๋ ์ฝ๋โ๊ฐ ์๋์ผ๋ก ๋๋ฌ๋๋ค.
๋ฐฉ๊ธ ์์๋ ์๋ฐํ๋ ํด๋ก์ ๊ฐ ์๋๋ค
double์ ๋ฐ๊นฅ ๋ณ์๋ฅผ ์บก์ฒํ์ง ์์ผ๋ฏ๋ก ์ ํํ๋ ์ต๋ช ํจ์์ผ ๋ฟ์ด๋ค(์น์ 4์ ์ฉ์ด ์ ๋ฆฌ ์ฐธ๊ณ ). ๋ค๋ง ๋ด๋ถ ํจ์๊ฐ ๋ฐ๊นฅ์ ์ง์ญ ๋ณ์๊น์ง ์บก์ฒํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์, ์ค๋ฌด์์๋ ์ด ํจํด์ ๋ฌถ์ด์ ํด๋ก์ ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์บก์ฒ๊น์ง ํ๋ฉด ํฌํผ์ ๋งค๋ฒ ์ธ์๋ฅผ ๋๊ธฐ์ง ์์๋ ๋๋ ์ด์ ์ด ์ถ๊ฐ๋๋ค.func process(nums []int, factor int) []int { // factor๋ฅผ ์บก์ฒ โ ์ธ์๋ก ์ ๋๊ฒจ๋ ๋จ multiply := func(x int) int { return x * factor } out := make([]int, 0, len(nums)) for _, n := range nums { out = append(out, multiply(n)) } return out }
ํด๋ก์ ์ ์ค์ ์ฉ๋
ํด๋ก์ ๋ ๋ฏธ๋ค์จ์ด, ํฉํ ๋ฆฌ ํจ์, ์ง์ฐ ์คํ ๋ฑ์์ ์์ฃผ ์ฐ์ธ๋ค. ํนํ Go์ HTTP ํธ๋ค๋ฌ์์ ์์กด์ฑ์ ์ฃผ์ ํ ๋ ํด๋ก์ ํจํด์ด ์ผ๋ฐ์ ์ด๋ค.
6. defer
defer๋ ํจ์ ํธ์ถ์ ๊ทธ ํจ์๊ฐ ๋๋ ๋๊น์ง ๋ฏธ๋ค๋๋ ํค์๋๋ค. ์ฃผ๋ก ์ด์ด๋ ์์(ํ์ผ, ๋คํธ์ํฌ ์ฐ๊ฒฐ, ๋ฝ ๋ฑ)์ ์์ง ์๊ณ ์ ๋ฆฌํ๋ ๋ฐ ์ด๋ค. ์ ๋ฆฌ ์ฝ๋๋ฅผ ์์์ ์ฐ ์ฝ๋ ๋ฐ๋ก ์์ ์ ์ด๋ ์ ์์ด์, ํจ์๊ฐ ์ด๋ค ๊ฒฝ๋ก๋ก ๋๋๋ ์ ๋ฆฌ๊ฐ ๋ณด์ฅ๋๋ค.
func readFile(name string) error {
f, err := os.Open(name)
if err != nil {
return err
}
defer f.Close() // ํจ์๊ฐ ๋๋ ๋ ์คํ๋จ โ ์ฌ๊ธฐ์ ๋ซ๋ ๊ฑธ ์์ ์ผ์ด ์๋ค
// f๋ฅผ ๊ฐ์ง๊ณ ์์
...
// ์ค๊ฐ์ returnํด๋ f.Close()๋ ๋ฐ๋์ ์คํ๋๋ค
return nil
}Python์ with๋ฌธ์ด๋ try/finally์ ๋ชฉ์ ์ด ๊ฐ๋ค.
# Python โ with๋ฌธ์ด ๋ธ๋ก์ ๋ฒ์ด๋ ๋ ์๋์ผ๋ก close
def read_file(name):
with open(name) as f:
# f๋ฅผ ๊ฐ์ง๊ณ ์์
...
...
# ๋ธ๋ก์ ๋ฒ์ด๋๋ฉด ์๋์ผ๋ก ๋ซํ์ฐจ์ด๊ฐ ์๋ค๋ฉด, Python์ with๋ ๋ธ๋ก์ ๋ฒ์ด๋ ๋ ์ ๋ฆฌ๋๊ณ , Go์ defer๋ ํจ์๊ฐ ๋๋ ๋ ์ ๋ฆฌ๋๋ค๋ ์ ์ด๋ค.
defer๋ ํด๋ก์ ์ ์ฉ ๊ธฐ๋ฅ์ด ์๋๋ค
defer๋ค์๋ ์๋ฌด ํจ์ ํธ์ถ์ด๋ ์ฌ ์ ์๋ค. ๋ฉ์๋ ํธ์ถ(f.Close()), ์ผ๋ฐ ํจ์ ํธ์ถ(fmt.Println("done")), ์ต๋ช ํจ์(func(){...}())๋ฅผ ๋ชจ๋ ๋ฏธ๋ฃฐ ์ ์๋ค. defer์ ๋ณธ์ง์ โ์ด ํธ์ถ์ ํจ์ ๋์ผ๋ก ๋ฏธ๋ฃฌ๋คโ๋ ์คํ ์์ ์ ์ด์ผ ๋ฟ, ํด๋ก์ ์๋ ๋ณ๊ฐ์ ๊ธฐ๋ฅ์ด๋ค.defer f.Close() // ๋ฉ์๋ ํธ์ถ โ ํด๋ก์ ์๋ defer fmt.Println("done") // ์ผ๋ฐ ํจ์ ํธ์ถ โ ํด๋ก์ ์๋ defer func() { ... }() // ์ต๋ช ํจ์ โ ์บก์ฒํ๋ฉด ํด๋ก์ ์ฑ ์์ โdefer๋ ์ฌ๋ฌ ํด๋ก์ ๋ฅผ ์ง์ฐ์ํจ๋คโ๊ณ ํํํ๋ ๊ฑด defer์ ์ ์๊ฐ ์๋๋ผ ์ค์ ์ฐ์์ ๋ฐ์ํ ๊ฒ์ด๋ค. ์์ ํ๋ ๋ซ๋ ์ ๋๋ฉด
defer f.Close()ํ ์ค๋ก ๋๋์ง๋ง, ์๋ 6-3ยท6-4์์ ๋ณผ โ์คํ ์์ ์ ๋ณ์ ์ฝ๊ธฐโ๋ โ๋ช ๋ช ๋ ๋ฐํ๊ฐ ์์ โ,recover๊ฐ์ ์๋ฏธ ์๋ ์ ๋ฆฌ ์์ ์ ์ฌ๋ฌ ์ค์ ์ต๋ช ํจ์๋ก ๋ฌถ๊ณ ๋ฐ๊นฅ ๋ณ์๋ฅผ ์บก์ฒํ๊ฒ ๋๋ค. ๊ทธ๊ฒ ๊ณง ํด๋ก์ ๋ค. ์ฆ defer๊ฐ ํด๋ก์ ๋ฅผ ์๊ตฌํ๋ ๊ฒ ์๋๋ผ, ์ธ ๋งํ defer๊ฐ ์์ฐ์ค๋ฝ๊ฒ ํด๋ก์ ํํ๊ฐ ๋๋ ๊ฒ์ด๋ค.๋ ์ถ์ ๋ถ๋ฆฌํด์ ๋ณด๋ฉด ๊น๋ํ๋ค. defer๋ โ์ธ์ ์คํํ ์งโ(์คํ ์์ ์ ์ด), ํด๋ก์ ๋ โ๋ฌด์์ ๋ค๊ณ ์์์งโ(๋ณ์ ์บก์ฒ) ๋ฅผ ๋ด๋นํ๋ค. ์๋ก ์ง๊ตํ๋ ๊ฐ๋ ์ด๊ณ , defer ์์์์ ํด๋ก์ ๊ฐ ์์ฃผ ๋ณด์ด๋ ๊ฑด ๋ณต์กํ ์ ๋ฆฌ๋ฅผ ์ต๋ช ํจ์๋ก ๋ฌถ๋ค ๋ณด๋ ์บก์ฒ๊ฐ ๋ฐ๋ผ์จ ๊ฒฐ๊ณผ์ผ ๋ฟ์ด๋ค.
6-1. ์คํ ์์ โ return ์ดํ์ ์คํ๋๋ค
defer๋ก ๋ฏธ๋ฃฌ ํจ์๋ ๋ฐ๊นฅ ํจ์์ return์ด ๋ฐํ๊ฐ์ ์ ํ ๋ค, ํธ์ถํ ์ชฝ์ผ๋ก ๋์๊ฐ๊ธฐ ์ง์ ์ ์คํ๋๋ค. ์ฆ return ๋ฌธ์ฅ ์์ฒด๋ณด๋ค ๋ฆ๊ฒ ์คํ๋๋ค.
func example() {
fmt.Println("1. ํจ์ ์์")
defer fmt.Println("3. defer ์คํ (๋ง์ง๋ง)")
fmt.Println("2. ํจ์ ๋ณธ๋ฌธ ๋")
}
// ์ถ๋ ฅ:
// 1. ํจ์ ์์
// 2. ํจ์ ๋ณธ๋ฌธ ๋
// 3. defer ์คํ (๋ง์ง๋ง)6-2. ํ์ ์ ์ถ(LIFO) โ ๋์ค์ ์ด defer๊ฐ ๋จผ์ ์คํ๋๋ค
defer๋ ์ฌ๋ฌ ๋ฒ ์ธ ์ ์๊ณ , ์์๋ ์์์ ์ญ์์ผ๋ก ์คํ๋๋ค. ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ฑ๋กํ ๊ฒ์ด ๊ฐ์ฅ ๋จผ์ ์คํ๋๋ค.
func main() {
defer fmt.Println("first")
defer fmt.Println("second")
defer fmt.Println("third")
fmt.Println("body")
}
// ์ถ๋ ฅ:
// body
// third
// second
// first์ด ์์๊ฐ ์์ฐ์ค๋ฌ์ด ์ด์ ๊ฐ ์๋ค. ๋ณดํต ์์์ โ๋จผ์ ์ฐ ๊ฒ์ ๋์ค์ ๋ซ๋โ ๊ฒ ๋ง๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฅผ ๋ค์ด ํ์ผ์ ์ด๊ณ ๊ทธ ์์ ๋ฒํผ๋ฅผ ์์ ๋ค๋ฉด, ๋ฒํผ๋ฅผ ๋จผ์ ๋ซ๊ณ ํ์ผ์ ๋์ค์ ๋ซ์์ผ ํ๋ค. LIFO ๋๋ถ์ ์ฐ ์์๋๋ก defer๋ฅผ ์ ๊ธฐ๋ง ํ๋ฉด ๋ซ๋ ์์๊ฐ ์์์ ๋ง์ถฐ์ง๋ค.
f, _ := os.Open("data.txt")
defer f.Close() // ๋์ค์ ์คํ (2์์)
gz, _ := gzip.NewReader(f)
defer gz.Close() // ๋จผ์ ์คํ (1์์) โ ์ฐ ์์์ ์ญ์์ผ๋ก ๋ซํ6-3. ์ธ์๋ defer๋ฅผ ๋ง๋๋ ์๊ฐ ํ๊ฐ๋๋ค
๊ฐ์ฅ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด๋ค. defer์ ๋๊ธด ํจ์์ ์ธ์๋ defer ๋ฌธ์ฅ์ ๋ง๋๋ ์์ ์ ์ฆ์ ๊ณ์ฐ๋๊ณ , ์ค์ ํธ์ถ๋ง ๋ฏธ๋ค์ง๋ค.
func main() {
i := 0
defer fmt.Println("defer๊ฐ ๋ณธ i:", i) // ์ด ์์ ์ i(0)๊ฐ ๋ฐ์ ๋จ
i = 100
fmt.Println("ํ์ฌ i:", i)
}
// ์ถ๋ ฅ:
// ํ์ฌ i: 100
// defer๊ฐ ๋ณธ i: 0 โ 100์ด ์๋๋ผ 0i๊ฐ ๋์ค์ 100์ผ๋ก ๋ฐ๋์ด๋, defer๋ ๋ฑ๋ก ์์ ์ ๊ฐ 0์ ์ด๋ฏธ ๋ถ์ก์ ๋์๋ค. ์ธ์๊ฐ ์๋๋ผ ํด๋ก์ ๋ก ๊ฐ์ธ๋ฉด ๋์์ด ๋ฌ๋ผ์ง๋ค. ํด๋ก์ ์์ i๋ ์คํ ์์ ์ ์ฝํ๊ธฐ ๋๋ฌธ์ด๋ค.
func main() {
i := 0
defer func() {
fmt.Println("defer๊ฐ ๋ณธ i:", i) // ์คํ ์์ ์ i๋ฅผ ์ฝ์
}()
i = 100
}
// ์ถ๋ ฅ:
// defer๊ฐ ๋ณธ i: 100 โ ํด๋ก์ ๋ผ ์ต์ ๊ฐ์ธ์ ํ๊ฐ vs ํด๋ก์ ์บก์ฒ
defer f(x):x๋ ์ง๊ธ ํ๊ฐ๋์ด ๊ณ ์ ๋๋คdefer func(){ ... x ... }():x๋ ๋์ค์(์คํ ์์ ์) ์ฝํ๋ค ์ด ์ฐจ์ด๊ฐdefer์ ํด๋ก์ ๊ฐ ๋ง๋๋ ์ง์ ์ด๋ค. ๋ ์ค ๋ฌด์์ ์ํ๋์ง ์์ํ๊ณ ์จ์ผ ํ๋ค.
6-4. ๋ช ๋ช ๋ ๋ฐํ๊ฐ ์์
defer์ ๋๊ธด ํด๋ก์ ๋ ํจ์์ ๋ช
๋ช
๋ ๋ฐํ๊ฐ(named return value) ์ ๋ฐ๊ฟ ์ ์๋ค. ๋ฐํ๊ฐ์ ์ด๋ฆ์ ๋ถ์ด๋ฉด, return์ด ๊ทธ ๋ณ์์ ๊ฐ์ ๋ฃ์ ๋ค defer๊ฐ ์คํ๋๋ฏ๋ก, defer ์์์ ์ต์ข
๋ฐํ๊ฐ์ ์๋ณผ ์ ์๋ค.
func double(x int) (result int) { // ๋ฐํ๊ฐ์ result๋ผ๋ ์ด๋ฆ์ ์ค
defer func() {
result *= 2 // return์ด ์ ํ result๋ฅผ ๋ ๋ฐฐ๋ก
}()
result = x + 1
return result // result์ x+1์ ๋ฃ๊ณ โ defer๊ฐ *2
}
fmt.Println(double(3)) // (3+1) * 2 = 8์ด ํจํด์ ์ฃผ๋ก ์๋ฌ๋ฅผ ๊ฐ๊ณตํ๊ฑฐ๋, panic์ ๋ณต๊ตฌํด์ ์๋ฌ๋ก ๋ฐ๊พธ๋ ๊ณณ(recover)์์ ์ฐ์ธ๋ค. ์๋ฌ ์ฒ๋ฆฌ ํธ์์ ๋ ๋ค๋ฃฌ๋ค.
6-5. ์ฃผ์ โ ๋ฐ๋ณต๋ฌธ ์์ defer
defer๋ ํจ์๊ฐ ๋๋ ๋ ์คํ๋์ง, ๋ฐ๋ณต๋ฌธ ํ ๋ฐํด๊ฐ ๋๋ ๋ ์คํ๋๋ ๊ฒ ์๋๋ค. ๋ฃจํ ์์์ ์์์ ์ด๊ณ defer๋ก ๋ซ์ผ๋ฉด, ์์์ด ๋ฃจํ ๋ด๋ด ์์๋ค๊ฐ ํจ์๊ฐ ๋๋๋ ์๊ฐ์์ผ ํ๊บผ๋ฒ์ ๋ซํ๋ค.
// ๋์ ์ โ ํ์ผ ํธ๋ค์ด ๋ฃจํ ๋ด๋ด ์ ๋ซํ๊ณ ์์ธ๋ค
func processAll(names []string) error {
for _, name := range names {
f, err := os.Open(name)
if err != nil {
return err
}
defer f.Close() // ํจ์๊ฐ ๋๋ ๋๊น์ง ์ ๋ซํ โ ํธ๋ค ๋์
// ...
}
return nil
}ํ์ผ ์๊ฐ ๋ง์ผ๋ฉด ํธ๋ค์ด ๊ณ ๊ฐ๋ ์ ์๋ค. ์ด๋ด ๋๋ ๋ฃจํ ๋ณธ๋ฌธ์ ๋ณ๋ ํจ์๋ก ๋ถ๋ฆฌํด์, ํ ๋ฐํด๊ฐ ๊ณง ํ ํจ์ ํธ์ถ์ด ๋๊ฒ ๋ง๋ ๋ค. ๊ทธ๋ฌ๋ฉด ๋งค ๋ฐ๋ณต๋ง๋ค defer๊ฐ ์ ๋ ์คํ๋๋ค.
// ์ข์ ์ โ ํ ํ์ผ ์ฒ๋ฆฌ๋ฅผ ํจ์๋ก ๋ถ๋ฆฌ
func processAll(names []string) error {
for _, name := range names {
if err := processOne(name); err != nil {
return err
}
}
return nil
}
func processOne(name string) error {
f, err := os.Open(name)
if err != nil {
return err
}
defer f.Close() // processOne์ด ๋๋ ๋๋ง๋ค ๋ซํ
// ...
return nil
}defer ํต์ฌ ์ ๋ฆฌ
- ์์ ์ ๋ฆฌ(ํ์ผ/์ฐ๊ฒฐ/๋ฝ)๋ฅผ ์ฐ ์ฝ๋ ๋ฐ๋ก ์์ ์ ์ด๋๋ ์ฉ๋
- ์คํ ์์ : ํจ์์
return์ดํ, ํธ์ถ ์ธก์ผ๋ก ๋์๊ฐ๊ธฐ ์ง์ - ์ฌ๋ฌ ๊ฐ๋ฉด ํ์ ์ ์ถ(LIFO)๋ก ์คํ โ ์ฐ ์์๋๋ก ์ ์ผ๋ฉด ๋ซ๋ ์์๊ฐ ์ญ์์ผ๋ก ๋ง์ถฐ์ง
- ์ธ์๋ ๋ฑ๋ก ์์ ์ ํ๊ฐ๋๊ณ , ํด๋ก์ ๋ก ๊ฐ์ธ๋ฉด ์คํ ์์ ์ ์ฝํ
- ๋ช ๋ช ๋ ๋ฐํ๊ฐ์ defer ํด๋ก์ ๋ก ์์ ๊ฐ๋ฅ
- ๋ฐ๋ณต๋ฌธ ์์์๋ ํจ์๋ก ๋ถ๋ฆฌํ์ง ์์ผ๋ฉด ์์์ด ๋๊น์ง ์์
7. ๊ฐ์ ์ํ ํธ์ถ (call by value)
Go๋ ํจ์์ ์ธ์๋ฅผ ๋๊ธธ ๋ ํญ์ ๊ฐ์ ๋ณต์ฌํ๋ค. ์ด๊ฒ์ ๊ฐ์ ์ํ ํธ์ถ(call by value)์ด๋ผ๊ณ ํ๋ค. ํจ์๋ ์๋ณธ์ด ์๋๋ผ ๋ณต์ฌ๋ณธ์ ๋ฐ์ผ๋ฏ๋ก, ํจ์ ์์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ฌด๋ฆฌ ์์ ํด๋ ํธ์ถ ์ธก์ ์๋ณธ์ ๊ทธ๋๋ก๋ค.
๊ตฌ์กฐ์ฒด๋ฅผ ๋๊ธฐ๋ ๊ฒฝ์ฐ๋ฅผ ๋ณด์.
type Point struct {
X, Y int
}
func modify(p Point) {
p.X = 100 // ๋ณต์ฌ๋ณธ์ ํ๋๋ฅผ ๋ฐ๊ฟ
}
func main() {
pt := Point{1, 2}
modify(pt)
fmt.Println(pt) // {1 2} โ ์๋ณธ์ ๊ทธ๋๋ก
}modify๋ pt์ ๋ณต์ฌ๋ณธ์ ๋ฐ์๊ธฐ ๋๋ฌธ์, p.X = 100์ ๋ณต์ฌ๋ณธ๋ง ๋ฐ๊พธ๊ณ ๋๋๋ค.
7-1. ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ๋ก ๋๊ธฐ๋ ์ธ์ด์์ ์ฐจ์ด
Python์ด๋ Java๋ ๋ค๋ฅด๊ฒ ๋์ํ๋ค. ๊ฐ์ฒด๋ฅผ ๋๊ธฐ๋ฉด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๊ฐ ์ ๋ฌ๋๋ฏ๋ก, ํจ์ ์์์ ๊ฐ์ฒด์ ์์ฑ์ ๋ฐ๊พธ๋ฉด ํธ์ถ ์ธก์๋ ๋ฐ์๋๋ค.
# Python โ ๊ฐ์ฒด๋ ์ฐธ์กฐ๋ก ๊ณต์ ๋๋ค
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def modify(p):
p.x = 100 # ์ค์ ๊ฐ์ฒด์ ์์ฑ์ ๋ฐ๊ฟ
pt = Point(1, 2)
modify(pt)
print(pt.x) # 100 โ ์๋ณธ์ด ๋ฐ๋๋ค!๊ฐ์ ์ฝ๋๋ฅผ Go์ Python์์ ๋๋ฆฌ๋ฉด ๊ฒฐ๊ณผ๊ฐ ์ ๋ฐ๋๋ค. Python ๊ฐ๋ฐ์๊ฐ Go๋ก ๋์ด์ฌ ๋ ๊ฐ์ฅ ์์ฃผ ํท๊ฐ๋ฆฌ๋ ์ง์ ์ด๋ค.
- Go: ๊ตฌ์กฐ์ฒด๋ ํต์งธ๋ก ๋ณต์ฌ๋๋ค โ ํจ์ ์ ์์ ์ด ์๋ณธ์ ๋ฐ์ ์ ๋จ
- Python/Java: ๊ฐ์ฒด๋ ์ฐธ์กฐ๋ก ๊ณต์ ๋๋ค โ ํจ์ ์ ์์ ์ด ์๋ณธ์ ๋ฐ์๋จ
7-2. ๋งต๊ณผ ์ฌ๋ผ์ด์ค๋ ์์ธ์ฒ๋ผ ๋ณด์ธ๋ค
๊ทธ๋ฐ๋ฐ ๋งต๊ณผ ์ฌ๋ผ์ด์ค๋ ๋์์ด ๋ค๋ฅด๋ค. ํจ์์ ๋๊ฒจ์ ๋ด์ฉ์ ๋ฐ๊พธ๋ฉด ํธ์ถ ์ธก์๋ ๋ฐ์๋๋ค.
// ๋งต โ ํจ์ ์์์ ์ถ๊ฐํ ํญ๋ชฉ์ด ์๋ณธ์ ๋ฐ์๋จ
func addEntry(m map[string]int) {
m["new"] = 1
}
func main() {
m := map[string]int{}
addEntry(m)
fmt.Println(m) // map[new:1] โ ๋ฐ๋๋ค
}// ์ฌ๋ผ์ด์ค โ ๊ธฐ์กด ์์๋ฅผ ์์ ํ๋ฉด ์๋ณธ์ ๋ฐ์๋จ
func zeroFirst(s []int) {
s[0] = 0
}
func main() {
nums := []int{1, 2, 3}
zeroFirst(nums)
fmt.Println(nums) // [0 2 3] โ ๋ฐ๋๋ค
}์ด๊ฒ call by value ์์น์ ์ด๊ธฐ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ฌ์ค์ ์ผ๊ด๋๋ค. ๋งต๊ณผ ์ฌ๋ผ์ด์ค์ ๊ฐ์ ๋ฐ์ดํฐ ์์ฒด๊ฐ ์๋๋ผ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ์์ ํค๋(ํฌ์ธํฐ๋ฅผ ํ์ ๊ตฌ์กฐ) ๋ค. ํจ์์ ๋๊ธธ ๋ ์ด ํค๋๊ฐ ๋ณต์ฌ๋์ง๋ง, ๋ณต์ฌ๋ณธ๋ ๊ฒฐ๊ตญ ๊ฐ์ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๊ทธ๋์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ฉด ์๋ณธ์๋ ๋ณด์ด๋ ๊ฒ์ด๋ค.
๋ณต์ฌ๋๋ ๊ฑด ํค๋, ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ๋ ๊ณต์
์ฌ๋ผ์ด์ค๋ฅผ ๋๊ธฐ๋ฉด
(ํฌ์ธํฐ, ๊ธธ์ด, ์ฉ๋)์ธ ๊ฐ์ผ๋ก ๋ ํค๋๊ฐ ๋ณต์ฌ๋๋ค. ๋ณต์ฌ๋ณธ์ ํฌ์ธํฐ๋ ์๋ณธ๊ณผ ๊ฐ์ ๋ด๋ถ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ฏ๋ก,s[0] = 0์ฒ๋ผ ๊ทธ ๋ฐฐ์ด์ ์์๋ฅผ ๊ฑด๋๋ฆฌ๋ฉด ์๋ณธ์๋ ๋ฐ์๋๋ค. ๋งต๋ ๊ฐ์ ์๋ฆฌ๋ค.
7-3. ์ฌ๋ผ์ด์ค์ ํจ์ โ append๋ ๋ฐ์ ์ ๋ ์ ์๋ค
๊ฐ์ ์ด์ ๋ก, ์ฌ๋ผ์ด์ค์ appendํ ๊ฒฐ๊ณผ๋ ํธ์ถ ์ธก์ ๋ฐ์๋์ง ์์ ์ ์๋ค.
func addItem(s []int) {
s = append(s, 99) // ๋ณต์ฌ๋ณธ ํค๋์ ๊ธธ์ด๋ง ๋ฐ๋
}
func main() {
nums := []int{1, 2, 3}
addItem(nums)
fmt.Println(nums) // [1 2 3] โ 99๊ฐ ์ ๋ณด์ธ๋ค
}์์๋ฅผ ์์ ํ๋ ๊ฒ(s[0] = 0)์ ๊ฐ๋ฆฌํค๋ ๋ฐฐ์ด์ ์ง์ ๊ฑด๋๋ฆฌ๋ ๋ฐ์๋์ง๋ง, append๋ ๋ณต์ฌ๋ณธ ํค๋์ ๊ธธ์ดยทํฌ์ธํฐ๋ง ๋ฐ๊พผ๋ค. ์๋ณธ ํค๋์ ๊ธธ์ด๋ ์ฌ์ ํ 3์ด๋ผ์ ์ถ๊ฐ๋ ์์๊ฐ ๋ณด์ด์ง ์๋๋ค. (์ด ๋์์ 03ํธ์ ์ฌ๋ผ์ด์ฑยท์ ์ฅ ๊ณต๊ฐ ๊ณต์ ๋ด์ฉ๊ณผ ์ด์ด์ง๋ค.)
7-4. ๊ทธ๋์ ํฌ์ธํฐ๊ฐ ํ์ํ๋ค
์ ๋ฆฌํ๋ฉด Go์์ ํจ์๊ฐ ์๋ณธ์ ๋ฐ๊พธ๊ฒ ํ๋ ค๋ฉด ๋ ๊ฐ์ง ๊ธธ์ด ์๋ค.
- ๋งตยท์ฌ๋ผ์ด์ค์ฒ๋ผ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ํ์ ์ ๊ทธ๋๋ก ๋๊ฒจ๋ ๋ด์ฉ ์์ ์ด ๋ฐ์๋๋ค
- ๊ตฌ์กฐ์ฒด๋ ๊ธฐ๋ณธ ํ์ ์ ์๋ณธ์ ๋ฐ๊พธ๋ ค๋ฉด ๊ทธ ๊ฐ์ ์ฃผ์(ํฌ์ธํฐ)๋ฅผ ๋๊ฒจ์ผ ํ๋ค