Alert
์ด ๊ธ์ Claude Code์ ๋์์ ๋ฐ์ ์์ฑ๋์์ต๋๋ค
TL;DR
- Go ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ํ์ ์ ์ผ๋ถ์ด๋ฏ๋ก ์ค๋ฌด์์๋ ์ฌ๋ผ์ด์ค๋ฅผ ์ฌ์ฉ
- ์ฌ๋ผ์ด์ค๋ Python list์ ์ ์ฌํ์ง๋ง append ์ ๋ฐ๋์ ์ฌํ ๋น ํ์
- ๋งต์ Python dict์ ๊ฑฐ์ ๋์ผํ๋ nil ๋งต์ ์ฐ๊ธฐํ๋ฉด panic ๋ฐ์
- ๊ตฌ์กฐ์ฒด๋ Python dataclass์ ๋น์ทํ ์ญํ ์ ํ๋ Go์ ๋ณตํฉ ํ์
1. ๋ฐฐ์ด โ ๊ฑฐ์ ์ ์ฐ์ง๋ง ์์์ผ ํ๋ ์ด์
Go์ ๋ฐฐ์ด์ C/C++์ฒ๋ผ ๊ณ ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ค. ์ค์ํ ์ ์ ํฌ๊ธฐ ์์ฒด๊ฐ ํ์ ์ ์ผ๋ถ๋ผ๋ ๊ฒ์ด๋ค.
var a [3]int // [3]int ํ์
var b [4]int // [4]int ํ์
โ a์ ๋ค๋ฅธ ํ์
[3]int์ [4]int๋ ์๋ก ๋ค๋ฅธ ํ์
์ด๊ธฐ ๋๋ฌธ์ ๋์
๋, ๋น๊ต๋ ์ ๋๋ค. Python์์ ๋ฆฌ์คํธ ๊ธธ์ด๊ฐ ํ์
์ ์ํฅ์ ์ฃผ์ง ์๋ ๊ฒ๊ณผ ๋์กฐ์ ์ด๋ค.
a = b // ์ปดํ์ผ ์๋ฌ: cannot use b (type [4]int) as type [3]int๋ฐฐ์ด์ ์ธ์ ์ฐ๋๊ฐ
- ์ค๋ฌด์์ ๋ฐฐ์ด์ ์ง์ ์ธ ์ผ์ ๊ฑฐ์ ์๋ค
- ์ฌ๋ผ์ด์ค์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ธฐ ์ํ ๋ฐฐ๊ฒฝ ์ง์ ์ ๋๋ก ์์๋๋ฉด ๋๋ค
- SHA-256 ํด์๊ฐ์ฒ๋ผ ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ๊ฐ๋ ๋ฑ์ฅํ๋ค
2. ์ฌ๋ผ์ด์ค โ Python list์ Go ๋ฒ์
์ฌ๋ผ์ด์ค๋ Go์์ ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ์ปฌ๋ ์
ํ์
์ด๋ค. Python์ list์ ์ญํ ์ด ๊ฐ๋ค.
2.1 ์ ์ธ๊ณผ ์ด๊ธฐํ
// ๋ฆฌํฐ๋ด๋ก ์ ์ธ
var nums = []int{10, 20, 30}
// ์งง์ ์ ์ธ
names := []string{"alice", "bob"}Python๊ณผ ๋น๊ตํ๋ฉด ์ด๋ ๋ค.
# Python
nums = [10, 20, 30]
names = ["alice", "bob"]// Go
nums := []int{10, 20, 30}
names := []string{"alice", "bob"}2.2 nil ์ฌ๋ผ์ด์ค
์ ์ธ๋ง ํ๊ณ ์ด๊ธฐํํ์ง ์์ผ๋ฉด nil ์ฌ๋ผ์ด์ค๊ฐ ๋๋ค.
var x []int
fmt.Println(x == nil) // true
fmt.Println(len(x)) // 0Python์ ๋น ๋ฆฌ์คํธ []์ ๋ค๋ฅด๋ค. Python์์ []๋ ์ ํจํ ๋น ๋ฆฌ์คํธ์ง๋ง, Go์ nil ์ฌ๋ผ์ด์ค๋ ์์ง ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋์ง ์์ ์ํ๋ค. ๋ค๋ง len, append ๋ฑ์ nil ์ฌ๋ผ์ด์ค์์๋ ์ ์ ๋์ํ๋ค.
# Python
x = [] # ๋น ๋ฆฌ์คํธ, None์ด ์๋
x is None # False// Go
var x []int // nil ์ฌ๋ผ์ด์ค
x == nil // true
x = append(x, 1) // ์ ์ ๋์2.3 append โ ๋ฐ๋์ ์ฌํ ๋น
append๋ ์๋ณธ ์ฌ๋ผ์ด์ค๋ฅผ ์์ ํ์ง ์๊ณ ์ ์ฌ๋ผ์ด์ค๋ฅผ ๋ฐํํ๋ค. ๋ฐ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ฌํ ๋นํด์ผ ํ๋ค.
x := []int{1, 2, 3}
x = append(x, 4) // ๋ฐ๋์ x์ ๋ค์ ๋์
x = append(x, 5, 6, 7) // ์ฌ๋ฌ ๊ฐ ๋์ ์ถ๊ฐPython์ extend์ ํด๋นํ๋ ํจํด์ ... ์ฐ์ฐ์๋ฅผ ์ด๋ค.
# Python
a = [1, 2, 3]
b = [4, 5, 6]
a.extend(b)// Go
a := []int{1, 2, 3}
b := []int{4, 5, 6}
a = append(a, b...) // b๋ฅผ ํ์ด์ appendappend๋ฅผ ์ฌํ ๋นํ์ง ์์ผ๋ฉด?
append(x, 10)์ฒ๋ผ ๊ฒฐ๊ณผ๋ฅผ ๋ฒ๋ฆฌ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์๋ฌ๋ฅผ ๋ธ๋ค. Python์list.append()๋ ์๋ณธ์ ์ง์ ์์ (in-place)ํ๋ฏ๋ก ๋ฐํ๊ฐ์ ์ธ ํ์๊ฐ ์์ง๋ง, Go๋ ๋ค๋ฅด๋ค.
2.4 ์ฌ๋ผ์ด์ฑ โ ๋ถ๋ถ ์ถ์ถ๊ณผ ์ ์ฅ ๊ณต๊ฐ ๊ณต์
์ฌ๋ผ์ด์ค์์ ์ผ๋ถ๋ฅผ ์๋ผ๋ด๋ ๋ฌธ๋ฒ์ Python๊ณผ ๊ฑฐ์ ๊ฐ๋ค.
x := []int{10, 20, 30, 40, 50}
y := x[1:3] // [20, 30] โ ์ธ๋ฑ์ค 1๋ถํฐ 3 ๋ฏธ๋ง
z := x[:2] // [10, 20]
w := x[2:] // [30, 40, 50]# Python โ ๋์ผํ ๋ฌธ๋ฒ
x = [10, 20, 30, 40, 50]
y = x[1:3] # [20, 30]ํ์ง๋ง ๋์ ๋ฐฉ์์ด ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฅด๋ค. Python์ ์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ , Go๋ ์๋ณธ ๋ฐฐ์ด์ ๊ณต์ ํ๋ค.
x := []int{10, 20, 30, 40, 50}
y := x[1:3] // [20, 30]
y[0] = 999
fmt.Println(x) // [10, 999, 30, 40, 50] โ ์๋ณธ๋ ๋ฐ๋!
fmt.Println(y) // [999, 30]# Python โ ์๋ณธ์ ์ํฅ ์์
x = [10, 20, 30, 40, 50]
y = x[1:3]
y[0] = 999
print(x) # [10, 20, 30, 40, 50] โ ์๋ณธ ๊ทธ๋๋กGo์์ ์ฌ๋ผ์ด์ฑ์ ๋ณต์ฌ๊ฐ ์๋๋ผ ๊ฐ์ ๋ด๋ถ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ๋ทฐ(view) ๋ฅผ ๋ง๋ ๋ค. ๊ทธ๋์ ํ์ชฝ์ ์์ ํ๋ฉด ๋ค๋ฅธ ์ชฝ์๋ ์ํฅ์ด ๊ฐ๋ค.
๋ ์ํํ ๊ฒฝ์ฐ๋ ์ฌ๋ผ์ด์ฑํ ๋ค append๋ฅผ ํ ๋๋ค. ์ฉ๋์ด ๋จ์์์ผ๋ฉด ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ฎ์ด์ธ ์ ์๋ค.
x := []int{10, 20, 30, 40, 50}
y := x[:2] // [10, 20], cap(y) = 5 โ ์๋ณธ์ ์ฉ๋์ ๊ทธ๋๋ก ๊ฐ์ ธ๊ฐ
y = append(y, 999)
fmt.Println(x) // [10, 20, 999, 40, 50] โ x[2]๊ฐ ๋ฎ์ด์จ์ง!
fmt.Println(y) // [10, 20, 999]์ด ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ด ๋ ๊ฐ์ง ์๋ค.
๋ฐฉ๋ฒ 1: ์์ ํ ์ฌ๋ผ์ด์ค ํํ์ (3-index slice)
์ธ ๋ฒ์งธ ์ธ๋ฑ์ค๋ก ์ฉ๋์ ์ ํํ ์ ์๋ค. x[start:end:cap] ํํ๋ค.
x := []int{10, 20, 30, 40, 50}
y := x[:2:2] // [10, 20], cap(y) = 2 โ ์ฉ๋์ ๊ธธ์ด์ ๊ฐ๊ฒ ์ ํ
y = append(y, 999) // ์ฉ๋ ์ด๊ณผ โ ์ ๋ฐฐ์ด ํ ๋น
fmt.Println(x) // [10, 20, 30, 40, 50] โ ์๋ณธ ์์
fmt.Println(y) // [10, 20, 999]์ธ ๋ฒ์งธ ๊ฐ์ด ์ฉ๋์ ๋ ์์น๋ฅผ ์ง์ ํ๋ค. x[:2:2]๋ โ๊ธธ์ด 2, ์ฉ๋๋ 2โ๊ฐ ๋์ด append ์ ๋ฐ๋์ ์ ๋ฐฐ์ด์ด ํ ๋น๋๋ค.
๋ฐฉ๋ฒ 2: copy ํจ์
์์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ ๋
๋ฆฝ์ ์ธ ์ฌ๋ผ์ด์ค๋ฅผ ๋ง๋ ๋ค. Python์ ์ฌ๋ผ์ด์ฑ(x[1:3])์ด ํ๋ ๊ฒ๊ณผ ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ๋ค.
x := []int{10, 20, 30, 40, 50}
y := make([]int, 2) // ๊ธธ์ด 2์ง๋ฆฌ ์ฌ๋ผ์ด์ค๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ ๋ค (make๋ 2.6์์ ์์ธํ)
copy(y, x[1:3]) // x[1:3]์ ๋ด์ฉ์ y์ ๋ณต์ฌ
y[0] = 999
fmt.Println(x) // [10, 20, 30, 40, 50] โ ์๋ณธ ์์
fmt.Println(y) // [999, 30]copy(dst, src)๋ ๋ ์ฌ๋ผ์ด์ค ์ค ์งง์ ์ชฝ์ ๊ธธ์ด๋งํผ๋ง ๋ณต์ฌํ๋ค. ๊ทธ๋์ ๋์(dst)์๋ ๋ฏธ๋ฆฌ ๊ธธ์ด๊ฐ ํ๋ณด๋ ์ฌ๋ผ์ด์ค๊ฐ ํ์ํ๊ณ , ์ฌ๊ธฐ์ make๋ฅผ ์ด๋ค. ๋ฐํ๊ฐ์ ์ค์ ๋ก ๋ณต์ฌ๋ ์์ ์๋ค.
์ฌ๋ผ์ด์ฑ ์ ์ฃผ์
- Go์ ์ฌ๋ผ์ด์ฑ์ ๋ณต์ฌ๊ฐ ์๋๋ผ ๋ทฐ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค
- ์๋ณธ๊ณผ ๋ถ๋ฆฌํ๊ณ ์ถ์ผ๋ฉด
copy๋ฅผ ์ฐ๊ฑฐ๋, 3-index slice(x[:2:2])๋ก ์ฉ๋์ ์ ํํด์ผ ํ๋ค- Python ๊ฐ๋ฐ์๋ ์ฌ๋ผ์ด์ฑ์ด ํญ์ ๋ณต์ฌ์ธ ๊ฒ์ ์ต์ํ๋ฏ๋ก, Go์์ ์ด ์ฐจ์ด๋ฅผ ๋์น๊ธฐ ์ฝ๋ค
2.5 len๊ณผ cap
์ฌ๋ผ์ด์ค์๋ ๊ธธ์ด(length)์ ์ฉ๋(capacity) ๋ ๊ฐ์ง ์์ฑ์ด ์๋ค.
x := []int{1, 2, 3}
fmt.Println(len(x)) // 3 โ ํ์ฌ ์์ ๊ฐ์
fmt.Println(cap(x)) // 3 โ ๋ด๋ถ ๋ฐฐ์ด์ ์ ์ฒด ํฌ๊ธฐ
x = append(x, 4)
fmt.Println(len(x)) // 4
fmt.Println(cap(x)) // 6 โ ์ฉ๋์ด ๋ถ์กฑํด์ 2๋ฐฐ๋ก ํ์ฅ๋จlen: ํ์ฌ ๋ค์ด์๋ ์์ ์cap: ์ฌํ ๋น ์์ด ๋ด์ ์ ์๋ ์ต๋ ์์ ์
์ฉ๋์ด ๋ถ์กฑํ๋ฉด Go ๋ฐํ์์ด ๋ ํฐ ๋ฐฐ์ด์ ์๋ก ํ ๋นํ๊ณ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ค. ํ์ฅ ๊ท์น์ ๋๋ต ๋ค์๊ณผ ๊ฐ๋ค. (Go 1.14 ๊ธฐ์ค)
- ํ์ฌ ์ฉ๋์ด 1024 ๋ฏธ๋ง์ด๋ฉด 2๋ฐฐ๋ก ํ์ฅ
- 1024 ์ด์์ด๋ฉด ์ฝ 25%์ฉ ํ์ฅ
Python์ list๋ ๋ด๋ถ์ ์ผ๋ก ๋น์ทํ ๋์ ๋ฐฐ์ด ๊ตฌ์กฐ๋ฅผ ์ด๋ค. ๋ค๋ง Python์์๋ ๊ฐ๋ฐ์๊ฐ capacity๋ฅผ ์ง์ ๊ด๋ฆฌํ ์ผ์ด ์๋ค.
2.6 make โ ์ฉ๋์ ๋ฏธ๋ฆฌ ์ง์
ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์๊ณ ์์ผ๋ฉด make๋ก ์ฌ๋ผ์ด์ค๋ฅผ ์์ฑํ๋ฉด ๋ถํ์ํ ์ฌํ ๋น์ ์ค์ผ ์ ์๋ค.
// ๊ธธ์ด 5, ์ฉ๋ 5 (๊ธฐ๋ณธ๊ฐ์ผ๋ก cap == len)
a := make([]int, 5)
// a = [0, 0, 0, 0, 0]
// ๊ธธ์ด 5, ์ฉ๋ 10
b := make([]int, 5, 10)
// b = [0, 0, 0, 0, 0], cap(b) = 10๊ธธ์ด 0, ์ฉ๋๋ง ์ง์ ํ๋ ํจํด
ํฌ๊ธฐ๋ฅผ ์์ํ ์ ์์ง๋ง ์ฒ์์๋ ๋น์ด์์ด์ผ ํ ๋ ์์ฃผ ์ด๋ค.
result := make([]int, 0, 100) for _, v := range data { result = append(result, v*2) }
2.7 ์ธ์ ๋ญ ์ฐ๋๊ฐ
| ์ํฉ | ๊ถ์ฅ ๋ฐฉ์ | ์์ |
|---|---|---|
| ๋น์ด์์ ์๋ ์๋ ๊ฒฝ์ฐ | nil ์ฌ๋ผ์ด์ค | var data []int |
| ์ด๊ธฐ๊ฐ์ด ์๋ ๊ฒฝ์ฐ | ๋ฆฌํฐ๋ด | nums := []int{1, 2, 3} |
| ํฌ๊ธฐ๋ฅผ ์์ํ ์ ์๋ ๊ฒฝ์ฐ | make | make([]int, 0, n) |
// JSON ์๋ต ๋ฑ์์ ๊ฐ์ด ์์ ์๋ ์์ผ๋ฉด nil ์ฌ๋ผ์ด์ค
var data []int
// ๊ณ ์ ๋ ์ด๊ธฐ๊ฐ์ด ์์ผ๋ฉด ๋ฆฌํฐ๋ด
defaults := []string{"en", "ko", "ja"}
// ๋ฃจํ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์ ๋ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ก์ผ๋ฉด ์ฑ๋ฅ ์ด๋
result := make([]int, 0, len(input))3. ๋งต โ Python dict์ ๊ฑฐ์ ๊ฐ๋ค
Go์ map์ Python์ dict์ ๊ธฐ๋ฅ์ด ๊ฑฐ์ ๋์ผํ๋ค. ํค-๊ฐ ์์ ์ ์ฅํ๋ ํด์ ํ
์ด๋ธ ๊ธฐ๋ฐ ์๋ฃ๊ตฌ์กฐ๋ค.
3.1 ์ ์ธ๊ณผ ์ด๊ธฐํ
// ๋ฆฌํฐ๋ด
m := map[string]int{
"alice": 90,
"bob": 85,
}
// make๋ก ๋น ๋งต ์์ฑ
scores := make(map[string]int)# Python
m = {"alice": 90, "bob": 85}
scores = {}3.2 ์ฝ๊ธฐ์ ์ฐ๊ธฐ
m["charlie"] = 78 // ์ฐ๊ธฐ
score := m["alice"] // ์ฝ๊ธฐ โ 90์๋ ํค๋ฅผ ์ฝ์ผ๋ฉด Python์ KeyError๋ฅผ ๋ฐ์์ํค์ง๋ง, Go๋ ํด๋น ๊ฐ ํ์
์ zero value๋ฅผ ๋ฐํํ๋ค.
score := m["unknown"] // 0 (int์ zero value)์ด ๋์ ๋๋ฌธ์ ํค๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ ค๋ฉด comma ok ๊ด์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํ๋ค.
3.3 comma ok ๊ด์ฉ๊ตฌ
v, ok := m["key"]
if !ok {
fmt.Println("key๊ฐ ์์")
}Python์์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
# Python โ ๋ฐฉ๋ฒ 1: get
v = m.get("key") # ์์ผ๋ฉด None
# Python โ ๋ฐฉ๋ฒ 2: in ์ฐ์ฐ์
if "key" in m:
v = m["key"]Go์ comma ok ํจํด์ Python์ dict.get()๊ณผ in ๊ฒ์ฌ๋ฅผ ํ๋๋ก ํฉ์น ํํ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
3.4 ์ญ์
// Go
delete(m, "bob")# Python
del m["bob"]Go์ delete๋ ์๋ ํค๋ฅผ ์ญ์ ํด๋ panic์ด ๋ฐ์ํ์ง ์๋๋ค. Python์ del์ ์๋ ํค๋ฉด KeyError๊ฐ ๋ฐ์ํ๋ค.
3.5 nil ๋งต ์ฃผ์
var m map[string]int // nil ๋งต
fmt.Println(m["key"]) // 0 โ ์ฝ๊ธฐ๋ ๋๋ค
m["key"] = 1 // panic: assignment to entry in nil mapnil ๋งต์ ์ฐ๊ธฐํ๋ฉด panic
nil ๋งต์ ์ฝ๊ธฐ๋ ๊ฐ๋ฅํ์ง๋ง ์ฐ๊ธฐ๋ฅผ ์๋ํ๋ฉด ๋ฐํ์ panic์ด ๋ฐ์ํ๋ค. ๋ฐ๋์
make(map[string]int)๋๋ ๋ฆฌํฐ๋ดmap[string]int{}๋ก ์ด๊ธฐํํ ๋ค ์ฌ์ฉํด์ผ ํ๋ค.
4. ๊ตฌ์กฐ์ฒด ๋ง๋ณด๊ธฐ
Go์ ๊ตฌ์กฐ์ฒด(struct)๋ Python์ dataclass์ ๋น์ทํ ์ญํ ์ ํ๋ค. ์ฌ๋ฌ ํ๋๋ฅผ ํ๋์ ํ์
์ผ๋ก ๋ฌถ๋๋ค.
4.1 Python dataclass์ ๋น๊ต
# Python
from dataclasses import dataclass
@dataclass
class User:
name: str
age: int// Go
type User struct {
Name string
Age int
}4.2 ์ ์ธ๊ณผ ์ฌ์ฉ
// var ์ ์ธ โ ๋ชจ๋ ํ๋๊ฐ zero value
var u User
fmt.Println(u.Name) // "" (๋น ๋ฌธ์์ด)
fmt.Println(u.Age) // 0
// ๋ฆฌํฐ๋ด ์ ์ธ
u2 := User{
Name: "alice",
Age: 30,
}Python์์๋ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ์ง ์์ผ๋ฉด ๋ฐ๋์ ์ธ์๋ฅผ ๋๊ฒจ์ผ ํ์ง๋ง, Go์ ๊ตฌ์กฐ์ฒด๋ ์ ์ธ๋ง ํ๋ฉด ๋ชจ๋ ํ๋๊ฐ zero value๋ก ์ด๊ธฐํ๋๋ค.
4.3 ์ต๋ช ๊ตฌ์กฐ์ฒด
์ผํ์ฑ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฌถ๊ณ ์ถ์ ๋ ํ์ ์ด๋ฆ ์์ด ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค.
person := struct {
Name string
Age int
}{
Name: "bob",
Age: 25,
}JSON ๋ณํ์ด๋ ํ ์คํธ ์ฝ๋์์ ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฅผ ์์๋ก ๋ด์ ๋ ์ ์ฉํ๋ค.
4.4 ๊ตฌ์กฐ์ฒด ๋น๊ต์ ๋ณํ
๋น๊ต
๊ตฌ์กฐ์ฒด๋ ๋ชจ๋ ํ๋๊ฐ ๋น๊ต ๊ฐ๋ฅํ ํ์
(์ซ์, ๋ฌธ์์ด, bool ๋ฑ)์ผ๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉด ==๋ก ์ง์ ๋น๊ตํ ์ ์๋ค. ๊ฐ์ ํ์
์ด๊ณ ๋ชจ๋ ํ๋ ๊ฐ์ด ๊ฐ์ผ๋ฉด true๋ค.
type Point struct {
X int
Y int
}
a := Point{1, 2}
b := Point{1, 2}
c := Point{3, 4}
fmt.Println(a == b) // true โ ๋ชจ๋ ํ๋๊ฐ ๊ฐ์
fmt.Println(a == c) // false๋จ, ์ฌ๋ผ์ด์ค๋ ๋งต ๊ฐ์ ๋น๊ต ๋ถ๊ฐ๋ฅํ ํ๋๊ฐ ๋ค์ด์์ผ๋ฉด ==๋ฅผ ์ธ ์ ์๊ณ ์ปดํ์ผ ์๋ฌ๊ฐ ๋๋ค. ์ด ๊ฒฝ์ฐ๋ reflect.DeepEqual ๊ฐ์ ๋ณ๋ ๋ฐฉ๋ฒ์ ์จ์ผ ํ๋ค.
Python์์๋ @dataclass๊ฐ __eq__๋ฅผ ์๋ ์์ฑํด์ ํ๋ ๊ฐ์ผ๋ก ๋น๊ตํด์ค๋ค. Go์ ๊ตฌ์กฐ์ฒด ==๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋น์ทํ์ง๋ง, ์ธ์ด ์ฐจ์์์ ๊ธฐ๋ณธ ์ ๊ณต๋๋ค๋ ์ ์ด ๋ค๋ฅด๋ค.
# Python โ dataclass๋ ๊ฐ ๋น๊ต๋ฅผ ์๋ ์ง์
a = Point(1, 2)
b = Point(1, 2)
print(a == b) # True๋ณํ
ํ์ ์ด ๋ค๋ฅธ ๋ ๊ตฌ์กฐ์ฒด๋ ์๋ก ๋น๊ตํ ์ ์๋ค. ํ์ง๋ง ํ๋์ ์ด๋ฆ, ์์, ํ์ ์ด ๋ชจ๋ ๊ฐ๋ค๋ฉด ๋ช ์์ ํ์ ๋ณํ์ ๊ฐ๋ฅํ๋ค.
type Point struct {
X int
Y int
}
type Coord struct {
X int
Y int
}
p := Point{1, 2}
// fmt.Println(p == Coord{1, 2}) // ์ปดํ์ผ ์๋ฌ: ํ์
์ด ๋ค๋ฆ
c := Coord(p) // OK โ ํ๋ ์ด๋ฆ/์์/ํ์
์ด ๊ฐ์์ ๋ณํ ๊ฐ๋ฅ
fmt.Println(c) // {1 2}ํ๋ ๊ตฌ์ฑ์ด ํ๋๋ผ๋ ๋ค๋ฅด๋ฉด(์ด๋ฆ, ์์, ํ์ ์ค ํ๋๋ผ๋) ๋ณํ์ด ์ ๋๋ค.
type Named struct {
X int
Y int
Label string // ํ๋๊ฐ ํ๋ ๋ ์์
}
// c := Named(p) // ์ปดํ์ผ ์๋ฌ: ํ๋ ๊ตฌ์ฑ์ด ๋ค๋ฆ๋น๊ต vs ๋ณํ ์ ๋ฆฌ
- ๋น๊ต(
==) : ๊ฐ์ ํ์ ๋ผ๋ฆฌ๋ง ๊ฐ๋ฅ, ๋ชจ๋ ํ๋ ๊ฐ์ด ๊ฐ์ผ๋ฉดtrue- ๋ณํ : ํ์ ์ด ๋ฌ๋ผ๋ ํ๋์ ์ด๋ฆ/์์/ํ์ ์ด ์์ ํ ๊ฐ์ผ๋ฉด ๋ช ์์ ๋ณํ ๊ฐ๋ฅ
- ์ฌ๋ผ์ด์คยท๋งต ํ๋๊ฐ ์์ผ๋ฉด
==๋น๊ต ๋ถ๊ฐ (reflect.DeepEqual์ฌ์ฉ)