Alert

์ด ๊ธ€์€ Claude Code์˜ ๋„์›€์„ ๋ฐ›์•„ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

TL;DR

  • Go์˜ ๋ฐ˜๋ณต๋ฌธ์€ for ํ•˜๋‚˜๋ฟ์ด๋ฉฐ while, do-while ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์Œ
  • range๊ฐ€ ๋„˜๊ธฐ๋Š” ๊ฐ’์€ ๋ณต์‚ฌ๋ณธ์ด๋ผ ์›๋ณธ ์ˆ˜์ •์€ ์ธ๋ฑ์Šค ์ ‘๊ทผ์œผ๋กœ ํ•ด์•ผ ํ•จ
  • ์ค‘์ฒฉ ๋ฃจํ”„๋Š” ๋ ˆ์ด๋ธ”(break outer)๋กœ ํ•œ ๋ฒˆ์— ๋น ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์Œ
  • range๋กœ ๋ฌธ์ž์—ด ์ˆœํšŒ ์‹œ ๋ฐ”์ดํŠธ ์ธ๋ฑ์Šค์™€ rune ๋‹จ์œ„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ Python์˜ ๋ฌธ์ž ๋‹จ์œ„ ์ˆœํšŒ์™€ ๋‹ค๋ฆ„
  • if๋ฌธ์— ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ , ๋ณ€์ˆ˜ ์Šค์ฝ”ํ”„๊ฐ€ ๋ธ”๋ก ๋‹จ์œ„๋กœ ์ œํ•œ๋จ
  • := ์„€๋„์ž‰์€ Go ์ดˆ๋ณด์ž๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ๊ฒช๋Š” ๋ฒ„๊ทธ ์›์ธ ์ค‘ ํ•˜๋‚˜
  • switch๋Š” ์ž๋™ break์ด๋ฉฐ fallthrough๋กœ ๋‹ค์Œ case์— ์ด์–ด ์‹คํ–‰ ๊ฐ€๋Šฅ

1. for ํ•˜๋‚˜๋กœ ์ „๋ถ€ โ€” Go์—๋Š” while์ด ์—†๋‹ค

Python์—๋Š” for, while, ๋ฆฌ์ŠคํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜ ๋“ฑ ๋ฐ˜๋ณต ๊ตฌ๋ฌธ์ด ์—ฌ๋Ÿฟ ์žˆ์ง€๋งŒ, Go๋Š” for ํ‚ค์›Œ๋“œ ํ•˜๋‚˜๋กœ ๋ชจ๋“  ๋ฐ˜๋ณต์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

1-1. C-style for loop

for i := 0; i < 10; i++ {
    fmt.Println(i)
}
for i in range(10):
    print(i)

์ดˆ๊ธฐํ™”(; ์•ž), ์กฐ๊ฑด(; ์‚ฌ์ด), ํ›„์ฒ˜๋ฆฌ(; ๋’ค) ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. Python์˜ range()๊ฐ€ ์ด ์„ธ ๊ฐ€์ง€๋ฅผ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜๋ฉด ์ข€ ๋” ๋ช…์‹œ์ ์ด๋‹ค.

1-2. ์กฐ๊ฑด์‹๋งŒ (= while)

i := 1
for i < 100 {
    i *= 2
}
i = 1
while i < 100:
    i *= 2

์ดˆ๊ธฐํ™”์™€ ํ›„์ฒ˜๋ฆฌ๋ฅผ ๋นผ๋ฉด while๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

1-3. ๋ฌดํ•œ ๋ฃจํ”„

for {
    // break ๋˜๋Š” return์œผ๋กœ ํƒˆ์ถœ
}
while True:
    # break ๋˜๋Š” return์œผ๋กœ ํƒˆ์ถœ

์กฐ๊ฑด์‹๋งˆ์ € ๋นผ๋ฉด ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ๋œ๋‹ค. while True:๋ณด๋‹ค ํƒ€์ดํ•‘์ด ์งง๋‹ค.

1-4. for-range (= for-in)

nums := []int{10, 20, 30}
for i, v := range nums {
    fmt.Println(i, v)
}
nums = [10, 20, 30]
for i, v in enumerate(nums):
    print(i, v)

range๋Š” ์Šฌ๋ผ์ด์Šค, ๋งต, ๋ฌธ์ž์—ด, ์ฑ„๋„ ๋“ฑ ๋‹ค์–‘ํ•œ ํƒ€์ž…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งต ์ˆœํšŒ
m := map[string]int{"a": 1, "b": 2}
for k, v := range m {
    fmt.Println(k, v)
}
d = {"a": 1, "b": 2}
for k, v in d.items():
    print(k, v)
๋ถˆํ•„์š”ํ•œ ๊ฐ’ ๋ฌด์‹œ

์ธ๋ฑ์Šค๋‚˜ ๊ฐ’์ด ํ•„์š” ์—†์œผ๋ฉด _๋กœ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ด€๋ก€๋Š” Python๊ณผ ๋™์ผํ•˜๋‹ค.

for _, v := range nums {
    fmt.Println(v)
}
 
for i := range nums {
    fmt.Println(i) // ์ธ๋ฑ์Šค๋งŒ ํ•„์š”ํ•  ๋•Œ๋Š” ๋‘ ๋ฒˆ์งธ ๋ณ€์ˆ˜๋ฅผ ์•„์˜ˆ ์ƒ๋žต
}
for-range์˜ ๊ฐ’์€ ๋ณต์‚ฌ๋ณธ์ด๋‹ค

range๊ฐ€ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฐ’์€ ์›๋ณธ ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ณต์‚ฌ๋ณธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋ฃจํ”„ ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•ด๋„ ์›๋ณธ ์Šฌ๋ผ์ด์Šค๋Š” ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.

nums := []int{10, 20, 30}
for _, v := range nums {
    v *= 2 // ๋ณต์‚ฌ๋ณธ๋งŒ ์ˆ˜์ •๋จ
}
fmt.Println(nums) // [10 20 30] โ€” ์›๋ณธ ๊ทธ๋Œ€๋กœ

์›๋ณธ์„ ๋ฐ”๊พธ๋ ค๋ฉด ์ธ๋ฑ์Šค๋กœ ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.

for i := range nums {
    nums[i] *= 2 // ์›๋ณธ ์ˆ˜์ •
}
fmt.Println(nums) // [20 40 60]

๊ตฌ์กฐ์ฒด ์Šฌ๋ผ์ด์Šค์—์„œ ํŠนํžˆ ์‹ค์ˆ˜ํ•˜๊ธฐ ์‰ฝ๋‹ค. ๋ณต์‚ฌ๋ณธ์˜ ํ•„๋“œ๋ฅผ ๋ฐ”๊ฟ”๋ด์•ผ ์›๋ณธ์—๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค.

type Point struct{ X, Y int }
points := []Point{{1, 2}, {3, 4}}
 
for _, p := range points {
    p.X = 100 // ๋ณต์‚ฌ๋ณธ์˜ ํ•„๋“œ โ€” ๋ฌด์˜๋ฏธ
}
fmt.Println(points) // [{1 2} {3 4}] โ€” ๋ณ€ํ™” ์—†์Œ
 
for i := range points {
    points[i].X = 100 // ์›๋ณธ ์ˆ˜์ •
}
fmt.Println(points) // [{100 2} {100 4}]

Python๊ณผ์˜ ์ฐจ์ด

Python์—์„œ for item in list๋กœ ๋ฐ›์€ item๋„ ์žฌํ• ๋‹น(item = ...)ํ•˜๋ฉด ์›๋ณธ์ด ์•ˆ ๋ฐ”๋€Œ๋Š” ๊ฑด ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ item์ด ๋ฆฌ์ŠคํŠธ๋‚˜ ๊ฐ์ฒด๋ฉด item.attr = ...์ด๋‚˜ item.append(...)๋กœ ๋‚ด๋ถ€๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. Go์˜ ๊ฐ’ ํƒ€์ž…(๊ตฌ์กฐ์ฒด, ๋ฐฐ์—ด)์€ ๋ณต์‚ฌ๋ณธ์ด๋ผ ์ด๋Ÿฐ ๋‚ด๋ถ€ ์ˆ˜์ •์กฐ์ฐจ ์›๋ณธ์— ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค. ์Šฌ๋ผ์ด์Šค/๋งต ๊ฐ™์€ ์ฐธ์กฐ ํƒ€์ž…์€ ๋ณต์‚ฌ๋ณธ์ด์–ด๋„ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ์ˆ˜์ •์ด ๋ฐ˜์˜๋œ๋‹ค.

1-5. ๋ ˆ์ด๋ธ”๋ง โ€” ์ค‘์ฒฉ ๋ฃจํ”„ ํ•œ ๋ฒˆ์— ๋น ์ ธ๋‚˜๊ฐ€๊ธฐ

break์™€ continue๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์žฅ ์•ˆ์ชฝ ๋ฃจํ”„์—๋งŒ ์ ์šฉ๋œ๋‹ค. ์ค‘์ฒฉ ๋ฃจํ”„์—์„œ ๋ฐ”๊นฅ ๋ฃจํ”„๊นŒ์ง€ ์ œ์–ดํ•˜๋ ค๋ฉด ๋ ˆ์ด๋ธ”์„ ๋ถ™์ธ๋‹ค.

outer:
for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
        if i*j > 2 {
            break outer // ๋ฐ”๊นฅ ๋ฃจํ”„๊นŒ์ง€ ํ•œ ๋ฒˆ์— ํƒˆ์ถœ
        }
        fmt.Println(i, j)
    }
}

continue๋„ ๋ ˆ์ด๋ธ”๊ณผ ํ•จ๊ป˜ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ์•ˆ์ชฝ ๋ฃจํ”„๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ๋ฐ”๊นฅ ๋ฃจํ”„์˜ ๋‹ค์Œ ๋ฐ˜๋ณต์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

outer:
for _, row := range matrix {
    for _, v := range row {
        if v < 0 {
            continue outer // ์Œ์ˆ˜๋ฅผ ๋งŒ๋‚˜๋ฉด ์ด ํ–‰์„ ๋ฒ„๋ฆฌ๊ณ  ๋‹ค์Œ ํ–‰์œผ๋กœ
        }
        fmt.Println(v)
    }
}

Python์—๋Š” ๋ ˆ์ด๋ธ” ๋ฌธ๋ฒ•์ด ์—†๋‹ค. ๊ฐ™์€ ๋™์ž‘์„ ํ•˜๋ ค๋ฉด ํ”Œ๋ž˜๊ทธ ๋ณ€์ˆ˜๋ฅผ ๋‘๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ด์„œ return์œผ๋กœ ๋น ์ ธ๋‚˜์˜ค๋Š” ์‹์œผ๋กœ ์šฐํšŒํ•œ๋‹ค.

# Python โ€” ํ”Œ๋ž˜๊ทธ๋กœ ์šฐํšŒ
done = False
for i in range(3):
    for j in range(3):
        if i * j > 2:
            done = True
            break
    if done:
        break

๋ ˆ์ด๋ธ” ์ž‘์„ฑ ๊ด€๋ก€

๋ ˆ์ด๋ธ” ์ด๋ฆ„์€ ๋ฃจํ”„ ๋ฐ”๋กœ ์•ž์— ์ฝœ๋ก (:)๊ณผ ํ•จ๊ป˜ ์“ฐ๊ณ , ๋“ค์—ฌ์“ฐ๊ธฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊นŠ์€ ์ค‘์ฒฉ์ด ์ž์ฃผ ์ƒ๊ธฐ๋ฉด ๋ ˆ์ด๋ธ”๋ณด๋‹ค ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋จผ์ € ๊ณ ๋ คํ•˜๋Š” ํŽธ์ด ๋‚ซ๋‹ค.


2. range์™€ ๋ฌธ์ž์—ด โ€” ๋ฐ”์ดํŠธ vs ๋ฃฌ

Python์—์„œ ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•˜๋ฉด ํ•ญ์ƒ ๋ฌธ์ž(์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œํฌ์ธํŠธ) ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. Go๋Š” ๋‹ค๋ฅด๋‹ค.

Go์˜ ๋ฌธ์ž์—ด์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ”์ดํŠธ ์Šฌ๋ผ์ด์Šค([]byte)๋‹ค. range๋กœ ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•˜๋ฉด ์ธ๋ฑ์Šค๋Š” ๋ฐ”์ดํŠธ ์œ„์น˜, ๊ฐ’์€ rune(์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œํฌ์ธํŠธ) ์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

s := "apple_ฯ€!"
for i, r := range s {
    fmt.Printf("i=%d r=%c\n", i, r)
}

์ถœ๋ ฅ ๊ฒฐ๊ณผ:

i (๋ฐ”์ดํŠธ ์ธ๋ฑ์Šค)r (rune)๋ฐ”์ดํŠธ ์ˆ˜
0a1
1p1
2p1
3l1
4e1
5_1
6ฯ€2
8!1

ฯ€๋Š” UTF-8๋กœ 2๋ฐ”์ดํŠธ๋ฅผ ์ฐจ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๊ฐ€ 6์—์„œ 8๋กœ ์ ํ”„ํ•œ๋‹ค. ASCII ๋ฌธ์ž๋งŒ ๋‹ค๋ฃจ๋‹ค๊ฐ€ ๋‹ค๊ตญ์–ด ๋ฌธ์ž์—ด์„ ๋งŒ๋‚˜๋ฉด ์ธ๋ฑ์Šค ๊ณ„์‚ฐ์ด ํ‹€์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

Python๊ณผ์˜ ์ฐจ์ด

Python์—์„œ enumerate("apple_ฯ€!")๋ฅผ ํ•˜๋ฉด ์ธ๋ฑ์Šค๊ฐ€ 0, 1, 2, โ€ฆ 8๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค. Python์˜ str์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œํฌ์ธํŠธ ๋‹จ์œ„๋กœ ์ธ๋ฑ์‹ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ˆœํšŒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด range๋ฅผ ์“ฐ์ง€ ๋ง๊ณ  ์ธ๋ฑ์Šค๋กœ ์ง์ ‘ ์ ‘๊ทผํ•˜๋ฉด ๋œ๋‹ค.

for i := 0; i < len(s); i++ {
    fmt.Printf("byte[%d] = %x\n", i, s[i])
}

3. if๋ฌธ โ€” ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์ด ์žˆ๋Š” if

Go์˜ if๋Š” ์กฐ๊ฑด์‹ ์•ž์— ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” if-else ๋ธ”๋ก ์•ˆ์—์„œ๋งŒ ์œ ํšจํ•˜๋‹ค.

if n := rand.Intn(10); n == 0 {
    fmt.Println("too low")
} else if n > 5 {
    fmt.Println("too big:", n)
} else {
    fmt.Println("good:", n)
}
// ์—ฌ๊ธฐ์„œ n์„ ์“ฐ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ

Python์—๋Š” ์ด๋Ÿฐ ๋ฌธ๋ฒ•์ด ์—†๋‹ค. ๊ฐ€์žฅ ๋น„์Šทํ•œ ๊ฒƒ์€ walrus operator(:=)์ง€๋งŒ ์Šค์ฝ”ํ”„ ๋™์ž‘์ด ๋‹ค๋ฅด๋‹ค.

import random
 
# walrus operator โ€” n์ด ๋ฐ”๊นฅ ์Šค์ฝ”ํ”„์—์„œ๋„ ์œ ํšจํ•จ
if (n := random.randint(0, 9)) == 0:
    print("too low")
elif n > 5:
    print(f"too big: {n}")
else:
    print(f"good: {n}")
 
print(n)  # ์—ฌ์ „ํžˆ ์ ‘๊ทผ ๊ฐ€๋Šฅ

ํ•ต์‹ฌ ์ฐจ์ด

  • Go: if ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์˜ ๋ณ€์ˆ˜๋Š” if-else ๋ธ”๋ก์ด ๋๋‚˜๋ฉด ์‚ฌ๋ผ์ง„๋‹ค
  • Python: walrus operator๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ฐ”๊นฅ ์Šค์ฝ”ํ”„์—์„œ๋„ ์‚ด์•„์žˆ๋‹ค

์ด ํŒจํ„ด์€ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์—์„œ ํŠนํžˆ ์ž์ฃผ ์“ฐ์ธ๋‹ค.

if err := doSomething(); err != nil {
    return err
}
// err์€ ์—ฌ๊ธฐ์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€ โ€” ์Šค์ฝ”ํ”„๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌ๋จ

4. ๋ธ”๋ก ์Šค์ฝ”ํ”„์™€ ์„€๋„์ž‰

Go๋Š” ์ค‘๊ด„ํ˜ธ({}) ๋ธ”๋ก ๋‹จ์œ„๋กœ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค. Python์˜ ํ•จ์ˆ˜ ๋‹จ์œ„ ์Šค์ฝ”ํ”„(LEGB ๊ทœ์น™)์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅด๋‹ค.

4-1. ๊ธฐ๋ณธ ๋ธ”๋ก ์Šค์ฝ”ํ”„

x := 10
if true {
    x := 20  // ์ƒˆ๋กœ์šด x โ€” ๋ฐ”๊นฅ x๋ฅผ ๊ฐ€๋ฆฐ๋‹ค(shadow)
    fmt.Println(x) // 20
}
fmt.Println(x) // 10

:=๋Š” ์ƒˆ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ์—ฐ์‚ฐ์ž๋‹ค. ์•ˆ์ชฝ ๋ธ”๋ก์—์„œ :=๋ฅผ ์“ฐ๋ฉด ๋ฐ”๊นฅ ๋ณ€์ˆ˜์™€ ์ด๋ฆ„์ด ๊ฐ™์•„๋„ ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ๋ณ€์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

Python์—์„œ๋Š” ๊ฐ™์€ ์ด๋ฆ„์— ํ• ๋‹นํ•˜๋ฉด ๋ฐ”๊นฅ ๋ณ€์ˆ˜๋ฅผ ๋ฎ์–ด์“ด๋‹ค.

x = 10
if True:
    x = 20  # ๋ฐ”๊นฅ x๋ฅผ ๋ฎ์–ด์”€
    print(x)  # 20
print(x)  # 20

4-2. err ์„€๋„์ž‰ ํ•จ์ •

์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๋‹ค.

var err error
 
err = step1() // ๋ฐ”๊นฅ err์— ํ• ๋‹น
if err != nil {
    return err
}
 
if true {
    err := step2() // ์ƒˆ๋กœ์šด err! ๋ฐ”๊นฅ err์„ ๊ฐ€๋ฆผ
    // ์ด err์€ ๋ธ”๋ก์ด ๋๋‚˜๋ฉด ์‚ฌ๋ผ์ง„๋‹ค
    _ = err
}
 
fmt.Println(err) // step1()์˜ ์—๋Ÿฌ๊ฐ’ โ€” step2() ๊ฒฐ๊ณผ๋Š” ๋ฐ˜์˜ ์•ˆ ๋จ

๊ฐ™์€ ์Šค์ฝ”ํ”„์—์„œ :=๋ฅผ ์“ฐ๋ฉด ์ด๋ฏธ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์•ˆ์ชฝ ๋ธ”๋ก์—์„œ :=๋ฅผ ์“ฐ๋ฉด ์ƒˆ ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค. ์ด ์ฐจ์ด๋ฅผ ๋†“์น˜๋ฉด ์—๋Ÿฌ๋ฅผ ์‚ผํ‚ค๋Š” ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธด๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ๋ฐ”๊นฅ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ ค๋ฉด =๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค (:= ๋Œ€์‹ )
  • go vet -shadow ๋˜๋Š” shadow ๋ฆฐํ„ฐ๋กœ ์„€๋„์ž‰์„ ๊ฒ€์ถœํ•  ์ˆ˜ ์žˆ๋‹ค
  • golangci-lint์— shadow ๊ด€๋ จ ๋ฆฐํ„ฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด CI์—์„œ ์ž๋™์œผ๋กœ ์žก์•„์ค€๋‹ค

4-3. ์œ ๋‹ˆ๋ฒ„์Šค ๋ธ”๋ก ์‹๋ณ„์ž ์„€๋„์ž‰

len, cap, make, append, new, true, false ๋“ฑ์€ Go์˜ ์œ ๋‹ˆ๋ฒ„์Šค ๋ธ”๋ก(์ตœ์ƒ์œ„ ์Šค์ฝ”ํ”„)์— ์ •์˜๋œ ์‹๋ณ„์ž๋‹ค. ์ด๊ฒƒ๋“ค๋„ ์„€๋„์ž‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

len := 10 // ์ปดํŒŒ์ผ ์—๋Ÿฌ ์•ˆ ๋‚จ! ํ•˜์ง€๋งŒ ์ดํ›„ len() ํ•จ์ˆ˜๋ฅผ ์“ธ ์ˆ˜ ์—†์Œ

์ด๋Ÿฐ ์ด๋ฆ„์€ ๋ณ€์ˆ˜๋ช…์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. Python์—์„œ list = [1, 2, 3]์œผ๋กœ ๋นŒํŠธ์ธ์„ ๋ฎ์–ด์“ฐ๋Š” ์‹ค์ˆ˜์™€ ๊ฐ™์€ ๋งฅ๋ฝ์ด๋‹ค.


5. switch โ€” Python match/case๋ณด๋‹ค ์œ ์—ฐํ•˜๋‹ค

Go์˜ switch๋Š” C/C++๊ณผ ๋‹ฌ๋ฆฌ break๊ฐ€ ํ•„์š” ์—†๋‹ค. ๋งค์นญ๋˜๋Š” case๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋น ์ ธ๋‚˜์˜จ๋‹ค.

switch os := runtime.GOOS; os {
case "darwin":
    fmt.Println("macOS")
case "linux":
    fmt.Println("Linux")
default:
    fmt.Println(os)
}
import platform
 
match platform.system():
    case "Darwin":
        print("macOS")
    case "Linux":
        print("Linux")
    case os:
        print(os)

Go switch๊ฐ€ ๋” ์œ ์—ฐํ•œ ๋ถ€๋ถ„

ํ•˜๋‚˜์˜ case์— ์—ฌ๋Ÿฌ ๊ฐ’์„ ์ฝค๋งˆ๋กœ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ๋‹ค.

switch day {
case "Sat", "Sun":
    fmt.Println("weekend")
default:
    fmt.Println("weekday")
}

๋น„๊ต ๋Œ€์ƒ ์—†์ด switch๋งŒ ์“ฐ๋ฉด if-else ์ฒด์ธ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

switch {
case n < 0:
    fmt.Println("negative")
case n == 0:
    fmt.Println("zero")
default:
    fmt.Println("positive")
}

fallthrough โ€” ๋‹ค์Œ case๋กœ ๋–จ์–ด๋œจ๋ฆฌ๊ธฐ

Go๋Š” ๊ธฐ๋ณธ์ด ์ž๋™ break๋ผ์„œ, C์ฒ˜๋Ÿผ ๋‹ค์Œ case๋กœ ์ด์–ด์„œ ์‹คํ–‰ํ•˜๋ ค๋ฉด fallthrough๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. ํ˜„์žฌ case์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ ๋’ค ๋ฐ”๋กœ ๋‹ค์Œ case์˜ ์ฝ”๋“œ๊นŒ์ง€ ์กฐ๊ฑด ๊ฒ€์‚ฌ ์—†์ด ์‹คํ–‰ํ•œ๋‹ค.

switch n := 2; n {
case 2:
    fmt.Println("2")
    fallthrough // ๋‹ค์Œ case๋กœ ๋–จ์–ด์ง„๋‹ค
case 1:
    fmt.Println("1")
    fallthrough
case 0:
    fmt.Println("0")
}
// ์ถœ๋ ฅ:
// 2
// 1
// 0

fallthrough๋Š” ๋‹ค์Œ case์˜ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ๋ฌด์กฐ๊ฑด ์‹คํ–‰ํ•œ๋‹ค. ์ด ์ ์„ ๋†“์น˜๊ธฐ ์‰ฝ๋‹ค. ์œ„์—์„œ n์ด 2์—ฌ๋„ case 1, case 0์˜ ๋ณธ๋ฌธ์ด ๋ชจ๋‘ ์‹คํ–‰๋œ๋‹ค.

๋ˆ„์ ๋˜๋Š” ๋“ฑ๊ธ‰ ์ฒ˜๋ฆฌ ๊ฐ™์€ ๊ณณ์—์„œ ๊ฐ€๋” ์“ฐ์ง€๋งŒ, ์˜๋„๋ฅผ ํ—ท๊ฐˆ๋ฆฌ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์‰ฌ์›Œ์„œ ์‹ค๋ฌด์—์„œ๋Š” ๊ฑฐ์˜ ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ์ฝค๋งˆ๋กœ ์—ฌ๋Ÿฌ ๊ฐ’์„ ๋‚˜์—ดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค.

# Python match/case์—๋Š” fallthrough๊ฐ€ ์—†๋‹ค โ€” ์—ฌ๋Ÿฌ ๊ฐ’์€ | ๋กœ ๋ฌถ๋Š”๋‹ค
match command:
    case "start" | "run":
        print("์‹คํ–‰")
    case "stop":
        print("์ค‘์ง€")

if๋ฌธ์ฒ˜๋Ÿผ switch์—๋„ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ os := runtime.GOOS, n := 2 ๋ถ€๋ถ„์ด ๊ทธ ์˜ˆ์‹œ๋‹ค.