์ด๊ฒ์ ํ๋ณ ์กฐํฉ์ด๋ผ๊ณ ๋ ํ๋ ํฉ๊ณ ์ ํ์ ๋ํ ์ ์์ ๋๋ค. Go์ ํฉ๊ณ ์ ํ์ ๋ค์์ ์ ์ธํ๊ณ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐํ์ด์ค์ฒ๋ผ ์๋ํด์ผ ํฉ๋๋ค.
ํฉ๊ณ ์ ํ์ switch ๋ฌธ๊ณผ ์ผ์น์ํฌ ์ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ ๋ชจ๋ ๋ณํ์ด ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค. switch ๋ฌธ์ ์ ๋ด์์ ์ผ์นํ๋ ๋ณํ์ ๊ฐ์ธ ๊ฒ์ฒ๋ผ ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์คํ ์์ค ๋ฆด๋ฆฌ์ค ์ด์ ๋ถํฐ ์์ํ์ฌ ๊ณผ๊ฑฐ์ ์ฌ๋ฌ ๋ฒ ๋ ผ์๋์์ต๋๋ค. ๊ณผ๊ฑฐ์ ํฉ์๋ sum ์ ํ์ด ์ธํฐํ์ด์ค ์ ํ์ ๋ณ๋ก ์ถ๊ฐ๋์ง ์๋๋ค๋ ๊ฒ์ด์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ ๋ถ๋ฅํ๋ฉด ๊ฒฐ๊ตญ ์ปดํ์ผ๋ฌ๊ฐ ์ ํ ์ ํ์ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ฑ์ ๋์ง ํ์ธํ๋ ์ธํฐํ์ด์ค ์ ํ์ ์ป๊ฒ ๋ฉ๋๋ค. ๊ทธ๊ฒ์ ์๋ก์ด ์ธ์ด ๋ณ๊ฒฝ์ ๋ํ ์๋นํ ์์ ์ด์ ์ ๋๋ค.
์ด ์ ์์ ๊ณ์ ์ถ์งํ๋ ค๋ฉด ๋ค์์ ํฌํจํ์ฌ ๋ณด๋ค ์์ ํ ์ ์ ๋ฌธ์๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๊ตฌ๋ฌธ์ด๋ ๋ฌด์์ ๋๊น? ์ ํํ ์ด๋ป๊ฒ ์๋ํฉ๋๊น? (๋น์ ์ ๊ทธ๊ฒ๋ค์ด "๊ฐ ์ ํ"์ด๋ผ๊ณ ๋งํ์ง๋ง ์ธํฐํ์ด์ค ์ ํ์ ๋ํ ๊ฐ ์ ํ์ ๋๋ค). ์ฅ๋จ์ ์ ๋ฌด์์ ๋๊น?
https://www.reddit.com/r/golang/comments/46bd5h/ama_we_are_the_go_contributors_ask_us_anything/d03t6ji/?st=ixp2gf04&sh=7d6920db ์์ ์์์ผ ํ ๊ณผ๊ฑฐ ํ ๋ก ์ ์ฐธ์กฐ
๋๋ ์ด๊ฒ์ด Go1์ ์ ํ ์์คํ
์ ๋๋ฌด ์ค์ํ ๋ณ๊ฒฝ์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ ๊ธด๊ธํ๊ฒ ํ์ํ์ง ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ Go 2์ ๋ ํฐ ๋งฅ๋ฝ์์ ๋ค์ ์ดํด๋ณผ ๊ฒ์ ์ ์ํฉ๋๋ค.
์ด ์ ์์ ๋ง๋ค์ด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ์ ๋ ์ด ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ 1๋
์ ๋ ๊ณ ๋ฏผํด ์์ต๋๋ค.
๋ค์์ ๋ด๊ฐ ๊ตฌ์ฒด์ ์ธ ์ ์์ ๊ฐ์ง๊ณ ์๋ ํ์
๋๋ค. ์ ์๊ฐ์๋
"์ ํ ์ ํ"์ ์ค์ ๋ก "ํฉ ์ ํ"๋ณด๋ค ๋ ๋์ ์ด๋ฆ์ผ ์ ์์ง๋ง YMMV์
๋๋ค.
ํฉ๊ณ ์ ํ์ "|"๊ฐ ๊ฒฐํฉ๋ ๋ ์ด์์ ์ ํ์ผ๋ก ํ์๋ฉ๋๋ค.
์ด์์.
type: type1 | type2 ...
๊ฒฐ๊ณผ ์ ํ์ ๊ฐ์ ์ง์ ๋ ์ ํ ์ค ํ๋๋ง ๋ณด์ ํ ์ ์์ต๋๋ค. NS
์ ํ์ ์ธํฐํ์ด์ค ์ ํ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋์ ์ ํ์
ํ ๋น๋ ๊ฐ์
๋๋ค.
ํน๋ณํ ๊ฒฝ์ฐ๋ก "nil"์ ๊ฐ์ ์ฌ์ฉํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
0์ด ๋๋ค.
์๋ฅผ ๋ค์ด:
type maybeInt nil | int
ํฉ๊ณ ์ ํ์ ๋ฉ์๋ ์ธํธ๋ ๋ฉ์๋ ์ธํธ์ ๊ต์งํฉ์ ๋ณด์ ํฉ๋๋ค.
๋์ผํ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ ์ธํ ๋ชจ๋ ๊ตฌ์ฑ ์์ ์ ํ
์ด๋ฆ์ด์ง๋ง ์๋ช
์ด ๋ค๋ฆ
๋๋ค.
๋ค๋ฅธ ์ธํฐํ์ด์ค ์ ํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก sum ์ ํ์ ๋์
์ ํ ๋ณํ. ์ ํ ์ค์์น์์ ์ค์์น์ ์ฒซ ๋ฒ์งธ ์์
์ ์ฅ๋ ์ ํ๊ณผ ์ผ์นํ๋ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค.
ํฉ๊ณ ์ ํ์ 0 ๊ฐ์ ์ฒซ ๋ฒ์งธ ์ ํ์ 0 ๊ฐ์
๋๋ค.
ํฉ๊ณ.
ํฉ๊ณ ์ ํ์ ๊ฐ์ ํ ๋นํ ๋ ๊ฐ์ด ๋ ๋ง์ด ๋ค์ด๊ฐ ์ ์๋ ๊ฒฝ์ฐ
๊ฐ๋ฅํ ์ ํ ์ค ํ๋ ์ด์์ธ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ์ ํ์ด ์ ํ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด:
var x int|float64 = 13
๋์ ์ ํ์ด int์ธ ๊ฐ์ด ์์ฑ๋์ง๋ง
var x int|float64 = 3.13
๋์ ์ ํ์ด float64์ธ ๊ฐ์ด ์์ฑ๋ฉ๋๋ค.
์์งํ ๊ตฌํ์ ํฉ๊ณ ์ ํ์ ์ธํฐํ์ด์ค๋ก ์ ํํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
๊ฐ์น. ๋ณด๋ค ์ ๊ตํ ์ ๊ทผ ๋ฐฉ์์ ํํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ๋ฅํ ๊ฐ ์งํฉ์ ์ ํฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด ํฌ์ธํฐ๊ฐ ์๋ ๊ตฌ์ฒด์ ์ธ ์ ํ์ผ๋ก๋ง ๊ตฌ์ฑ๋ ํฉ๊ณ ์ ํ
์ถ๊ฐ ๊ฐ์ ์ฌ์ฉํ์ฌ ํฌ์ธํฐ๊ฐ ์๋ ์ ํ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
์ค์ ์ ํ์ ๊ธฐ์ตํ์ญ์์ค.
sum-of-struct-types์ ๊ฒฝ์ฐ ์ฌ๋ถ์ ํจ๋ฉ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
๊ทธ ๋ชฉ์ ์ ์ํด ๊ตฌ์กฐ์ฒด์ ๊ณตํต๋ ๋ฐ์ดํธ.
@rogpeppe ์ ํ ์ด์ค์
๋ฐ ์ ํ ์ค์์น์ ์ด๋ป๊ฒ ์ํธ ์์ฉํฉ๋๊น? ํฉ๊ณ์ ๋ฉค๋ฒ๊ฐ ์๋ ์ ํ(๋๋ ์ ํ์ ๋ํ ์ด์ค์
)์ case
๊ฐ ์๋ ๊ฒ์ ์ปดํ์ผ ํ์ ์ค๋ฅ์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌํ ์ ํ์ ๋ํด ํฌ๊ด์ ์ด์ง ์์ ์ค์์น๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ์ค๋ฅ๊ฐ ๋ ๊น์?
์ ํ ์ค์์น์ ๊ฒฝ์ฐ
type T int | interface{}
๊ทธ๋ฆฌ๊ณ ๋น์ ์ :
switch t := t.(type) {
case int:
// ...
t๊ฐ int๋ฅผ ํฌํจํ๋{} ์ธํฐํ์ด์ค๋ฅผ ํฌํจํ๊ณ ์๋๋ฐ, ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์ ์ผ์นํ๋์? ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ๊ฐ case interface{}
์ด๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
๋๋ ํฉ๊ณ ์ ํ์ ๊ตฌ์ฒด์ ์ธ ์ ํ๋ง ํฌํจ๋ ์ ์์ต๋๊น?
type T interface{} | nil
์ด๋ป์ต๋๊น? ๋น์ ์ด ์ฐ๋ ๊ฒฝ์ฐ
var t T = nil
t์ ์ ํ์ ๋ฌด์์
๋๊น? ์๋๋ฉด ๊ทธ ๊ณต์ฌ๊ฐ ๊ธ์ง๋์ด ์์ต๋๊น? ๋น์ทํ ์ง๋ฌธ์ด type T []int | nil
๋ํด ๋ฐ์ํ๋ฏ๋ก ์ธํฐํ์ด์ค์ ๊ดํ ๊ฒ๋ง์ด ์๋๋๋ค.
์, ์ปดํ์ผ ํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์๋์ง ํ์คํ์ง ์๋ค.
์ด๋ฌํ ์ ํ์ ๋ํด ํฌ๊ด์ ์ด์ง ์์ ์ค์์น๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ค๋ฅธ ๊ณณ์์๋ ์ฒ ์ ํจ์ ์๊ตฌํ์ง ์์ต๋๋ค. ํ ๊ฐ์ง
๊ทธ๋๋ ์ข์ต๋๋ค. ์ ํ์ด ์ฒ ์ ํ๋ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ ์๊ตฌํ ์ ์์ต๋๋ค.
์ข
๊ฒฐ ์ง์ ๋ก ๋ง๋ค๊ธฐ ์ํด.
์ฆ, ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
func addOne(x int|float64) int|float64 {
switch x := x.(type) {
case int:
return x + 1
case float64:
return x + 1
}
}
๊ทธ๋ฆฌ๊ณ ํฉ๊ณ ์ ํ์ ๋ณ๊ฒฝํ์ฌ ์ถ๊ฐ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ ํ ์ค์์น์ ๊ฒฝ์ฐ
์ ํ T ์ ์ | ์ํธ ์์ฉ{}
๊ทธ๋ฆฌ๊ณ ๋น์ ์ :
์ค์์น t := t.(์ ํ) {
์ผ์ด์ค ์ ์:
// ...
t๊ฐ int๋ฅผ ํฌํจํ๋{} ์ธํฐํ์ด์ค๋ฅผ ํฌํจํ๊ณ ์๋๋ฐ, ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์ ์ผ์นํ๋์? ์ฒซ ๋ฒ์งธ ์ผ์ด์ค๊ฐ ์ผ์ด์ค ์ธํฐํ์ด์ค{}๋ผ๋ฉด?
t๋ int๋ฅผ ํฌํจํ๋{} ์ธํฐํ์ด์ค๋ฅผ ํฌํจํ ์ ์์ต๋๋ค. t๋ ์ธํฐํ์ด์ค์
๋๋ค
๋ค๋ฅธ ์ธํฐํ์ด์ค ์ ํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ํ์ ์ง์ ํ ์ ์๋ค๋ ์ ๋ง ์ ์ธํ๋ฉด
๊ตฌ์ฑ๋์ด ์๋ ์ด๊ฑฐ๋ ์ ํ ์งํฉ์ ํฌํจํฉ๋๋ค.
์ธํฐํ์ด์ค๊ฐ{} int๋ฅผ ํฌํจํ๋ ์ธํฐํ์ด์ค๋ฅผ ํฌํจํ ์ ์๋ ๊ฒ์ฒ๋ผ{}
ํฉ๊ณ ์ ํ์ ์ธํฐํ์ด์ค ์ ํ๊ณผ ์ผ์นํ ์ ์์ง๋ง ์ฌ์ ํ ๊ตฌ์ฒด์ ์ธ
๋์ ๊ฐ์ ์
๋ ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
type R io.Reader | io.ReadCloser
Tํ ์ธํฐํ์ด์ค๋ ์ด๋ป์ต๋๊น{} | ๋ฌด? ๋น์ ์ด ์ฐ๋ ๊ฒฝ์ฐ
var t T = ์์
t์ ์ ํ์ ๋ฌด์์ ๋๊น? ์๋๋ฉด ๊ทธ ๊ณต์ฌ๊ฐ ๊ธ์ง๋์ด ์์ต๋๊น? ์ ํ T []int | nil, ๊ทธ๋์ ๊ทธ๊ฒ์ ๋จ์ง ์ธํฐํ์ด์ค์ ๊ดํ ๊ฒ์ด ์๋๋๋ค.
์์ ์ ์์ ๋ฐ๋ฅด๋ฉด ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ ์ป์ต๋๋ค.
๊ฐ์ ํ ๋นํ ์ ์๋ ํฉ๊ณ์์
nil ์ธํฐํ์ด์ค๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ฌ์ค ์ธํฐํ์ด์ค{} | nil์ ๊ธฐ์ ์ ์ผ๋ก ์ค๋ณต๋ฉ๋๋ค. ์๋ํ๋ฉด ๋ชจ๋ ์ธํฐํ์ด์ค๊ฐ{}
0 ์ผ ์ ์์ต๋๋ค.
[]int | nil, nil []int๋ nil ์ธํฐํ์ด์ค์ ๋์ผํ์ง ์์ผ๋ฏ๋ก
์ฝํฌ๋ฆฌํธ ๊ฐ ([]int|nil)(nil)
๋ ๊ฒ์ด๋ค []int(nil)
ํ์ง ํ์ํ๋์ง ์์ nil
.
[]int | nil
์ฌ๋ก๊ฐ ํฅ๋ฏธ๋กญ์ต๋๋ค. ์ ํ ์ ์ธ์ nil
๊ฐ ํญ์ "nil ์ธํฐํ์ด์ค ๊ฐ"์ ์๋ฏธํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ
type T []int | nil
var x T = nil
x
๋ nil []int
๊ฐ ์๋๋ผ nil ์ธํฐํ์ด์ค์์ ์๋ฏธํฉ๋๋ค.
ํด๋น ๊ฐ์ ๋์ผํ ์ ํ์ผ๋ก ์ธ์ฝ๋ฉ๋ nil []int
์ ๊ตฌ๋ณ๋ฉ๋๋ค.
var y T = []int(nil) // y != x
ํฉ๊ณ๊ฐ ๋ชจ๋ ๊ฐ ์ ํ์ธ ๊ฒฝ์ฐ์๋ ํญ์ nil์ด ํ์ํ์ง ์์ต๋๊น? ๊ทธ๋ ์ง ์์ผ๋ฉด var x int64 | float64
๋ ์ด๋ป๊ฒ ๋ ๊น์? ๋ค๋ฅธ ๊ท์น์์ ์ธ์ฝํ๋ ๋ด ์ฒซ ๋ฒ์งธ ์๊ฐ์ ์ฒซ ๋ฒ์งธ ์ ํ์ 0 ๊ฐ์ด์ง๋ง var x interface{} | int
์ด๋ป์ต๋๊น? @bcmills๊ฐ ์ง์ ํ ๊ฒ์ฒ๋ผ ๊ณ ์ ํ ํฉ๊ณ๊ฐ nil์ด์ด์ผ ํฉ๋๋ค.
๋๋ฌด ๋ฏธ๋ฌํ ๊ฒ ๊ฐ์ต๋๋ค.
Exhaustive ์ ํ ์ค์์น๊ฐ ์ข์ ๊ฒ์
๋๋ค. ์ํ๋ ๋์์ด ์๋ ๋ ํญ์ ๋น default:
ํ ์ ์์ต๋๋ค.
์ ์์๋ "ํฉ๊ณ ์ ํ์ ๊ฐ์ ํ ๋นํ ๋ ๊ฐ์ด ๋ ๋ง์
๊ฐ๋ฅํ ์ ํ ์ค ํ๋๋ณด๋ค ๋ ๋ง์ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ์ ํ์ด ์ ํ๋ฉ๋๋ค."
๋ฐ๋ผ์:
type T []int | nil
var x T = nil
x๋ nil์ด []int์ ํ ๋น ๊ฐ๋ฅํ๊ณ []int๊ฐ ์ ํ์ ์ฒซ ๋ฒ์งธ ์์์ด๊ธฐ ๋๋ฌธ์ ๊ตฌ์ฒด์ ์ธ ์ ํ []int๋ฅผ ๊ฐ์ต๋๋ค. ๋ค๋ฅธ []int(nil) ๊ฐ๊ณผ ๊ฐ์ต๋๋ค.
ํฉ๊ณ๊ฐ ๋ชจ๋ ๊ฐ ์ ํ์ธ ๊ฒฝ์ฐ์๋ ํญ์ nil์ด ํ์ํ์ง ์์ต๋๊น? ๊ทธ๋ ์ง ์์ผ๋ฉด var x int64 | float64?
์ ์์ "ํฉ๊ณ ์ ํ์ 0 ๊ฐ์ ์ฒซ ๋ฒ์งธ ์ ํ์ 0 ๊ฐ์
๋๋ค.
ํฉ๊ณ."์ด๋ฏ๋ก ๋ต์ int64(0)์
๋๋ค.
๋ค๋ฅธ ๊ท์น์์ ์ธ์ฝํ๋ ๋ด ์ฒซ ๋ฒ์งธ ์๊ฐ์ ์ฒซ ๋ฒ์งธ ์ ํ์ 0 ๊ฐ์ด๊ฒ ์ง๋ง var x interface{} | ์ธํธ? @bcmills๊ฐ ์ง์ ํ ๊ฒ์ฒ๋ผ ๊ณ ์ ํ ํฉ๊ณ๊ฐ nil์ด์ด์ผ ํฉ๋๋ค.
์๋์, ์ด ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ธ ์ธํฐํ์ด์ค nil ๊ฐ์ผ ๋ฟ์ ๋๋ค. ํด๋น ์ ํ(์ธํฐํ์ด์ค{} | nil)์ ์ค๋ณต๋ฉ๋๋ค. ์๋ง๋ ํ ์์๊ฐ ๋ค๋ฅธ ์์์ ์์ ์งํฉ์ธ ํฉ๊ณ ์ ํ์ ์ง์ ํ๋๋ก ์ปดํ์ผ๋ฌ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค. ํ์ฌ ๊ทธ๋ฌํ ์ ํ์ ์ ์ํ ์์ ์ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํฉ๊ณ ์ ํ์ 0 ๊ฐ์ ํฉ๊ณ์์ ์ฒซ ๋ฒ์งธ ์ ํ์ 0 ๊ฐ์ ๋๋ค.
ํฅ๋ฏธ๋ก์ด ์ ์์ด์ง๋ง ํฉ๊ณ ์ ํ์ ํ์ฌ ๋ณด์ ํ๊ณ ์๋ ๊ฐ์ ์ ํ์ ์ด๋๊ฐ์ ๊ธฐ๋กํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํฉ๊ณ ์ ํ์ 0 ๊ฐ์ด ์ ์ฒด ๋ฐ์ดํธ 0์ด ์๋๋ฏ๋ก ๋ค์๊ณผ ๋ค๋ฅผ ์ ์์ต๋๋ค. Go์ ๋ค๋ฅธ ๋ชจ๋ ์ ํ. ๋๋ ์ ํ ์ ๋ณด๊ฐ ์์ผ๋ฉด ๊ฐ์ด ๋์ด๋ ์ฒซ ๋ฒ์งธ ์ ํ์ 0 ๊ฐ์ด์ง๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ nil
๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ ์์ธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋์ด๋ ์ฒซ ๋ฒ์งธ ์ ํ.
๋ฐ๋ผ์ (stuff) | nil
๋ (stuff)์ ์๋ฌด ๊ฒ๋ nil์ด ๋ ์ ์๊ณ nil | (stuff)
๋ ๋ฌผ๊ฑด์ ์ด๋ค ๊ฒ์ด nil์ด ๋ ์ ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒ์ ์๋ฏธํ ๋๋ง ์๋ฏธ๊ฐ ์์ต๋๊น? nil์ ์ด๋ค ๊ฐ์น๋ฅผ ๋ํฉ๋๊น?
@ianlancetaylor ๋๋ ๋ง์ ๊ธฐ๋ฅ์ ์ธ์ด๊ฐ C์์์ ๊ฐ์ด ๋ณธ์ง์ ์ผ๋ก (๋ซํ) ํฉ๊ณ ์ ํ์ ๊ตฌํํ๋ค๊ณ ๋ฏฟ์ต๋๋ค.
struct {
int which;
union {
A a;
B b;
C c;
} summands;
}
which
๊ฐ Union์ ํ๋๋ฅผ ์์๋๋ก ์ธ๋ฑ์ฑํ๋ฉด 0 = a, 1 = b, 2 = c, 0 ๊ฐ ์ ์๋ ๋ชจ๋ ๋ฐ์ดํธ๊ฐ 0์ด ๋๋๋ก ์๋ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ธํฐํ์ด์ค์ ๋ฌ๋ฆฌ ๋ค๋ฅธ ๊ณณ์ ์ ํ์ ์ ์ฅํด์ผ ํฉ๋๋ค. ๋ํ ์ ํ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋๋ง๋ค ์ผ์ข
์ nil ํ๊ทธ์ ๋ํ ํน๋ณํ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ ๊ฒ ํ๋ฉด ํน๋ณํ ์ธํฐํ์ด์ค ๋์ Union์ ๊ฐ ์ ํ์ด ๋ง๋ค์ด์ง๋๋ฐ, ์ด๊ฒ๋ ํฅ๋ฏธ๋กญ์ต๋๋ค.
์ ํ์ ๊ธฐ๋กํ๋ ํ๋์ ์ฒซ ๋ฒ์งธ ์ ํ์ ๋ํ๋ด๋ 0 ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ๋ชจ๋ 0 ๊ฐ์ด ์๋ํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ์ด๊ฒ์ ํํํ๋ ํ ๊ฐ์ง ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
type A = B|C
struct A {
choice byte // value 0 or 1
value ?// (thing big enough to store B | C)
}
[ํธ์งํ๋ค]
@jimmyfrasche ๊ฐ ์ ๋ฅผ
nil๋ก ์ถ๊ฐํ ์ ์๋ ๊ฒ์ด ์์ต๋๊น?
type S int | string | struct{}
var None struct{}
?
๊ทธ๊ฒ์ ๋ง์ ํผ๋์ ํผํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค (์ ์ด๋ ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋)
๋๋ ๋ ๋์
type (
None struct{}
S int | string | None
)
๊ทธ๋ฐ ์์ผ๋ก switch on None
ํ๊ณ None{}
ํ ๋นํ ์ ์์ต๋๋ค.
@jimmyfrasche struct{}
๋ nil
๊ฐ์ง ์์ต๋๋ค. ์ฌ์ํ ์ธ๋ถ ์ฌํญ์ด์ง๋ง ํฉ๊ณ์ ๋ํ ์ ํ ์ ํ์ ๋ถํ์ํ๊ฒ(?) ๋ค๋ฅธ ์ ํ์ ์ ํ ์ ํ๊ณผ ๋ถ๊ธฐํ๊ฒ ๋ง๋ค ๊ฒ์
๋๋ค.
@bcmills ๋ฌ๋ฆฌ ์ฃผ์ฅํ๋ ค๋ ์๋๋ ์๋์์ต๋๋ค. ํฉ๊ณ์ ๋ชจ๋ ์ ํ์์ nil์ ์๋ฏธ์ ๊ฒน์น์ง ์๊ณ ๊ฐ์น ๋ถ์กฑ์ ๊ตฌ๋ณํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค๋ ์๋ฏธ์์ต๋๋ค.
@rogpepp ์ด๊ฒ์ ๋ฌด์์ ์ธ์ํฉ๋๊น?
// r is an io.Reader interface value holding a type that also implements io.Closer
var v io.ReadCloser | io.Reader = r
switch v.(type) {
case io.ReadCloser: fmt.Println("ReadCloser")
case io.Reader: fmt.Println("Reader")
}
๋๋ "๋ฆฌ๋"๋ผ๊ณ ๊ฐ์ ํ ๊ฒ์ ๋๋ค.
@jimmyfrasche ์ ๋ ReadCloser
๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ค๋ฅธ ์ธํฐํ์ด์ค์ ์ ํ ์ค์์น์์ ์ป์ ์ ์๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค.
(๋ํ ๋ช ์์ ํ๊ทธ๊ฐ ์ ํ ์ ํ์์ ์กฐํ ์ค๋ฒํค๋๋ฅผ ์ฝ๊ฐ ์ ์ฝํ ์ ์๋ค๊ณ ๊ฐ์ ํ์ง๋ง ์ธํฐํ์ด์ค ์ ํ๋ง ํฌํจํ๋ ํฉ๊ณ๋ ์ผ๋ฐ ์ธํฐํ์ด์ค๋ณด๋ค ๋ ๋ง์ ๊ณต๊ฐ์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.)
@bcmills ํฅ๋ฏธ๋ก์ด ํ ๋น์ ๋๋ค. ๊ณ ๋ คํ์ญ์์ค: https://play.golang.org/p/PzmWCYex6R
@ianlancetaylor ์ข์ ์ง์ ์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ๋ด "์์งํ ๊ตฌํ" ์ ์ ์์ฒด๊ฐ ๋๋ฌด ์์งํ๋ค๋ ๊ฒ์ ์์ํ์ง๋ง ๋์๋ค๋๊ธฐ๊ฐ ์ด๋ ต๋ค๊ณ ์๊ฐ ํ์ง ์์ต๋๋ค. ํฉ๊ณ ์ ํ์ ์ธํฐํ์ด์ค ์ ํ์ผ๋ก ์ทจ๊ธ๋์ง๋ง ์ค์ ๋ก ์ ํ ๋ฐ ํด๋น ๋ฉ์๋ ์ธํธ์ ๋ํ ์ง์ ํฌ์ธํฐ๋ฅผ ํฌํจํ ํ์๋ ์์ต๋๋ค. ๋์ ์ ์ ํ ๊ฒฝ์ฐ ์ ํ์ ์์ํ๋ ์ ์ ํ๊ทธ๋ฅผ ํฌํจํ ์ ์์ต๋๋ค. ํด๋น ํ๊ทธ๋ ์ ํ ์์ฒด๊ฐ nil์ธ ๊ฒฝ์ฐ์๋ 0์ด ์๋ ์ ์์ต๋๋ค.
์ฃผ์ด์ง:
var x int | nil = nil
x์ ๋ฐํ์ ๊ฐ์ด ๋ชจ๋ 0์ผ ํ์๋ ์์ต๋๋ค. x์ ์ ํ์ ์ ํํ๊ฑฐ๋ ๋ณํํ ๋
๋ค๋ฅธ ์ธํฐํ์ด์ค ์ ํ์ผ๋ก ํ๊ทธ๋ฅผ ์ง์ ํ๋ ๊ฒฝ์ฐ ๋ค์์ ํฌํจํ๋ ์์ ํ
์ด๋ธ์ ํตํด ํ๊ทธ๋ฅผ ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
์ค์ ์ ํ ํฌ์ธํฐ.
๋ ๋ค๋ฅธ ๊ฐ๋ฅ์ฑ์ ์ฒซ ๋ฒ์งธ ์์์ธ ๊ฒฝ์ฐ์๋ง nil ์ ํ์ ํ์ฉํ๋ ๊ฒ์ด์ง๋ง,
๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ์ ๋ฐฐ์ ํฉ๋๋ค.
var t nil | int
var u float64 | t
@jimmyfrasche ๋ค๋ฅธ ์ธํฐํ์ด์ค์ ์ ํ ์ค์์น์์ ์ป๋ ๊ฒ๊ณผ ๋์ผํ ReadCloser๋ฅผ ๊ฐ์ ํฉ๋๋ค.
์.
@bcmills ํฅ๋ฏธ๋ก์ด ํ ๋น์ ๋๋ค. ๊ณ ๋ คํ์ญ์์ค: https://play.golang.org/p/PzmWCYex6R
๋๋ ์ด๊ฒ์ ์ดํดํ์ง ๋ชปํ๋ค. "์ด [...]๊ฐ ReadCloser๋ฅผ ์ธ์ํ๊ธฐ ์ํด ์ ํ ์ค์์น์ ์ ํจํด์ผ ํ๋ ์ด์ "
๋ชจ๋ ์ธํฐํ์ด์ค ์ ํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํฉ๊ณ ์ ํ์ ๊ทธ ์์ ์๋ ๊ฒ์ ๊ตฌ์ฒด์ ์ธ ๊ฐ๋ง ์ ์ฅํฉ๋๋ค.
ํฉ๊ณ์ ์ฌ๋ฌ ์ธํฐํ์ด์ค ์ ํ์ด ์๋ ๊ฒฝ์ฐ ๋ฐํ์ ํํ์ ์ธํฐํ์ด์ค ๊ฐ์ผ ๋ฟ์ ๋๋ค. ๊ธฐ๋ณธ ๊ฐ์ด ์ ์ธ๋ ๊ฐ๋ฅ์ฑ ์ค ํ๋ ์ด์์ ๊ตฌํํด์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฆ, I1๊ณผ I2๊ฐ ๋ชจ๋ ์ธํฐํ์ด์ค ์ ํ์ธ ์ ํ(I1 | I2)์ ๋ฌด์ธ๊ฐ๋ฅผ ํ ๋นํ ๋ ์ ๋ ฅํ ๊ฐ์ด ๋น์์ I1 ๋๋ I2๋ฅผ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ์๋ ค์ก๋์ง ์ฌ๋ถ๋ฅผ ๋์ค์ ์ ์ ์์ต๋๋ค.
io.ReadCloser | io.Reader ์ค์์น๋ฅผ ์ ๋ ฅํ๊ฑฐ๋ io.Reader์์ io.ReadCloser๊ฐ ์๋๋ผ๊ณ ์ฃผ์ฅํ ๋ ํฉ๊ณ ์ ํ์ ๋ํ ํ ๋น์ด ์ธํฐํ์ด์ค๋ฅผ unboxes ๋ฐ reboxesํ์ง ์๋ ํ ํ์ ํ ์ ์์ต๋๋ค.
io.Reader๊ฐ ์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ์ด๋ํฉ๋๋ค. | io.ReadCloser ์๊ฒฉํ๊ฒ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์งํํ๊ธฐ ๋๋ฌธ์ io.ReadCloser๋ฅผ ํ์ฉํ์ง ์๊ฑฐ๋ ๊ตฌํ์ด ํฉ๊ณ์ ๋ชจ๋ ์ธํฐํ์ด์ค์์ "๊ฐ์ฅ ์ผ์นํ๋" ์ธํฐํ์ด์ค๋ฅผ ๊ฒ์ํด์ผ ํ์ง๋ง ์ ์ ์ํ ์ ์์ต๋๋ค.
@rogpeppe ์ ์์์ ๊ตฌํ์ ์ต์ ํ ๊ฐ๋ฅ์ฑ๊ณผ 0 ๊ฐ์ ๋ฏธ๋ฌํจ์ ๋ฌด์ํ๊ณ ์๋์ผ๋ก ์ ์๋ ์ธํฐํ์ด์ค ์ ํ(๊ด๋ จ ๋ฉ์๋์ ๊ต์ฐจ ํฌํจ)๋ณด๋ค ํฉ๊ณ ์ ํ์ ์ฌ์ฉํ๋ ์ฃผ์ ์ด์ ์ ์ ํ ๊ฒ์ฌ๊ธฐ๊ฐ ์ค๋ฅ๋ฅผ ์ง์ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐํ์์ด ์๋ ์ปดํ์ผ ์๊ฐ์. ๋ ๋ฒ์งธ ์ด์ ์ ์ ํ์ ๊ฐ์ด ๋ ๊ตฌ๋ณ๋์ด ํ๋ก๊ทธ๋จ์ ๊ฐ๋ ์ฑ/์ดํด์ ๋์์ด ๋ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ํฐ ์ด์ ์ด ์์ต๋๊น?
(๋๋ ์ด๋ค ์์ผ๋ก๋ ์ ์์ ์ค์ด๋ ค๊ณ ํ๋ ๊ฒ์ด ์๋๋ผ ์ง๊ด์ ๋ฐ๋ก ์ก์ผ๋ ค๊ณ ํ ๋ฟ์ ๋๋ค. ํนํ ์ถ๊ฐ ๊ตฌ๋ฌธ ๋ฐ ์๋ฏธ ๋ณต์ก์ฑ์ด "ํฉ๋ฆฌ์ ์ผ๋ก ์์" ๊ฒฝ์ฐ - ๊ทธ๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๊ฐ ๋ฌด์์ด๋ - ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ด์ ์ ํ์คํ ๋ณผ ์ ์์ต๋๋ค. ์ค๋ฅ๋ฅผ ์ผ์ฐ ์ก์๋ ๋๋ค.)
@griesemer ๋ค, ๋ง์ต๋๋ค.
ํนํ ์ฑ๋์ด๋ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ์ ๋ฌํ ๋ ๊ฐ๋ฅํ ๊ฐ๋ฅ์ฑ์ ์ ํํ ํํํ๋ ์ ํ์ ๊ฐ์ง ์ ์๋ ๊ฒ์ด ๊ฐ๋ ์ฑ๊ณผ ์ ํ์ฑ์ ๋์์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ๋ ์ธํฐํ์ด์ค ์ ํ์ unexported ๋ฉ์๋๋ฅผ ํฌํจํ์ฌ ์ด๋ฅผ ์๋ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด์ง๋ง ์ด๊ฒ์ a) ์๋ฒ ๋ฉ์ผ๋ก ์ฐํํ ์ ์๊ณ b) unexported ๋ฉ์๋๊ฐ ์จ๊ฒจ์ ธ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ์ ํ์ ๋ชจ๋ ๋ณด๊ธฐ ์ด๋ ต์ต๋๋ค.
@jimmyfrasche
io.ReadCloser | io.Reader ์ค์์น๋ฅผ ์ ๋ ฅํ๊ฑฐ๋ io.Reader์์ io.ReadCloser๊ฐ ์๋๋ผ๊ณ ์ฃผ์ฅํ ๋ ํฉ๊ณ ์ ํ์ ๋ํ ํ ๋น์ด ์ธํฐํ์ด์ค๋ฅผ unboxes ๋ฐ reboxesํ์ง ์๋ ํ ํ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ์ ํ์ด ์์ผ๋ฉด ํญ์ io.Reader(๋๋ nil, ๋ชจ๋ io.Reader๋ nil์ผ ์ ์๊ธฐ ๋๋ฌธ์)์์ ์ ์ ์์ต๋๋ค. ๋ ๊ฐ์ง ๋์์ ๋ฐฐํ์ ์ด์ง ์์ต๋๋ค. ์ ์๋ ํฉ๊ณ ์ ํ์ "๋ฐฐํ์ ๋๋"๊ฐ ์๋ "ํฌํจ ๋๋"์ ๋๋ค.
io.Reader๊ฐ ์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ์ด๋ํฉ๋๋ค. | io.ReadCloser ์๊ฒฉํ๊ฒ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์งํํ๊ธฐ ๋๋ฌธ์ io.ReadCloser๋ฅผ ํ์ฉํ์ง ์๊ฑฐ๋ ๊ตฌํ์ด ํฉ๊ณ์ ๋ชจ๋ ์ธํฐํ์ด์ค์์ "๊ฐ์ฅ ์ผ์นํ๋" ์ธํฐํ์ด์ค๋ฅผ ๊ฒ์ํด์ผ ํ์ง๋ง ์ ์ ์ํ ์ ์์ต๋๋ค.
"๋ค๋ฅธ ๊ธธ๋ก ๊ฐ๋ ๊ฒ"์ด โโํด๋น ์ ํ์ ํ ๋นํ๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒฝ์ฐ ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
"ํฉ๊ณ ์ ํ์ ๊ฐ์ ํ ๋นํ ๋ ๊ฐ์ด ๋ ๋ง์
๊ฐ๋ฅํ ์ ํ ์ค ํ๋๋ณด๋ค ๋ ๋ง์ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ์ ํ์ด ์ ํ๋ฉ๋๋ค."
์ด ๊ฒฝ์ฐ io.ReadCloser๋ io.Reader์ io.ReadCloser ๋ชจ๋์ ๋ค์ด๊ฐ ์ ์์ผ๋ฏ๋ก io.Reader๋ฅผ ์ ํํ์ง๋ง ์ค์ ๋ก๋ ๋์ค์ ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. io.Reader ์ ํ๊ณผ io.Reader ์ ํ ์ฌ์ด์๋ ๊ฐ์งํ ์ ์๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. | io.ReadCloser๋ io.Reader๊ฐ io.Reader๋ฅผ ๊ตฌํํ๋ ๋ชจ๋ ์ธํฐํ์ด์ค ์ ํ๋ ๋ณด์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ๊ฐ ์ด์ ๊ฐ์ ์ ํ์ ๊ฑฐ๋ถํ๋๋ก ํ๋ ๊ฒ์ด ์ข์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ธํฐํ์ด์ค{}๊ฐ ์ด๋ฏธ ๋ชจ๋ ์ ํ์ ํฌํจํ ์ ์์ผ๋ฏ๋ก ์ธํฐํ์ด์ค{}์ ๊ด๋ จ๋ ๋ชจ๋ ํฉ๊ณ ์ ํ์ ๊ฑฐ๋ถํ ์ ์์ผ๋ฏ๋ก ์ถ๊ฐ ์๊ฒฉ์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค.
@rogpepp ๋น์ ์ ์ ์์ ๋ํด ์ ๊ฐ ์ข์ํ๋ ๋ถ๋ถ์ด ๋ง์ด ์์ต๋๋ค. ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ๋น ์๋ฏธ์ 0 ๊ฐ์ ๊ฐ์ฅ ์ผ์ชฝ ์ ํ ๊ท์น์ 0 ๊ฐ์ด ๋งค์ฐ ๋ช ํํ๊ณ ๊ฐ๋จํฉ๋๋ค. ์์ฃผ ๊ฐ๋ค.
๋ด๊ฐ ๊ฑฑ์ ํ๋ ๊ฒ์ ์ธํฐํ์ด์ค์ ์ด๋ฏธ boxed๋ ๊ฐ์ sum ํ์ ๋ณ์์ ํ ๋นํ๋ ๊ฒ์ ๋๋ค.
์ ์ ๋์ ์ด์ ์์ ๋ฅผ ์ฌ์ฉํ์ฌ RC๊ฐ io.ReadCloser์ ํ ๋นํ ์ ์๋ ๊ตฌ์กฐ์ฒด๋ผ๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด
var v io.ReadCloser | io.Reader = RC{}
๊ฒฐ๊ณผ๋ ๋ถ๋ช ํ๊ณ ๋ถ๋ช ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ ๊ฒ ํ๋ฉด
var r io.Reader = RC{}
var v io.ReadCloser | io.Reader = r
ํ ์ ์๋ ์ ์ผํ ํฉ๋ฆฌ์ ์ธ ์ผ์ v store r์ io.Reader๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. io.ReadCloser. ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ํ์ํฉ๋๋ค.
switch v := v.(type) {
case io.ReadCloser: useReadCloser(v)
case io.Reader:
if rc, ok := v.(io.ReadCloser); ok {
useReadCloser(rc)
} else {
useReader(v)
}
}
์ด์ io.ReadCloser <: io.Reader๋ผ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ ์ํ ๋๋ก ์ด๋ฅผ ํ์ฉํ์ง ์์ ์ ์์ง๋ง ๋ฌธ์ ๊ฐ ๋ ๊ทผ๋ณธ์ ์ด๋ฉฐ Goโ ์ ๋ํ ๋ชจ๋ ํฉ๊ณ ์ ํ ์ ์์ ์ ์ฉ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
A(), B(), C() ๋ฉ์๋๊ฐ ๊ฐ๊ฐ ์๋ ์ธ ๊ฐ์ ์ธํฐํ์ด์ค A, B, C๊ฐ ์๊ณ ์ธ ๊ฐ์ง ๋ฉ์๋๊ฐ ๋ชจ๋ ์๋ ABC ๊ตฌ์กฐ์ฒด๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. A, B, C๋ ๋ถ๋ฆฌ๋์ด ์์ผ๋ฏ๋ก A | ๋ | C์ ๊ทธ ์์ด์ ๋ชจ๋ ์ ํจํ ์ ํ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
var c C = ABC{}
var v A | B | C = c
์ด๋ฅผ ์ฌ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ด ๋ง์ด ์์ง๋ง ์ธํฐํ์ด์ค๊ฐ ํฌํจ๋ ๋ v๊ฐ ๋ฌด์์ธ์ง์ ๋ํ ์๋ฏธ ์๋ ๋ณด์ฅ์ ์ป์ง ๋ชปํฉ๋๋ค. ํฉ๊ณ๋ฅผ ์ธ๋ฐ์ฑํ ํ ์์๊ฐ ์ค์ํ ๊ฒฝ์ฐ ์ธํฐํ์ด์ค๋ฅผ ์ธ๋ฐ์ฑํด์ผ ํฉ๋๋ค.
์๋ง๋ ์ด๋ค summands๋ ์ธํฐํ์ด์ค๊ฐ ๋ ์ ์๋ค๋ ์ ํ์ด ์์ด์ผ ํฉ๋๊น?
๋ด๊ฐ ์๊ฐํ ์ ์๋ ์ ์ผํ ๋ค๋ฅธ ํด๊ฒฐ์ฑ ์ ์ธํฐํ์ด์ค๋ฅผ ํฉ๊ณ ์ ํ ๋ณ์์ ํ ๋นํ๋ ๊ฒ์ ํ์ฉํ์ง ์๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๊ทธ ์์ฒด๋ก ๋ ์ฌ๊ฐํ ๋ฐฉ์์ผ๋ก ๋ณด์ ๋๋ค.
โ ๋ชจํธ์ฑ์ ์์ ๊ธฐ ์ํด ํฉ๊ณ์ ์ ํ์ ๋ํ ์ ํ ์์ฑ์๋ฅผ ํฌํจํ์ง ์์ต๋๋ค(Haskell์์ Maybe ์ ํ์ ๊ฐ์ ์์ฑํ๊ธฐ ์ํด Just v๋ผ๊ณ ๋งํด์ผ ํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด). ํ์ง๋ง ์ ๋ ์ด์ ๋ํด ์ ํ ์ฐฌ์ฑํ์ง ์์ต๋๋ค.
@jimmyfrasche ์ฃผ๋ฌธ๋ ์ธ๋ฐ์ฑ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์ค์ ๋ก ์ค์ํฉ๋๊น? ๊ทธ๊ฒ์ ๋์๊ฒ ๋ช ํํ์ง, ๊ทธ๋ฆฌ๊ณ ๊ฒ์ด ์ค์ ์ฌ๊ฑด์ ๋ํ ๋ช ์์ ์ธ ์์ ๊ตฌ์กฐ์ฒด๋ก ํด๊ฒฐํ ์ฝ๊ฒ :
type ReadCloser struct { io.ReadCloser }
type Reader struct { io.Reader }
var v ReadCloser | Reader = Reader{r}
@bcmills ๊ฒฐ๊ณผ๊ฐ ๋ช ํํ์ง ์๊ณ ๋ง์ผ๋ฉฐ ์ธํฐํ์ด์ค๊ฐ ํฌํจ๋ ๋ ํฉ๊ณ ์ ํ์ผ๋ก ์ํ๋ ๋ชจ๋ ๋ณด์ฅ์ด ์ฆ๋ฐํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์จ๊ฐ ๋ฏธ๋ฌํ ๋ฒ๊ทธ์ ์คํด๋ฅผ ๋ถ๋ฌ์ผ์ผํค๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋น์ ์ด ์ ๊ณตํ๋ ๋ช ์์ ์ธ ์์ ๊ตฌ์กฐ ์์ ๋ ํฉ๊ณ ์ ํ์์ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์ง ์์๋ ํฉ๊ณ ์ ํ์ ๋ฅ๋ ฅ์ ์ ํ ์ ํํ์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ๊ฐ์ฃผ์์ ์ธ๊ธํ ๋ช ํ์ฑ์ ์ํด ์ ํ ์์ฑ์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์์ฑํ๊ณ ์์ต๋๋ค. ๋ถ๋ช ํ ์ฝ๊ฐ ์ฑ๊ฐ์๊ณ ์ถ๊ฐ ๋จ๊ณ์ด์ง๋ง ๊ฐ๋จํ๊ณ ์ธ์ด ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ ํ ์ง๊ตํ๋๋ก ํ๋ Go์ ์ฒ ํ๊ณผ ๋งค์ฐ ์ผ์นํฉ๋๋ค.
์ด์กํ์ผ๋ก ์ํ๋ ๋ชจ๋ ๋ณด์ฅ
๊ทธ๊ฒ์ ๋น์ ์ด ๊ธฐ๋ํ๋ ๋ณด์ฅ์ ๋ฌ๋ ค ์์ต๋๋ค. ๋๋ ๋น์ ์ด ํฉ๊ณ ์ ํ์ ๊ธฐ๋ํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๊ฒฉํ๊ฒ ํ๊ทธ๊ฐ ์ง์ ๋ ๊ฐ์ด๋ฏ๋ก A|B|C ์ ํ์ด ์ฃผ์ด์ง๋ฉด static์ด ๋ฌด์์ธ์ง ์ ํํ ์ ์ ์์ต๋๋ค.
ํ ๋นํ ์ ํ์
๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฝํฌ๋ฆฌํธ์ ๋จ์ผ ๊ฐ์ ๋ํ ์ ํ ์ ํ์ผ๋ก ๋ณธ๋ค.
์ ํ - ์ ํ์ ๊ฐ์ด A, B ๋ฐ C ์ค ์ ์ด๋ ํ๋์ ์ ํ ํธํ๋๋ค๋ ๊ฒ์
๋๋ค.
๊ฒฐ๊ตญ ๊ฐ์ด ์๋ ์ธํฐํ์ด์ค์ผ ๋ฟ์
๋๋ค.
์ฆ, ํ ๋น ํธํ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํฉ๊ณ ์ ํ์ ๊ฐ์ ํ ๋นํ ์ ์๋ ๊ฒฝ์ฐ
sum ์ ํ์ ๋ฉค๋ฒ ์ค ํ๋๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ๋ฉค๋ฒ ์ค ์ด๋ ๋ฉค๋ฒ๊ฐ
"chosen" - ๊ฐ ์์ฒด๋ฅผ ๊ธฐ๋กํฉ๋๋ค. io.Reader๋ฅผ ํ ๋นํ ๋์ ๋์ผ
์ธํฐํ์ด์ค{}์ ๋ํด ์ ์ io.Reader ์ ํ์ ์๊ณ ๊ฐ ์์ฒด๋ง ๊ฐ๊ฒ ๋ฉ๋๋ค.
io.Reader์ ํธํ๋์ง๋ง ๋ฐ์ํ๋ ๋ค๋ฅธ ์ธํฐํ์ด์ค ์ ํ๊ณผ๋ ํธํ๋ฉ๋๋ค.
๊ตฌํ.
๊ทํ์ ์์์ :
var c C = ABC{}
var v A | B | C = c
A, B ๋ฐ C ์ค ํ๋์ ๋ํ v์ ์ ํ ์ด์ค์ ์ ์ฑ๊ณตํฉ๋๋ค. ๊ทธ๊ฒ์ ๋์๊ฒ ํฉ๋ฆฌ์ ์ผ๋ก ๋ณด์ธ๋ค.
@rogpepp ๊ทธ ์๋ฏธ๋ก ์ ๋ด๊ฐ ์์ํ๋ ๊ฒ๋ณด๋ค ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋๋ ์ฌ์ ํ ์ธํฐํ์ด์ค์ ํฉ๊ณ๊ฐ ์ ์์ด๋์ง ํ์ ํ์ง ๋ชปํ์ง๋ง ๋ ์ด์ ๊ทธ๋ ์ง ์๋ค๊ณ ํ์ ํ์ง ์์ต๋๋ค. ์ง์ !
type U I | *T
์๊ณ I
๋ ์ธํฐํ์ด์ค ์ ํ์ด๊ณ *T
๋ I
๋ฅผ ๊ตฌํํ๋ ์ ํ์
๋๋ค.
์ฃผ์ด์ง
var i I = new(T)
var u U = i
u
์ ๋์ ์ ํ์ *T
์ด๊ณ ,
var u U = new(T)
ํด๋น *T
์ ์ ํ ์ด์ค์
์ด ์๋ I
๋ก ์ก์ธ์คํ ์ ์์ต๋๋ค. ๊ทธ ๋ง์ต๋๊น?
์ด๋ ์ ํจํ ์ธํฐํ์ด์ค ๊ฐ์์ ํฉ๊ณ๋ก์ ํ ๋น์ด ํฉ๊ณ์์ ์ฒซ ๋ฒ์งธ ์ผ์น ์ ํ์ ๊ฒ์ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
๋ํ var v uint8 | int32 | int64 = i
์ ๊ฐ์ ๊ฒ๊ณผ๋ ๋ค์ ๋ค๋ฅผ ์ ์์ต๋๋ค. i
๊ฐ int64
๊ฒฝ์ฐ์๋ ์ธ ๊ฐ์ง ์ ํ i
์ค ์ด๋ ๊ฒ์ด๋ ํญ์ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. int64
uint8
๋ค์ด๊ฐ ์ ์๋
์ง์ !
์ผ!
์ ํ ์ด์ค์ ์ ์ฌ์ฉํ์ฌ ํด๋น *T์ I๋ก ์ก์ธ์คํ ์ ์์ต๋๋ค. ๊ทธ ๋ง์ต๋๊น?
์.
์ด๋ ์ ํจํ ์ธํฐํ์ด์ค ๊ฐ์์ ํฉ๊ณ๋ก์ ํ ๋น์ด ํฉ๊ณ์์ ์ฒซ ๋ฒ์งธ ์ผ์น ์ ํ์ ๊ฒ์ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
์, ์ ์์์ ๋งํ๋ฏ์ด (๋ฌผ๋ก ์ปดํ์ผ๋ฌ๋ ์ด๋ ๊ฒ์ ์ ํํด์ผ ํ๋์ง ์ ์ ์ผ๋ก ์๊ณ ์์ผ๋ฏ๋ก ๋ฐํ์์ ๊ฒ์ํ์ง ์์ต๋๋ค.)
๋ํ var v uint8 | int32 | int64 = i๋ i๊ฐ uint8์ ๋ค์ด๊ฐ ์ ์๋ int64์ธ ๊ฒฝ์ฐ์๋ ์ธ ๊ฐ์ง ์ ํ i ์ค ์ด๋ ๊ฒ์ด๋ ํญ์ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ์์ํฉ๋๋ค.
์, ์๋ํ๋ฉด i๊ฐ ์์๊ฐ ์๋๋ฉด ํด๋น ๋์ ์ค ํ๋์๋ง ํ ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์, ์๋ํ๋ฉด i๊ฐ ์์๊ฐ ์๋๋ฉด ํด๋น ๋์ ์ค ํ๋์๋ง ํ ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ช ๋ช ๋์ง ์์ ์ ํ์ ๋ช ๋ช ๋ ์ ํ์ ํ ๋นํ ์ ์๋ ๊ท์น ๋๋ฌธ์ ์ฌ์ค์ด ์๋๋๋ค. ๊ทธ๋๋ ํฐ ์ฐจ์ด๋ ์๋ ๊ฒ ๊ฐ์์. ๊ท์น์ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค.
๋ฐ๋ผ์ ๋ด ๋ง์ง๋ง ๊ฒ์๋ฌผ์ I | *T
์ ํ์ I
์ ํ๊ณผ ์ฌ์ค์ ๋์ผํ๊ณ io.ReadCloser | io.Reader
๋ ์ฌ์ค์ io.Reader
์ ๋์ผํ ์ ํ์
๋๊น?
์ข์์. ๋ ์ ํ ๋ชจ๋ ํ ์ ํ์ด ๋ค๋ฅธ ์ ํ์ ์ํด ๊ตฌํ๋๋ ์ธํฐํ์ด์ค์ธ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ํฉ๊ณ ์ ํ์ ๊ฑฐ๋ถํ๋ค๋ ๋ด๊ฐ ์ ์ํ ๊ท์น์ ์ํด ๋ค๋ฃจ์ด์ง ๊ฒ์
๋๋ค. ๋์ผํ๊ฑฐ๋ ์ ์ฌํ ๊ท์น์ int|int
์ ๊ฐ์ ์ค๋ณต ์ ํ์ด ์๋ ํฉ๊ณ ์ ํ์ ๋ค๋ฃฐ ์ ์์ต๋๋ค.
ํ ๊ฐ์ง ์๊ฐ: int|byte
์ด byte|int
์ ๊ฐ์ง ์๋ค๋ ๊ฒ์ด ์ง๊ด์ ์ด์ง ์์ ์ ์์ง๋ง ์ค์ ๋ก๋ ๊ด์ฐฎ์ ๊ฒ์
๋๋ค.
์ด๋ ์ ํจํ ์ธํฐํ์ด์ค ๊ฐ์์ ํฉ๊ณ๋ก์ ํ ๋น์ด ํฉ๊ณ์์ ์ฒซ ๋ฒ์งธ ์ผ์น ์ ํ์ ๊ฒ์ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
์, ์ ์์์ ๋งํ๋ฏ์ด (๋ฌผ๋ก ์ปดํ์ผ๋ฌ๋ ์ด๋ ๊ฒ์ ์ ํํด์ผ ํ๋์ง ์ ์ ์ผ๋ก ์๊ณ ์์ผ๋ฏ๋ก ๋ฐํ์์ ๊ฒ์ํ์ง ์์ต๋๋ค.)
๋๋ ์ด๊ฒ์ ๋ฐ๋ฅด์ง ์๋๋ค. ๋ด๊ฐ ์ฝ๋ ๋ฐฉ์(์๋ํ ๋ด์ฉ๊ณผ ๋ค๋ฅผ ์ ์์)์ I์ T-๊ตฌํ-I์ ๊ฒฐํฉ U๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ต์ํ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
1a) U u = t
ํ ๋น ์ ํ๊ทธ๋ T๋ก ์ค์ ๋ฉ๋๋ค. ํ๊ทธ๊ฐ T์ด๊ธฐ ๋๋ฌธ์ ๋์ค์ ์ ํํ๋ฉด T๊ฐ ๋ฉ๋๋ค.
1b) U u = i
ํ ๋น ์(i๋ ์ค์ ๋ก T์) ํ๊ทธ๊ฐ I๋ก ์ค์ ๋ฉ๋๋ค. ๋์ค์ ์ ํํ๋ฉด ํ๊ทธ๊ฐ I์ด๊ธฐ ๋๋ฌธ์ T๊ฐ ํ์ ๋์ง๋ง ๋ ๋ฒ์งธ ๊ฒ์ฌ(T๊ฐ I ๋ฐ T๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ์ํ๋จ) U)์ ๊ตฌ์ฑ์์
๋๋ค. T๋ฅผ ๋ฐ๊ฒฌํฉ๋๋ค.
2a) 1a์ฒ๋ผ
2b) U u = i
ํ ๋น ์(i๋ ์ค์ ๋ก T์) ์์ฑ๋ ์ฝ๋๋ ๊ฐ(i)์ ํ์ธํ์ฌ T๊ฐ I๋ฅผ ๊ตฌํํ๊ณ T๋ U์ ๊ตฌ์ฑ์์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก T์ธ์ง ํ์ธํฉ๋๋ค. ์ฆ, ํ๊ทธ๊ฐ T๋ก ์ค์ ๋ฉ๋๋ค. ๋์ค์ ์ ํํ๋ฉด ์ง์ T๊ฐ ๋ฉ๋๋ค.
T, V, W๊ฐ ๋ชจ๋ I ๋ฐ U = *T | *V | *W | I
๊ตฌํํ๋ ๊ฒฝ์ฐ U u = i
ํ ๋น์๋ 3๊ฐ์ง ์ ํ ํ
์คํธ๊ฐ ํ์ํฉ๋๋ค.
์ธํฐํ์ด์ค์ ํฌ์ธํฐ๋ ๊ณต์ฉ์ฒด ์ ํ์ ์๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋์์ต๋๋ค. ๊ทธ๋ ์ฃ ?
"๋ฉ์ง" ๊ตฌํ์ด ์ฝ๊ฐ์ ๋นํธ ๋ฑ ์์ ์ํํ๋ ํน์ ์ข ๋ฅ์ ํด์ปค๋ฅผ ์์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋ ์ฐธ์กฐ ๋์์ด 4๋ฐ์ดํธ๋ก ์ ๋ ฌ๋๋ 4๊ฐ ์ดํ์ ํฌ์ธํฐ ์ ํ์ ์กฐํฉ์ด ์๋ ๊ฒฝ์ฐ ํ๊ทธ๋ฅผ ํ์ 2์ ์ ์ฅํฉ๋๋ค. ๊ฐ์ ๋นํธ. ์ด๊ฒ์ ์ฐจ๋ก๋ก Union ๊ตฌ์ฑ์์ ์ฃผ์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์ข์ง ์์์ ์๋ฏธํฉ๋๋ค(์ด์จ๋ ํด๋น ์ฃผ์๋ ํ๊ทธ๋ฅผ ์กฐ์ ํ์ง ์๊ณ "์ด์ " ์ ํ์ ๋ณต์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ์ง ์์ต๋๋ค).
๋๋ 50๋นํธ ์ฃผ์ ๊ณต๊ฐ์ด ์๊ณ NaN์ ๋ํด ์ฝ๊ฐ์ ์์ ๋ฅผ ๊ฐ๊ณ ์ ํ๋ ๊ฒฝ์ฐ ์ ์, ํฌ์ธํฐ ๋ฐ ๋ ๋ฐฐ๋ฅผ ๋ชจ๋ 64๋นํธ ํฉ์งํฉ์ผ๋ก ๋ง๋ค ์ ์์ผ๋ฉฐ ์ฝ๊ฐ์ ๋นํธ ์กฐ์ ๋น์ฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ ํ์ ์ ์์ ๋ชจ๋ ์ด์ฒด์ ์ด๋ฉฐ, ๋ ๋ค ์์์(?) ๊ด์ ์ ์ธ ์ง์ง์๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
์ด๊ฒ์ ์ฐจ๋ก๋ก ๋ ธ์กฐ์์ ์ฃผ์๋ฅผ ์ทจํ๋ ๊ฒ์ด ์ข์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ณ์. ํ์ง๋ง ์ด์จ๋ ํ์ ์ฃผ์ฅ์ ๊ฒฐ๊ณผ๊ฐ ์ค๋๋ ์ฒ๋ฆฌ๋ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๋ ์ฃ ?
U u = i(i๋ ์ค์ ๋ก T์)์ ํ ๋น์์ ํ๊ทธ๋ I๋ก ์ค์ ๋ฉ๋๋ค.
์ด๊ฒ์ด ํต์ฌ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค . ํ๊ทธ I์ด ์์ต๋๋ค.
์ ์ ๋ฐํ์ ํํ์ ๋ฌด์ํ๊ณ ํฉ๊ณ ์ ํ์ ์ธํฐํ์ด์ค๋ก ๊ณ ๋ คํ์ญ์์ค. ๋ชจ๋ ์ธํฐํ์ด์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ ์ ํ(์ ์ฅ๋ ์ ํ)์ด ์์ต๋๋ค. ๋น์ ์ด ์ฐธ์กฐํ๋ "ํ๊ทธ"๋ ์ ํํ ๊ทธ ๋์ ์ ํ์ ๋๋ค.
์ ์์ ๋ง์ง๋ง ๋จ๋ฝ์์ ์์ํ๋ ค๊ณ ํ๋ ๊ฒ์ฒ๋ผ ๋ฐํ์ ์ ํ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์ ํ ํ๊ทธ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ง๋ง ๊ฒฐ๊ตญ์๋ ํญ์ ๋์ ์์ฑ๋ ๋ "์ ํ๋" ๋์์ด ์๋ ํฉ๊ณ ์ ํ ๊ฐ์ ์ ํ์ ๋๋ค.
์ธํฐํ์ด์ค์ ํฌ์ธํฐ๋ ๊ณต์ฉ์ฒด ์ ํ์ ์๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋์์ต๋๋ค. ๊ทธ๋ ์ฃ ?
๊ทธ๋ ์ง๋ ์์์ง๋ง ์ ์๊ฐ์๋ ๋ค๋ฅธ ์ธ์ด ๊ธฐ๋ฅ๊ณผ ๊ด๋ จํ์ฌ ๋ชจ๋ ์ ์์ด ๊ฐ๋ฅํ ํ ์ง๊ตํด์ผ ํฉ๋๋ค.
@dr2chase ์ง๊ธ๊น์ง ๋ด๊ฐ ์ดํดํ ๊ฒ์ sum ์ ํ์ด ์ ์์ ์ธํฐํ์ด์ค ์ ํ์ ํฌํจํ๋ ๊ฒฝ์ฐ ๋ฐํ์์ ๊ตฌํ์ด ์ธํฐํ์ด์ค(๋ฉ์๋ ์ธํธ์ ๊ต์ฐจ ํฌํจ)์ ๋์ผํ์ง๋ง ํ์ฉ ๊ฐ๋ฅํ ์ ํ์ ๋ํ ์ปดํ์ผ ์๊ฐ ๋ถ๋ณ์ฑ์ ์ฌ์ ํ ์ํ.
sum ์ ํ์ด ๊ตฌ์ฒด์ ์ธ ์ ํ๋ง ํฌํจํ๊ณ C ์คํ์ผ์ ํ๋ณ ํฉ์งํฉ์ฒ๋ผ ๊ตฌํ๋ ๊ฒฝ์ฐ์๋ sum ์ ํ์ ๊ฐ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ฃผ์. ๊ทธ๋ฌ๋ ํฉ๊ณ ์ ๋ ฅ ๊ฐ ์์ฒด์ ์ฃผ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํฉ๊ณ ์ ํ์ด ์ด๋ฐ ์์ผ๋ก ๋์ํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๊น? ์ฐ๋ฆฌ๋ ์ ํ๋/์ด์ค์
๋ ์ ํ์ด ๊ฐ์ด ๊ณต์ฉ์ฒด์ ํ ๋น๋ ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋งํ๊ฑฐ๋ ์์ํ ๊ฒ๊ณผ ๋์ผํ๋ค๊ณ ์ฝ๊ฒ ์ ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฐ๋ฆฌ๋ int8 ๋ int16 ๋ int32 ๋ฑ๊ณผ ๊ด๋ จํ์ฌ ํฅ๋ฏธ๋ก์ด ์ฅ์๋ก ์ด๋๋ฆด ์ ์์ต๋๋ค. ๋๋ ์๋ฅผ ๋ค์ด int8 | uint8
.
ํฉ๊ณ ์ ํ์ด ์ด๋ฐ ์์ผ๋ก ๋์ํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๊น?
๊ทธ๊ฒ์ ํ๋จ์ ๋ฌธ์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ ์ ๋ฐ ๋์ ์ ํ์ ๊ฐ์ธ ์ธํฐํ์ด์ค ๊ฐ๋ ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ์๊ฐํฉ๋๋ค. ์ ์๋ ํฉ๊ณ ์ ํ์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ธํฐํ์ด์ค ์ ํ์ ์ง์ ํ๋ ๋ณด๋ค ์ ํํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ํ sum ์ ํ์ด ๋ค๋ฅธ ์ ํ์ ์ ํ ์์ด ์๋ํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ์ง ์์ผ๋ฉด ์ธํฐํ์ด์ค ์ ํ์ ์ ์ธํด์ผ ํ๋ฏ๋ก ๊ธฐ๋ฅ์ด ์์ ํ ์ง๊ตํ์ง ์์ต๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด int8 ๋ int16 ๋ int32 ๋ฑ๊ณผ ๊ด๋ จํ์ฌ ํฅ๋ฏธ๋ก์ด ์ฅ์๋ก ์ธ๋๋ ์ ์์ต๋๋ค. ๋๋, ์๋ฅผ ๋ค์ด int8 | uint8.
์ฌ๊ธฐ์์ ๋น์ ์ ๊ด์ฌ์ฌ๋ ๋ฌด์์ ๋๊น?
ํจ์ ์ ํ์ ๋งต์ ํค ์ ํ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋๋ฑํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋ผ ๋ค๋ฅธ ์ ํ์ ์ ํ์ ์ ํํ๋ ์ ํ์ ๋ํ ์ ๋ก๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ์์ง ํ๋งค๋์ง ์์ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋๋ก ์ด๋ ค ์์ต๋๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ํฌํจํ๋ ํฉ๊ณ ์ ํ์ผ๋ก ์ด๋ค ์ข ๋ฅ์ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์์ต๋๊น?
๋์.
๊ณต์ฉ์ฒด ์ ํ์ 0๊ฐ ์ด์์ ์ ํ์ ๋์ดํ๋ ์ ํ์ ๋๋ค.
union {
T0
T1
//...
Tn
}
Union์ ๋์ด๋ ๋ชจ๋ ์ ํ(T0, T1, ..., Tn)์ ์๋ก ๋ฌ๋ผ์ผ ํ๋ฉฐ ์ธํฐํ์ด์ค ์ ํ์ด ๋ ์ ์์ต๋๋ค.
๋ฉ์๋๋ ์ผ๋ฐ์ ์ธ ๊ท์น์ ๋ฐ๋ผ ์ ์๋(๋ช ๋ช ๋) ๊ณต์ฉ์ฒด ์ ํ์ ์ ์ธ๋ ์ ์์ต๋๋ค. ๋์ด๋ ์ ํ์์ ์น๊ฒฉ๋ ๋ฉ์๋๊ฐ ์์ต๋๋ค.
๊ณต์ฉ์ฒด ์ ํ์ ๋ํ ์๋ฒ ๋ฉ์ด ์์ต๋๋ค. ํ๋์ ๊ณต์ฉ์ฒด ์ ํ์ ๋ค๋ฅธ ์ ํ์ ๋์ดํ๋ ๊ฒ์ ๋ค๋ฅธ ์ ํจํ ์ ํ์ ๋์ดํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ type S struct { S }
๊ฐ ์ ํจํ์ง ์์ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๋ก ๊ณต์ฉ์ฒด๋ ์์ฒด ์ ํ์ ์ฌ๊ท์ ์ผ๋ก ๋์ดํ ์ ์์ต๋๋ค.
๊ณต์ฉ์ฒด๋ ๊ตฌ์กฐ์ฒด์ ํฌํจ๋ ์ ์์ต๋๋ค.
๊ณต์ฉ์ฒด ์ ํ์ ๊ฐ์ ๋์ด๋ ์ ํ ์ค ํ๋๋ก ์ ํ๋๋ ๋์ ์ ํ๊ณผ ๋์ ์ ํ์ ๊ฐ(์ ์ฅ๋ ๊ฐ์ด๋ผ๊ณ ํจ)์ ๋๋ค. ๋์ด๋ ์ ํ ์ค ์ ํํ ํ๋๊ฐ ํญ์ ๋์ ์ ํ์ ๋๋ค.
๋น ํฉ์งํฉ์ 0 ๊ฐ์ ๊ณ ์ ํฉ๋๋ค. ๋น์ด ์์ง ์์ ๊ณต์ฉ์ฒด์ 0 ๊ฐ์ ๊ณต์ฉ์ฒด์ ๋์ด๋ ์ฒซ ๋ฒ์งธ ์ ํ์ 0 ๊ฐ์ ๋๋ค.
U
์ ๋์จ ์ ํ์ ๋ํ ๊ฐ์ 0 ๊ฐ์ ๋ํด U{}
๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ์ ์์ต๋๋ค. U
์ ํ๋ ์ด์์ ์ ํ์ด ์๊ณ v
๊ฐ ๋์ด๋ ์ ํ ์ค ํ๋์ ๊ฐ์ธ ๊ฒฝ์ฐ T
, U{v}
๋ v
์ ์ฅํ๋ ๊ณต์ฉ์ฒด ๊ฐ์ ์์ฑํฉ๋๋ค. T
. v
๊ฐ U
๋์ด๋์ง ์์ ์ ํ์ด๊ณ ๋์ด๋ ์ ํ ์ค ๋ ์ด์์ ํ ๋น๋ ์ ์๋ ๊ฒฝ์ฐ ๋ช
ํ์ฑ์ ์ํด ๋ช
์์ ๋ณํ์ด ํ์ํฉ๋๋ค.
์กฐํฉ์ ๊ฐ์ด ์
๋ ฅ U
๋ค๋ฅธ ์กฐํฉ ํํ๋ก ๋ณํ ํ ์ V
๊ณผ V(U{})
์ ํ์
์ธํธ IFF U
์ ์๋ธ ์ธํธ V
์ ์ ํ ์งํฉ์
๋๋ค. ์ฆ, ์์๋ฅผ ๋ฌด์ํ๋ค U
๋ฑ ๋ชจ๋ ๊ฐ์ ์ ํ์ด ์์ด์ผํฉ๋๋ค V
์ํ์ํ๊ณ , U
ํ์ง์์๋ ์ ํ ๊ฐ์ง ์ ์์ต๋๋ค V
์์ง๋ง V
์๋ U
์๋ ์ ํ์ด ์์ ์ ์์ต๋๋ค.
๊ณต์ฉ์ฒด ์ ํ ๊ฐ์ ํ ๋น ๊ฐ๋ฅ์ฑ์ ๊ณต์ฉ์ฒด ์ ํ ์ค ์ต๋ ํ๋๊ฐ ์ ์(์ด๋ฆ ์ง์ )๋์ด ์๋ ํ ๋ณํ ๊ฐ๋ฅ์ฑ์ผ๋ก ์ ์๋ฉ๋๋ค.
ํตํฉ ์ ํ U
์ ๋์ด๋ ์ ํ ์ค ํ๋์ธ T
๊ฐ์ ํตํฉ ์ ํ U
์ ๋ณ์์ ํ ๋น๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋์ ์ ํ์ด T
๋๊ณ ๊ฐ์ด ์ ์ฅ๋ฉ๋๋ค. ํ ๋น ํธํ ๊ฐ์ ์์ ๊ฐ์ด ์๋ํฉ๋๋ค.
๋์ด๋ ๋ชจ๋ ์ ํ์ด ๋ฑํธ ์ฐ์ฐ์๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ:
==
๋ false์ด๊ณ !=
๋ true์
๋๋ค. ํ ๋น ํธํ ๊ฐ์ ์์ ๊ฐ์ด ์๋ํฉ๋๋ค.๊ณต์ฉ์ฒด ์ ํ์ ๊ฐ์๋ ๋ค๋ฅธ ์ฐ์ฐ์๊ฐ ์ง์๋์ง ์์ต๋๋ค.
์ฃผ์ฅ๋ ์ ํ์ด ๋์ ์ ํ์ธ ๊ฒฝ์ฐ ๋์ด๋ ์ ํ ์ค ํ๋์ ๋ํ ํตํฉ ์ ํ์ ๋ํ ์ ํ ์ฃผ์ฅ์ด ์ ์ง๋ฉ๋๋ค.
์ธํฐํ์ด์ค ์ ํ์ ๊ณต์ฉ์ฒด ์ ํ์ ๋ํ ์ ํ ์ด์ค์ ์ ๋์ ์ ํ์ด ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒฝ์ฐ ์ ์ง๋ฉ๋๋ค. (ํนํ ๋์ด๋ ๋ชจ๋ ์ ํ์ด ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒฝ์ฐ ์ด์ค์ ์ด ํญ์ ์ ์ง๋จ).
์ ํ ์ค์์น๋ ๋์ด๋ ๋ชจ๋ ์ ํ์ ํฌํจํ์ฌ ์์ ํ๊ฑฐ๋ ๊ธฐ๋ณธ ๋์๋ฌธ์๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค.
์ ํ ์ด์ค์ ๋ฐ ์ ํ ์ค์์น๋ ์ ์ฅ๋ ๊ฐ์ ๋ณต์ฌ๋ณธ์ ๋ฐํํฉ๋๋ค.
ํจํค์ง ๋ฆฌํ๋ ํธ๋ ๋ฐ์๋ ๊ณต์ฉ์ฒด ๊ฐ์ ๋์ ์ ํ ๋ฐ ์ ์ฅ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ๊ณผ ๋ฐ์ฌ๋ ๊ณต์ฉ์ฒด ์ ํ์ ๋์ด๋ ์ ํ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
๋ ธํธ:
union{...}
๊ตฌ๋ฌธ์ ์ด ์ค๋ ๋์ ํฉ๊ณ ์ ํ ์ ์๊ณผ โโ๊ตฌ๋ณํ๊ธฐ ์ํด, ์ฃผ๋ก Go ๋ฌธ๋ฒ์์ nice ์์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ถ๋ถ์ ์ผ๋ก ์ ํ๋์์ผ๋ฉฐ, ๋ถ์์ ์ผ๋ก ์ด๊ฒ์ด ๊ตฌ๋ณ๋ ๊ณต์ฉ์ฒด์์ ๊ฐ์กฐํ๊ธฐ ์ํด ์ ํ๋์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด๊ฒ์ union{}
๋ฐ union{ int }
์ ๊ฐ์ ๋ค์ ์ด์ํ ๊ณต์ฉ์ฒด๋ฅผ ํ์ฉํฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ ๋ง์ ์๋ฏธ์์ struct{}
(์ ์์ ๋ฐ๋ผ ๋ค๋ฅธ ์ ํ)์ ๋์ผํ๋ฏ๋ก ๋ค๋ฅธ ๋น ์ ํ์ ์ถ๊ฐํ๋ ๊ฒ ์ธ์๋ ์ธ์ด์ ์ถ๊ฐํ์ง ์์ต๋๋ค. ๋ ๋ฒ์งธ๊ฐ ๋ ์ ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, type Id union { int }
๋ ํตํฉ ๋ฒ์ ์ด idValue.int
๋ฅผ ์ง์ ํ์ง ์๊ณ ๋ ์ง์ ํ ๋น์ ํ์ฉํ์ฌ ๋ด์ฅ ์ ํ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ค๋ ์ ์ ์ ์ธํ๋ฉด type Id struct { int }
์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
ํ ๋น ํธํ ์ ํ์ ์ฒ๋ฆฌํ ๋ ํ์ํ ๋ช ํํ ๋ณํ์ ์ฝ๊ฐ ๊ฐํนํ์ง๋ง ๋ค์ด์คํธ๋ฆผ ์ฝ๋๊ฐ ์ค๋น๋์ง ์์ ๋ชจํธ์ฑ์ ๋์ ํ๋๋ก ๊ณต์ฉ์ฒด๊ฐ ์ ๋ฐ์ดํธ๋๋ฉด ์ค๋ฅ๋ฅผ ํฌ์ฐฉํฉ๋๋ค.
์๋ฒ ๋ฉ์ด ์๋ ๊ฒ์ ๊ณต์ฉ์ฒด์ ๋ฉ์๋๋ฅผ ํ์ฉํ๊ณ ์ ํ ์ค์์น์์ ์ฒ ์ ํ ์ผ์น๋ฅผ ์๊ตฌํ๋ ๊ฒฐ๊ณผ์ ๋๋ค.
๋์ด๋ ์ ํ์ ๋ฉ์๋์ ์ ํจํ ๊ต์งํฉ์ ์ทจํ๋ ๋์ ๊ณต์ฉ์ฒด ์์ฒด์ ๋ฉ์๋๋ฅผ ํ์ฉํ๋ฉด ์ค์๋ก ์์น ์๋ ๋ฉ์๋๋ฅผ ์ป๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์ ์ฅ๋ ๊ฐ์ ๊ณตํต ์ธํฐํ์ด์ค์ ์ด์ค์
ํ๋ ํ์์ ์น๊ฒฉ์ด ํ์ํ ๋ ๊ฐ๋จํ๊ณ ๋ช
์์ ์ธ ๋ํผ ๋ฉ์๋๋ฅผ ํ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํตํฉ ์ ํ U
๋์ด๋ ๋ชจ๋ ์ ํ์ด fmt.Stringer
๊ตฌํํฉ๋๋ค.
func (u U) String() string {
return u.(fmt.Stringer).String()
}
์ฐ๊ฒฐ๋ reddit ์ค๋ ๋์์ rsc๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํ์ต๋๋ค.
sum { X;์ 0 ๊ฐ์ ์ด์ํ ๊ฒ์ ๋๋ค. Y }๋ sum { Y; NS }. ์ด์ก์ด ์ผ๋ฐ์ ์ผ๋ก ์๋ํ๋ ๋ฐฉ์์ด ์๋๋๋ค.
์ด๊ฒ์ ์ค์ ๋ก ์ด๋ค ์ ์์๋ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ํด ์๊ฐํด ์์ต๋๋ค.
๋ฒ๊ทธ๊ฐ ์๋๋ผ ๊ธฐ๋ฅ์ ๋๋ค.
๊ณ ๋ คํ๋ค
type (
Undefined = struct{}
UndefinedOrInt union { Undefined; int }
)
๋
type (
Illegal = struct{}
IntOrIllegal union { int; Illegal }
)
UndefinedOrInt
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ง ์ ์๋์ง ์์์ผ๋ ์ ์๋๋ฉด int
๊ฐ์ด ๋ฉ๋๋ค. ์ด๊ฒ์ *int
์ ์ ์ฌํฉ๋๋ค. ์ด๊ฒ์ ํฉ๊ณ ์ ํ(1 + int)์ด Go์์ ์ง๊ธ ํํ๋์ด์ผ ํ๋ ๋ฐฉ์์ด๊ณ 0 ๊ฐ๋ ์ ์ฌํฉ๋๋ค.
๋ฐ๋ฉด์ IntOrIllegal
๋ ๊ธฐ๋ณธ์ ์ผ๋ก int 0์ด๋ผ๊ณ ๋งํ์ง๋ง ์ด๋ ์์ ์์ ๋ถ๋ฒ์ผ๋ก ํ์๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ ํ *int
์ ์ฌํ์ง๋ง 0 ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ new(int)
ํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์๋๋ฅผ ๋ ์ ํํํฉ๋๋ค.
๊ตฌ์กฐ์ฒด์ bool ํ๋๋ฅผ ์์๋ก ํํํ์ฌ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ํ๋ ๊ฐ์ด 0์ด ๋๋๋ก ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
ํฉ๊ณ์ 0 ๊ฐ์ ๋ชจ๋ ๊ทธ ์์ฒด๋ก ์ ์ฉํ๊ณ ์๋ฏธ๊ฐ ์์ผ๋ฉฐ ํ๋ก๊ทธ๋๋จธ๋ ์ํฉ์ ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ ์ ํํ ์ ์์ต๋๋ค.
ํฉ๊ณ๊ฐ ์์ผ ์ด๊ฑฐํ(๊ฐ ์์ผ ์ ์๋ struct{}
)์ธ ๊ฒฝ์ฐ ๋จผ์ ๋์ด๋๋ ๋ ์ง๊ฐ ์ฃผ์ ์ฒซ ๋ฒ์งธ ์์ผ์ด๋ฉฐ iota
์คํ์ผ ์ด๊ฑฐํ์ ๊ฒฝ์ฐ์๋ ๋์ผํฉ๋๋ค.
๋ํ ํฉ๊ณ ์ ํ ๋๋ 0 ๊ฐ์ ๊ฐ๋ ์ด ์๋ ํ๋ณ/ํ๊ทธ ๊ฒฐํฉ์ด ์๋ ์ธ์ด๋ฅผ ์์ง ๋ชปํฉ๋๋ค. C๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ง๋ง 0 ๊ฐ์ ์ด๊ธฐํ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ์ ๋๋ค. Java์ ๊ธฐ๋ณธ๊ฐ์ null์ด์ง๋ง ๋ชจ๋ ๊ฒ์ด ์ฐธ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ด๊ฐ ์๋ ๋ค๋ฅธ ๋ชจ๋ ์ธ์ด์๋ summands์ ๋ํ ํ์ ์ ํ ์์ฑ์๊ฐ ์์ผ๋ฏ๋ก ์ค์ ๋ก 0 ๊ฐ์ ๊ฐ๋ ์ด ์์ต๋๋ค. ๊ทธ๋ฐ ์ธ์ด๊ฐ ์์ต๋๊น? ๊ทธ๊ฒ์ ๋ฌด์์ํฉ๋๊น?
"ํฉ"๊ณผ "ํฉ์งํฉ"์ ์ํ์ ๊ฐ๋ ๊ณผ์ ์ฐจ์ด์ ์ด ๋ฌธ์ ๋ผ๋ฉด ์ฐ๋ฆฌ๋ ํญ์ ๊ทธ๊ฒ๋ค์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ถ๋ฅผ ์ ์์ต๋๋ค(์: "๋ณํ").
์ด๋ฆ: Union์ C/C++ ์์์ฃผ์์๋ฅผ ํผ๋ํฉ๋๋ค. Variant๋ ์ฃผ๋ก COBRA ๋ฐ COM ํ๋ก๊ทธ๋๋จธ์๊ฒ ์น์ํ๋ฉฐ, ์ฌ๊ธฐ์ ๊ธฐ๋ฅ์ ์ธ์ด๋ ๊ตฌ๋ณ๋ ๊ฒฐํฉ์ ์ ํธํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ธํธ๋ ๋์ฌ์ ๋ช ์ฌ์ ๋๋ค. ๋๋ _pic_ ํค์๋๋ฅผ ์ข์ํ๋ค. ๋ฆผ๋ณด๋ _pick_๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ์งง๊ณ ์ ํํ ์ ํ ์งํฉ์์ ์ ํํ๋ ค๋ ์ ํ์ ์๋๋ฅผ ์ค๋ช ํฉ๋๋ค.
์ด๋ฆ/๊ตฌ๋ฌธ์ ํฌ๊ฒ ๊ด๋ จ์ด ์์ต๋๋ค. ๊ณ ๋ฅด์๋ฉด ๋ฉ๋๋ค.
์ด ์ค๋ ๋์ ์ ์ ์ค ํ๋๋ ์งํฉ ์ด๋ก ์ ์์ ๋ง์ต๋๋ค.
0 ๊ฐ์ ๋ํด ํน๋ณํ ์ฒซ ๋ฒ์งธ ์ ํ์ ์ ํ ์ด๋ก ์ ์ธ ํฉ์ด ํต๊ทผํ๊ธฐ ๋๋ฌธ์ ๊ด๋ จ์ด ์์ผ๋ฏ๋ก ์์๋ ๊ด๋ จ์ด ์์ต๋๋ค(A + B = B + A). ๋ด ์ ์์ ๊ทธ ์์ฑ์ ์ ์งํ์ง๋ง ์ ํ ์ ํ๋ ์ด๋ก ์ ํต๊ทผํ๊ณ ๋๋ถ๋ถ์ ์ธ์ด(Go ํฌํจ)์์ ์ค์ ๋ก ๋ค๋ฅธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ฏ๋ก ์๋ง๋ ํ์๋ ์๋๋๋ค.
@jimmyfrasche
์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ '์ ํ' ๋ฉค๋ฒ๋ก ํ์ฉํ์ง ์๋ ๊ฒ์ด ๋งค์ฐ ํฐ ๋จ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฒซ์งธ, '์ ํ' ์ ํ์ ํ๋ฅญํ ์ฌ์ฉ ์ฌ๋ก ์ค ํ๋๋ฅผ ์์ ํ ๋ฌดํจํํฉ๋๋ค. ์ค๋ฅ๊ฐ ๊ตฌ์ฑ์ ์ค ํ๋๊ฐ ๋๋ ๊ฒ์ ๋๋ค. ๋๋ ์ฌ์ฉ์๊ฐ ๋ฏธ๋ฆฌ StringReader๋ฅผ ์ฌ์ฉํ๋๋ก ํ์ง ์์ผ๋ ค๋ฉด io.Reader ๋๋ ๋ฌธ์์ด์ด ์๋ ์ ํ ์ ํ์ ์ฒ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์ฒด๋ก ์ธํฐํ์ด์ค๋ ๋ ๋ค๋ฅธ ์ ํ์ด๋ฉฐ '์ ํ' ๋ฉค๋ฒ์ ๋ํ ์ ํ ์ ํ์ด ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ ํ ์ ํ์ 2๊ฐ์ ์ธํฐํ์ด์ค ๋ฉค๋ฒ๊ฐ ์๊ณ ํ๋๋ ๋ค๋ฅธ ํ๋์ ์ํด ์์ ํ ๋๋ฌ์ธ์ฌ ์๋ ๊ฒฝ์ฐ ์ด์ ์ ์ธ๊ธํ ๋๋ก ์ปดํ์ผ ์๊ฐ ์ค๋ฅ์ฌ์ผ ํฉ๋๋ค.
๊ทํ์ ๋ฐ๋ ์ ์์์ ๋ด๊ฐ ์ข์ํ๋ ๊ฒ์ ์ ํ ์ ํ์์ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์๋ค๋ ์ฌ์ค์ ๋๋ค. ์ด๋ค ๋ฉ์๋๊ฐ ๋ชจ๋ ๊ตฌ์ฑ์์ ์ํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์(์ด์จ๋ ์ด์ ๋ํ ์ธํฐํ์ด์ค๊ฐ ์์) ๋ฉค๋ฒ ๋ฉ์๋์ ๋จ๋ฉด์ ์ ๊ณตํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฒ ์ ํ ์ค์์น + ๊ธฐ๋ณธ ์ผ์ด์ค๋ ์์ฃผ ์ข์ ์๊ฐ์ ๋๋ค.
@rogpeppe @jimmyfrasche ๋น์ ์ ์ ์์์ ๋ณผ ์ ์๋ ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ํด์ผ ํ๋ ์ด์ ์ ๋๋ค. ์๋ก์ด ์ข ๋ฅ์ ์ ํ์ ์ถ๊ฐํ๋ ๋ฐ๋ ๋ถ๋ช ํ ๋จ์ ์ด ์์ต๋๋ค. ๋ฐ๋์ ๊ธฐ๋๋ ๋ชจ๋ ์ฌ๋์ด ๋ฐฐ์์ผ ํ๋ ์๋ก์ด ๊ฐ๋ ์ ๋๋ค. ๋ณด์ ์ด์ ์ ๋ฌด์์ ๋๊น? ํนํ, ์๋ก์ด ์ ํ์ ์ ํ์ ์ธํฐํ์ด์ค ์ ํ์์ ์ป์ ์ ์๋ ๋ฌด์์ ์ ๊ณตํฉ๋๊น?
@ianlancetaylor Robert๋ ์ฌ๊ธฐ์ ์ ์์ฝ๋์ด ์์ต๋๋ค: https://github.com/golang/go/issues/19412#issuecomment -288608089
@ianlancetaylor
ํ๋ฃจ๊ฐ ๋๋๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ์ ์ ์์ผ๋ฉฐ ์ด๊ฒ์ด Go์ ์ฃผ์ ์ง์๋ฌธ์
๋๋ค. json.Token์ ๊ณ ๋ คํด ๋ณด์ธ์. ํ์ฌ ์ธํฐํ์ด์ค๋ก ์ ์๋์ด ์์ง๋ง{} ๋ฌธ์์์๋ ์ค์ ๋ก ํน์ ์ ํ์ ์ ํ ์ค ํ๋๋ง ๋ ์ ์๋ค๊ณ ๋ช
์ํ๊ณ ์์ต๋๋ค. ๋ฐ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ด ์ฐ์ฌ์ง๋ฉด
type Token Delim | bool | float64 | Number | string | nil
์ฌ์ฉ์๋ ๋ชจ๋ ๊ฐ๋ฅ์ฑ์ ์ฆ์ ๋ณผ ์ ์์ผ๋ฉฐ ๋๊ตฌ๋ ์๋์ผ๋ก ์์ ํ ์ค์์น๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ, ์ปดํ์ผ๋ฌ๋ ๋น์ ์ด ๊ฑฐ๊ธฐ์ ์์์น ๋ชปํ ์ ํ์ ์ง์ด๋ฃ๋ ๊ฒ์ ๋ฐฉ์งํ ๊ฒ์ ๋๋ค.
ํ๋ฃจ๊ฐ ๋๋๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ์ ์ ์์ผ๋ฉฐ ์ด๊ฒ์ด Go์ ์ฃผ์ ์ง์๋ฌธ์ ๋๋ค.
๋ ๋ง์ ๊ธฐ๋ฅ์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ํด ๋ ๋ง์ด ์์์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ธ์ด์ ๋ํ ํ๊ท ์์ค์ ์ง์์ ๊ฐ์ง ์ฌ๋์ ๊ฒฝ์ฐ ๊ฐ๋ ์ฑ์ ๋ฐ๋์ [์๋ก ์ถ๊ฐ๋] ๊ธฐ๋ฅ์ ์์ ๋ฐ๋น๋กํฉ๋๋ค.
@cznic
๋ ๋ง์ ๊ธฐ๋ฅ์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ํด ๋ ๋ง์ด ์์์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ํญ์์ ์๋๋๋ค. "์ธ์ด์ ๋ํด ๋ ๋ง์ด ์๋ ๊ฒ"์ "์ฝ๋์์ ์๋ชป๋๊ฑฐ๋ ์ผ๊ด๋์ง ์๊ฒ ๋ฌธ์ํ๋ ๋ถ๋ณ๋์ ๋ํด ๋ ๋ง์ด ์๋ ๊ฒ"์ผ๋ก ๋์ฒดํ ์ ์๋ค๋ฉด, ๊ทธ๊ฒ์ ์ฌ์ ํ โโ์์ต์ด ๋ ์ ์์ต๋๋ค. (์ฆ, ๊ธ๋ก๋ฒ ์ง์์ด ๋ก์ปฌ ์ง์์ ํ์์ฑ์ ๋์ฒดํ ์ ์์ต๋๋ค.)
๋ ๋์ ์ปดํ์ผ ์๊ฐ ์ ํ ๊ฒ์ฌ๊ฐ ์ค์ ๋ก ์ ์ผํ ์ด์ ์ด๋ผ๋ฉด vet๊ฐ ๊ฒ์ฌํ ์ฃผ์์ ๋์ ํ์ฌ ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๋งค์ฐ ์ ์ฌํ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ๊ฐ์ ๊ฒ
//vet:types Delim | bool | float64 | Number | string | nil
type Token interface{}
ํ์ฌ ์ฐ๋ฆฌ๋ ์ด๋ค ์ข ๋ฅ์ ์์์ฌ ์๊ฒฌ๋ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฏ๋ก ์ด๊ฒ์ด ์์ ํ ์ง์งํ ์ ์์ ์๋๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ ๊ธฐ๋ณธ ์์ด๋์ด์ ๋ํด ์ง์งํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ป๋ ์ ์ผํ ์ด์ ์ด ์ ์ ๋ถ์ ๋๊ตฌ๋ก ์์ ํ ํ ์ ์๋ ๊ฒ์ด๋ผ๋ฉด ์ ์ ํ ์ธ์ด์ ๋ณต์กํ ์ ๊ฐ๋ ์ ์ถ๊ฐํ ๊ฐ์น๊ฐ ์์ต๋๊น?
cmd/vet์ ์ํด ์ํ๋ ํ ์คํธ์ ๋๋ถ๋ถ, ์๋ง๋ ๋ชจ๋๋ ๋ณ๋์ ์ ์ ๋ถ์ ๋๊ตฌ๊ฐ ์๋ ์ปดํ์ผ๋ฌ์ ์ํด ๊ฒ์ฌ๋ ์ ์๋ค๋ ์๋ฏธ์์ ์ธ์ด์ ์ถ๊ฐ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ์์์ฌ๋ฅผ ์ปดํ์ผ๋ฌ์์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ ์ฉํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ์ด ๊ฐ๋ ์ด ์์์ฌ ์ชฝ์ด ์๋๋ผ ์ธ์ด ์ชฝ์ธ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@ianlancetaylor ๋ค์ ํ์ธ ๋๊ธ: https://github.com/BurntSushi/go-sumtype
@ianlancetaylor ๋ณ๊ฒฝ์ด ์ ๋นํ์ง ์ฌ๋ถ์ ๋ํด์๋ ์ ๊ทน์ ์ผ๋ก ๋ฌด์ํ๊ฑฐ๋ ๋ค๋ก
๋ ๋์ ์ปดํ์ผ ์๊ฐ ์ ํ ๊ฒ์ฌ๊ฐ ์ค์ ๋ก ์ ์ผํ ์ด์ ์ด๋ผ๋ฉด vet๊ฐ ๊ฒ์ฌํ ์ฃผ์์ ๋์ ํ์ฌ ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๋งค์ฐ ์ ์ฌํ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์๋ก์ด ๊ฒ์ ๋ฐฐ์์ผ ํ๋ค๋ ๋นํ์ ์ฌ์ ํ ์ทจ์ฝํฉ๋๋ค. ์ฝ๋๋ฅผ ๋๋ฒ๊ทธ/์ดํด/์ฌ์ฉํ๊ธฐ ์ํ ๋ง์ ์์์ฌ ์๊ฒฌ์ ๋ํด ๋ฐฐ์์ผ ํ๋ค๋ฉด Go ์ธ์ด ์์ฐ์ ํ ๋นํ๋ ๊ธฐ์ ์ ์ผ๋ก Go ์ธ์ด๊ฐ ์๋ ์์ฐ์ ํ ๋นํ๋ ์๊ด์์ด ์ ์ ๊ณผ์ธ์ ๋๋ค. ์ด์จ๋ ๋งค์ง ๋๊ธ์ ์ธ์ด๋ฅผ ๋ฐฐ์ ๋ค๊ณ ์๊ฐํ์ ๋ ๋ฐฐ์์ผ ํ๋ค๋ ๊ฒ์ ๋ชฐ๋๊ธฐ ๋๋ฌธ์ ๋น์ฉ์ด ๋ ๋ง์ด ๋ญ๋๋ค.
@cznic
๋๋ ๋์ํ์ง ์๋๋ค. ํ์ฌ์ ๊ฐ์ ์ผ๋ก๋ ์ฑ๋์ด ๋ฌด์์ธ์ง ๋๋ ๊ธฐ๋ฅ์ด ๋ฌด์์ธ์ง ์ดํดํ๊ฒ ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๊ฒ๋ค์ ์ธ์ด์ ์กด์ฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ด ์๋์ผ๋ก ์ธ์ด๋ฅผ ์ด๋ ต๊ฒ ๋ง๋ ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ์ด ๊ฒฝ์ฐ, ๋ธ๋๋ฐ์ค ์ธํฐํ์ด์ค ์ ํ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ๋ ๋ฐ๋๋ก ๋
์์๊ฒ ์ ํ์ด ๋ฌด์์ธ์ง ์ฆ๊ฐ์ ์ผ๋ก ๋ช
ํํ๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์ดํดํ๊ธฐ๊ฐ ๋ ์ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์ฃผ์ฅํฉ๋๋ค.{}
@ianlancetaylor
๊ฐ์ธ์ ์ผ๋ก ์ด ๊ธฐ๋ฅ์ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ฝ๊ณ ์ถ๋ก ํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ๊ณผ ๋ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ปดํ์ผ ์๊ฐ ์์ ์ฑ์ ๋งค์ฐ ์ข์ ๊ธฐ๋ฅ์ด์ง๋ง ์ฃผ์ ๊ธฐ๋ฅ์ ์๋๋๋ค. ์ ํ ์๋ช
์ ์ฆ์ ๋ ๋ช
ํํ๊ฒ ๋ง๋ค ๋ฟ๋ง ์๋๋ผ ํ์ ์ฌ์ฉ๋ฒ๋ ์ดํดํ๊ธฐ ์ฝ๊ณ ์์ฑํ๊ธฐ๋ ๋ ์ฝ์ต๋๋ค. ์ฌ๋๋ค์ ์์ํ์ง ๋ชปํ ์ ํ์ ๋ฐ์ผ๋ฉด ๋ ์ด์ ํจ๋์ ์์กดํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ํ์ฌ ๋์์ด๋ฏ๋ก ๋ฏธ์ง์ ๊ฒ์ ๋ฐฉํด๋ฐ์ง ์๊ณ ์ฌ์ฉ๋ฒ์ ๋ํด ๋ ์ฝ๊ฒ ์๊ฐํ ์ ์์ต๋๋ค. . ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ํด ์ฃผ์ ๋ฐ ๊ธฐํ ๋๊ตฌ(์์ฌ ์ ํ์ผ์ง๋ผ๋)์ ์์กดํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ ๊น๋ํ ๊ตฌ๋ฌธ์ด ๊ทธ๋ฌํ ์ฃผ์๋ณด๋ค ์ฝ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๊ธ์ ๊ตฌ์กฐ๊ฐ ์๊ณ ์๋ง์ด ๋๊ธฐ ์ฝ์ต๋๋ค.
@ianlancetaylor
์ด ๊ฐ๋ ์ด ์์์ฌ ์ชฝ์ด ์๋๋ผ ์ธ์ด ์ชฝ์ธ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋์ผํ ์ง๋ฌธ์ ํ๋ง ์์ ์ฝ์ด ์ธ๋ถ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ์ฉํ ์ ์์ผ๋ฉฐ ํ๋ฆผ์์ด Go๊ฐ "ํ๋ง ํํ"์ด ๋๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค. ๋ฐ๋ฉด์, ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ธ "ํ์ฅ"๊ตฌ๋ฌธ์ผ๋ก ๋จ์ด์ ธ ์ค์ ์ธ์ด์ ์ค์ํ ๋ถ๋ถ ์งํฉ์ ์ค์ ํ ์ธ์ด์ ์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. (์: Rust, C++ ๋ฐ GNU C์ "์์ฑ")
ํต์ฌ ์ธ์ด ๋์ ํ์ฅ ๋๋ ์์ฑ์ ๊ธฐ๋ฅ์ ๋ฃ๋ ์ฃผ๋ ์ด์ ๋ ์ ๊ธฐ๋ฅ์ ์ธ์ํ์ง ๋ชปํ๋ ๋๊ตฌ์์ ํธํ์ฑ์ ํฌํจํ์ฌ ๊ตฌ๋ฌธ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํด์์ ๋๋ค. ("๋๊ตฌ์์ ํธํ์ฑ"์ด ์ค์ ๋ก ์ค์ ๋ก ์๋ํ๋์ง ์ฌ๋ถ๋ ๊ธฐ๋ฅ์ด ์ค์ ๋ก ์ํํ๋ ์์ ์ ํฌ๊ฒ ์์กดํฉ๋๋ค.)
Go์ ๋งฅ๋ฝ์์ vet
์ ๊ธฐ๋ฅ์ ๋ฃ๋ ์ฃผ๋ ์ด์ ๋ ์ธ์ด ์์ฒด์ ์ ์ฉํ ๊ฒฝ์ฐ Go 1 ํธํ์ฑ์ ์ ์งํ์ง ์๋ ๋ณ๊ฒฝ์ ๊ตฌํํ๊ธฐ ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฌ๊ธฐ์์ ๋ฌธ์ ๋ก ๋ณด์ง ์๋๋ค.
vet
์ ๊ธฐ๋ฅ์ ๋ฃ์ง ์๋ ํ ๊ฐ์ง ์ด์ ๋ ์ปดํ์ผ ์ค์ ์ ํํด์ผ ํ๋ ๊ฒฝ์ฐ์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.
switch x := somepkg.SomeFunc().(type) {
โฆ
}
ํจํค์ง ๊ฒฝ๊ณ๋ฅผ ๋์ด ํฉ๊ณ์ ์๋ ์ ํ์ ๋ํด ์ ์ ํ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์ ์ ์์ต๋๊น? vet
๊ฐ ๊ทธ๋ ๊ฒ ๊น์ ์ดํ์ ๋ถ์์ ํ ์ ์๋ค๋ ๊ฒ์ ๋ถ๋ช
ํ์ง ์์ต๋๋ค. ๊ทธ๋์ ์๋ง๋ ๊ทธ๊ฒ์ด ํต์ฌ ์ธ์ด๋ก ๊ฐ์ผ ํ๋ ์ด์ ์ผ ๊ฒ์
๋๋ค.
@dr2chase ์ผ๋ฐ์ ์ผ๋ก ๋น์ ์ด ์ณ์ต๋๋ค๋ง, ์ด ํน์ ํ ์์ ๋ํด์๋ ๋น์ ์ด ๋ง์ต๋๊น? ์ฝ๋๋ ๋งค์ง ์ฝ๋ฉํธ๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ๋ชฐ๋ผ๋ ์์ ํ ์ดํดํ ์ ์์ต๋๋ค. ๋ง๋ฒ์ ์ฃผ์์ ์ฝ๋๊ฐ ํ๋ ์ผ์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์์์ฌ์ ์ค๋ฅ ๋ฉ์์ง๋ ๋ช ํํด์ผ ํฉ๋๋ค.
@bcmills
์ด ๊ฐ๋ ์ด ์์์ฌ ์ชฝ์ด ์๋๋ผ ์ธ์ด ์ชฝ์ธ ์ด์ ๋ ๋ฌด์์ ๋๊น?
ํ๋ง ์์ ์ฝ์ด ์ธ๋ถ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋์ผํ ์ง๋ฌธ์ ์ ์ฉํ ์ ์์ต๋๋ค....
๋์ํ์ง ์์ต๋๋ค. ๋ ผ์ ์ค์ธ ๊ธฐ๋ฅ์ด ์ปดํ์ผ๋ ์ฝ๋์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ ์ด์ ๋ํ ์๋ ์ธ์๊ฐ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๊ธฐ๋ฅ์ ๋ถ๋ช ํ ์ปดํ์ผ๋ ์ฝ๋์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
(์, ์์์ฌ๋ ๊ฐ์ ธ์จ ํจํค์ง์ ์์ค๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์์ต๋๋ค.)
๋๋ ์์์ฌ์ ๋ํ ๋์ ์ฃผ์ฅ์ด ๊ฒฐ์ ์ ์ด๋ผ๊ณ ์ฃผ์ฅํ๋ ค๋ ๊ฒ์ด ์๋๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ธ์ด ๋ณ๊ฒฝ์ ๋ถ์ ์ ์ธ ์์น์์ ์์๋ฉ๋๋ค. ๊ฐ๋จํ ์ธ์ด๋ ๋งค์ฐ ๋ฐ๋์งํ๋ฉฐ ์ด์ ๊ฐ์ ์ค์ํ ์ ๊ธฐ๋ฅ์ ํ์ฐ์ ์ผ๋ก ์ธ์ด๋ฅผ ๋ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค. ์ธ์ด ๋ณ๊ฒฝ์ ์ฐฌ์ฑํ๋ ๊ฐ๋ ฅํ ์ฃผ์ฅ์ด ํ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด ๊ด์ ์์ ๊ทธ๋ฌํ ๊ฐ๋ ฅํ ์ฃผ์ฅ์ ์์ง ๋ํ๋์ง ์์์ต๋๋ค. ๊ฒฐ๊ตญ, ์ฐ๋ฆฌ๋ ์ด ๋ฌธ์ ์ ๋ํด ์ค๋ซ๋์ ์๊ฐํ๊ณ FAQ(https://golang.org/doc/faq#variant_types)์ ๋๋ค.
@ianlancetaylor
์ด ๊ฒฝ์ฐ ๊ธฐ๋ฅ์ ๋ถ๋ช ํ ์ปดํ์ผ๋ ์ฝ๋์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
ํน์ ์ธ๋ถ ์ฌํญ์ ๋ฌ๋ ค ์๋ค๊ณ ์๊ฐํฉ๋๊น? ์์์ ์ธ๊ธํ @jimmyfrasche (https://github.com/golang/go/issues/19412#issuecomment-289319916)๊ฐ ํ์คํ ํ๋ "ํฉ์ 0๊ฐ์ ์ฒซ ๋ฒ์งธ ์ ํ์ 0๊ฐ" ๋์์ ๋๋ค.
@urandom ์ธํฐํ์ด์ค์ ๊ณต์ฉ์ฒด ์ ํ์ด ๋ช ์์ ์ ํ ์์ฑ์ ์์ด ํผํฉ๋์ง ์๋ ์ด์ ์ ๋ํ ๊ธด ์ค๋ช ์ ์์ฑํ๊ณ ์์์ง๋ง ๊ทธ๋ ๊ฒ ํ ์ ์๋ ํฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
๋ด ๋ฐ๋ ์ ์์ ๋ํ ๋น ๋ฅด๊ณ ๋๋ฌ์ด ๋ฐ๋ ์ ์. (๋ช ์์ ์ผ๋ก ์ธ๊ธ๋์ง ์์ ๊ฒ์ ์ด์ ์ ์๊ณผ ๋์ผํฉ๋๋ค.) ํ ์ ์์ด ๋ค๋ฅธ ์ ์๋ณด๋ค ๋ ๋์์ง ํ์ ํ ์ ์์ง๋ง ์ด ์ ์์ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๊ณ ๋ ๋ช ํํฉ๋๋ค.
Union์๋ ์ดํ "ํ๊ทธ ์ด๋ฆ"์ด๋ผ๊ณ ํ๋ ๋ช ์์ ์ธ "ํ๋ ์ด๋ฆ"์ด ์์ต๋๋ค.
union { //or whatever
None, invalid struct{} //None is zero value
Good, Bad int
Err error //okay because it's explicitly named
}
์์ง ์๋ฒ ๋ฉ์ด ์์ต๋๋ค. ํ๊ทธ ์ด๋ฆ์ด ์๋ ์ ํ์ ๊ฐ๋ ๊ฒ์ ํญ์ ์ค๋ฅ์ ๋๋ค.
Union ๊ฐ์๋ ๋์ ์ ํ์ด ์๋ ๋์ ํ๊ทธ๊ฐ ์์ต๋๋ค.
๋ฆฌํฐ๋ด ๊ฐ ์์ฑ: U{v}
๋ ์์ ํ ๋ชจํธํ์ง ์์ ๊ฒฝ์ฐ์๋ง ์ ํจํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด U{Tag: v}
์ฌ์ผ ํฉ๋๋ค.
๋ณํ ๊ฐ๋ฅ์ฑ ๋ฐ ํ ๋น ํธํ์ฑ์ ํ๊ทธ ์ด๋ฆ๋ ๊ณ ๋ คํฉ๋๋ค.
๋
ธ๋์กฐํฉ์ ๋ฐฐ์ ํ๋ ๊ฒ์ ๋ง์ ์ด ์๋๋๋ค. ํญ์ ํธํ๋๋ ๊ณต์ฉ์ฒด ๊ฐ์ ํ ๋นํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ ์ฅ๋ ๊ฐ์ ์ค์ ํ๋ ค๋ฉด ์ํ๋ ํ๊ทธ ์ด๋ฆ์ ๋ช
์์ ์ผ๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค. v.Good = 1
๋ ๋์ ํ๊ทธ๋ฅผ Good์ผ๋ก ์ค์ ํ๊ณ ์ ์ฅ๋ ๊ฐ์ 1๋ก ์ค์ ํฉ๋๋ค.
์ ์ฅ๋ ๊ฐ์ ์ก์ธ์คํ๋ ๊ฒ์ ์ ํ ์ด์ค์ ์ด ์๋ ํ๊ทธ ์ด์ค์ ์ ์ฌ์ฉํฉ๋๋ค.
g := v.[Tag] //may panic
g, ok := v.[Tag] //no panic but could return zero-value, false
v.Tag๋ ๋ชจํธํ๊ธฐ ๋๋ฌธ์ rhs์ ๋ํ ์ค๋ฅ์ ๋๋ค.
ํ๊ทธ ์ค์์น๋ switch v.[type]
์์ฑ๋ ์ ํ ์ค์์น์ ๋น์ทํ์ง๋ง ๋์๋ฌธ์๊ฐ ๊ณต์ฉ์ฒด์ ํ๊ทธ๋ผ๋ ์ ์ ์ ์ธํ๊ณ ๋ ๋ค๋ฆ
๋๋ค.
์ ํ ์ด์ค์ ์ ๋์ ํ๊ทธ ์ ํ๊ณผ ๊ด๋ จํ์ฌ ์ ์ง๋ฉ๋๋ค. ์ ํ ์ค์์น๋ ์ ์ฌํ๊ฒ ์๋ํฉ๋๋ค.
์ด๋ค ์กฐํฉ ์ ํ์ ๊ฐ, b๊ฐ ์ฃผ์ด์ง๋ฉด ๋์ ํ๊ทธ๊ฐ ๋์ผํ๊ณ ์ ์ฅ๋ ๊ฐ์ด ๋์ผํ๋ฉด a == b์ ๋๋ค.
์ ์ฅ๋ ๊ฐ์ด ํน์ ๊ฐ์ธ์ง ํ์ธํ๋ ค๋ฉด ํ๊ทธ ์ด์ค์ ์ด ํ์ํฉ๋๋ค.
ํ๊ทธ ์ด๋ฆ์ ๋ด๋ณด๋ด์ง ์์ ๊ฒฝ์ฐ ์ ๋์จ์ ์ ์ํ๋ ํจํค์ง์์๋ง ํ๊ทธ ์ด๋ฆ์ ์ค์ ํ๊ณ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ด๋ณด๋ธ ํ๊ทธ์ ๋ด๋ณด๋ด์ง ์์ ํ๊ทธ๊ฐ ํผํฉ๋ ๊ณต์ฉ์ฒด์ ํ๊ทธ ์ ํ์ด ๊ธฐ๋ณธ ์ผ์ด์ค ์์ด ์ ์ ํจํค์ง ์ธ๋ถ์์ ์ ๋ ์์ ํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๋ชจ๋ ํ๊ทธ๊ฐ ๋ด๋ณด๋ด์ง์ง ์์ผ๋ฉด ๋ธ๋๋ฐ์ค์ ๋๋ค.
๋ฆฌํ๋ ์ ์ ํ๊ทธ ์ด๋ฆ๋ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
e: ์ค์ฒฉ๋ ๊ณต์ฉ์ฒด์ ๋ํ ์ค๋ช . ์ฃผ์ด์ง
type U union {
A union {
A1 T1
A2 T2
}
B union {
B1 T3
B2 T4
}
}
var u U
u์ ๊ฐ์ ๋์ ํ๊ทธ A์ด๊ณ ์ ์ฅ๋ ๊ฐ์ ๋์ ํ๊ทธ A1๊ณผ์ ์ต๋ช ํฉ์งํฉ์ด๋ฉฐ ์ ์ฅ๋ ๊ฐ์ T1์ 0 ๊ฐ์ ๋๋ค.
u.B.B2 = returnsSomeT3()
ํ๋์ ๋ฉ๋ชจ๋ฆฌ ์์น์ ๋ชจ๋ ์ ์ฅ๋์ด ์์ผ๋ฏ๋ก ์ค์ฒฉ๋ ๊ณต์ฉ์ฒด ์ค ํ๋์์ ๋ค๋ฅธ ํ๋๋ก ์ด๋ํ๋๋ผ๋ u๋ฅผ 0 ๊ฐ์์ ์ ํํ๋ ๋ฐ ํ์ํ ์ ๋ถ์ ๋๋ค. ํ์ง๋ง
v := u.[A].[A2]
๋ ๊ฐ์ ๊ณต์ฉ์ฒด ๊ฐ์ ๋ํ ํ๊ทธ ์ด์ค์ ๊ณผ ์ฌ๋ฌ ์ค๋ก ๋ถํ ํ์ง ์๊ณ ๋ 2๊ฐ์ ๊ฐ์ ๊ฐ๋ ๋ฒ์ ์ ํ๊ทธ ์ด์ค์ ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ํจ๋์ ๋น ์ง ๊ธฐํ๊ฐ ๋ ๋ฒ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ค์ฒฉ ํ๊ทธ ์ค์์น๊ฐ ๋ ๊น๋ํฉ๋๋ค.
edit2: ์ ํ ์ฃผ์ฅ์ ๋ํ ์ค๋ช .
์ฃผ์ด์ง
type U union {
Exported, unexported int
}
var u U
u.(int)
์ ๊ฐ์ ํ์ ์ฃผ์ฅ์ ์ ์ ์ผ๋ก ํฉ๋ฆฌ์ ์
๋๋ค. ์ ์ ํจํค์ง ๋ด์์๋ ํญ์ ์ ์ง๋ฉ๋๋ค. ๊ทธ๋ฌ๋ u
๊ฐ ์ ์ ํจํค์ง ์ธ๋ถ์ ์์ผ๋ฉด ๋์ ํ๊ทธ๊ฐ unexported
๋ ๊ตฌํ ์ธ๋ถ ์ ๋ณด ๋์ถ์ ๋ฐฉ์งํ๊ธฐ ์ํด u.(int)
ํจ๋์ด ๋ฐ์ํฉ๋๋ค. ์ธํฐํ์ด์ค ์ ํ์ ๋ํ ์ฃผ์ฅ๊ณผ ์ ์ฌํฉ๋๋ค.
@ianlancetaylor ๋ค์์ ์ด ๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ๋์์ด ๋๋์ง์ ๋ํ ๋ช ๊ฐ์ง ์์ ๋๋ค.
์ผ๋ถ ํจํค์ง(์ go/ast
)์ ํต์ฌ์๋ ํ๋ ์ด์์ ํฐ ๊ธ์ก ์ ํ์ด ์์ต๋๋ค. ์ด๋ฌํ ์ ํ์ ์ดํดํ์ง ์๊ณ ๋ ์ด๋ฌํ ํจํค์ง๋ฅผ ํ์ํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๋ ํผ๋์ค๋ฝ๊ฒ๋ sum ์ ํ์ ๋ฉ์๋๊ฐ ์๋ ์ธํฐํ์ด์ค(์: go/ast.Node
)๋ก ํ์๋๊ณ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ๋น ์ธํฐํ์ด์ค(์: go/ast.Object.Decl
)๋ก ํ์๋ฉ๋๋ค.
protobuf oneof
๊ธฐ๋ฅ์ Go๋ก ์ปดํ์ผํ๋ฉด oneof ํ๋์ ๋ํ ํ ๋น์ด ์ ํ์ด ์์ ํ์ง ํ์ธํ๋ ๊ฒ์ด ์ ์ผํ ๋ชฉ์ ์ธ ๋ด๋ณด๋ด๊ธฐ๋์ง ์์ ์ธํฐํ์ด์ค ์ ํ์ด ์์ฑ๋ฉ๋๋ค. ์ฐจ๋ก๋ก oneof์ ๊ฐ ๋ถ๊ธฐ์ ๋ํ ์ ํ์ ์์ฑํด์ผ ํฉ๋๋ค. ์ต์ข
์ ํ์ ๋ํ ์ ํ ๋ฆฌํฐ๋ด์ ์ฝ๊ณ ์ฐ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
&sppb.Mutation{
Operation: &sppb.Mutation_Delete_{
Delete: &sppb.Mutation_Delete{
Table: m.table,
KeySet: keySetProto,
},
},
}
์ผ๋ถ(์ ๋ถ๋ ์๋์ง๋ง) ์ค ํ๋๋ ํฉ๊ณ ์ ํ์ผ๋ก ํํ๋ ์ ์์ต๋๋ค.
๋๋๋ก "์๋ง๋" ์ ํ์ด ์ ํํ ํ์ํ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ง์ Google API ๋ฆฌ์์ค ์ ๋ฐ์ดํธ ์์ ์์๋ ๋ฆฌ์์ค ํ๋์ ํ์ ์งํฉ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. Go์์ ์ด๊ฒ์ ํํํ๋ ์์ฐ์ค๋ฌ์ด ๋ฐฉ๋ฒ ์ค ํ๋๋ ๊ฐ ํ๋์ ๋ํด "์๋ง๋" ์ ํ์ด ์๋ ๋ฆฌ์์ค ๊ตฌ์กฐ์ฒด์ ๋ณํ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด Google Cloud Storage ObjectAttrs ๋ฆฌ์์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
type ObjectAttrs struct {
ContentType string
...
}
๋ถ๋ถ ์ ๋ฐ์ดํธ๋ฅผ ์ง์ํ๊ธฐ ์ํด ํจํค์ง๋ ๋ค์์ ์ ์ํฉ๋๋ค.
type ObjectAttrsToUpdate struct {
ContentType optional.String
...
}
์ฌ๊ธฐ์ optional.String
๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค( godoc ).
// String is either a string or nil.
type String interface{}
์ด๊ฒ์ ์ค๋ช
ํ๊ธฐ ์ด๋ ต๊ณ ์ ํ์ด ์์ ํ์ง ์์ง๋ง ์ค์ ๋ก๋ ํธ๋ฆฌํฉ๋๋ค. ์๋ํ๋ฉด ObjectAttrsToUpdate
๋ฆฌํฐ๋ด์ ์กด์ฌ๋ฅผ ์ธ์ฝ๋ฉํ๋ ๋์ ObjectAttrs
๋ฆฌํฐ๋ด๊ณผ ๋๊ฐ์ด ๋ณด์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ์ธ ์ ์์์ผ๋ฉด ์ข๊ฒ ๋ค.
type ObjectAttrsToUpdate struct {
ContentType string | nil
...
}
๋ง์ ํจ์๋ xor ์๋ฏธ ์ฒด๊ณ์ ํจ๊ป (T, error)
๋ฅผ ๋ฐํํฉ๋๋ค(T๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ค๋ฅ๊ฐ nil์ธ ๊ฒฝ์ฐ). ๋ฐํ ์ ํ์ T | error
๋ก ์์ฑํ๋ฉด ์๋ฏธ๋ฅผ ๋ช
ํํ ํ๊ณ ์์ ์ฑ์ ๋์ด๋ฉฐ ๋ ๋ง์ ๊ตฌ์ฑ ๊ธฐํ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. (ํธํ์ฑ ์ด์ ๋ก) ํจ์์ ๋ฐํ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ฑฐ๋ ๋ณ๊ฒฝํ๊ณ ์ถ์ง ์๋๋ผ๋ sum ์ ํ์ ์ฑ๋์ ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ด ํด๋น ๊ฐ์ ์ ๋ฌํ๋ ๋ฐ ์ฌ์ ํ ์ ์ฉํฉ๋๋ค.
go vet
์ฃผ์์ ์ด๋ฌํ ๊ฒฝ์ฐ์ ๋ง์ ๋์์ด ๋ ๊ฒ์ด์ง๋ง ์ต๋ช
์ ํ์ด ์๋ฏธ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ํฉ๊ณ ์ ํ์ด ์๋ค๋ฉด ๋ง์ด ๋ณผ ์ ์์ ๊ฒ์
๋๋ค.
chan *Response | error
์ด ์ ํ์ ์ฌ๋ฌ ๋ฒ ์ธ ์ ์์ ๋งํผ ์งง์ต๋๋ค.
@ianlancetaylor ์ด๊ฒ์ ์๋ง๋ ์ข์ ์์์ ์๋์ง๋ง Go1์์ ์ด๋ฏธ ํ ์ ์๋ ๊ณต์ฉ์ฒด๋ก ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ด ์์ต๋๋ค. ์๋ํ๋ฉด ์ ๋ ์ด๋ฌํ ์ฃผ์ฅ์ ์ธ์ ํ๊ณ ์์ฝํ๋ ๊ฒ์ด ๊ณต์ ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
(์๋ ๊ตฌ๋ฌธ/์๋ฏธ์ ๋ํ ํ๊ทธ์ ํจ๊ป ๋ด ์ต์ ์ ์์ ์ฌ์ฉํฉ๋๋ค. ๋ํ ๋ฐฉ์ถ๋ ์ฝ๋๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ ๋์์ ํจ์ฌ ์ด์ ์ ๊ฒ์ํ C ์ฝ๋์ ๊ฐ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.)
ํฉ๊ณ ์ ํ์ iota, ํฌ์ธํฐ ๋ฐ ์ธํฐํ์ด์ค์ ๊ฒน์นฉ๋๋ค.
์ด ๋ ๊ฐ์ง ์ ํ์ ๋๋ต ๋์ผํฉ๋๋ค.
type Stoplight union {
Green, Yellow, Red struct {}
}
func (s Stoplight) String() string {
switch s.[type] {
case Green: return "green" //etc
}
}
๊ทธ๋ฆฌ๊ณ
type Stoplight int
const (
Green Stoplight = iota
Yellow
Red
)
func (s Stoplight) String() string {
switch s {
case Green: return "green" //etc
}
}
์ปดํ์ผ๋ฌ๋ ๋ ๋ค์ ๋ํด ์ ํํ ๋์ผํ ์ฝ๋๋ฅผ ๋ด๋ณด๋ ๋๋ค.
Union ๋ฒ์ ์์๋ int๊ฐ ์จ๊ฒจ์ง ๊ตฌํ ์ธ๋ถ ์ ๋ณด๋ก ๋ฐ๋๋๋ค. iota ๋ฒ์ ์ ์ฌ์ฉํ๋ฉด ๋ ธ๋์/๋นจ๊ฐ์์ด ๋ฌด์์ธ์ง ๋ฌป๊ฑฐ๋ Stoplight ๊ฐ์ -42๋ก ์ค์ ํ ์ ์์ง๋ง ํตํฉ ๋ฒ์ ์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ด๋ ๋ชจ๋ ์ต์ ํ ์ค์ ๊ณ ๋ คํ ์ ์๋ ์ปดํ์ผ๋ฌ ์ค๋ฅ ๋ฐ ๋ถ๋ณ๋์ ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ธ๋์ ํ์๋ฑ์ ์ค๋ช ํ์ง ๋ชปํ๋ (๊ฐ) ์ค์์น๋ฅผ ์์ฑํ ์ ์์ง๋ง ํ๊ทธ ์ค์์น๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฅผ ๋ช ์์ ์ผ๋ก ๋ํ๋ด๊ธฐ ์ํด ๊ธฐ๋ณธ ์ผ์ด์ค๊ฐ ํ์ํฉ๋๋ค.
๋ฌผ๋ก , ๊ณต์ฉ์ฒด ์ ํ์ผ๋ก๋ ํ ์ ์๋ ์ผ์ iota๋ก ํ ์ ์์ต๋๋ค.
์ด ๋ ๊ฐ์ง ์ ํ์ ๊ฑฐ์ ๋์ผํฉ๋๋ค.
type MaybeInt64 union {
None struct{}
Int64 int64
}
๊ทธ๋ฆฌ๊ณ
type MaybeInt64 *int64
ํฌ์ธํฐ ๋ฒ์ ์ ๋ ์ปดํฉํธํฉ๋๋ค. ํตํฉ ๋ฒ์ ์ ๋์ ํ๊ทธ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ถ๊ฐ ๋นํธ(์ด๋ ๋จ์ด ํฌ๊ธฐ์ผ ์ ์์)๊ฐ ํ์ํ๋ฏ๋ก ๊ฐ์ ํฌ๊ธฐ๋ https://golang.org/pkg/database/sql/ ๊ณผ ๊ฐ์ ์
Union ๋ฒ์ ์ ์๋๋ฅผ ๋ณด๋ค ๋ช ํํ๊ฒ ๋ฌธ์ํํฉ๋๋ค.
๋ฌผ๋ก ์ ๋์จ ์ ํ์ผ๋ก๋ ํ ์ ์๋ ํฌ์ธํฐ๋ก ํ ์ ์๋ ์ผ์ด ์์ต๋๋ค.
์ด ๋ ๊ฐ์ง ์ ํ์ ๊ฑฐ์ ๋์ผํฉ๋๋ค.
type AB union {
A A
B B
}
๊ทธ๋ฆฌ๊ณ
type AB interface {
secret()
}
func (A) secret() {}
func (B) secret() {}
ํตํฉ ๋ฒ์ ์ ์๋ฒ ๋ฉ์ผ๋ก ์ฐํํ ์ ์์ต๋๋ค. A์ B๋ ๊ณตํต์ ๋ฉ์๋๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์ค์ ๋ก ๊ธฐ๋ณธ ์ ํ์ผ ์๋ ์๊ณ @urandom ๊ฒ์๋ json.Token ์์ ์ ๊ฐ์ด ์์ ํ ๋ถ๋ฆฌ๋ ๋ฉ์๋ ์ธํธ๋ฅผ ๊ฐ์ง ์๋ ์์ต๋๋ค.
AB ๊ณต์ฉ์ฒด ๋ AB ์ธํฐํ์ด์ค์ ๋ฌด์์ ๋ฃ์ ์ ์๋์ง ๋ณด๋ ๊ฒ์ ์ ๋ง ์ฝ์ต๋๋ค. ์ ์๋ ๋ฌธ์์ ๋๋ค(๋ฌด์์ด ๋ฌด์์ธ์ง ์์๋ด๊ธฐ ์ํด go/ast ์์ค๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฝ์ด์ผ ํ์ต๋๋ค).
AB ๊ณต์ฉ์ฒด๋ ์ ๋ nil์ด ๋ ์ ์์ผ๋ฉฐ ๊ตฌ์ฑ ์์์ ๊ต์ฐจ์ ์ธ๋ถ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค(์ด๋ ๊ตฌ์กฐ์ฒด์ ์ธํฐํ์ด์ค๋ฅผ ํฌํจํ์ฌ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ง๋ง ๊ตฌ์ฑ์ ๋ ์ฌ์ธํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค).
๋ฌผ๋ก , ๊ณต์ฉ์ฒด ์ ํ์ผ๋ก๋ ํ ์ ์๋ ์ธํฐํ์ด์ค๋ก ํ ์ ์๋ ์ผ์ด ์์ต๋๋ค.
์ด์ฉ๋ฉด ๊ทธ ๊ฒน์นจ์ด ๋๋ฌด ๊ฒน์น ์๋ ์์ต๋๋ค.
๊ฐ๊ฐ์ ๊ฒฝ์ฐ ์ ๋์จ ๋ฒ์ ์ ์ฃผ์ ์ด์ ์ ์ค์ ๋ก ๋ ์๊ฒฉํ ์ปดํ์ผ ์๊ฐ ๊ฒ์ฌ์ ๋๋ค. ํ ์ ์๋ ๊ฒ๋ณด๋ค ํ ์ ์๋ ๊ฒ์ด ๋ ์ค์ํฉ๋๋ค. ๋ ๊ฐ๋ ฅํ ๋ถ๋ณ์ผ๋ก ๋ณํํ๋ ์ปดํ์ผ๋ฌ์ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ์ต์ ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ฒ์ญํ๋ ํ๋ก๊ทธ๋๋จธ์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ๊ฑฑ์ ํ๋๋ก ํ ์ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ ๋น์ ์ด ํ๋ ธ๋์ง ์๋ ค์ค ๊ฒ์ ๋๋ค. ์ธํฐํ์ด์ค ๋ฒ์ ์๋ ์ต์ํ ์ค์ํ ๋ฌธ์ ์ด์ ์ด ์์ต๋๋ค.
iota ๋ฐ ํฌ์ธํฐ ์์ ์ ํฌ๋ฐํ ๋ฒ์ ์ "๋ด๋ณด๋ด์ง ์์ ๋ฉ์๋์์ ์ธํฐํ์ด์ค" ์ ๋ต์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๋ฌธ์ ์ ๋ํด map[string]interface{}
๋ฐ func ์ ํ ๋ฐ ๋ฉ์๋ ๊ฐ์ด ์๋ (๋น์ด ์์ง ์์) ์ธํฐํ์ด์ค๋ก ๊ตฌ์กฐ์ฒด๋ฅผ ์๋ฎฌ๋ ์ด์
ํ ์ ์์ต๋๋ค. ๋ ์ด๋ ต๊ณ ๋ ์์ ํ๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ ํ์ง ์์ ๊ฒ์
๋๋ค.
์ด๋ฌํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ธ์ด์ ๋ฌด์ธ๊ฐ๋ฅผ ์ถ๊ฐํ์ง๋ง ํด๋น ๊ธฐ๋ฅ์ด ์์ผ๋ฉด ํด๊ฒฐ๋ ์ ์์ต๋๋ค(๊ณ ํต์ค๋ฝ๊ฒ ๊ทธ๋ฆฌ๊ณ ํญ์ ์ค์).
๊ทธ๋์ ์ ๋ ๋ฐ๊ฐ Go์์ ๊ทผ์ฌํ๋ ์ ์๋ ํ๋ก๊ทธ๋จ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ๊ฒ์ด ์๋๋ผ, ๊ฒฐํฉ ์์ด Go์์ ํจ์ฌ ๋ ์ฝ๊ณ ๊น๋ํ๊ฒ ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋์ ๋ณด์ฌ์ค์ผ ํ ๊ฒ์ ๊ทธ๊ฒ๋ฟ์ด๋ค.
@jimmyfrasche
ํตํฉ ์ ํ์ ์ด๋ฆ์ด ์ง์ ๋ ํ๋๊ฐ ์์ด์ผ ํ ์ด์ ๊ฐ ์์ต๋๋ค. ์ด๋ฆ์ ๋์ผํ ์ ํ์ ์๋ก ๋ค๋ฅธ ํ๋๋ฅผ ๊ตฌ๋ณํ๋ ค๋ ๊ฒฝ์ฐ์๋ง ์ ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ณต์ฉ์ฒด์๋ ๋์ผํ ์ ํ์ ์ฌ๋ฌ ํ๋๊ฐ ์์ด์๋ ์ ๋ฉ๋๋ค. ์ด๋ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฆ์ ๊ฐ๋ ๊ฒ์ ์ค๋ณต๋๋ฉฐ ํผ๋๊ณผ ๋ ๋ง์ ํ์ดํ์ผ๋ก ์ด์ด์ง๋๋ค.
๋ณธ์ง์ ์ผ๋ก ์ ๋์จ ์ ํ์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
union {
struct{}
int
err
}
์ ํ ์์ฒด๋ ๊ตฌ์กฐ์ฒด์ ํฌํจ๋ ์ ํ์ด ์๋ณ์๋ก ์ฌ์ฉ๋๋ ๋ฐฉ์๊ณผ ๋งค์ฐ ์ ์ฌํ๊ฒ ๊ณต์ฉ์ฒด์ ํ ๋นํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ณ ์ ์๋ณ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ช
์์ ํ ๋น์ด ์๋ํ๋ ค๋ฉด ๊ตฌ๋ฌธ์์ ์ด๋ฌํ ์์ ํ์ฉํ๋ฏ๋ก ๋ช
๋ช
๋์ง ์์ ํ์์ ๋ฉค๋ฒ๋ก ์ง์ ํ์ฌ ๊ณต์ฉ์ฒด ํ์์ ๋ง๋ค ์ ์์ต๋๋ค. ์: v.struct{} = struct{}
๋ฐ๋ผ์ ์์ ๊ตฌ์กฐ์ฒด, ๊ณต์ฉ์ฒด ๋ฐ ํจ์์ ๊ฐ์ ์ ํ์ ๊ณต์ฉ์ฒด์ ์ผ๋ถ๊ฐ ๋๊ณ ํ ๋น ๊ฐ๋ฅํ๊ฒ ๋๊ธฐ ์ํด ๋ฏธ๋ฆฌ ์ด๋ฆ์ ์ง์ ํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ผ๋์ ๋๊ณ ๋ด๋ถ ๊ณต์ฉ์ฒด๋ ๋ค๋ฅธ ๋ฉค๋ฒ ์ ํ์ผ ๋ฟ์ด๋ฏ๋ก ์ค์ฒฉ ๊ณต์ฉ์ฒด๋ ํน๋ณํ ๊ฒ์ด ์๋๋๋ค.
์ด์ ์ด๋ค ๊ตฌ๋ฌธ์ด ๋ ๋์์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
[union|sum|pick|oneof] {
type1
package1.type2
....
}
์์ ๋ด์ฉ์ ์ข ๋ ์ ์ฌํด ๋ณด์ด์ง๋ง ๊ทธ๋ฌํ ์ ํ์ ๋ํด์๋ ์ฝ๊ฐ ์ฅํฉํฉ๋๋ค.
๋ฐ๋ฉด์ type1 | package1.type2
๋ ์ผ๋ฐ์ ์ธ go ์ ํ์ฒ๋ผ ๋ณด์ด์ง ์์ ์ ์์ง๋ง '|'๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ด ์์ต๋๋ค. OR๋ก ์ฃผ๋ก ์ธ์๋๋ ๊ธฐํธ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจํธํ์ง ์์ผ๋ฉด์ ์ฅํฉํจ์ ์ค์
๋๋ค.
@urandom "ํ๊ทธ ์ด๋ฆ"์ด ์์ง๋ง ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ ๊ฒฝ์ฐ ์ถ๊ฐ ๊ฒ์ฌ๋ฅผ ํตํด ํฉ๊ณ๊ฐ interface{}
๋ก ์ถ์๋ฉ๋๋ค. ํ ๊ฐ์ง๋ฅผ ๋ฃ์ ์ ์์ง๋ง ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊บผ๋ผ ์ ์๊ธฐ ๋๋ฌธ์ ํฉ๊ณ ์ ํ์ด ์๋๋๋ค. ํ๊ทธ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ํฉ๊ณ ์ ํ์ด ๋ ์ ์๊ณ ๋ชจํธํจ ์์ด ์ธํฐํ์ด์ค๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
ํ์ง๋ง ํ๊ทธ ์ด๋ฆ์ ์ธํฐํ์ด์ค ๋ฌธ์ ๊ทธ ์ด์์{}๋ณต๊ตฌํฉ๋๋ค. ๊ทธ๋ค์ ์ ํ์ ํจ์ฌ ๋ ๋ง๋ฒ์ฒ๋ผ ๋ง๋ค๊ณ ๊ตฌ๋ณํ๊ธฐ ์ํด ๋ง์ ์ ํ์ ๋ฐ๋ช ํ์ง ์๊ณ ๋ ๋ชจ๋ ๊ฒ์ ์๊ด์ค๋ฝ๊ฒ ๋ช ์ํ๊ฒ ๋ง๋ญ๋๋ค. ์ง์ ํ ๋๋ก ๋ช ์์ ํ ๋น ๋ฐ ์ ํ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ๋์ ์ ํ์ ๋ ์ด์์ ํ๊ทธ๋ฅผ ์ง์ ํ ์ ์๋ค๋ ๊ฒ์ด ๊ธฐ๋ฅ์ ๋๋ค. ์ฐ์์ผ๋ก ์ผ๋ง๋ ๋ง์ ์ฑ๊ณต ๋๋ ์คํจ๊ฐ ๋ฐ์ํ๋์ง ์ธก์ ํ๋ ์ ํ์ ๊ณ ๋ คํ์ญ์์ค(1๊ฐ์ ์ฑ๊ณต์ N๊ฐ์ ์คํจ๋ฅผ ์ทจ์ํ๊ณ ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง).
type Counter union {
Successes, Failures uint
}
ํ์ํ ํ๊ทธ ์ด๋ฆ ์์ด
type (
Success uint
Failures uint
Counter Successes | Failures
)
๋์
๊ณผ ๊ฐ์ ๊ฒ์ด๋ค c = Successes(1)
๋์ c.Successes = 1
. ๋น์ ์ ๋ง์ ๊ฒ์ ์ป์ง ๋ชปํ๋ค.
๋ ๋ค๋ฅธ ์๋ก๋ ๋ก์ปฌ ๋๋ ์๊ฒฉ ์ค๋ฅ๋ฅผ ๋ํ๋ด๋ ์ ํ์ด ์์ต๋๋ค. ํ๊ทธ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ๋ชจ๋ธ๋งํ ์ ์์ต๋๋ค.
type Failure union {
Local, Remote error
}
์ค๋ฅ์ ์ญ๋ฆฌ๋ ์ค์ ์ค๋ฅ๊ฐ ๋ฌด์์ด๋ ๊ด๊ณ์์ด ํ๊ทธ ์ด๋ฆ์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค. ํ๊ทธ ์ด๋ฆ์ด ์์ผ๋ฉด ํฉ๊ณ์์ ์ง์ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋๋ผ๋ type Local { error }
ํ๊ณ ์๊ฒฉ์์๋ ๋์ผํด์ผ ํฉ๋๋ค.
ํ๊ทธ ์ด๋ฆ์ ์ ๋์จ์์ ๋ก์ปฌ๋ก ๋ณ์นญ์ด๋ ๋ช ๋ช ๋ ์ ํ์ด ์๋ ํน์ํ ์ ํ์ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ๋์ผํ ์ ํ์ ๊ฐ์ง ์ฌ๋ฌ "ํ๊ทธ"๋ฅผ ๊ฐ๋ ๊ฒ์ ๋ด ์ ์์ ๊ณ ์ ํ ๊ฒ์ด ์๋๋๋ค. ๋ชจ๋ ๊ธฐ๋ฅ ์ธ์ด(๋ด๊ฐ ์๊ณ ์๋)๊ฐ ํ๋ ์ผ์ ๋๋ค.
๋ด๋ณด๋ธ ์ ํ์ ๋ํด ๋ด๋ณด๋ด์ง ์์ ํ๊ทธ๋ฅผ ๋ง๋ค๊ฑฐ๋ ๊ทธ ๋ฐ๋๋ก ๋ง๋๋ ๊ธฐ๋ฅ๋ ํฅ๋ฏธ๋ก์ด ๋ฐ์ ์ ๋๋ค.
๋ํ ๋ณ๋์ ํ๊ทธ ๋ฐ ์ ํ ์ด์ค์ ์ ์ฌ์ฉํ๋ฉด ํ ์ค ๋ํผ๋ฅผ ์ฌ์ฉํ์ฌ ๊ณต์ ๋ฉ์๋๋ฅผ ๊ณต์ฉ์ฒด๋ก ์น๊ฒฉํ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ํฅ๋ฏธ๋ก์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ๊ทธ๊ฒ์ด ์ผ์ผํค๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ชจ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ ์ด์ธ๋ฆฌ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์์งํ ์ธ ๋๋ ํ์ ์ด ์์์ง๋ง, Go์ ํฉ์ ํตํฉํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์ด๊ฒ์ด ์ ์ ๋ ํ์คํด์ง๊ณ ์์ต๋๋ค.
์ด๋ฅผ ์ข ๋ ํ์ฅํ๊ธฐ ์ํด ์ ์๊ฒ ๋๊ธฐ๋ฅผ ๋ถ์ฌํ๋ ์๋ @rogpeppe io.Reader | io.ReadCloser
์
๋๋ค. ํ๊ทธ ์์ด ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ ๊ฒ์ io.Reader
์ ๊ฐ์ ์ ํ์
๋๋ค.
ReadCloser๋ฅผ ๋ฃ๊ณ Reader๋ก ๊บผ๋ผ ์ ์์ต๋๋ค. ๋น์ ์ A๋ฅผ ์๋๋ค | B๋ ํฉ๊ณ ์ ํ์ A ๋๋ B ์์ฑ์ ์๋ฏธํฉ๋๋ค.
io.ReadCloser
๋ฅผ io.Reader
io.ReadCloser
๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ํด ๊ตฌ์ฒด์ ์ด์ด์ผ ํ๋ ๊ฒฝ์ฐ @bcmills๊ฐ ์ง์ ํ ๋๋ก type Reader struct { io.Reader }
๋ฑ์ ๋ํผ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์ ํ์ Reader | ReadCloser
ํด์ผ ํฉ๋๋ค.
๊ฒฐํฉ๋์ง ์์ ๋ฉ์๋ ์ธํธ๊ฐ ์๋ ์ธํฐํ์ด์ค๋ก ํฉ๊ณ๋ฅผ ์ ํํ๋๋ผ๋ ํ ์ ํ์ด ์ด๋ฌํ ์ธํฐํ์ด์ค ์ค ๋ ์ด์์ ๊ตฌํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํฉ๊ณ ์ ํ์ ๋ช ์์ฑ์ ์์ต๋๋ค. "A ๋๋ B"๊ฐ ์๋๋๋ค. "A ๋๋ B ๋๋ ๋๋ก๋ ์ํ๋ ๋๋ก"์ ๋๋ค.
์ค์๊ฐ์์ผ๋ก ์ด๋ฌํ ์ ํ์ด ๋ค๋ฅธ ํจํค์ง์์ ๊ฐ์ ธ์จ ๊ฒ์ด๋ผ๋ฉด A๊ฐ B์ ๋์ผํ๊ฒ ์ทจ๊ธ๋์ง ์๋๋ก ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ๋ฐ ๋งค์ฐ ์ฃผ์๋ฅผ ๊ธฐ์ธ์๋ค ํ๋๋ผ๋ ์ ๋ฐ์ดํธ ํ ๊ฐ์๊ธฐ ๋ค๋ฅด๊ฒ ์๋ํ ์ ์์ต๋๋ค.
์๋ ๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์ง ์๋ ๊ฒ์ ํ๊ตฌํ์ต๋๋ค. ์๋ฌด๋ ๊ทธ๊ฒ์ ๋ง์กฑํ์ง ์์์ต๋๋ค! ํ์ง๋ง a = b
์ ๊ฐ์ด a, b์ ์ข
๋ฅ์ ๋ฐ๋ผ ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง๋ ๋ฌธ์ ๋ ํด๊ฒฐํ์ง ๋ชปํ์ต๋๋ค. ์ ๋ ๋ถํธํฉ๋๋ค. ๋ํ ์ ํ ํ ๋น ๊ธฐ๋ฅ์ด ์๋ํ ๋ ์ ํ์์ ์ด๋ค ์ ํ์ด ์ ํ๋๋์ง์ ๋ํ ๋ง์ ๊ท์น์ด ์์ด์ผ ํ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ง์ ๋ง๋ฒ์
๋๋ค.
ํ๊ทธ๋ฅผ ์ถ๊ฐํ๋ฉด ๋ชจ๋ ์ฌ๋ผ์ง๋๋ค.
union { R io.Reader | RC io.ReadCloser }
ํ๋ฉด ์ด ReadCloser๊ฐ ์๋ฏธ ์๋ ๊ฒฝ์ฐ ๋
์๋ก ๊ฐ์ฃผ๋๊ธฐ๋ฅผ ์ํ๋ค๊ณ ๋ช
์์ ์ผ๋ก ๋งํ ์ ์์ต๋๋ค. ๋ํผ ์ ํ์ด ํ์ํ์ง ์์ต๋๋ค. ์ ์์ ๋ดํฌ๋์ด ์์ต๋๋ค. ํ๊ทธ ์ ํ์ ๊ด๊ณ์์ด ์ด๋ ํ๋์ ํ๊ทธ์ด๊ฑฐ๋ ๋ค๋ฅธ ํ๋์
๋๋ค.
๋จ์ ์ ๋ค๋ฅธ ๊ณณ์์ io.Reader๋ฅผ ์ป๋ ๊ฒฝ์ฐ chan ์์ ๋๋ func ํธ์ถ์ด io.ReadCloser์ผ ์ ์์ผ๋ฉฐ ์ ์ ํ ํ๊ทธ์ ํ ๋นํด์ผ ํ๋ ๊ฒฝ์ฐ io์ assert๋ฅผ ์ ๋ ฅํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ReadCloser ๋ฐ ํ ์คํธ. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ํ๋ก๊ทธ๋จ์ ์๋๋ฅผ ํจ์ฌ ๋ ๋ช ํํ๊ฒ ๋ง๋ญ๋๋ค. ์ ํํ ๋น์ ์ด ์๋ฏธํ๋ ๋ฐ๋ ์ฝ๋์ ์์ต๋๋ค.
๋ํ ํ๊ทธ ์ด์ค์ ์ ์ ํ ์ด์ค์ ๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ ๋ง๋ก ์ ๊ฒฝ ์ฐ์ง ์๊ณ io.Reader๋ฅผ ์ํ๋ฉด ํ๊ทธ์ ๊ด๊ณ์์ด ์ ํ ์ด์ค์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ฅ๋๊ฐ ์์ ๋ฅผ ์กฐํฉ/ํฉ๊ณ/๋ฑ ์์ด Go๋ก ๋ณํํ ์ต์ ์ ๋ ธ๋ ฅ์ ๋๋ค. ์๋ง๋ ๊ฐ์ฅ ์ข์ ์๋ ์๋์ง๋ง ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ํ์ธํ๋ ๋ฐ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
์ ์์ ๊ฐ๊ฒฐํ ๊ธ๋จธ๋ฆฌ ๊ธฐํธ๋ณด๋ค ์ดํดํ๊ธฐ ๋ ์ฌ์ธ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ณด๋ค ์กฐ์์ ์ธ ๋ฐฉ์์ผ๋ก ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์์ญ์๋ ์ฝ๊ฐ์ ์์ฉ๊ตฌ๊ฐ ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๋ฐ๋ณต์ ๋ํ ๋ฉ๋ชจ์ ํจ๊ป ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฒซ ๋ฒ์งธ ์ธ์คํด์ค๋ง ์์ฑํ์ต๋๋ค.
๋ ธ์กฐ ์ ์๊ณผ ํจ๊ป ์ด๋:
type fail union { //zero value: (Local, nil)
Local, Remote error
}
func (f fail) Error() string {
//Could panic if local/remote nil, but assuming
//it will be constructed purposefully
return f.(error).Error()
}
type U union { //zero value: (A, "")
A, B, C string
D, E int
F fail
}
//in a different package
func create() pkg.U {
return pkg.U{D: 7}
}
func process(u pkg.U) {
switch u := u.[type] {
case A:
handleA(u) //undefined here, just doing something with unboxed value
case B:
handleB(u)
case C:
handleC(u)
case D:
handleD(u)
case E:
handleE(u)
case F:
switch u := u.[type] {
case Local:
log.Fatal(u)
case Remote:
log.Printf("remote error %s", u)
retry()
}
}
}
ํ์ฌ Go๋ก ์์ญ:
(์์ญ๊ณผ ์์ ์ฐจ์ด์ ์ ๋ํ ๋ฉ๋ชจ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.)
const ( //simulates tags, namespaced so other packages can see them without overlap
Fail_Local = iota
Fail_Remote
)
//since there are only two tags with a single type this can
//be represented precisely and safely
//the error method on the full version of fail can be
//put more succinctly with type embedding in this case
type fail struct { //zero value (Fail_Local, nil) :)
remote bool
error
}
// e, ok := f.[Local]
func (f *fail) TagAssertLocal2() (error, bool) { //same for TagAssertRemote2
if !f.remote {
return nil, false
}
return f.error, true
}
// e := f.[Local]
func (f *fail) TagAssertLocal() error { //same for TagAssertRemote
if !f.remote {
panic("invalid tag assert")
}
return f.error
}
// f.Local = err
func (f *fail) SetLocal(err error) { //same for SetRemote
f.remote = false
f.error = err
}
// simulate tag switch
func (f *fail) TagSwitch() int {
if f.remote {
return Fail_Remote
}
return Fail_Local
}
// f.(someType) needs to be written as f.TypeAssert().(someType)
func (f *fail) TypeAssert() interface{} {
return f.error
}
const (
U_A = iota
U_B
// ...
U_F
)
type U struct { //zero value (U_A, "", 0, fail{}) :(
kind int //more than two types, need an int
s string //these would all occupy the same space
i int
f fail
}
//s, ok := u.[A]
func (u *U) TagAssertA2() (string, bool) { //similar for B, etc.
if u.kind == U_A {
return u.s, true
}
return "", false
}
//s := u.[A]
func (u *U) TagAssertA() string { //similar for B, etc.
if u.kind != U_A {
panic("invalid tag assert")
}
return u.s
}
// u.A = s
func (u *U) SetA(s string) { //similar for B, etc.
//if there were any pointers or reference types
//in the union, they'd have to be nil'd out here,
//since the space isn't shared
u.kind = U_A
u.s = s
}
// special case of u.F.Local = err
func (u *U) SetF_Local(err error) { //same for SetF_Remote
u.kind = U_F
u.f.SetLocal(err)
}
func (u *U) TagSwitch() int {
return u.kind
}
func (u *U) TypeAssert() interface{} {
switch u.kind {
case U_A, U_B, U_C:
return u.s
case U_D, U_E:
return u.i
}
return u.f
}
//in a different package
func create() pkg.U {
var u pkg.U
u.SetD(7)
return u
}
func process(u pkg.U) {
switch u.TagSwitch() {
case U_A:
handleA(u.TagAssertA())
case U_B:
handleB(u.TagAssertB())
case U_C:
handleC(u.TagAssertC())
case U_D:
handleD(u.TagAssertD())
case U_E:
handleE(u.TagAssertE())
case U_F:
switch u := u.TagAssertF(); u.TagSwitch() {
case Fail_Local:
log.Fatal(u.TagAssertLocal())
case Fail_Remote:
log.Printf("remote error %s", u.TagAssertRemote())
}
}
}
@jimmyfrasche
Union์๋ ๋์ผํ ์ ํ์ ๊ฐ์ง ์ ์๋ ํ๊ทธ๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ๋ค์ ๊ตฌ๋ฌธ์ด ๋ ์ ํฉํ์ง ์์ต๋๋ค.
func process(u pkg.U) {
switch v := u {
case A:
handleA(v) //undefined here, just doing something with unboxed value
case B:
handleB(v)
case C:
handleC(v)
case D:
handleD(v)
case E:
handleE(v)
case F:
switch w := v {
case Local:
log.Fatal(w)
case Remote:
log.Printf("remote error %s", w)
retry()
}
}
}
๋ด๊ฐ ๋ณด๊ธฐ์ ์ค์์น์ ํจ๊ป ์ฌ์ฉํ ๋ ๊ณต์ฉ์ฒด๋ int ๋๋ stringํ๊ณผ ๊ฐ์ ์ ํ๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ์ฃผ์ ์ฐจ์ด์ ์ ์ด์ ์ ํ๊ณผ ๋ฌ๋ฆฌ ํ ๋นํ ์ ์๋ '๊ฐ'์ด ์ ํํ๊ณ ์ค์์น ์์ฒด๊ฐ ์ฒ ์ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ์๋ ๊ฐ๋ฐ์์ ์ ์ ์ ์์ ์ ์ค์ฌ์ฃผ๋ ํน๋ณํ ๊ตฌ๋ฌธ์ด ํ์ํ์ง ์์ต๋๋ค.
๋ํ ์ด ์ ์์ ๋ฐ๋ผ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์ ํจํ ๊น์?
type Foo union {
// Completely different types, no ambiguity
A string
B int
}
func Bar(f Foo) {
switch v := f {
....
}
}
....
func main() {
// No need for Bar(Foo{A: "hello world"})
Bar("hello world")
Bar(1)
}
@urandom ๊ฐ๋ฅํ ๋๋ง๋ค ๊ธฐ์กด Go ๊ตฌ๋ฌธ์ ๋ํ ์ ์ถ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฏธ๋ฅผ ๋ฐ์ํ๋ ๊ตฌ๋ฌธ์ ์ ํํ์ต๋๋ค.
์ธํฐํ์ด์ค ์ ํ์ผ๋ก ํ ์ ์๋ ์ผ
var i someInterface = someValue //where someValue implements someInterface.
var j someInterface = i //this assignment is different from the last one.
๊ณ์ฝ์ด ์ถฉ์กฑ๋๋ ํ someValue
์ ์ ํ์ด ๋ฌด์์ด๋ ์๊ด์์ด ๊ด์ฐฎ๊ณ ๋ชจํธํ์ง ์์ต๋๋ค.
๊ณต์ฉ์ฒด์ ํ๊ทธโ ๋ฅผ ๋์ ํ ๋ ๋๋๋ก ๋ชจํธํ ์ ์์ต๋๋ค. ๋ง๋ฒ ํ ๋น์ ํน์ ๊ฒฝ์ฐ์๋ง ์ ํจํฉ๋๋ค. ํน๋ณํ ์ผ์ด์ค๋ ๋๋๋ก ๋ช ์์ ์ด์ด์ผ๋ง ํฉ๋๋ค.
๋๋ ๋๋๋ก ํ ๋จ๊ณ๋ฅผ ๊ฑด๋๋ธ ์ ์๋ค๋ ์ ์ ๋ณด์ง ๋ชปํฉ๋๋ค. ํนํ ์ฝ๋ ๋ณ๊ฒฝ์ด ๊ทธ ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ์ฝ๊ฒ ๋ฌดํจํํ ์ ์๊ณ ๊ทธ๋ฐ ๋ค์ ๋์๊ฐ์ ์ด์จ๋ ๋ชจ๋ ์ฝ๋๋ฅผ ์
๋ฐ์ดํธํด์ผ ํ ๋ ํนํ ๊ทธ๋ ์ต๋๋ค. C int
๊ฐ Foo
์ถ๊ฐ๋ ๊ฒฝ์ฐ Foo/Bar ์์ ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด Bar(1)
๋ฅผ ๋ณ๊ฒฝํด์ผ ํ์ง๋ง Bar("hello world")
๋ ๋ณ๊ฒฝํ์ง ์์์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ด์ง ์์ ์ํฉ์์ ๋ช ๋ฒ์ ํค ์
๋ ฅ์ ์ ์ฅํ๊ธฐ ์ํด ๋ชจ๋ ๊ฒ์ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ๋๋ก๋ ์ด๋ ๊ฒ ๋ณด์ด๊ณ ๋๋ก๋ ๊ทธ๋ ๊ฒ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋
์ ์ดํดํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
โ ๋๋ ๊ทธ๋ค์๊ฒ ๋ ๋์ ์ด๋ฆ์ด ์์์ผ๋ฉด ์ข๊ฒ ๋ค. ์ด๋ฏธ ๊ตฌ์กฐ์ฒด ํ๊ทธ๊ฐ ์์ต๋๋ค. ๋ ์ด๋ธ์ด๋ผ๊ณ ๋ถ๋ฅด๊ณ ์ถ์์ง๋ง Go์๋ ๋ ์ด๋ธ์ด ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ํ๋๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ด ๋ ์ ์ ํ๊ณ ๊ฐ์ฅ ํผ๋์ค๋ฌ์ ๋ณด์ ๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์์ ๊ฑฐ๋ฅผ ํ๊ณ ์ถ์ดํ๋ค๋ฉด ์ด๊ฒ์ ์ ๋ง๋ก ์ ์ ํ ์ฝํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ค ์๋ฏธ์์ ํ๊ทธ๊ฐ ์๋ ๊ณต์ฉ์ฒด๋ ์ธํฐํ์ด์ค๋ณด๋ค ๊ตฌ์กฐ์ฒด์ ๋ ์ ์ฌํฉ๋๋ค. ํ ๋ฒ์ ํ๋์ ํ๋๋ง ์ค์ ํ ์ ์๋ ํน์ํ ์ข ๋ฅ์ ๊ตฌ์กฐ์ฒด์ ๋๋ค. ๊ทธ๋ฐ ๊ด์ ์์ ๋ณด๋ฉด Foo/Bar ์์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
type Foo struct {
A string
B int
}
func Bar(f Foo) {...}
func main() {
Bar("hello world") //same as Bar(Foo{A: "hello world", B: 0})
Bar(1) //same as Bar(Foo{A: "", B: 1})
}
์ด ๊ฒฝ์ฐ์๋ ๋ถ๋ช ํ์ง๋ง ์ข์ ์๊ฐ์ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ํ ์ ์์์์ Bar(Foo{1})
๋ ์ ๋ง๋ก ํค ์
๋ ฅ์ ์ ์ฅํ๋ ค๋ ๊ฒฝ์ฐ ๋ช
ํํ ๋ ํ์ฉ๋ฉ๋๋ค. ๋ํ ํตํฉ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก &Foo{"hello world"}
์๋ ๋ณตํฉ ๋ฆฌํฐ๋ด ๊ตฌ๋ฌธ์ด ์ฌ์ ํ ํ์ํฉ๋๋ค.
์ฆ, ๊ณต์ฉ์ฒด๋ ํ์ฌ "ํ๋"๊ฐ ์ค์ ๋ ๋์ ํ๊ทธ๊ฐ ์๋ค๋ ์ ์์ ์ธํฐํ์ด์ค์ ์ ์ฌํฉ๋๋ค.
switch v := u.[type] {...
๋ ์ธํฐํ์ด์ค์ ๋ํด switch v := i.(type) {...
๋ฅผ ํ๋ฅญํ๊ฒ ๋ฏธ๋ฌ๋งํ๋ ๋์์ ๊ณต์ฉ์ฒด ๊ฐ์ ๋ํ ์ง์ ์ ํ ์ ํ ๋ฐ ์ด์ค์
์ ํ์ฉํฉ๋๋ค. ๋ ์ฝ๊ฒ ์๋ณํ ์ ์๋๋ก u.[union]
์ด์ด์ผ ํ์ง๋ง ์ด๋ ์ชฝ์ด๋ ๊ตฌ๋ฌธ์ด ๊ทธ๋ ๊ฒ ๋ฌด๊ฒ์ง ์๊ณ ์๋ฏธ๊ฐ ๋ช
ํํฉ๋๋ค.
.(type)
๊ฐ ๋ถํ์ํ๋ค๋ ๋์ผํ ์ฃผ์ฅ์ ํ ์ ์์ง๋ง, ์ ์๊ฐ์๋ ํญ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ํํ ์๊ณ ๊ทธ๊ฒ์ด ์์ ํ ์ ๋นํ๋๋ค๋ ๊ฒ์ ์ ๋์
๋๋ค.
์ด๊ฒ์ด ์ด๋ฌํ ์ ํ์ ๋ํ ๋์ ์ถ๋ก ์ด์์ต๋๋ค.
@jimmyfrasche
์ค์์น ๊ตฌ๋ฌธ์ ์ค๋ช
ํ์๋ ๋ค์ ์ง๊ด์ ์ด์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ switch v := i.(type) {...
๋ ์ ํ ์ฌ๋ก์ ๋ฐ๋ผ ๋์ด๋๊ณ .(type)
๋ก ํ์๋๋ ๊ฐ๋ฅํ ์ ํ์ ์ ํํฉ๋๋ค.
๊ทธ๋ฌ๋ Union์ ์ฌ์ฉํ๋ฉด ์ค์์น๊ฐ ๊ฐ๋ฅํ ์ ํ์ด ์๋๋ผ ๊ฐ์ ํตํด ์ ํ๋ฉ๋๋ค. ๊ฐ ๊ฒฝ์ฐ๋ ๋ค๋ฅธ ๊ฐ๋ฅํ ๊ฐ์ ๋ํ๋ด๋ฉฐ ๊ฐ์ ์ค์ ๋ก ๋์ผํ ์ ํ์ ๊ณต์ ํ ์ ์์ต๋๋ค. ์ด๋ ๋ฌธ์์ด ๋ฐ int ์ค์์น์ ๋ ์ ์ฌํฉ๋๋ค. ์ฌ๊ธฐ์ ์ผ์ด์ค๋ ๊ฐ์ ๋์ดํ๊ณ ํด๋น ๊ตฌ๋ฌธ์ ๊ฐ๋จํ switch v := u {...
์
๋๋ค. ๊ทธ๋ฐ ์ ์์ ํฉ์งํฉ ๊ฐ์ ํตํด ์ ํํ๋ ๊ฒ์ด switch v := u { ...
๋๋ ๊ฒ์ด ๋ ์์ฐ์ค๋ฌ์ ๋ณด์
๋๋ค. int ๋ฐ string์ ๊ฒฝ์ฐ๋ณด๋ค ์ ์ฌํ์ง๋ง ๋ ์ ํ์ ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
@urandom ๊ตฌ๋ฌธ์ ๋ํ ์์ฃผ ์ข์ ์ ์ ๋๋ค. ์ฌ์ค์ ๋ ์ด๋ธ์ด ์๋ ์ด์ ์ ์์์ ์ ๋ณด๋ฌผ์ด๋ฏ๋ก ๋น์ ์ ํ์ด์์ต๋๋ค. ๊ทธ๋ฅ ์๋ฌด ์๊ฐ ์์ด ๊ทธ๋ฅ ๋ณต์ฌํ์ต๋๋ค. ์ง์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
switch u {...
์๋ ๊ฒ์ด์ง๋ง์ ๋ฌธ์ switch v := u {...
๋๋ฌด ๋ง์ ๋ชจ์์
๋๋ค switch v := f(); v {...
(ํ ๊ฒ์ด๋ค ์ค๋ฅ๋ณด๊ณ ๋ ์ด๋ ค์ด ๋ช
ํํ์ง ๊ตฌ์ฑ๋์๋ค).
@as ๊ฐ ์ ์ํ ๋๋ก union
ํค์๋์ ์ด๋ฆ์ด pick
๋ก ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ํ๊ทธ ์ค์์น๋ ๋์นญ์ ์ ์งํ๋ switch u.[pick] {...
๋๋ switch v := u.[pick] {...
๋ก ์์ฑ๋ ์ ์์ต๋๋ค. ์ ํ ์ค์์น๊ฐ ์์ง๋ง ํผ๋์ ์ผ์ผํค์ง ์๊ณ ๊ฝค ๋ฉ์ง๊ฒ ๋ณด์
๋๋ค.
๊ตฌํ์ด int๋ฅผ ์ผ๋๋ผ๋ ์ฌ์ ํ ๋์ ํ๊ทธ ๋ฐ ์ ์ฅ๋ ๊ฐ์ผ๋ก ์ ํ์ ์์์ ๊ตฌ์กฐ ํด์ ๊ฐ ์์ต๋๋ค. ์ด๋ ๋ฌธ๋ฒ ๊ท์น์ ๊ด๊ณ์์ด ๋ช ์์ ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ๊ทธ ํ๋๋ฅผ ํธ์ถํ๊ณ ํ๋ ์ด์ค์ ๋ฐ ํ๋ ์ ํ์ด ๋๋๋ก ํ๋ ๊ฒ์ ๋งค์ฐ ์๋ฏธ๊ฐ ์์ต๋๋ค.
ํธ์ง : ์ ํ๊ณผ ํจ๊ป ๋ฐ์ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ด์ํ์ง๋ง
[๋ต๋ณ์ด ๋ฆ์ด์ ์ฃ์กํฉ๋๋ค - ์ ๋ ํด๊ฐ ์ค์ด์์ต๋๋ค]
@ianlancetailor ๋ ๋ค์
๋น์ ์ ์ ์์์ ๋ณผ ์ ์๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ํด์ผ ํ๋ ์ด์ ์ ๋๋ค. ์๋ก์ด ์ข ๋ฅ์ ์ ํ์ ์ถ๊ฐํ๋ ๋ฐ๋ ๋ถ๋ช ํ ๋จ์ ์ด ์์ต๋๋ค. ๋ฐ๋์ ๊ธฐ๋๋ ๋ชจ๋ ์ฌ๋์ด ๋ฐฐ์์ผ ํ๋ ์๋ก์ด ๊ฐ๋ ์ ๋๋ค. ๋ณด์ ์ด์ ์ ๋ฌด์์ ๋๊น? ํนํ, ์๋ก์ด ์ ํ์ ์ ํ์ ์ธํฐํ์ด์ค ์ ํ์์ ์ป์ ์ ์๋ ๋ฌด์์ ์ ๊ณตํฉ๋๊น?
๋ด๊ฐ ๋ณด๋ ๋ ๊ฐ์ง ์ฃผ์ ์ด์ ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ ์ธ์ด ์ด์ ์ ๋๋ค. ๋ ๋ฒ์งธ๋ ์ฑ๋ฅ์์ ์ด์ ์ ๋๋ค.
๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ๋, ํนํ ๋์ ํ๋ก์ธ์ค์์ ์ฝ์ ๋ ๊ฐ ๋ฉ์์ง์๋ ๊ด๋ จ ํ๋กํ ์ฝ ์๊ตฌ ์ฌํญ์ด ์์ ์ ์์ผ๋ฏ๋ก ์์ ํ ์ ์๋ ์ ์ฒด ๋ฉ์์ง ์งํฉ์ ์ ์ ์์ผ๋ฉด ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์ฃผ์ด์ง ํ๋กํ ์ฝ์ ๋ํด ๊ฐ๋ฅํ ๋ฉ์์ง ์ ํ์ ์๋ ๋งค์ฐ ์ ์ ์ ์์ง๋ง ๋ฉ์์ง๋ฅผ ํํํ๊ธฐ ์ํด ๊ฐ๋ฐฉํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ๋ ๊ทธ ๋ถ๋ณ์ฑ์ ๋ช ํํ์ง ์์ต๋๋ค. ์ข ์ข ์ฌ๋๋ค์ ์ด๋ฅผ ํผํ๊ธฐ ์ํด ๊ฐ ๋ฉ์์ง ์ ํ์ ๋ํด ๋ค๋ฅธ ์ฑ๋์ ์ฌ์ฉํ์ง๋ง ๊ทธ์ ๋ฐ๋ฅธ ๋น์ฉ์ด ๋ฐ๋ฆ ๋๋ค.
์๋ ค์ง ๊ฐ๋ฅํ ๋ฉ์์ง ์ ํ์ด ์ ๊ณ ํฌ์ธํฐ๊ฐ ํฌํจ๋์ด ์์ง ์์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๊ฐ๋ฐฉํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ํํํ๋ ค๋ฉด ์ธํฐํ์ด์ค ๊ฐ์ ๋ง๋ค๊ธฐ ์ํ ํ ๋น์ด ํ์ํฉ๋๋ค. ๊ฐ๋ฅํ ๋ฉ์์ง ์ ํ์ ์ ํํ๋ ์ ํ์ ์ฌ์ฉํ๋ฉด ์ด๋ฅผ ํผํ ์ ์์ผ๋ฏ๋ก GC ์๋ ฅ์ ์ํํ๊ณ ์บ์ ์ง์ญ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
sum ์ ํ์ด ํด๊ฒฐํ ์ ์๋ ํน๋ณํ ๊ณ ํต์ godoc์
๋๋ค. ast.Spec
๋ฅผ ์๋ก ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://golang.org/pkg/go/ast/#Spec
๋ง์ ํจํค์ง๋ ๋ช ๋ช ๋ ์ธํฐํ์ด์ค ์ ํ์ ๊ฐ๋ฅํ ๊ธฐ๋ณธ ์ ํ์ ์๋์ผ๋ก ๋์ดํ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์ฝ๋๋ฅผ ๋ณด๊ฑฐ๋ ์ด๋ฆ ์ ๋ฏธ์ฌ ๋๋ ์ ๋์ฌ์ ์์กดํ์ง ์๊ณ ๋ ์์ด๋์ด๋ฅผ ๋น ๋ฅด๊ฒ ์ป์ ์ ์์ต๋๋ค.
์ธ์ด๊ฐ ์ด๋ฏธ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ ์๊ณ ์๋ ๊ฒฝ์ฐ iotas๊ฐ ์๋ ์ด๊ฑฐํ ์ ํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก godoc
์์ ์๋ํํ ์ ์์ต๋๋ค. ๋ํ ์ผ๋ฐ ํ
์คํธ๊ฐ ์๋ ์ค์ ๋ก ์ ํ์ ์ฐ๊ฒฐํ ์๋ ์์ต๋๋ค.
ํธ์ง: ๋ค๋ฅธ ์: https://github.com/mvdan/sh/commit/ebbfda50dfe167bee741460a4491ffec1006bdef
@mvdan ์ธ์ด ๋ณ๊ฒฝ ์์ด Go1์ ์คํ ๋ฆฌ๋ฅผ ๊ฐ์ ํ ์ ์๋ ์ฐ์ํ๊ณ ์ค์ฉ์ ์ธ ํฌ์ธํธ์ ๋๋ค. ์ด์ ๋ํด ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ ์ถํ๊ณ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๊น?
์ฃ์กํฉ๋๋ค. godoc ํ์ด์ง ๋ด์ ๋ค๋ฅธ ์ด๋ฆ์ ๋ํ ๋งํฌ๋ง ์ธ๊ธํ๊ณ ์์ง๋ง ์ฌ์ ํ ์๋์ผ๋ก ๋์ดํ๊ณ ์์ต๋๊น?
์ฃ์กํฉ๋๋ค. ๋ ๋ช ํํด์ผ ํฉ๋๋ค.
godoc์ ํ์ฌ ํจํค์ง์ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์ ํ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ธฐ๋ฅ ์์ฒญ์ ์๋ฏธํ์ต๋๋ค.
(์๋์ผ๋ก ๋์ด๋ ์ด๋ฆ์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ๊ธฐ๋ฅ ์์ฒญ์ด ์ด๋๊ฐ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ํ์ฌ๋ก์๋ ์ฐพ์ ์๊ฐ์ด ์์ต๋๋ค.)
๋๋ ์ด(์ด๋ฏธ ๋งค์ฐ ๊ธด) ์ค๋ ๋๋ฅผ ์ธ์ํ๊ณ ์ถ์ง ์์ผ๋ฏ๋ก ๋ณ๋์ ๋ฌธ์ ๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ ์ฐธ์กฐ.
@Merovius AST ํญ๋ชฉ์ด ์ด๊ฑฐํ๋ณด๋ค ํฉ๊ณ ์ ํ์ ๋ ๋ง์ด ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ์์ https://github.com/golang/go/issues/19814#issuecomment -298833986์ ํ์ ํ๊ณ
๋จผ์ , ํฉ๊ณ ์ ํ์ด Go์ ์ํ๋์ง ํ์คํ์ง ์๋ค๋ ์ ์ ๋ฐ๋ณตํด์ ๋ง์๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. ๋๋ ๊ทธ๋ค์ด ํ์คํ ์ํ์ง ์๋๋ค๋ ๊ฒ์ ์์ง ํ์ ํ์ง ๋ชปํ์ต๋๋ค. ๋๋ ๊ทธ๋ค์ด ์์ด๋์ด๋ฅผ ํ๊ตฌํ๊ณ ๊ทธ๋ค์ด ๋ง๋์ง ํ์ธํ๊ธฐ ์ํด ๊ทธ๋ ๊ฒํ๋ค๋ ๊ฐ์ ํ์ ์์ ํ๊ณ ์์ต๋๋ค. ์ด๋ ์ชฝ์ด๋ ์ค๋ํ ์ฉ์๊ฐ ์์ต๋๋ค.
๋์งธ, ๊ทํ์ ์๊ฒฌ์์ ์ ์ง์ ์ธ ์ฝ๋ ๋ณต๊ตฌ๋ฅผ ์ธ๊ธํ์ต๋๋ค. ํฉ๊ณ ์ ํ์ ์ ์ฉ์ด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ ์์ ์ธํฐํ์ด์ค์ ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ตฌ์กฐ์ฒด์์ ํ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ๊ณผ ๋๋ฑํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฌ๋ฐ๋ฅด๊ณ ๋ฐ๋์งํ ํ๋์ ๋๋ค.
์๋ก์ด ์ข ๋ฅ์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ Node ์ธํฐํ์ด์ค๋ก ๊ตฌํ๋ AST์ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. AST๊ฐ ์ธ๋ถ ํ๋ก์ ํธ์ ์ ์๋์ด ์๊ณ AST๋ฅผ ์๋ดํ๋ ํ๋ก์ ํธ์ ํจํค์ง์์ AST๋ฅผ ๊ฐ์ ธ์ค๊ณ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์ธํฐํ์ด์ค ๊ธฐ๋ฐ AST์ ๊ฒฝ์ฐ์๋ง 2.1.1์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค. ์ด๊ฒ์ ๋ฌด์๋ณด๋ค ์ฐ์ฐ์ ๋๋ค. ์ ์ง์ ์ฝ๋ ๋ณต๊ตฌ๊ฐ ์๋ํ์ง ์์ต๋๋ค. AST๋ ๋ฒ์ ์ ์ฌ๋ ค์ผ ํ๊ณ ์ฝ๋๋ ๋ฒ์ ์ ์ฌ๋ ค์ผ ํฉ๋๋ค.
์ฒ ์ ํ ๋ฆฐํฐ๊ฐ ๋์์ด ๋์ง๋ง ๋ฆฐํฐ๊ฐ ๋ชจ๋ ์ธํฐํ์ด์ค ์ ํ์ ๊ฒ์ฌํ ์ ์๊ธฐ ๋๋ฌธ์ ํน์ ์ธํฐํ์ด์ค๋ฅผ ๊ฒ์ฌํด์ผ ํ๋ค๊ณ ์๋ ค์ผ ํฉ๋๋ค. ์ด๋ ์์ค ์ฃผ์ ๋๋ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์๋ ์ผ์ข ์ ๊ตฌ์ฑ ํ์ผ์ ์๋ฏธํฉ๋๋ค. ์์ค ๋ด ์ฃผ์์ธ ๊ฒฝ์ฐ ์ ์์ ๋ฐ๋ผ AST๊ฐ ๋ณ๋์ ํ๋ก์ ํธ์ ์ ์๋์ด ์์ผ๋ฏ๋ก ํด๋น ํ๋ก์ ํธ์ ๋ฐ๋ผ ์ฒ ์ ํ ๊ฒ์ฌ๋ฅผ ์ํด ์ธํฐํ์ด์ค์ ํ๊ทธ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์ ์ฒด ์ปค๋ฎค๋ํฐ๊ฐ ๋์ํ๊ณ ํญ์ ์ฌ์ฉํ๋ ํ๋์ ์ฒ ์ ํ ๋ฆฐํฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ๋๊ท๋ชจ๋ก ์๋ํฉ๋๋ค.
ํฉ๊ณ ๊ธฐ๋ฐ AST๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ ํ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ์ ์ ์ผํ ์ฐจ์ด์ ์ ์ฒ ์ ํ ๋ฆฐํฐ๊ฐ ์ปดํ์ผ๋ฌ์ ๋ด์ฅ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ ๋ค 2.2์๋ ๋์์ด ๋์ง ์์ง๋ง ๋ฌด์์ ํ ์ ์์ต๋๊น?
ํฉ๊ณ ์ ํ์ด ์ ์ฉํ ๋ ๊ฐ๋จํ AST ์ธ์ ์ฌ๋ก๊ฐ ์์ต๋๋ค. ๋ฐ๋ก ํ ํฐ์
๋๋ค. ๋ ๊ฐ๋จํ ๊ณ์ฐ๊ธฐ๋ฅผ ์ํด ์ดํ๋ถ์๊ธฐ๋ฅผ ์์ฑํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฐ๊ด๋ ๊ฐ์ด ์๋ *
์ ๊ฐ์ ํ ํฐ๊ณผ ์ด๋ฆ์ ๋ํ๋ด๋ ๋ฌธ์์ด์ด ์๋ Var
์ ๊ฐ์ ํ ํฐ ๋ฐ float64๋ฅผ ๋ณด์ ํ๋ Val
์ ๊ฐ์ ํ ํฐ์ด ์์ต๋๋ค. .
์ด๊ฒ์ ์ธํฐํ์ด์ค๋ก ๊ตฌํํ ์๋ ์์ง๋ง ๋ฒ๊ฑฐ๋ก์ธ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์๋ง๋ ๋ค์๊ณผ ๊ฐ์ด ํ ๊ฒ์ ๋๋ค.
package token
type Type int
const (
Times Type = iota
// ...
Var
Val
)
type Value struct {
Type
Name string // only valid if Type == Var
Number float64 // only valid if Type == Val
}
iota ๊ธฐ๋ฐ ์ด๊ฑฐํ์ ๋ํ ์ฒ ์ ํ ๋ฆฐํฐ๋ ์๋ชป๋ Type์ด ์ฌ์ฉ๋์ง ์๋๋ก ํ ์ ์์ง๋ง Type == Times์ผ ๋ Name์ ํ ๋นํ๊ฑฐ๋ Type == Var์ผ ๋ Number๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์ ๋ํด์๋ ์ ์๋ํ์ง ์์ต๋๋ค. ํ ํฐ์ ์์ ์ข
๋ฅ๊ฐ ๋์ด๋ ์๋ก ์
ํ๋ ๋ฟ์
๋๋ค. ์ฌ๊ธฐ์ ํ ์ ์๋ ์ต์ ์ ๋ฐฉ๋ฒ์ Valid() error
๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. ์ด ๋ฉ์๋๋ ๋ชจ๋ ์ ์ฝ ์กฐ๊ฑด๊ณผ ์ธ์ ๋ฌด์์ ํ ์ ์๋์ง ์ค๋ช
ํ๋ ๋ง์ ๋ฌธ์๋ฅผ ํ์ธํฉ๋๋ค.
ํฉ๊ณ ์ ํ์ ์ด๋ฌํ ๋ชจ๋ ์ ์ฝ ์กฐ๊ฑด์ ์ฝ๊ฒ ์ธ์ฝ๋ฉํ๊ณ ์ ์๋ ํ์ํ ๋ชจ๋ ๋ฌธ์๊ฐ ๋ ๊ฒ์ ๋๋ค. ์๋ก์ด ์ข ๋ฅ์ ํ ํฐ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด์ง๋ง AST์ ๋ํด ๋งํ ๋ชจ๋ ๋ด์ฉ์ ์ฌ์ ํ โโ์ฌ๊ธฐ์ ์ ์ฉ๋ฉ๋๋ค.
๋ ๋ง์ ๋๊ตฌ๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ถฉ๋ถํ๋ค๊ณ ํ์ ํ์ง ๋ชปํฉ๋๋ค.
@jimmyfrasche
๋์งธ, ๊ทํ์ ์๊ฒฌ์์ ์ ์ง์ ์ธ ์ฝ๋ ๋ณต๊ตฌ๋ฅผ ์ธ๊ธํ์ต๋๋ค. ํฉ๊ณ ์ ํ์ ์ ์ฉ์ด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ ์์ ์ธํฐํ์ด์ค์ ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ตฌ์กฐ์ฒด์์ ํ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ๊ณผ ๋๋ฑํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ค.
์๋์, ๋๋ฑํ์ง ์์ต๋๋ค. ์ ์ง์ ๋ณต๊ตฌ ๋ชจ๋ธ์์ ์ด๋ฌํ ๋ณ๊ฒฝ์ ๋ชจ๋ ์ํํ ์ ์์ต๋๋ค(์ธํฐํ์ด์ค์ ๊ฒฝ์ฐ: 1. ๋ชจ๋ ๊ตฌํ์ ์ ๋ฉ์๋ ์ถ๊ฐ, 2. ์ธํฐํ์ด์ค์ ๋ฉ์๋ ์ถ๊ฐ. ๊ตฌ์กฐ์ฒด ํ๋์ ๊ฒฝ์ฐ: 1. ํ๋์ ๋ชจ๋ ์ฌ์ฉ ์ ๊ฑฐ, 2. ํ๋ ์ ๊ฑฐ). ํฉ๊ณ ์ ํ์ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ ์ง์ ์๋ฆฌ ๋ชจ๋ธ์์ ์๋ ํ์ง ์์ต๋๋ค . lib๋ฅผ ๋จผ์ ์ถ๊ฐํ๋ฉด ๋ ์ด์ ์ฒ ์ ํ๊ฒ ํ์ธํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ค๋จ๋์ง๋ง ์ ์ฌ๋ก๊ฐ ์์ง ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์๊ฒ ๋จผ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ ๊ฑฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
์ค์ํ ๋ณ๊ฒฝ ์ฌํญ์ธ์ง ์ฌ๋ถ๊ฐ ์๋๋ผ ์ค๋จ์ ์ต์ํํ๋ฉด์ ์กฐ์ ํ ์ ์๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ธ์ง ์ฌ๋ถ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฌ๋ฐ๋ฅด๊ณ ๋ฐ๋์งํ ํ๋์ ๋๋ค.
์ ํํ. Sum ์ ํ์ ์ ์์ ์ฌ๋๋ค์ด ์ํ๋ ๋ชจ๋ ์ด์ ๋ ๊ทผ๋ณธ์ ์ผ๋ก ์ ์ง์ ์ฝ๋ ๋ณต๊ตฌ ๊ฐ๋ ๊ณผ ์๋ฆฝํ ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค ๊ธฐ๋ฐ AST์ ๊ฒฝ์ฐ์๋ง 2.1.1์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค.
์๋์ค, 1.2์ ๊ฒฝ์ฐ์๋ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค(์ธ์ํ ์ ์๋ ๋ฌธ๋ฒ์ผ๋ก ์ธํด ๋ฐํ์์ ์คํจํ๋ ๊ฒ์ ์๋ฒฝํฉ๋๋ค. ํ์ง๋ง ๋นํฉํ๊ณ ์ถ์ง๋ ์์ง๋ง ์ค๋ฅ๋ฅผ ๋ฐํํจ) ๋ฐ 2.1์ ๋ง์ ๊ฒฝ์ฐ์์๋ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค. ๋๋จธ์ง๋ ์ํํธ์จ์ด ์ ๊ทธ๋ ์ด๋์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์๊ฐ ์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ๊ทธ๋ ๋ค๊ณ ํด์ ์ํํธ์จ์ด๊ฐ ์ฌ๋ฐ๋ฅด์ง ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
AST๋ ๋ฒ์ ์ ์ฌ๋ ค์ผ ํ๊ณ ์ฝ๋๋ ๋ฒ์ ์ ์ฌ๋ ค์ผ ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ๋น์ ์ ๋ง์์ ์ด๋ป๊ฒ ์ด์ด์ง๋์ง ์ ํ ์์ง ๋ชปํฉ๋๋ค. ๋์๊ฒ "์ด ์๋ก์ด ๋ฌธ๋ฒ์ ์์ง ๋ชจ๋ ๋๊ตฌ์์ ์๋ํ์ง๋ ์์ง๋ง ์ปดํ์ผ๋ฌ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค"๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ์ข์ต๋๋ค. "์ด ์๋ก์ด ๋ฌธ๋ฒ์์ ์ด ๋๊ตฌ๋ฅผ ์คํํ๋ฉด ๋ฐํ์์ ์คํจํ ๊ฒ"์ธ ๊ฒ์ฒ๋ผ ๊ด์ฐฎ์ต๋๋ค. ์ต์ ์ ๊ฒฝ์ฐ ์ด๋ ์ ์ง์ ๋ณต๊ตฌ ํ๋ก์ธ์ค์ ๋ ๋ค๋ฅธ ๋จ๊ณ๋ฅผ ์ถ๊ฐํ ๋ฟ์ ๋๋ค. a) AST ํจํค์ง ๋ฐ ํ์์ ์ ๋ ธ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค. b) ์ ๋ ธ๋๋ฅผ ํ์ฉํ๊ธฐ ์ํด AST ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ตฌ๋ฅผ ์์ ํฉ๋๋ค. c) ์ ๋ ธ๋๋ฅผ ์ฌ์ฉํ๋๋ก ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์, ์ ๋ ธ๋๋ a) ๋ฐ b)๊ฐ ์๋ฃ๋ ํ์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ํ๋ก์ธ์ค์ ๋ชจ๋ ๋จ๊ณ์์ ์ค๋จ ์์ด ๋ชจ๋ ๊ฒ์ด ์ฌ์ ํ ์ฌ๋ฐ๋ฅด๊ฒ ์ปดํ์ผ๋๊ณ ์๋ํฉ๋๋ค.
์ ์ง์ ์ธ ์ฝ๋ ๋ณต๊ตฌ์ ์ฒ ์ ํ ์ปดํ์ผ๋ฌ ๊ฒ์ฌ๊ฐ ์๋ ์ธ์์์ ์๋์ผ๋ก ๊ด์ฐฎ์ ๊ฒ์ด๋ผ๋ ๋ง์ ์๋๋๋ค. ์ฌ์ ํ ์ ์คํ ๊ณํ๊ณผ ์คํ์ด ํ์ํ๋ฉฐ ์ ์ง ๊ด๋ฆฌ๋์ง ์์ ์ญ ์ข ์์ฑ์ ์ฌ์ ํ ๊นจ๋จ๋ฆด ์ ์์ผ๋ฉฐ ์ ํ ์ํํ ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ์ ์์ต๋๋ค(์๊ฐํ ์๋ ์์ง๋ง). ๊ทธ๋ฌ๋ ์ ์ด๋ a) ์ ์ง์ ์ธ ์ ๊ทธ๋ ์ด๋ ๊ฒฝ๋ก๊ฐ ์๊ณ b) ์ด๊ฒ์ด ๋ฐํ์์ ๋๊ตฌ๋ฅผ ์ค๋จํด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ํ ๊ฒฐ์ ์ ๋๊ตฌ ์์ฑ์์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค. ๊ทธ๋ค์ ์ ์ ์๋ ๊ฒฝ์ฐ์ ํด์ผ ํ ์ผ์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
์ฒ ์ ํ ๋ฆฐํฐ๊ฐ ๋์์ด ๋์ง๋ง ๋ฆฐํฐ๊ฐ ๋ชจ๋ ์ธํฐํ์ด์ค ์ ํ์ ๊ฒ์ฌํ ์ ์๊ธฐ ๋๋ฌธ์ ํน์ ์ธํฐํ์ด์ค๋ฅผ ๊ฒ์ฌํด์ผ ํ๋ค๊ณ ์๋ ค์ผ ํฉ๋๋ค.
์์? ๋๋ switchlintโข๊ฐ default-case๊ฐ ์๋ ๋ชจ๋ ์ ํ ์ค์์น์ ๋ํด ๋ถํํ๋ ๊ฒ์ด ๊ด์ฐฎ๋ค๊ณ ์ฃผ์ฅํ๊ณ ์ถ์ต๋๋ค. ๊ฒฐ๊ตญ ์ฝ๋๊ฐ ๋ชจ๋ ์ธํฐํ์ด์ค ์ ์์ ํจ๊ป ์๋ํ ๊ฒ์ผ๋ก ์์ํ๋ฏ๋ก ์ ์ ์๋ ๊ตฌํ๊ณผ ํจ๊ป ์๋ํ๋ ์ฝ๋๊ฐ ์์ผ๋ฉด ์ด์จ๋ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ์, ์ด ๊ท์น์๋ ์์ธ๊ฐ ์์ง๋ง ์์ธ๋ ์ด๋ฏธ ์๋์ผ๋ก ๋ฌด์ํ ์ ์์ต๋๋ค.
์ค์ ํฉ๊ณ ์ ํ๋ณด๋ค ์ปดํ์ผ๋ฌ์์ "๋ชจ๋ ์ ํ ์ ํ์ ๊ธฐ๋ณธ ์ผ์ด์ค๊ฐ ํ์ํ๋๋ผ๋ ๊ธฐ๋ณธ ์ผ์ด์ค๊ฐ ํ์ํฉ๋๋ค"๋ฅผ ์ ์ฉํ๋ ๋ฐ ๋ ๋์ํ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ด ์ ์ ์๋ ์ ํ์ ์ง๋ฉดํ์ ๋ ์ฝ๋๊ฐ ์ํํด์ผ ํ ์์ ์ ๊ฒฐ์ ํ๋๋ก ํ๊ณ ๊ฐ์ ํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ์ธํฐํ์ด์ค๋ก ๊ตฌํํ ์๋ ์์ง๋ง ๋ฒ๊ฑฐ๋ก์ธ ๊ฒ์ ๋๋ค.
์ด๊นจ๋ฅผ ์ผ์ฑ ํ๋ ๊ฒ์ ๋งค์ฐ ๋๋ฌผ๊ฒ ๋ฐ์ํ๋ ๊ฒฝ์ฐ์ ์ผํ์ฑ ๋ ธ๋ ฅ์ ๋๋ค. ๋์๊ฒ ๊ด์ฐฎ์ ๋ณด์ธ๋ค.
๊ทธ๋ฆฌ๊ณ FWIW, ๋๋ ํ์ฌ ํฉ๊ณ ์ ํ์ ์ฒ ์ ํ ํ์ธ ๊ฐ๋ ์ ๋ํด ๋ ผ์ํ๊ณ ์์ต๋๋ค. ๋๋ "์ด๋ฌํ ๊ตฌ์กฐ์ ์ผ๋ก ์ ์๋ ์ ํ ์ค ํ๋"๋ผ๊ณ ๋งํ๋ ์ถ๊ฐ๋ ํธ์์ฑ์ ๋ํด ์์ง ๊ฐ๋ ฅํ ์๊ฒฌ์ด ์์ต๋๋ค.
@Merovius ์ ์ง์ ์ฝ๋ ๋ณต๊ตฌ์ ๋ํ ๊ทํ์ ์ฐ์ํ ์ ์ ๋ํด ๋ ์๊ฐํด์ผ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋์:
๋๋ ํ์ฌ ํฉ๊ณ ์ ํ์ ์ฒ ์ ํ ํ์ธ ๊ฐ๋ ์ ๋ฐ๋ํ๋ ์ฃผ์ฅ๋ง ํ๊ณ ์์ต๋๋ค.
๊ธฐ๋ณธ ์ผ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ฑ ๊ฒ์ฌ๋ฅผ ๋ช ์์ ์ผ๋ก ์ตํธ์์ํ ์ ์์ต๋๋ค(ํจ๊ณผ์ ์ผ๋ก: ๊ธฐ๋ณธ๊ฐ์ "๊ทธ ๋ฐ์ ๋ชจ๋ ๊ฒ"์ ํฌํจํ๋ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ์ฌ ์ฒ ์ ํ๊ฒ ๋ง๋ญ๋๋ค). ์ฌ์ ํ ์ ํ๊ถ์ด ์์ง๋ง ๋ช ์์ ์ผ๋ก ์ ํํด์ผ ํฉ๋๋ค.
๋๋ switchlintโข๊ฐ default-case๊ฐ ์๋ ๋ชจ๋ ์ ํ ์ค์์น์ ๋ํด ๋ถํํ๋ ๊ฒ์ด ๊ด์ฐฎ๋ค๊ณ ์ฃผ์ฅํ๊ณ ์ถ์ต๋๋ค. ๊ฒฐ๊ตญ ์ฝ๋๊ฐ ๋ชจ๋ ์ธํฐํ์ด์ค ์ ์์ ํจ๊ป ์๋ํ ๊ฒ์ผ๋ก ์์ํ๋ฏ๋ก ์ ์ ์๋ ๊ตฌํ๊ณผ ํจ๊ป ์๋ํ๋ ์ฝ๋๊ฐ ์์ผ๋ฉด ์ด์จ๋ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ์, ์ด ๊ท์น์๋ ์์ธ๊ฐ ์์ง๋ง ์์ธ๋ ์ด๋ฏธ ์๋์ผ๋ก ๋ฌด์ํ ์ ์์ต๋๋ค.
ํฅ๋ฏธ๋ก์ด ์์ด๋์ด๋ค์. ์ธํฐํ์ด์ค๋ก ์๋ฎฌ๋ ์ดํธ๋ ํฉ๊ณ ์ ํ๊ณผ const/iota๋ก ์๋ฎฌ๋ ์ดํธ๋ ์ด๊ฑฐํ์ ๋๋ฌํ์ง๋ง ์๋ ค์ง ์ผ์ด์ค๋ฅผ ๋์ณค๋ค๊ณ ๋งํ์ง ์๊ณ ์ ์ ์๋ ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํ์ง ์์๋ค๋ ๊ฒ์ ์๋ ค์ค๋๋ค. ์ด์จ๋ ์๋๋ฌ์ด ๊ฒ ๊ฐ์ต๋๋ค. ๊ณ ๋ คํ๋ค:
switch {
case n < 0:
case n == 0:
case n > 0:
}
n์ด ์ ์์ด๋ฉด ์์ ํ์ง๋ง(์๋ ์ ๊ฒฝ์ฐ n != n
๋๋ฝ๋จ) ์ ํ์ ๋ํ ๋ง์ ์ ๋ณด๋ฅผ ์ธ์ฝ๋ฉํ์ง ์๊ณ ๊ธฐ๋ณธ๊ฐ์ด ๋๋ฝ๋ ๊ฒ์ผ๋ก ํ๋๊ทธ ์ง์ ํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ๊ฒ์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ:
switch {
case p[0](a, b):
case p[1](a, b):
//...
case p[N](a, b):
}
p[i]
๊ฐ a
๋ฐ b
์ ํ์ ๋ํด ๋ฑ๊ฐ ๊ด๊ณ๋ฅผ ํ์ฑํ๋๋ผ๋ ์ด๋ฅผ ์ฆ๋ช
ํ ์ ์์ผ๋ฏ๋ก ์ค์์น์ ๊ธฐ๋ณธ๊ฐ์ด ์๋ ๊ฒ์ผ๋ก ํ๋๊ทธ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. ์ด๋ ๋งค๋ํ์คํธ, ์์ค์ ์ฃผ์, ํ์ฉ ๋ชฉ๋ก์ ์๋ egrep -v
๋ํ ๋ํผ ์คํฌ๋ฆฝํธ ๋๋ p[i]
๋ ์์ ํ์ง ์์ต๋๋ค.
์ด์จ๋ "๋ชจ๋ ์ํฉ์์ ํญ์ ๋ถ์ดํ์ ๋ํด ๋ถํํ์ง ์๋"๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๊ตฌํํ๊ธฐ์๋ ์ฌ์ํ ๋ฆฐํฐ๊ฐ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๊ฒ ํ๊ณ go-corpus์์ ์คํํ๊ณ ์ค์ ๋ก ์ผ๋ง๋ ์๋๋ฝ๊ณ ์ ์ฉํ์ง ํ์ธํ๋ ๊ฒ์ ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค.
๋์ฒด ํ ํฐ ๊ตฌํ:
//Type defined as before
type SimpleToken { Type }
type StringToken { Type; Value string }
type NumberToken { Type; Value float64 }
type Interface interface {
//some method common to all these types, maybe just token() Interface
}
์ด๋ ๋ฌธ์์ด๊ณผ ์ซ์ ๊ฐ์ ๋ชจ๋ ๊ฐ์ง๊ณ ์์ง๋ง SimpleToken
๋๋ ๊ทธ ๋ฐ๋์ฌ์ผ ํ๋ ์ ํ์ผ๋ก StringToken
์์ฑ์ ํ์ฉํ์ง ์๋ ๋ถ๋ฒ ํ ํฐ ์ํ๋ฅผ ์ ์ํ ๊ฐ๋ฅ์ฑ์ ์ ๊ฑฐํฉ๋๋ค. ๋ฐ๋๋ก
์ธํฐํ์ด์ค๋ก ๊ทธ๋ ๊ฒ ํ๋ ค๋ฉด ํ ํฐ๋น ํ๋์ ์ ํ์ ์ ์ํด์ผ ํ๋ฉฐ( type Plus struct{}
, type Mul struct{}
๋ฑ) ๋๋ถ๋ถ์ ์ ์๋ ์ ํ ์ด๋ฆ์ ๋ํด ์ ํํ ๋์ผํฉ๋๋ค. ์ผํ์ฑ ๋
ธ๋ ฅ์ด๋ ์๋๋ ๊ทธ๊ฒ์ ๋ง์ ์์
์
๋๋ค(์ด ๊ฒฝ์ฐ ์ฝ๋ ์์ฑ์ ์ ํฉํ์ง๋ง).
ํ์ฉ ๊ฐ๋ฅํ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํ ํฐ ์ข ๋ฅ๋ฅผ ๋ถํ ํ๊ธฐ ์ํด ํ ํฐ ์ธํฐํ์ด์ค์ "๊ณ์ธต ๊ตฌ์กฐ"๋ฅผ ๊ฐ์ง ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
type SimpleToken int //implements token.Interface
const (
Plus SimpleToken = iota
// ...
}
type NumericToken interface {
Interface
Value() float64
nt() NumericToken
}
type IntToken struct { //implements NumericToken, and a FloatToken
type StringToken interface { // for Var and Func and Const, etc.
Interface
Value() string
st() StringToken
}
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ฌธ์์ด์ด ํฌํจ๋ ๋๋ง ํฌ์ธํฐ๊ฐ ํ์ํ ๊ตฌ์กฐ์ฒด ๋๋ ํฉ๊ณ ์ ํ๊ณผ ๋ฌ๋ฆฌ ๊ฐ ํ ํฐ์ ํด๋น ๊ฐ์ ์ก์ธ์คํ๊ธฐ ์ํด ํฌ์ธํฐ ์ฐธ์กฐ๊ฐ ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ ํ ๋ฆฐํฐ์ godoc์ ๊ฐ์ ์ผ๋ก ์ด ๊ฒฝ์ฐ ํฉ๊ณ ์ ํ์ ๋ํ ํฐ ์น๋ฆฌ๋ ํ ๋น์ ์ต์ํํ๋ฉด์ ๋ถ๋ฒ ์ํ์ ํ์ดํ์ ์(ํค๋ณด๋ ์๋ฏธ์์)์ ํ์ฉํ์ง ์๋ ๊ฒ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ์ด๋ ์ค์ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ธฐ๋ณธ ์ผ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ฑ ๊ฒ์ฌ๋ฅผ ๋ช ์์ ์ผ๋ก ์ตํธ์์ํ ์ ์์ต๋๋ค(ํจ๊ณผ์ ์ผ๋ก: ๊ธฐ๋ณธ๊ฐ์ "๊ทธ ๋ฐ์ ๋ชจ๋ ๊ฒ"์ ํฌํจํ๋ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ์ฌ ์ฒ ์ ํ๊ฒ ๋ง๋ญ๋๋ค). ์ฌ์ ํ ์ ํ๊ถ์ด ์์ง๋ง ๋ช ์์ ์ผ๋ก ์ ํํด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ ์ด๋ ์ชฝ์ด๋ ์ฐ๋ฆฌ ๋ ๋ค ์ฒ ์ ํ ํ์ธ์ ์ ํํ๊ฑฐ๋ ์ ํํ์ง ์์ ์ ์์ต๋๋ค. :)
์๋ ค์ง ์ผ์ด์ค๋ฅผ ๋์ณค๋ค๋ ๊ฒ์ด ์๋๋ผ ์๋ ค์ง์ง ์์ ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌํ์ง ์์๋ค๋ ๊ฒ์ ๋๋ค.
ํจ๊ณผ์ ์ผ๋ก, ๋๋ ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฏธ ์ ์ฒด ํ๋ก๊ทธ๋จ ๋ถ์์ ์ํํ์ฌ ๋ด๊ฐ ์๊ฐ ํ๋ ์ธํฐํ์ด์ค์์ ์ด๋ค ๊ตฌ์ฒด์ ์ธ ์ ํ์ด ์ฌ์ฉ๋๋์ง๋ฅผ ๊ฒฐ์
๊ทธ๋ฌ๋ ์์งํ ์ด๊ฒ์ ์ฒซ ๋ฒ์งธ ์์น์์ ์ฃผ์ฅ๋๋ฉฐ ์ค์ ๊ตฌํ์ ๋ํด์๋ ์ ํ ๋ชจ๋ฆ
๋๋ค.
์ด๋ค ๊ฒฝ์ฐ๋ a) ์ ์ฒด ํ๋ก๊ทธ๋จ์ ์ ์๋ ๊ตฌ์ฒด์ ์ธ ์ ํ์ ๋์ดํ๊ณ b) ๋ชจ๋ ์ ํ ์ค์์น์ ๋ํด ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋์ง ์ฌ๋ถ๋ฅผ ํํฐ๋งํ๋ ๊ฒ์ ๋งค์ฐ ์ฌ์์ผ ํฉ๋๋ค. ๋น์ ์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด , ๋น์ ์ ์ ๋ขฐํ ์์๋ ๋ชฉ๋ก์ผ๋ก ๋๋ผ ๊ฒ์ ๋๋ค. ์ ์๊ฐ์๋.
๋๋ ๋๊ตฌ๊ฐ ์ค์ ๋ก ๋ช ์ ์ ์ผ๋ก ์ต์ ์ ์๋ฆฌ๋๋งํผ ์ ๋ขฐ์ฑ์ด ๊ธฐ๋ก ๋ ์ ์๋ค๋ ๊ฒ์ 100 % ํ์ ์๋์ง๋ง, ๋๋ ๋น์ ์ด ์ฌ๋ก์ 90 %๋ฅผ ์ปค๋ฒ ํ ์ ์๋ค๊ณ ํ์ ํ๊ณ ๋น์ ์ ํ์คํ์ด ์ธ๋ถ์์ ์ํํ๋ ๋๊ตฌ๋ฅผ ์ธ ์ ์ฌ๋ฐ๋ฅธ ์ฃผ์์ด ์ ๊ณต๋ ์ปดํ์ผ๋ฌ(์ฆ, sum-types๋ฅผ ์ค์ ์ ํ์ด ์๋ pragma์ ์ ์ฌํ ์ฃผ์์ผ๋ก ๋ง๋ญ๋๋ค). ๋ฌผ๋ก ์ข์ ํด๊ฒฐ์ฑ ์ ์๋๋๋ค.
์ด์จ๋ ์๋๋ฌ์ด ๊ฒ ๊ฐ์ต๋๋ค. ๊ณ ๋ คํ๋ค:
๋๋ ์ด๊ฒ์ด ๋ถ๊ณตํํ๋ค๊ณ ์๊ฐํ๋ค. ๊ทํ๊ฐ ์ธ๊ธํ ์ฌ๋ก๋ ํฉ๊ณ ์ ํ๊ณผ ์ ํ ๊ด๋ จ์ด ์์ต๋๋ค. ๊ทธ๋ฌํ ๋๊ตฌ๋ฅผ ์ด๋์ ์์ฑํด์ผ ํ๋ค๋ฉด ์ ํ ์ค์์น์ ํํ์์ด ์๋ ์ค์์น๋ก ์ ํํ ๊ฒ์ ๋๋ค. ํฉ ์ ํ๋ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ธ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋์ฒด ํ ํฐ ๊ตฌํ:
๋ง์ปค ๋ฐฉ์์ด ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ ํ ํ๋๊ฐ ํ์ํ์ง ์์ผ๋ฉฐ ์ธํฐํ์ด์ค ํํ์์ ๋ฌด๋ฃ๋ก ์ป์ ์ ์์ต๋๋ค. marker-method๋ฅผ ๊ณ์ํด์ ๋ฐ๋ณตํ๋ ๊ฒ์ด ๊ฑฑ์ ๋๋ค๋ฉด; ๋ด๋ณด๋ด์ง ์์ ๊ตฌ์กฐ์ฒด{}๋ฅผ ์ ์ํ๊ณ ํด๋น ๋ง์ปค ๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ณ ๊ฐ ๊ตฌํ์ ํฌํจํ์ฌ ๋ฉ์๋๋ณด๋ค ์ถ๊ฐ ๋น์ฉ์ด ์๊ณ ์ต์ ๋น ํ์ดํ์ด ์ ์ต๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ฐ ํ ํฐ์๋ ํด๋น ๊ฐ์ ์ก์ธ์คํ๊ธฐ ์ํด ํฌ์ธํฐ ์ฐธ์กฐ๊ฐ ํ์ํฉ๋๋ค.
์. ๊ทธ๊ฒ์ ์ค์ ๋น์ฉ์ด์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ์ด๋ค ์ฃผ์ฅ๋ณด๋ค ์ค์ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ถ๊ณตํํ๋ค๊ณ ์๊ฐํ๋ค.
๊ทธ๊ฑด ์ฌ์ค์ด์ผ.
๋๋ ๋น ๋ฅด๊ณ ๋๋ฌ์ด ๋ฒ์ ์ ์์ฑํ๊ณ stdlib์์ ์คํํ์ต๋๋ค. switch ๋ฌธ์ 1956๊ฐ์ ํํธ๊ฐ ์๋์ง ํ์ธํ๊ณ switch {
ํ์์ ๊ฑด๋๋ฐ๋๋ก ์ ํํ๋ฉด ํด๋น ๊ฐ์๊ฐ 1677๋ก ์ค์ด๋ญ๋๋ค. ๊ฒฐ๊ณผ๊ฐ ์๋ฏธ์๋์ง ํ์ธํ๊ธฐ ์ํด ํด๋น ์์น๋ฅผ ๊ฒ์ฌํ์ง ์์์ต๋๋ค.
https://github.com/jimmyfrasche/switchlint
ํ์คํ ๊ฐ์ ์ ์ฌ์ง๊ฐ ๋ง์ต๋๋ค. ์์ฃผ ์ธ๋ จ๋์ง๋ ์์ต๋๋ค. ํ ๋ฆฌํ์คํธ๋ฅผ ํ์ํฉ๋๋ค.
(๋๋จธ์ง ๋ต๋ณ์ ๋์ค์ ํ ๊ฒ์)
ํธ์ง: ์๋ชป๋ ๋งํฌ์ ํ์
๋๋ ์ด๊ฒ์ด ์ง๊ธ๊น์ง์ ๋ชจ๋ ๊ฒ์ ๋ํ (์๋นํ ํธํฅ๋) ์์ฝ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค(๊ทธ๋ฆฌ๊ณ ๋ด ๋ ๋ฒ์งธ ์ ์์ ์๊ธฐ์ ์ ์ผ๋ก ๊ฐ์ ํจ)
์ฅ์
๋จ์
1 + 1 + โฏ + 1
ํ์์ ํฉ๊ณ์ ๋ํด ์ด์ํจ๋์
1 + 1 + โฏ + 1
ํ์์ ํฉ๊ณ์ ๋ํ iota "enum"์ ๊ด๊ณ์์ด
์ ์ง์ ์ธ ์๋ฆฌ์ ๊ฒฝ์ฐ, ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ํฐ ๋ฌธ์ ์ธ ๊ฒฝ์ฐ, ์ ์ผํ ์ต์ ์ ์ธ๋ถ ํจํค์ง๊ฐ ์์ ์ฑ ๊ฒ์ฌ๋ฅผ ์ตํธ์์ํ๋ ๊ฒ๋ฟ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ๊ณผ ์ผ์นํ๋๋ผ๋ ๋ฏธ๋์ ๊ต์ ์๋ง ๊ด๋ จ๋ "๋ถํ์ํ" ๊ธฐ๋ณธ ์ฌ๋ก๋ฅผ ๊ฐ๋ ๊ฒ์ด ํฉ๋ฒ์ ์ด์ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ง๊ธ ์๋ฌต์ ์ผ๋ก ์ฌ์ค์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง์ ํ๊ธฐ๊ฐ ์ฝ์ง ์๋ค๋ฉด ๋ง์ ๋๋ค.
ํจํค์ง ๊ด๋ฆฌ์๊ฐ "๋ค์ ๋ฒ์ ์์ ์ด ํฉ๊ณ ์ ํ์ ์ ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐํ ์์ ์ด๋ ์ฒ๋ฆฌํ ์ ์๋์ง ํ์ธํ์ญ์์ค"๋ผ๊ณ ๋ฐํํ๋ฉด switchlint ๋๊ตฌ๊ฐ ํ์ํ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ์ ํ ํด์ ๋ฉ๋๋ค.
๋ค๋ฅธ ๊ฒฝ์ฐ์ฒ๋ผ ๊ฐ๋จํ์ง๋ ์์ง๋ง ์ฌ์ ํ ์ํํ ์ ์์ต๋๋ค.
์ธ๋ถ์์ ์ ์๋ ํฉ๊ณ ์ ํ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ ๋ ๊ธฐ๋ณธ๊ฐ์ ์ฃผ์ ์ฒ๋ฆฌํ์ฌ ์๋ ค์ง ์ฌ๋ก๋ฅผ ๋์น์ง ์์๋์ง ํ์ธํ ๋ค์ ์ปค๋ฐํ๊ธฐ ์ ์ ์ฃผ์ ์ฒ๋ฆฌ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๋๋ ๊ธฐ๋ณธ๊ฐ์ด "๋ถํ์ํจ"์์ ์๋ ค์ฃผ๋ ๋๊ตฌ๊ฐ ์์ ์ ์์ต๋๋ค. ์ด ๋๊ตฌ๋ ๋ชจ๋ ์ ๋ณด๋ฅผ ์๊ณ ์์ผ๋ฉฐ ๋ฏธ๋์ ์ ์ ์๋ ๊ฒ์ ๋๋นํ ์ ์์์ ์๋ ค์ค๋๋ค.
์ ์๋ ํจํค์ง์ ๊ด๊ณ์์ด ํฉ๊ณ ์ ํ์ ์๋ฎฌ๋ ์ด์ ํ๋ ์ธํฐํ์ด์ค ์ ํ์ ์ฌ์ฉํ ๋ ๋ฆฐํฐ๋ก ์์ ์ฑ ๊ฒ์ฌ๋ฅผ ์ ํํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
@Merovius ๊ทํ์ betterSumType() BetterSumType
ํธ๋ฆญ์ ๋งค์ฐ ํ๋ฅญํ์ง๋ง, ์ด๋ ์ ์ ํจํค์ง์์ ์ ํ์ด ๋ฐ์ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค(๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋
ธ์ถํด์ผ ํฉ๋๋ค.
func CallBeforeSwitches(b BetterSumType) (BetterSumType, bool) {
if b == nil {
return nil, false
}
b = b.betterSumType()
if b == nil {
return nil, false
}
return b, true
}
๋ํ ๋งค๋ฒ ํธ์ถ๋๋ ๋ณดํธ๋ผ๊ธฐ).
ํ๋ก๊ทธ๋จ์ ๋ชจ๋ ์ค์์น๊ฐ ์ฒ ์ ํ์ง ํ์ธํ๋ ๋ฐ ํ์ํ ๊ธฐ์ค์ ๋ฌด์์ ๋๊น?
๋น ์ธํฐํ์ด์ค๊ฐ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ชจ๋ ๊ฒ์ด ๊ฒ์์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ์ ์ด๋ ํ๋์ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
์ธํฐํ์ด์ค์ ๋ด๋ณด๋ด์ง ์์ ๋ฉ์๋๊ฐ ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ ํ์ด ์ด๋ฅผ ๊ตฌํํ ์ ์์ผ๋ฏ๋ก ์ฒ ์ ์ฑ์ ๊ฐ ์ค์์น์ ํธ์ถ ๊ทธ๋ํ์ ์๋ ๋ชจ๋ ํจํค์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ํจํค์ง๋ฅผ ๊ฐ์ ธ์ค๊ณ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ค์ ํด๋น ๊ฐ์ ํจํค์ง์ ๊ธฐ๋ฅ ์ค ํ๋๋ก ๋ณด๋ผ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํด๋น ๊ธฐ๋ฅ์ ์ค์์น๋ ๊ฐ์ ธ์ค๊ธฐ ์ฃผ๊ธฐ๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ์ฒ ์ ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ต์ํ ํ๋์ ๋ด๋ณด๋ด์ง ์์ ๋ฉ์๋๊ฐ ํ์ํฉ๋๋ค. (์ด๊ฒ์ ์ด์ ๊ธฐ์ค์ ํฌํจํฉ๋๋ค).
์๋ฒ ๋ฉ์ ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์๋ ์์ฑ์ ๋ง์น ๊ฒ์ด๋ฏ๋ก ํจํค์ง์ ์ํฌํฐ ์ค ์ด๋ ๋๊ตฌ๋ ์ธํฐํ์ด์ค ๋๋ ๊ทธ๊ฒ์ ๊ตฌํํ๋ ์ ํ์ ์ด๋ ์์ ์์๋ ํฌํจํ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค. ์ ๋ง ๋ฉ์ง ๋ฆฐํฐ๋ ์๋ฒ ๋๋ ๊ฐ์ ์์ฑํ๋ ํน์ ํจ์๋ฅผ ํธ์ถํ์ง ์๊ฑฐ๋ ์๋ฒ ๋๋ ์ธํฐํ์ด์ค๊ฐ ํจํค์ง์ API ๊ฒฝ๊ณ๋ฅผ "์ด์ค์ผ์ดํ"ํ์ง ์๋ ๊ฒฝ์ฐ ๋๋๋ก ์๋ฒ ๋๋๊ฐ ๊ด์ฐฎ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
์ฒ ์ ํ๊ฒ ํ๋ ค๋ฉด ์ธํฐํ์ด์ค์ 0 ๊ฐ์ด ์ ๋ ์ ๋ฌ๋์ง ์๋์ง ํ์ธํ๊ฑฐ๋ ์ฒ ์ ํ ์ค์์น ํ์ธ case nil
๋ ์ ์ฉํด์ผ ํฉ๋๋ค. (ํ์๊ฐ ๋ ์ฝ์ง๋ง nil์ ํฌํจํ๋ฉด "์ ํ A ๋๋ ์ ํ B ๋๋ ์ ํ C" ํฉ๊ณ๊ฐ "๋ฌด ๋๋ ์ ํ A ๋๋ ์ ํ B ๋๋ ์ ํ C" ํฉ๊ณ๋ก ๋ฐ๋๋ฏ๋ก ์ ์๊ฐ ์ ํธ๋ฉ๋๋ค.)
๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ ํธ๋ฆฌ์ ํด๋น ํธ๋ฆฌ ๋ด์ ์ง์ ๋ ์ธํฐํ์ด์ค์ ๋ํด ์ด๋ฌํ ์๋ฏธ ์ฒด๊ณ๋ฅผ ํ์ธํ ์ ์๋ ๋ชจ๋ ๊ธฐ๋ฅ(์ ํ ์ฌํญ ํฌํจ)์ ํฌํจํ๋ ๋ฆฐํฐ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
์ด์ ์ข ์์ฑ D๊ฐ ์๋ ํ๋ก์ ํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. D ํจํค์ง ์ค ํ๋์ ์ ์๋ ์ธํฐํ์ด์ค๊ฐ ํ๋ก์ ํธ์์ ์์ ํ์ง ํ์ธํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค.
์ด์ ํ๋ก์ ํธ D'์ ์ ์ข ์์ฑ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. D'๊ฐ ๋ฌธ์ ์ ์ธํฐํ์ด์ค ์ ํ์ ์ ์ํ D์ ํจํค์ง๋ฅผ ๊ฐ์ ธ์ค์ง๋ง ์ด ๋ฆฐํฐ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ฐ๋ฆฌ๊ฐ ์์ ํ ์ค์์น๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ณด์ ํด์ผ ํ๋ ๋ถ๋ณ์ฑ์ ์ฝ๊ฒ ํ๊ดดํ ์ ์์ต๋๋ค.
๊ทธ ๋ฌธ์ ์ ๋ํด D๊ฐ linter๋ฅผ ์ฐ์ฐํ ์ ๋ฌํ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. D๋ก์ ์ ๊ทธ๋ ์ด๋๋ D'๋งํผ ์ฝ๊ฒ ๋ถ๋ณ์ฑ์ ํ๊ดดํ ์ ์์ต๋๋ค.
๋ฆฐํฐ๊ฐ "์ง๊ธ์ 100% ์์ ๐" ๋ผ๊ณ ํด๋ ์ฐ๋ฆฌ๊ฐ ์๋ฌด๊ฒ๋ ํ์ง ์์๋ ๋ฐ๋ ์ ์์ต๋๋ค.
"iota enums"์ ๋ํ ์ฒ ์ ํ ๊ฒ์ฌ๊ธฐ๊ฐ ๋ ์ฌ์ ๋ณด์ ๋๋ค.
u
๊ฐ ์ ์์ด๊ณ t
๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ์ง์ ๋ ๊ฐ ๋๋ iota
์๋ const
๋ก ์ฌ์ฉ๋๋ ๋ชจ๋ type t u
์ ๋ํด u
๋ํ ๊ฐ์ด ์ด๋ฌํ ์์์ ํฌํจ๋ฉ๋๋ค.
๋ ธํธ:
1 << iota
๋ ์ ์ด๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ powerset์ผ๋ก ์ทจ๊ธ๋ ์ ์์ง๋ง ์๋ง๋ ๋นํธ๋ณ ๋ณด์๋ฅผ ๋๋ฌ์ผ ์ถ๊ฐ ์กฐ๊ฑด์ด ํ์ํ ๊ฒ์
๋๋ค. ๋น๋ถ๊ฐ์ ๊ณ ๋ คํ์ง ์์ต๋๋ค์ฝ์์ผ๋ก min(t)
์์๋ฅผ ํธ์ถํ์ฌ ๋ค๋ฅธ ์์์ ๋ํด C
, min(t) <= C
, ์ ์ฌํ๊ฒ max(t)
์์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํธ์ถํฉ๋๋ค. ๋ค๋ฅธ ์์ C
, C <= max(t)
.
t
๊ฐ ์ฒ ์ ํ๊ฒ ์ฌ์ฉ๋๋๋ก ํ๋ ค๋ฉด ๋ค์์ ํ์ธํด์ผ ํฉ๋๋ค.
t
์ ํญ์ ๋ช
๋ช
๋ ์์์
๋๋ค(๋๋ ํจ์ ํธ์ถ๊ณผ ๊ฐ์ ํน์ ๊ด์ฉ์ ์์น์์๋ 0).min(t) <= v <= max(t)
์ธ๋ถ์ t
, v
๊ฐ์ ๋ถํ๋ฑ ๋น๊ต๊ฐ ์์ต๋๋ค.t
๊ฐ์ ์ฐ์ ์ฐ์ฐ +
, /
๋ฑ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๊ฐ๋ฅํ ์์ธ๋ ๊ฒฐ๊ณผ๊ฐ min(t)
์ max(t)
์ฌ์ด์ ๊ณ ์ ๋ ๋์ผ ์ ์์ต๋๋ค t
๋ฅผ ์ ์ํ๋ ํจํค์ง๋ก ์ ํ๋์ด์ผ ํฉ๋๋ค.t
์ ๋ชจ๋ ์์ ๋๋ ๊ธฐ๋ณธ ์ผ์ด์ค๋ฅผ ํฌํจํฉ๋๋ค.์ด๋ ์ฌ์ ํ ๊ฐ์ ธ์ค๊ธฐ ํธ๋ฆฌ์ ๋ชจ๋ ํจํค์ง๋ฅผ ํ์ธํด์ผ ํ๋ฉฐ ๊ด์ฉ์ ์ฝ๋์์ ๋ฌดํจํ๋ ๊ฐ๋ฅ์ฑ์ด ์ ์ง๋ง ์ฝ๊ฒ ๋ฌดํจํ๋ ์ ์์ต๋๋ค.
๋ด ์ดํด์ ๋ฐ๋ฅด๋ฉด ์ด๊ฒ์ ์ ํ ๋ณ์นญ๊ณผ ์ ์ฌํ๊ฒ ๋ณ๊ฒฝ ์ฌํญ์ ๊นจ๋จ๋ฆฌ์ง ์์ ๊ฒ์ด๋ฏ๋ก Go 2๋ฅผ ์ํด ๋ณด๋ฅํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ ํ ๋ณ์นญ์ ์๋ก์ด ํค์๋๋ฅผ ๋์ ํ์ง ์์ผ๋ฉฐ ์ด๋ ํ์คํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ค. ๋ํ ์ฌ์ํ ์ธ์ด ๋ณ๊ฒฝ์๋ ๋ชจ๋ผํ ๋ฆฌ์์ด ์๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ์ด๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ ๊ฒ์ ๋๋ค. ๋ฐ์๋ ํฉ๊ณ ๊ฐ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ชจ๋ ๋ง์ฌ/๋น์ ๋ ฌ ๋ฃจํด์ ๊ฐ์กฐํ๋ ๊ฒ๋ง์ผ๋ก๋ ์์ฒญ๋ ์๋ จ์ด ๋ ๊ฒ์ ๋๋ค.
์ ํ ๋ณ์นญ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ ๋ฌธ์ ๋ฅผ ์์ ํ๊ณ ์์ต๋๋ค. Sum ์ ํ์ ์ ํ ์์ ์ฑ์ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ๊ทธ๊ฒ์ด ์๋ ๊ฒ์ ์ผ ์คํ ํผ๊ฐ ์๋๋๋ค.
@rogpeppe ์ ์๋ ์ ์๊ณผ ๊ฐ์ http
ํจํค์ง์๋ Handler
์ธํฐํ์ด์ค ์ ํ๊ณผ ์ด๋ฅผ ๊ตฌํํ๋ ํจ์ ์ ํ HandlerFunc
์์ต๋๋ค. ํ์ฌ http.Handle
ํจ์๋ฅผ ์ ๋ฌํ๋ ค๋ฉด ๋ช
์์ ์ผ๋ก HandlerFunc
๋ก ๋ณํํด์ผ ํฉ๋๋ค. http.Handle
๋์ HandlerFunc | Handler
์ ํ์ ์ธ์๋ฅผ ์๋ฝํ๋ฉด HandlerFunc
์ง์ ํ ๋นํ ์ ์๋ ๋ชจ๋ ํจ์/ํด๋ก์ ๋ฅผ ์๋ฝํ ์ ์์ต๋๋ค. ๊ณต์ฉ์ฒด๋ ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ์ ํ์ ๊ฐ์ ์ธํฐํ์ด์ค ์ ํ์ผ๋ก ๋ณํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ปดํ์ผ๋ฌ์ ์๋ ค์ฃผ๋ ์ ํ ํํธ ์ญํ ์ ํจ๊ณผ์ ์ผ๋ก ์ํํฉ๋๋ค. HandlerFunc
๋ Handler
HandlerFunc
๊ตฌํํ๋ฏ๋ก ๊ณต์ฉ์ฒด ์ ํ์ ๊ทธ๋ ์ง ์์ผ๋ฉด Handler
์ฒ๋ผ ์๋ํฉ๋๋ค.
์ด๊ฑฐ ์ค๋ ๋( https://github.com/golang/go/issues/19814#issuecomment -322752526) ์ ๋ํ ๊ทํ์ ์๊ฒฌ์ ๋ํ @griesemer, ์ ์ ์์ ์ด ์ค๋ ๋์ ์๋ถ๋ถ https://github.com/golang/ go/issues/19412#issuecomment -289588569๋ ํฉ๊ณ ์ ํ("์ ์ํ ์คํ์ผ ์ด๊ฑฐํ")์ด Go์์ ์ด๋ป๊ฒ ์๋ํด์ผ ํ๋์ง์ ๋ํ ์ง๋ฌธ์ ๋ค๋ฃน๋๋ค. ๋งํผ ๋ด๊ฐ ๊ทธ๋ค์ ์ข์ํ๋ ๊ฒ์ฒ๋ผ, ๊ทธ๋ค์ ์ด๋์ ํ์ํ ์ถ๊ฐ ๋ ๋๋ ๋ชฐ๋ผ,ํ์ง๋ง ๋๋ ๊ทธ๋ค์ด ๋ณผ ํ์๊ฐ ๊ฑฐ๋ผ๊ณ ์ถ๊ฐ ๋ ๊ฒฝ์ฐ / ๊ทธ๋ฐ ๋ง์ ์๋ ์๊ฐํ์ญ๋๊น.
๊ทธ ๊ฒ์๋ฌผ์ ์์ ํ์ง ์๊ณ ์ด ์ค๋ ๋ ์ ์ฒด์ ๊ฑธ์ณ, ์ ํ์ ์ค๋ช ์ด ์์ง๋ง, ์ด ์ค๋ ๋๊ฐ ์๋นํ ๊ธธ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์์ ์ ๋ฐ๋ณตํ๊ฑฐ๋ ์์ฝํ๋ ๋ฐ ์ ๊ฒฝ์ฐ์ง ์์ต๋๋ค.
์ ํ ํ๊ทธ๊ฐ ์๋ ์ธํฐํ์ด์ค๋ก ์๋ฎฌ๋ ์ด์ ๋ ํฉ๊ณ ์ ํ์ด ์๊ณ ์๋ฒ ๋ฉ์ผ๋ก ์ด๋ฅผ ์ ๋ ํผํ ์ ์๋ ๊ฒฝ์ฐ ์ด๊ฒ์ด ์ ๊ฐ ์๊ฐํด๋ธ ์ต์ ์ ๋ฐฉ์ด์ฑ ์ ๋๋ค. https://play.golang.org/p/FqdKfFojp-
@jimmyfrasche ๋๋ ์ด๊ฒ์ ์ผ๋ง ์ ์ ์ผ์ต๋๋ค.
๋ ๋ค๋ฅธ ๊ฐ๋ฅํ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://play.golang.org/p/p2tFm984S8
@rogpeppe ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋๋ ์ฌ๊ธฐ์ ๋ค๋ฅธ ์ด์์ ์๋ ์ฝ๋ฉํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋ฒ์งธ ์ ์์ ์์ ๋ ๋ฒ์ ์ ์์ฑํ์ต๋๋ค.
ํนํ, ๋๋ ์ฒ ์ ํ ๊ฒ์ฌ๋ฅผ ์ ๊ฑฐํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ธ๋ถ ์์ ์ฑ ๊ฒ์ฌ๊ธฐ๋ ์๋ ์ ์์ ๋ํด ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋จํ์ง๋ง ํฉ๊ณ ์ ํ์ ์๋ฎฌ๋ ์ดํธํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ค๋ฅธ Go ์ ํ์ ๋ํด ์์ฑํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
ํธ์ง: ์ ํ ๊ฐ์ ๋์ ๊ฐ์ ๋ํด assert๋ฅผ ์ ๋ ฅํ๋ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ์ต๋๋ค. ๊ทธ๊ฒ์ ๋๋ฌด ๋ง์ ์ ์ด๊ณ ๊ทธ๊ฒ์ ํ์ฉํ๋ ์ด์ ๋ ์ฝ๋ ์์ฑ์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ๊ณต๋ฉ๋๋ค.
Edit2: ์ ํ์ด ๋ค๋ฅธ ํจํค์ง์ ์ ์๋์ด ์์ ๋ ํ๋ ์ด๋ฆ์ด ์ด์ค์ ๋ฐ ์ค์์น์ ํจ๊ป ์๋ํ๋ ๋ฐฉ์์ ๋ช ํํ ํ์ต๋๋ค.
Edit3: ์ ํ๋ ์๋ฒ ๋ฉ ๋ฐ ๋ช ํํ ์์์ ํ๋ ์ด๋ฆ
Edit4: ์ค์์น์์ ๊ธฐ๋ณธ๊ฐ์ ๋ช ํํ ํฉ๋๋ค.
์ ํ์ ๊ตฌ์กฐ์ฒด์ ๊ตฌ๋ฌธ์ ์ผ๋ก ์ ์ฌํ ๋ณตํฉ ์ ํ์ ๋๋ค.
pick {
A, B S
C, D T
E U "a pick tag"
}
์์ A
, B
, C
, D
, E
๋ ์ ํ์ ํ๋ ์ด๋ฆ์ด๊ณ S
, T
๋ฐ U
๋ ํด๋น ํ๋์ ์ ํ์
๋๋ค. ํ๋ ์ด๋ฆ์ ๋ด๋ณด๋ด๊ฑฐ๋ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.
์ ํ์ ๊ฐ์ ์ง์ ์์ด ์ฌ๊ท์ ์ด์ง ์์ ์ ์์ต๋๋ค.
ํฉ๋ฒ์ ์ธ
type p pick {
//...
p *p
}
๋ถ๋ฒ์ ์ธ
type p pick {
//...
p p
}
์ ํ์ ๋ํ ํฌํจ์ ์์ง๋ง ์ ํ์ ๊ตฌ์กฐ์ฒด์ ํฌํจ๋ ์ ์์ต๋๋ค. ์ ํ์ด ๊ตฌ์กฐ์ฒด์ ํฌํจ๋ ๊ฒฝ์ฐ ์ ํ์ ๋ฉ์๋๋ ๊ตฌ์กฐ์ฒด๋ก ์น๊ฒฉ๋์ง๋ง ์ ํ์ ํ๋๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
ํ๋ ์ด๋ฆ์ด ์๋ ์ ํ์ ์ ํ๊ณผ ์ด๋ฆ์ด ๊ฐ์ ํ๋๋ฅผ ์ ์ํ๊ธฐ ์ํ ์ถ์ฝํ์
๋๋ค. (์ด๋ฆ์ด T
*T
์์ธ๋ฅผ ์ ์ธํ๊ณ ์ ํ์ด ๋ช
๋ช
๋์ง ์์ ๊ฒฝ์ฐ ์ค๋ฅ์
๋๋ค.)
์๋ฅผ ๋ค์ด,
type p pick {
io.Reader
io.Writer
string
}
์๋ ๊ฐ๊ฐ์ ์ ํ๊ณผ ํจ๊ป Reader
, Writer
๋ฐ string
์ธ ๊ฐ์ ํ๋๊ฐ ์์ต๋๋ค. string
ํ๋๋ ์ ๋๋ฒ์ค ๋ฒ์์ ์์ด๋ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.
์ ํ ์ ํ์ ๊ฐ์ ๋์ ํ๋์ ํด๋น ํ๋์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
์ ํ ์ ํ์ 0 ๊ฐ์ ์์ค ์์์ ์ฒซ ๋ฒ์งธ ํ๋์ด๋ฉฐ ํด๋น ํ๋์ 0 ๊ฐ์ ๋๋ค.
๋์ผํ ์ ํ ์ ํ์ ๋ ๊ฐ์ธ a
๋ฐ b
์ฃผ์ด์ง๋ฉด ์ ํ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ํ ๋น๋ ์ ์์ต๋๋ค.
a = b
์ ํ์ ํ๋ ์ ํ ์ค ํ๋๋ผ๋ ์ ํํ์ง ์์ ๊ฐ์ ํ ๋นํ๋ ๊ฒ์ ๋ถ๋ฒ์ ๋๋ค.
์ ํ ์ ํ์๋ ์ฃผ์ด์ง ์๊ฐ์ ํ๋์ ๋์ ํ๋๋ง ์์ต๋๋ค.
๋ณตํฉ ๋ฆฌํฐ๋ด ๊ตฌ๋ฌธ์ ๊ตฌ์กฐ์ฒด์ ์ ์ฌํ์ง๋ง ์ถ๊ฐ ์ ํ ์ฌํญ์ด ์์ต๋๋ค. ์ฆ, ํค๊ฐ ์๋ ๋ฆฌํฐ๋ด์ ํญ์ ์ ํจํ์ง ์์ผ๋ฉฐ ํ๋์ ํค๋ง ์ง์ ํ ์ ์์ต๋๋ค.
๋ค์์ด ์ ํจํฉ๋๋ค.
pick{A string; B int}{A: "string"} //value is (B, "string")
pick{A, B int}{B: 1} //value is (B, 1)
pick{A, B string}{} //value is (A, "")
๋ค์์ ์ปดํ์ผ ์๊ฐ ์ค๋ฅ์ ๋๋ค.
pick{A int; B string}{A: 1, B: "string"} //a pick can only have one value at a time
pick{A int; B uint}{1} //pick composite literals must be keyed
pick {A int; B string}
์ ํ์ p
๊ฐ์ด ์ฃผ์ด์ง๋ฉด ๋ค์ ํ ๋น
p.B = "hi"
p
์ ๋์ ํ๋๋ฅผ B
ํ๊ณ B
์ ๊ฐ์ "hi"๋ก ์ค์ ํฉ๋๋ค.
ํ์ฌ ๋์ ํ๋์ ํ ๋นํ๋ฉด ํด๋น ํ๋์ ๊ฐ์ด ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์ ๋์ ํ๋๋ฅผ ์ค์ ํ๋ ํ ๋น์ ์ง์ ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ 0์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค. ์ ํ ํ๋์ ์ ํ ๋๋ ๊ตฌ์กฐ์ฒด ํ๋์ ๋ํ ํ ๋น์ ํ์์ ๋ฐ๋ผ ๋์ ํ๋๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ค์ ํฉ๋๋ค.
type P pick {
A, B image.Point
}
var p P
fmt.Println(P) //{A: {0 0}}
p.A.X = 1 //A is the dynamic field, update
fmt.Println(P) //{A: {1 0}}
p.B.Y = 2 //B is not the dynamic value, create zero image.Point first
fmt.Println(P) //{B: {0 2}}
์ ํ์ ์๋ ๊ฐ์ ํ๋ ์ด์ค์ ๋๋ ํ๋ ์ค์์น๋ก๋ง ์ก์ธ์คํ ์ ์์ต๋๋ค.
x := p.[X] //panics if X is not the dynamic field of p
x, ok := p.[X] //returns the zero value of X and false if X is not the dynamic field of p
switch v := p.[var] {
case A:
case B, C: // v is only defined in this case if fields B and C have identical type names
case D:
default: // always legal even if all fields are exhaustively listed above
}
ํ๋ ์ด์ค์
๋ฐ ํ๋ ์ค์์น์ ํ๋ ์ด๋ฆ์ ์ ์๋ ํจํค์ง๊ฐ ์๋๋ผ ์ ํ์ ์์ฑ์
๋๋ค. pick
๋ฅผ ์ ์ํ๋ ํจํค์ง ์ด๋ฆ์ผ๋ก ๊ท์ ๋์ง ์์ผ๋ฉฐ ๊ท์ ๋ ์๋ ์์ต๋๋ค.
์ด๊ฒ์ ์ ํจํฉ๋๋ค:
_, ok := externalPackage.ReturnsPick().[Field]
์ด๊ฒ์ ์ ํจํ์ง ์์ต๋๋ค:
_, ok := externalPackage.ReturnsPick().[externalPackage.Field]
ํ๋ ์ด์ค์ ๋ฐ ํ๋ ์ ํ์ ํญ์ ๋์ ํ๋ ๊ฐ์ ๋ณต์ฌ๋ณธ์ ๋ฐํํฉ๋๋ค.
๋ด๋ณด๋ด์ง ์์ ํ๋ ์ด๋ฆ์ ์ ์ ํจํค์ง์์๋ง ์ฃผ์ฅํ ์ ์์ต๋๋ค.
์ ํ ์ด์ค์
๋ฐ ์ ํ ์ค์์น๋ ์ ํ์์๋ ์๋ํฉ๋๋ค.
//removed, see note at top
//v, ok := p.(fmt.Stringer) //holds if the type of the dynamic field implements fmt.Stringer
//v, ok := p.(int) //holds if the type of the dynamic field is an int
์ ํ ์ด์ค์
๋ฐ ์ ํ ์ค์์น๋ ํญ์ ๋์ ํ๋ ๊ฐ์ ๋ณต์ฌ๋ณธ์ ๋ฐํํฉ๋๋ค.
์ ํ์ด ์ธํฐํ์ด์ค์ ์ ์ฅ๋ ๊ฒฝ์ฐ ์ธํฐํ์ด์ค์ ๋ํ ์ ํ ์ด์ค์ ์ ์ ํ ์์ฒด์ ๋ฉ์๋ ์ธํธ์๋ง ์ผ์นํฉ๋๋ค. [์ฌ์ ํ ์ฌ์ค์ด์ง๋ง ์์ ๋ด์ฉ์ด ์ ๊ฑฐ๋์์ผ๋ฏ๋ก ์ค๋ณต๋จ]
๋ชจ๋ ์ ํ์ ์ ํ์ด ๊ฐ์ ์ฐ์ฐ์๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ ๋ค์์ ์ํํฉ๋๋ค.
==
๊ทธ๋ค์ ๊ฐ์ ๋์ ํ๋๊ฐ ๊ทธ ๊ฐ์ ๊ฒฝ์ฐ ==
==
๊ฒฝ์ฐ์๋ ๋์ ํ๋๊ฐ ๋ค๋ฅธ ๋ ๊ฐ์ !=
==
์
๋๋ค.์ ํ ์ ํ์ ๊ฐ์๋ ๋ค๋ฅธ ์ฐ์ฐ์๊ฐ ์ง์๋์ง ์์ต๋๋ค.
ํฝ ํ์
์ ๊ฐ P
๋ค๋ฅธ ์ ํ ์ ํ์ผ๋ก ๋ณํ ํ ์ ์์ต๋๋ค Q
ํ๋ ์ด๋ฆ์ ์ธํธ์ ํด๋น ์ ํ IFF์ P
ํ๋ ์ด๋ฆ๊ณผ์ ํ์ ์งํฉ์
๋๋ค ๊ทธ๋ค์ Q
์ ํ.
P
๋ฐ Q
๊ฐ ๋ค๋ฅธ ํจํค์ง์ ์ ์๋์ด ์๊ณ ๋ด๋ณด๋ด์ง ์์ ํ๋๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ํ๋๋ ์ด๋ฆ ๋ฐ ์ ํ์ ๊ด๊ณ์์ด ๋ค๋ฅธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์:
type P pick {A int; B string}
type Q pick {B string; A int; C float64}
//legal
var p P
q := Q(p)
//illegal
var q Q
p := P(Q) //cannot handle field C
๋ ์ ํ ์ ํ ๊ฐ์ ์ง์ ๊ฐ๋ฅ์ฑ์ ์ ํ ์ค ํ๋๋ง ์ ์๋๋ ํ ๋ณํ ๊ฐ๋ฅ์ฑ์ผ๋ก ์ ์๋ฉ๋๋ค.
๋ฉ์๋๋ ์ ์๋ ์ ํ ์ ํ์ ์ ์ธ๋ ์ ์์ต๋๋ค.
https://gist.github.com/jimmyfrasche/ba2b709cdc390585ba8c43c989797325 ๊ฒฝํ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๊ณ ์ํค์ ์ถ๊ฐํ์ต๋๋ค.
Edit: and :heart: @mewmew ์๊ฒ ๊ทธ ์์ ์ ๋ํ ๋ต๊ธ๋ก ํจ์ฌ ๋ ์ข๊ณ ์์ธํ ๋ณด๊ณ ์๋ฅผ ๋จ๊ฒผ์ต๋๋ค.
T
์ ํ์ ๋ํด T
์ ํ์ผ๋ก ๋ณํํ๊ฑฐ๋ T
์ ํ์ ๋ณ์์ ํ ๋นํ ์ ์๋ ์ ํ ๋ชฉ๋ก์ ๋งํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์ด๋จ๊น์? ์๋ฅผ ๋ค์ด
type T interface{} restrict { string, error }
ํ ๋น๋ ์ ์๋ ์ ์ผํ ์ ํ์ด string
๋๋ error
๊ฐ ๋๋๋ก T
๋ผ๋ ๋น ์ธํฐํ์ด์ค ์ ํ์ ์ ์ํฉ๋๋ค. ๋ค๋ฅธ ์ ํ์ ๊ฐ์ ํ ๋นํ๋ ค๊ณ ํ๋ฉด ์ปดํ์ผ ์๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด์ ๋งํ ์ ์๋ค
func FindOrFail(m map[int]string, key int) T {
if v, ok := m[key]; ok {
return v
}
return errors.New("no such key")
}
func Lookup() {
v := FindOrFail(m, key)
if err, ok := v.(error); ok {
log.Fatal(err)
}
s := v.(string) // This type assertion must succeed.
}
ํฉ๊ณ ์ ํ(๋๋ ์ ํ ์ ํ)์ ์ด๋ค ํต์ฌ ์์๊ฐ ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์ถฉ์กฑ๋์ง ์์ต๋๊น?
s := v.(string) // This type assertion must succeed.
v
๋ nil
์ผ ์ ์์ผ๋ฏ๋ก ์ด๊ฒ์ ์๋ฐํ ๋งํ๋ฉด ์ฌ์ค์ด ์๋๋๋ค. ์ด ๊ฐ๋ฅ์ฑ์ ์ ๊ฑฐํ๋ ค๋ฉด ์ธ์ด๋ฅผ ์๋นํ ํฌ๊ฒ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ๊ฐ์ด 0์ด ์๋ ์ ํ๊ณผ ์๋ฐ๋๋ ๋ชจ๋ ๊ฒ์ ๋์
ํ๋ ๊ฒ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์
๋๋ค. 0 ๊ฐ์ ์ธ์ด์ ์ผ๋ถ๋ฅผ ๋จ์ํํ์ง๋ง ์ด๋ฌํ ์ข
๋ฅ์ ๊ธฐ๋ฅ์ ๋์์ธํ๋ ๊ฒ๋ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
ํฅ๋ฏธ๋กญ๊ฒ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ @rogpeppe ์ ์๋ ์ ์๊ณผ ์๋นํ ์ ์ฌํฉ๋๋ค. ์ฌ๊ธฐ์ ์๋ ๊ฒ์ ๋์ด๋ ์ ํ์ ๋ํ ๊ฐ์ ๋ณํ์ผ๋ก, ์์ ์ง์ ํ ๊ฒ๊ณผ ๊ฐ์ ์ํฉ์์ ์ ์ฉํ ์ ์์ต๋๋ค( http.Handler
). ๋ ๋ค๋ฅธ ์ ์ ๋ณํ์ด ๊ณ ์ ํ ํ๊ทธ๊ฐ ์๋ ์ ํ์ผ๋ก ๊ตฌ๋ถ๋๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ณํ์ด ๊ณ ์ ํ ์ ํ์ด์ด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์๊ฒฉํ๊ฒ ํํ์ด ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ์ง๋ง ์ผ๋ถ ์ฌ๋๋ค์ ๋ณํ ํ๊ทธ์ ์ ํ์ ๊ตฌ๋ณํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
@ianlancetaylor
ํ๋ก
๋จ์
A + B + C
๋ฅผ ์ง์ ํ๋ ์ค์ ๋ก๋ ์ ํ์ ์ฌ์ง๊ฐ ์๋ 1 + A + B + C
์
๋๋ค. ๋ด๊ฐ ์ด ์์
์ ํ๋ ๋์ @stevenblenkinsop์ด ์ง์ ํ๋ฏ์ด.p
๋๋ *p
ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ํธ๋ ์ด๋ ์คํ๋ฅผ ๋ ์ ์ ์ดํ ์ ์์ต๋๋ค. ์ต์ ํ๋ก ๊ตฌ๋ณ๋ ๊ณต์ฉ์ฒด(C ์๋ฏธ์์)๋ก ๊ตฌํํ ์ ์์ต๋๋ค.T
์ ๋ํ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์์ ๊ฒ์
๋๋ค. type T restrict {string, error}
io.Reader
๋ฅผ ๋ฃ๊ณ io.Writer
๊บผ๋ผ ์ ์์ต๋๋ค. ์ด๋ (๋ฌด์ ํ) ์ธํฐํ์ด์ค์๋ ์๋ฏธ๊ฐ ์์ง๋ง ํฉ๊ณ ์ ํ์๋ ์ ํฉํ์ง ์์ต๋๋ค.error
์ง์ ๊ฐ๋ฅํ ๊ฒ์ ์ง์ ํ ์ ์๋ค๋ ์๋ฏธ๋ก ์ฝ์ต๋๋ค. to T
๋ ์ ํํ ์ค๋ฅ์ฌ์ผ ํฉ๋๋ค.์ฆ, ์ฃผ์ ์์(๋ด๊ฐ ๋์ดํ ์ฒ์ ๋ ๊ฐ์ ์ฅ์ )๋ฅผ ํ์ธํ๊ณ ๊ทธ๊ฒ์ด ๋ด๊ฐ ์ป์ ์ ์๋ ์ ๋ถ๋ผ๋ฉด ์ฌ์ฅ ๋ฐ๋์ ๊ฑธ๋ฆด ๊ฒ์ ๋๋ค. ๊ทธ๋๋ ๋ ๋์์ง๊ธธ ๋ฐ๋๋๋ค.
์ ํ ์ด์ค์
๊ท์น์ด ์ ์ฉ๋์๋ค๊ณ ๊ฐ์ ํ์ต๋๋ค. ๋ฐ๋ผ์ ์ ํ์ ๊ตฌ์ฒด์ ์ธ ์ ํ๊ณผ ๋์ผํ๊ฑฐ๋ ์ธํฐํ์ด์ค ์ ํ์ ํ ๋นํ ์ ์์ด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐํ์ด์ค์ ๋๊ฐ์ด ์๋ํ์ง๋ง ๋ชจ๋ ๊ฐ( nil
์ ์ธ)์ ๋์ด๋ ์ ํ ์ค ํ๋ ์ด์์ ๋ํด ์ด์ค์
ํ ์ ์์ด์ผ ํฉ๋๋ค.
@jimmyfrasche
์
๋ฐ์ดํธ๋ ์ ์์์ ์ ํ์ ๋ชจ๋ ์์๊ฐ ๊ณ ์ ํ ์ ํ์ธ ๊ฒฝ์ฐ ๋ค์ ํ ๋น์ด ๊ฐ๋ฅํฉ๋๊น?
type p pick {
A int
B string
}
func Foo(P p) {
}
var P p = 42
var Q p = "foo"
Foo(42)
Foo("foo")
๊ทธ๋ฌํ ํ ๋น์ด ๊ฐ๋ฅํ ๋ sum ์ ํ์ ์ ์ฉ์ฑ์ ํจ์ฌ ๋ ํฝ๋๋ค.
์ ํ ์ ์์ ์ฌ์ฉํ๋ฉด
p
๋๋*p
ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ํธ๋ ์ด๋ ์คํ๋ฅผ ๋ ์ ์ ์ดํ ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค๊ฐ ์ค์นผ๋ผ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ํ ๋นํ๋ ์ด์ ๋ ๋ค๋ฅธ ๋จ์ด๊ฐ ํฌ์ธํฐ์ธ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ ํ ๋จ์ด๋ฅผ ์ฝ์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ํ ๋ก ์ #8405๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ๋์ผํ ๊ตฌํ ๊ณ ๋ ค ์ฌํญ์ด ์ ํ ์ ํ์ ์ ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ, ์ด๋ ์ค์ ๋ก p
๊ฒฐ๊ตญ ํ ๋น๋๊ณ ๋ก์ปฌ์ด ์๋์ ์๋ฏธํ ์ ์์ต๋๋ค.
@urandom ์๋์, ์ ์๊ฐ ์ฃผ์ด์ง๋ฉด ์์ฑํด์ผ ํ ๊ฒ์ ๋๋ค.
var p P = P{A: 42} // p := P{A: 42}
var q P = P{B: "foo")
Foo(P{A: 42}) // or Foo({A: 42}) if types can be elided here
Foo(P{B: "foo"})
ํ ๋ฒ์ ํ๋์ ํ๋๋ง ์ค์ ํ ์ ์๋ ๊ตฌ์กฐ์ฒด๋ก ์๊ฐํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
๊ทธ๊ฒ์ด ์์ผ๋ฉด C uint
๋ฅผ p
ํ๋ฉด p = 42
์ด๋ป๊ฒ ๋ฉ๋๊น?
์์์ ํ ๋น ๊ฐ๋ฅ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ๋ง์ ๊ท์น์ ๋ง๋ค ์ ์์ง๋ง ํญ์ ์ ํ ์ ์์ ๋ณ๊ฒฝ์ด ํด๋น ์ ํ์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฝ๋์ ๋ฏธ๋ฌํ๊ณ ๊ทน์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์์ ์๋ฏธํฉ๋๋ค.
๊ฐ์ฅ ์ข์ ๊ฒฝ์ฐ ๋ณ๊ฒฝ์ ๋ชจํธ์ฑ ๋ถ์กฑ์ ์์กดํ๋ ๋ชจ๋ ์ฝ๋๋ฅผ ์ค๋จํ๊ณ ๋ค์ ์ปดํ์ผํ๊ธฐ ์ ์ p = int(42)
๋๋ p = uint(42)
๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค๊ณ ๋งํฉ๋๋ค. ํ ์ค ๋ณ๊ฒฝ์ผ๋ก ๋ฐฑ ์ค์ ์์ ํ ํ์๋ ์์ต๋๋ค. ํนํ ํด๋น ์ค์ด ์ฝ๋์ ๋ฐ๋ผ ์ฌ๋๋ค์ ํจํค์ง์ ์๋ ๊ฒฝ์ฐ.
100% ๋ ธ๊ณจ์ ์ด๊ฑฐ๋ ๋ชจ๋ ๊ฒ์ ๊นจ๋จ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ ๋ง์ง ์ ์๋ ๋งค์ฐ ์ทจ์ฝํ ์ ํ์ด์ด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ๋ชจ๋ ํฉ๊ณ ์ ํ ์ ์์ ์ ์ฉ๋์ง๋ง ๋ช ์์ ๋ ์ด๋ธ์ด ์๋ ๊ฒฝ์ฐ ๋ ์ด๋ธ์ด ํ ๋น๋๋ ์ ํ์ ๋ํด ๋ช ์์ ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ํ ๋น ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
@josharian ๊ทธ๋์ ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฝ๊ณ ์๋ค๋ฉด iface๊ฐ ์ด์ ์ Go๊ฐ ํ๋ ๊ฒ์ฒ๋ผ ๋ ๋ฒ์งธ ํ๋์ ๋จ์ด ํฌ๊ธฐ ๊ฐ์ ์จ๊ธฐ๋ ๋์ ํญ์ (*type, *value)
์ธ ์ด์ ๋ ๋์ GC๊ฐ ๋ ๊ฐ์ง ๋ชจ๋๋ฅผ ๊ฒ์ฌํ ํ์๊ฐ ์๋๋ก ํ๊ธฐ ์ํจ์
๋๋ค ๋ ๋ฒ์งธ ํ๋๊ฐ ํฌ์ธํฐ์ธ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ์ํด ํ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํญ์ ํฌ์ธํฐ๋ผ๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๋ด๊ฐ ๋ง์์ด?
์ฆ, ์ ํ ์ ํ์ด ๋ค์๊ณผ ๊ฐ์ด (C ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ) ๊ตฌํ๋ ๊ฒฝ์ฐ
struct {
int which;
union {
A a;
B b;
C c;
} summands;
}
GC๋ summands
๋ฅผ ์ค์บํด์ผ ํ๋์ง ๊ฒฐ์ ํ๊ธฐ ์ํด which
๋ฅผ ๊ฒ์ฌํ๊ธฐ ์ํด ์ ๊ธ(๋๋ ํ๋ คํ์ง๋ง ์ด์ ๋๋ฑํ ๊ฒ)์ ํด์ผ ํฉ๋๋ค.
iface๊ฐ Go๊ฐ ์ด์ ์ ํ๋ ๊ฒ์ฒ๋ผ ๋ ๋ฒ์งธ ํ๋์ ๋จ์ด ํฌ๊ธฐ ๊ฐ์ ์จ๊ธฐ๋ ๋์ ํญ์ (*type, *value)์ธ ์ด์ ๋ ๋์ GC๊ฐ ๋ ๋ฒ์งธ ํ๋๊ฐ ํฌ์ธํฐ์ธ์ง ํ์ธํ๊ธฐ ์ํด ๋ ํ๋๋ฅผ ๋ชจ๋ ๊ฒ์ฌํ ํ์๊ฐ ์๋๋ก ํ๊ธฐ ์ํด์์ ๋๋ค. - ํญ์ ๊ทธ๋ ๋ค๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ข์์.
๋ฌผ๋ก ์ ํ ์ ํ์ ์ ํ๋ ํน์ฑ์ผ๋ก ์ธํด ์ผ๋ถ ๋์ฒด ๊ตฌํ์ด ํ์ฉ๋ฉ๋๋ค. ์ ํ ์ ํ์ ํญ์ ์ผ๊ด๋ ํฌ์ธํฐ/๋นํฌ์ธํฐ ํจํด์ด ์๋๋ก ๋ฐฐ์น๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋ ์ค์นผ๋ผ ์ ํ์ ๊ฒน์น ์ ์๊ณ ๋ฌธ์์ด ํ๋๋ ์ฌ๋ผ์ด์ค ํ๋์ ์์๊ณผ ๊ฒน์น ์ ์์ต๋๋ค(๋ ๋ค "ํฌ์ธํฐ, ๋นํฌ์ธํฐ"๋ก ์์ํ๊ธฐ ๋๋ฌธ์). ๊ทธ๋์
pick {
a uintptr
b string
c []byte
}
๋๋ต์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ ์ ์์ต๋๋ค.
[ word 1 (ptr) ] [ word 2 (non-ptr) ] [ word 3 (non-ptr) ]
[ <nil> ] [ a ] [ ]
[ b.ptr ] [ b.len ] [ ]
[ c.ptr ] [ c.len ] [ c.cap ]
๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ ํ ์ ํ์ ์ด๋ฌํ ์ต์ ์ ํฌ์ฅ์ ํ์ฉํ์ง ์์ ์ ์์ต๋๋ค. (๊นจ์ง ASCII์ ๋ํด ์ ๊ฐ์ ๋๋ค. GitHub๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋งํ๋๋ก ํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ ์ ์ดํดํ์ จ์ผ๋ฉด ํฉ๋๋ค.)
์ ์ ๋ ์ด์์์ ์ํํ๋ ์ด ๊ธฐ๋ฅ์ ์ ํ ์ ํ์ ํฌํจํ๋ ๊ฒ์ ์ ํธํ๋ ์ฑ๋ฅ ์ธ์์ผ ์๋ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ด ๋ชฉํ๋ ๋จ์ํ ๊ด๋ จ ๊ตฌํ ์ธ๋ถ ์ ๋ณด์ ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ ๊ฒ์ ๋๋ค.
@josharian ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ์ง ์์์ต๋๋ค. (์์งํ ๋๋ GC๋ฅผ ๊ตฌ๋ณํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ฐ๊ตฌ๊ฐ ์๋์ง ๊ตฌ๊ธ๋งํ๊ณ , ๋น์ ์ด ๊ทธ๋ ๊ฒ ํ ์ ์๋ค๋ ๊ฒ์ ์์๊ณ ๊ทธ๊ฒ์ ํ๋ฃจ๋ผ๊ณ ๋ถ๋ ์ต๋๋ค. ์ด๋ค ์ด์ ์์์ธ์ง ๋ด ๋๋๋ "๋์์ฑ"์ ์ฐ๊ด์ํค์ง ์์์ต๋๋ค. ๊ทธ๋ "๊ฐ๊ธฐ"์ ํจ๊ป: facepalm!).
์ ํ ์ค ํ๋๊ฐ ์ด๋ฏธ ๋ ์ด์์์ด ์๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํ๋ค๋ฉด ์ ํ์ ํญ์ด ์ค์ด๋ค ๊ฒ์ ๋๋ค.
ํ ๊ฐ์ง ์ต์ ์ ํฌ๊ธฐ๊ฐ ๋๋ฑํ ๊ตฌ์กฐ์ฒด(ํ๋ณ์ int์ ๊ฒฝ์ฐ + 1)์ ๋์ผํจ์ ์๋ฏธํ๋ ํฌ์ธํฐ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ summands๋ฅผ "์์ถ"ํ์ง ์๋ ๊ฒ์ ๋๋ค. ๊ฐ๋ฅํ๋ฉด ๋ ์ด์์์ ๊ณต์ ํ ์ ์๋ ๋ชจ๋ ์ ํ์ด ์ํํ ์ ์๋๋ก ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์์ ์ทจํ ์ ์์ต๋๋ค.
์ข์ ํฌ๊ธฐ ์์ฑ์ ์๋ ๊ฒ์ ๋ถ๋๋ฌ์ด ์ผ์ด์ง๋ง ์ค์ ๋ก๋ ์ต์ ํ์ผ ๋ฟ์ ๋๋ค.
ํฌ์ธํฐ๊ฐ ํฌํจ๋์ง ์์ ๊ฒฝ์ฐ์๋ ํญ์ 1 + ํด๋น ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ๋ผ๊ณ ํด๋ ํ ๋น์ ๋ํ ์ ์ด๋ฅผ ํฌํจํ์ฌ ํ์ ์์ฒด์ ๋ค๋ฅธ ๋ชจ๋ ์ข์ ์์ฑ์ด ์์ต๋๋ค. ์ถ๊ฐ ์ต์ ํ๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ถ๊ฐ๋ ์ ์์ผ๋ฉฐ ์ ์ด๋ ๊ทํ๊ฐ ์ง์ ํ ๋๋ก ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
type p pick {
A int
B string
}
A์ B๊ฐ ์์ด์ผ ํฉ๋๊น? ์ ํ์ ์ ํ ์งํฉ์์ ์ ํํ๋ฏ๋ก ์๋ณ์ ์ด๋ฆ์ ์์ ํ ์ญ์ ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
type p pick {
int
string
}
q := p{string: "hello"}
๋๋ ์ด ํ์์ด ์ด๋ฏธ ๊ตฌ์กฐ์ฒด์ ์ ํจํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ํ์ ํ์ํ๋ค๋ ์ ์ฝ์ด ์์ ์ ์์ต๋๋ค.
@as ํ๋ ์ด๋ฆ์ด ์๋ต๋๋ฉด ์ ํ๊ณผ ๋์ผํ๋ฏ๋ก ์์ ๊ฐ ์๋ํ์ง๋ง ํด๋น ํ๋ ์ด๋ฆ์
์ ํ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ์์์ ์ผ๋ก ์์ฑ๋๊ฑฐ๋ ํ ๋น ๊ฐ๋ฅ์ฑ ๋ฐ ์ธํฐํ์ด์ค ์ ํ๊ณผ์ ์๋ชป๋ ์ํธ ์์ฉ์ด ์๋ ๊ฒฝ์ฐ์๋ ํ๋ ์ด๋ฆ์ด ์์ด์ผ ํฉ๋๋ค. ํ๋ ์ด๋ฆ์ Go์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ์๋ํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค.
@ ์ฃ์กํ์ง๋ง ๋น์ ์ด ๋ด๊ฐ ์ฝ์ ๊ฒ๊ณผ ๋ค๋ฅธ ๊ฒ์ ์๋ฏธํ๋ค๋ ๊ฒ์ ๋ฐฉ๊ธ ๊นจ๋ฌ์์ต๋๋ค.
๊ณต์์ ์๋ํ์ง๋ง ๊ตฌ์กฐ์ฒด ํ๋์ฒ๋ผ ๋ณด์ด์ง๋ง ์ผ๋ฐ์ ์ธ ๋ด๋ณด๋ด๊ธฐ/๋ด๋ณด๋ด์ง ์์ ํญ๋ชฉ์ผ๋ก ์ธํด ๋ค๋ฅด๊ฒ ๋์ํ๋ ํญ๋ชฉ์ด ์์ต๋๋ค.
์ ๋๋ฒ์ค์ ์๊ธฐ ๋๋ฌธ์ p
์ ์ํ๋ ํจํค์ง ์ธ๋ถ์์ ๋ฌธ์์ด์ ์ก์ธ์คํ ์ ์์ต๋๊น?
์ด๊ฑด ์ด๋ค๊ฐ์
type t struct {}
type P pick {
t
//other stuff
}
?
์ ํ ์ด๋ฆ์์ ํ๋ ์ด๋ฆ์ ๋ถ๋ฆฌํ์ฌ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
pick {
unexported Exported
Exported unexported
}
๋๋
pick { Recoverable, Fatal error }
์ ํ ํ๋๊ฐ ๊ตฌ์กฐ์ฒด ํ๋์ฒ๋ผ ๋์ํ๋ฉด ๊ตฌ์กฐ์ฒด ํ๋์ ๋ํด ์ด๋ฏธ ์๊ณ ์๋ ๋ง์ ๊ฒ์ ์ ํ ํ๋์ ๋ํด ์๊ฐํ ์ ์์ต๋๋ค. ์ ์ผํ ์ค์ ์ฐจ์ด์ ์ ํ ๋ฒ์ ํ๋๋ง ์ ํํ ์ ์๋ ํ๋๋ฅผ ์ค์ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
@jimmyfrasche
Go๋ ์ด๋ฏธ ๊ตฌ์กฐ์ฒด ๋ด๋ถ์ ์ต๋ช
์ ํ์ ํฌํจํ๋ ๊ฒ์ ์ง์ํ๋ฏ๋ก ๋ฒ์ ์ ํ์ ์ธ์ด์ ์ด๋ฏธ ์กด์ฌํ๋ ์ ํ์ด๋ฉฐ ์ ํ ๋ณ์นญ์ผ๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๋ฅํ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์๊ฐํ์ง ์์๋ค๋ ๊ฒ์ ์ธ์ ํฉ๋๋ค. ์ด ๊ด์ฉ๊ตฌ๊ฐ Go์์ ์ผ๋ฐ์ ์ธ์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๊ฒ ๊ฐ์ต๋๋ค.
package p
type T struct{
Exported t
}
type t struct{}
์์ _t_๋ ํฐ T์ ํฌํจ๋ ํจํค์ง์ ์กด์ฌํ๋ฉฐ ์ด๋ฌํ ๋ด๋ณด๋ธ ์ ํ์ ํตํด์๋ง ๋ ธ์ถ๋ฉ๋๋ค.
@๊ฐ์ด
๊ทธ๋ฌ๋ ๋ด๊ฐ ์์ ํ ๋ฐ๋ฅด๊ณ ์๋์ง ํ์ ํ ์ ์์ต๋๋ค.
//with the option to have field names
pick { //T is in the namespace of the pick and the type isn't exposed to other packages
T t
//...
}
//without
type T = t //T has to be defined in the outer scope and now t is exposed to other packages
pick {
T
//...
}
๋ํ ๋ ์ด๋ธ์ ์ ํ ์ด๋ฆ๋ง ์๋ ๊ฒฝ์ฐ []string
ํ๋ ค๋ฉด type Strings = []string
๋ฅผ ์ํํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐ ๊ตฌํํ ์ ํ ์ ํ์ ๋ณด๊ณ ์ถ์ ๋ฐฉ์์
๋๋ค. ์
ํนํ Rust์ C++(์ฑ๋ฅ์ ๋ํ ํฉ๊ธ ํ์ค)๊ฐ ์ํํ๋ ๋ฐฉ์์
๋๋ค.
๊ทธ๊ฒ.
์ฒ ์ ํ ๊ฒ์ฌ๋ฅผ ์ํ๋ฉด ๊ฒ์ฌ๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ํด์
์ฑ๋ฅ ์น๋ฆฌ. ์ฆ, ์ ํ ์ ํ๋ nil์ด ๋ ์ ์์ต๋๋ค.
์ ํ ์์์ ๊ตฌ์ฑ์ ์ฃผ์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ํ์ฉ๋์ง ์์์ผ ํฉ๋๋ค(
๋จ์ผ ์ค๋ ๋์ ๊ฒฝ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ ํ์ง ์์ต๋๋ค.
๋ฌ์คํธ ์ปค๋ฎค๋ํฐ.). ์ ํ ์ ํ์ ๋ํ ๋ค๋ฅธ ์ ํ์ด ํ์ํ ๊ฒฝ์ฐ
๊ทธ๋ฌ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ํ ์ ํ์ด ํญ์ ํ์ ํ ๋น๋๋ ๊ฒฝ์ฐ
๋์ ๊ฒ์
๋๋ค.
2017๋ 8์ 18์ผ ์คํ 12์ 1๋ถ์ "jimmyfrasche" [email protected]์ด ์์ฑํ์ต๋๋ค.
@josharian https://github.com/josharian ๊ทธ๋์ ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฝ๊ณ ์๋ค๋ฉด
iface๊ฐ ์ด์ ์จ๊น ๋์ ํญ์ (*type, *value)์ธ ์ด์
Go๊ฐ ์ด์ ์ ํ๋ ๊ฒ์ฒ๋ผ ๋ ๋ฒ์งธ ํ๋์ ๋จ์ด ํฌ๊ธฐ ๊ฐ์
๋์ GC๋ ๋ ๋ฒ์งธ ํ๋๋ฅผ ํ์ธํ๊ธฐ ์ํด ๋ ํ๋๋ฅผ ๋ชจ๋ ๊ฒ์ฌํ ํ์๊ฐ ์์ต๋๋ค.
ํฌ์ธํฐ์
๋๋ค. ํญ์ ๊ทธ๋ ๋ค๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๋ด๊ฐ ๋ง์์ด?
์ฆ, ์ ํ ์ ํ์ด ๋ค์๊ณผ ๊ฐ์ด (C ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ) ๊ตฌํ๋ ๊ฒฝ์ฐ
๊ตฌ์กฐ์ฒด {
์ ์;
์กฐํฉ {
์์ด;
ใดใด;
์จ์จ;
} ๋ช
๋ น;
}
GC๋ ์ ๊ธ(๋๋ ๋ฉ์ง์ง๋ง ๋๋ฑํ ๊ฒ)์ ์ทจํด์ผ ํฉ๋๋ค.
summands๋ฅผ ์ค์บํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ด๋ ๊ฒ์ ๊ฒ์ฌํฉ๋๊น?
โ
์ค๋ ๋๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๋ ๊ฒ์
๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/19412#issuecomment-323393003 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe-auth/AGGWB3Ayi31dYwotewcfgmCQL-XVrfxIks5sZbVrgaJpZM4MTmSr
.
@DemiMarie
Pick ์์์ ๊ตฌ์ฑ์ ์ฃผ์๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ํ์ฉ๋์ง ์์์ผ ํฉ๋๋ค(Rust ์ปค๋ฎค๋ํฐ์์ ์ ์๋ ค์ง ๊ฒ์ฒ๋ผ ๋จ์ผ ์ค๋ ๋์ ๊ฒฝ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ ํ์ง ์์ต๋๋ค.). ์ ํ ์ ํ์ ๋ํ ๋ค๋ฅธ ์ ํ์ด ํ์ํ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
๊ทธ๊ฑด ์ข์ ์ง์ ์ด์ผ. ๋๋ ๊ฑฐ๊ธฐ์ ๊ทธ๊ฒ์ ๊ฐ์ง๊ณ ์์์ง๋ง ํธ์ง์์ ์์ด ๋ฒ๋ ธ์ ๊ฒ์ ๋๋ค. ๋๋ ์ ํ์์ ๊ฐ์ ์ก์ธ์คํ ๋ ํญ์ ๊ฐ์ ์ด์ ๋ก ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ค๋ ๊ฒ์ ํฌํจํ์ต๋๋ค.
๊ทธ๊ฒ์ด ์ฌ์ค์ธ ์ด์ ์ ์๋ก ํ์์ ์ํด ๋ค์์ ๊ณ ๋ คํ์ญ์์ค.
v := pick{ A int; B bool }{A: 5}
p := &v.[A] //(this would be illegal but pretending it's not for a second)
v.B = true
v
ํ๋๊ฐ A
๋ฐ B
๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋์ผํ ์์น๋ฅผ ์ฐจ์งํ๋๋ก ์ต์ ํ๋ ๊ฒฝ์ฐ p
๋ int๋ฅผ ๊ฐ๋ฆฌํค์ง ์์ต๋๋ค. ๋ถ์ธ์. ๋ฉ๋ชจ๋ฆฌ ์์ ์ด ์๋ฐ๋์์ต๋๋ค.
@jimmyfrasche
๋ด์ฉ์ ์ฃผ์ ์ง์ ํ์ง ์์ผ๋ ค๋ ๋ ๋ฒ์งธ ์ด์ ๋ ๋์ฐ๋ณ์ด ์๋ฏธ๋ก ์ ๋๋ค. ๊ฐ ์ด ํน์ ์ํฉ์์ ๊ฐ์ ์ ์ผ๋ก ์ ์ฅ๋๋ ๊ฒฝ์ฐ
v := pick{ A int; ... }{A: 5}
v2 := v
v2.[A] = 6 // (this would be illegal under the proposal, but would be
// permitted if `v2.[A]` were addressable)
fmt.Println(v.[A]) // would print 6 if the contents of the pick are stored indirectly
pick
๊ฐ ์ธํฐํ์ด์ค์ ์ ์ฌํ ํ ๊ณณ์ ๊ฐ์ ์ ์ฅํ๋ ๊ฒฝ์ฐ ๊ฐ ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ ์งํ๋ ค๋ ๊ฒ์
๋๋ค. ๋น์ ์ด ๊ตฌํ ์ธ๋ถ๋ก ์ฐํ๋ฅผํด์ผ ํ ์ ์์ต๋๋ค, ์ ์ผํ ์ต์
์ ์ฃผ์๊ฐ ์๋ ๋ด์ฉ์ ํ์ธํ๋ ๊ฒ์
๋๋ค (๋๋ ๋ ์ ํํ๊ฒ, mutably ์ฃผ์๋ฅผํ์ง๋ง, ์ฐจ์ด๋ ํ์ฌ ์ด๋์ ์กด์ฌํ์ง ์๋) ๋น์ ์ด ์จ๋ฆฌ์ด์ฑ์ ๊ด์ฐฐ ํ ์ ์์ ์ ๋๋ก, .
ํธ์ง: ์ฃ์กํฉ๋๋ค(์๋ ์ฐธ์กฐ)
@jimmyfrasche
์ ํ ์ ํ์ 0 ๊ฐ์ ์์ค ์์์ ์ฒซ ๋ฒ์งธ ํ๋์ด๋ฉฐ ํด๋น ํ๋์ 0 ๊ฐ์ ๋๋ค.
v.[A]
๋ฐ v.(error)
๊ฐ ์ฌ๋ฐ๋ฅธ ์์
์ ์ํํ๋๋ก 0 ๊ฐ์ ํน์ ์ผ์ด์ค๋ก ์ง์ ํ์ง ์๋ ํ ์ฒซ ๋ฒ์งธ ํ๋๋ฅผ ๊ฐ์ ์ ์ผ๋ก ์ ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์๋ํ์ง ์์ต๋๋ค.
@stevenblenkinsop "์ฒซ ๋ฒ์งธ ํ๋๋ฅผ ๊ฐ์ ์ ์ผ๋ก ์ ์ฅํด์ผ ํจ"์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ํ๋๊ฐ ํฌ์ธํฐ์ธ์ง ์์์ ์ผ๋ก ํฌ์ธํฐ๋ฅผ ํฌํจํ๋ ์ ํ์ธ์ง๋ฅผ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์๋์ ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ช ํํ ํด ์ฃผ์๊ฒ ์ต๋๊น?
์ฃผ์ด์ง
var p pick { A error; B int }
0 ๊ฐ p
์๋ ๋์ ํ๋ A
์๊ณ A
์ nil์
๋๋ค.
pick
์ ์ ์ฅ๋ ๊ฐ์ด ํฌ์ธํฐ๋ฅผ ํฌํจํ๋ ๊ฒ์ ๋งํ๋ ๊ฒ์ด ์๋๋ผ @josharian์ด ์ค๋ช
ํ ๋๋ก ๊ฐ๋น์ง ์์ง๊ธฐ์ ์ํด ๋ถ๊ณผ๋ ๋ ์ด์์ ์ ์ฝ์ผ๋ก ์ธํด ๊ฐ์ ์ ์ผ๋ก ์ ์ฅ๋๋ ํฌ์ธํฐ๊ฐ ์๋ ๊ฐ์ ์ธ๊ธํ ๊ฒ์
๋๋ค. .
๊ทํ์ ์์์ p.B
ํฌ์ธํฐ๊ฐ ์๋)๋ ๋ ๊ฐ์ ํฌ์ธํฐ๋ก ๊ตฌ์ฑ๋ p.A
์ ๊ฒน์น๋ ์คํ ๋ฆฌ์ง๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ๊ฐ์ ์ ์ผ๋ก ์ ์ฅํด์ผ ํ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค(์: *int
๊ฐ ์๋๋ผ ์ก์ธ์คํ ๋ ์๋์ผ๋ก ์ญ์ฐธ์กฐ๋๋ int
ํ์๋จ). p.B
๊ฐ ์ฒซ ๋ฒ์งธ ํ๋์ธ ๊ฒฝ์ฐ pick
์ 0 ๊ฐ์ new(int)
์ด๋ฉฐ ์ด๊ธฐํ๊ฐ ํ์ํ๋ฏ๋ก ํ์ฉ๋๋ 0 ๊ฐ์ด ์๋๋๋ค. nil *int
๊ฐ new(int)
๋ก ์ฒ๋ฆฌ๋๋๋ก ํน์ ์ผ์ด์ค๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
@jimmyfrasche
์ ์ฃ์กํฉ๋๋ค. ๋ํ๋ฅผ ๋ค์ ์ดํด๋ณด๋ฉด ํฌ์ธํฐ๊ฐ ์๋ ์ ํ์ ๊ฐ์ ์ ์ฅ ์ธํฐํ์ด์ค ๋ฉ์ปค๋์ฆ์ ๋ณต์ฌํ๋ ๋์ ์ธ์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ ํธํ๋์ง ์๋ ๋ ์ด์์์ ๋ณํ์ ์ ์ฅํ๋ ๊ฒ์ ๊ณ ๋ คํ๊ณ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ๋ด ๋ง์ง๋ง ์ธ ๊ฐ์ง ์๊ฒฌ์ ๊ทธ ๊ฒฝ์ฐ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
ํธ์ง: ์ด๋ฐ, ๊ฒฝ์ ์กฐ๊ฑด. ๊ฒ์ํ ํ ๊ทํ์ ๋๊ธ์ ๋ณด์์ต๋๋ค.
@stevenblenkinsop ์, ๋ง์ธ์ง ์๊ฒ ์ต๋๋ค . ํ์ง๋ง ๊ทธ๊ฑด ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๊ฒน์น๋ ์คํ ๋ฆฌ์ง๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ด ์ต์ ํ์ ๋๋ค. ์ ๋ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. ์ ํ์ ์๋ฏธ๊ฐ ์ค์ํ ๋ถ๋ถ์ ๋๋ค.
์ปดํ์ผ๋ฌ๊ฐ ์คํ ๋ฆฌ์ง๋ฅผ ์ต์ ํํ ์ ์๊ณ ๊ทธ๋ ๊ฒ ํ๊ธฐ๋ก ์ ํํ๋ค๋ฉด ์ข์ ๋ณด๋์ค์ ๋๋ค.
๊ทํ์ ์์์ ์ปดํ์ผ๋ฌ๋ ๋๋ฑํ ๊ตฌ์กฐ์ฒด(ํ์ฑ ํ๋๋ฅผ ์๊ธฐ ์ํด ํ๊ทธ ์ถ๊ฐ)์ ๋๊ฐ์ด ์ ์ฅํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฒ์ ๋๋ค
struct {
which_field int // 0 = A, 1 = B
A error
B int
}
0 ๊ฐ์ ์ฌ์ ํ โโ๋ชจ๋ ๋ฐ์ดํธ 0์ด๋ฉฐ ํน๋ณํ ๊ฒฝ์ฐ๋ก ์๋ฐํ๊ฒ ํ ๋นํ ํ์๊ฐ ์์ต๋๋ค.
์ค์ํ ๋ถ๋ถ์ ์ฃผ์ด์ง ์๊ฐ์ ํ ํ๋๋ง ํ๋ ์ดํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์ ํ์ ๋ชจ๋ ์ ํ์ด fmt.Stringer
๋ฅผ ๋ง์กฑํ๋ ๊ฒฝ์ฐ ์ ํ์ ๋ํ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์๋๋ฅผ ์์ฑํ ์ ์๋๋ก ์ ํ์ ๋ํ ์ ํ ์ฃผ์ฅ/์ ํ์ ํ์ฉํ ๋๊ธฐ
func (p P) String() string {
return p.(fmt.Stringer).String()
}
๊ทธ๋ฌ๋ ์ ํ ํ๋์ ์ ํ์ด ์ธํฐํ์ด์ค๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฏธ๋ฌํจ์ ๋ง๋ญ๋๋ค.
์ด์ ์์์ P
์ ์ ํ ์์ฒด๊ฐ fmt.Stringer
์ธ ํ๋๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น String
๋ฉ์๋๋ ๋์ ํ๋์ด๊ณ ํด๋น ๊ฐ์ด nil
์ธ ๊ฒฝ์ฐ ํจ๋ํฉ๋๋ค. nil
์ธํฐํ์ด์ค๋ฅผ ์
๋ ฅํ ์ ์์ต๋๋ค. https://play.golang.org/p/HMYglwyVbl ์ด๊ฒ์ ํญ์ ์ฌ์ค์ด์ง๋ง ์ ๊ธฐ์ ์ผ๋ก ๋ํ๋์ง๋ ์์ง๋ง ์ ํ๊ณผ ํจ๊ป ๋ ์ ๊ธฐ์ ์ผ๋ก ๋ํ๋ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํฉ๊ณ ์ ํ์ ํ์์ ์ธ ํน์ฑ์ผ๋ก ์ธํด ์ฒ ์ ํ ๋ฆฐํฐ๊ฐ ์ด๊ฒ์ด ๋ฐ์ํ๋ ๋ชจ๋ ๊ณณ(์ ์ฌ์ ์ผ๋ก ์ผ๋ถ ์คํ์ง๊ฐ ์์)์ ์ฐพ์ ์ฒ๋ฆฌํด์ผ ํ๋ ์ฌ๋ก๋ฅผ ๋ณด๊ณ ํ ์ ์์ต๋๋ค.
๋ํ ์ ํ ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ ์๋ค๋ฉด ํด๋น ๋ฉ์๋๊ฐ ํ์ ์ด์ค์ ์ ์ถฉ์กฑํ๋ ๋ฐ ์ฌ์ฉ๋์ง ์๋๋ค๋ ๊ฒ๋ ๋๋ผ์ด ์ผ์ ๋๋ค.
type Num pick { A int; B float32 }
func (n Num) String() string {
switch v := n.[var] {
case A:
return fmt.Sprint(v)
case B:
return fmt.Sprint(v)
}
}
...
n := Num{A: 5}
s1, ok := p.(fmt.Stringer) // ok == false
var i interface{} = p
s2, ok := i.(fmt.Stringer) // ok == true
์ ํ ์ด์ค์ ์ด ์ธํฐํ์ด์ค๋ฅผ ๋ง์กฑํ๋ ๊ฒฝ์ฐ ํ์ฌ ํ๋์์ ๋ฉ์๋๋ฅผ ์น๊ฒฉํ๋๋ก ํ ์ ์์ง๋ง ์ด๋ ์ธํฐํ์ด์ค ์์ฒด์ ์ ์๋์ง ์์ ์ธํฐํ์ด์ค ํ๋์ ๊ฐ์์ ๋ฉ์๋๋ฅผ ์น๊ฒฉํ ์ง ์ฌ๋ถ์ ๊ฐ์ ๊ณ ์ ํ ๋ฌธ์ ์ ๋ถ๋ชํ๋๋ค. ์ฌ์ง์ด ์ด๊ฒ์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ). ๋ํ ๋ชจ๋ ํ๋์ ๊ณตํต์ ์ธ ๋ฉ์๋๊ฐ ์ ํ ์์ฒด๋ก ์น๊ฒฉ๋ ๊ฒ์ผ๋ก ์์ํ ์ ์์ง๋ง ์ ํ์ด ์ธํฐํ์ด์ค์ ์ ์ฅ๋ ๊ฒฝ์ฐ ์ ์ฌ์ ์ผ๋ก ๊ฐ์ ๋์คํจ์น ์ธ์ ๊ฐ ํธ์ถ์์ ๋ณํ ์ ํ์ ํตํด ๋์คํจ์น๋์ด์ผ ํฉ๋๋ค. ๋ฐ/๋๋ ํ๋๊ฐ ์ธํฐํ์ด์ค์ธ ๊ฒฝ์ฐ ๊ฐ์ ๋์คํจ์น๋ก ์ ์ก๋ฉ๋๋ค.
ํธ์ง: ๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ต์ ์ผ๋ก ์ ํ์ ํฌ์ฅํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ํ์์ ์ธ ๊ทผ์ฌ์น๊ฐ ์์ง๋ง NP-์์ ์ธ ๊ฐ์ฅ ์งง์ ์ผ๋ฐ์ ์ธ ์ด๋ฌธ์์ด ๋ฌธ์ ์ ์ธ์คํด์ค์ ๋๋ค.
๊ท์น์ ์ ํ ์ฃผ์ฅ์ด ์ ํ ๊ฐ์ ๋์ ํ๋์ ๋ํด ์ฃผ์ฅํ๋ ์ ํ ๊ฐ์ธ ๊ฒฝ์ฐ์ด์ง๋ง ์ ํ ๊ฐ์ด ์ธํฐํ์ด์ค์ ์ ์ฅ๋ ๊ฒฝ์ฐ ์ ํ ์ฃผ์ฅ์ ์ ํ ์ ํ์ ๋ฉ์๋ ์งํฉ์ ์์ต๋๋ค. ์ฒ์์๋ ๋๋ ์ ์์ง๋ง ์๋นํ ์ผ๊ด์ฑ์ด ์์ต๋๋ค.
์ ํ ๊ฐ์ ๋ํ ์ ํ ์ด์ค์ ํ์ฉ์ ์ญ์ ํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์์ฑํ๊ฑฐ๋ ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํ ํ์ ์์ด ์ ํ์ ๋ชจ๋ ์ ํ์ด ๊ณต์ ํ๋ ๋ฉ์๋๋ฅผ ๋งค์ฐ ์ฝ๊ฒ ํ๋ณดํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ถ๋๋ฌ์ด ์ผ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ฝ๋ ์์ฑ์ ์ฌ์ฉํ์ฌ ์์ฑํ๋ ๊ฒ์ ์๋นํ ์ฌ์ธ ๊ฒ์ ๋๋ค.
func (p Pick) String() string {
switch v := p.[var] {
case A:
return v.String()
case B:
return v.String()
//etc
}
}
๊ณ์ํด์ ์ ํ ์ด์ค์ ์ ์ญ์ ํ์ต๋๋ค. ์ถ๊ฐํด์ผ ํ ์๋ ์์ง๋ง ์ ์์์ ํ์ ๋ถ๋ถ์ ์๋๋๋ค.
@ianlancetaylor ์ ์ด์ ์๊ฒฌ ์ผ๋ก ๋์๊ฐ๊ณ ์ถ์ต๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํด ์ข ๋ ์๊ฐํ ํ ์๋ก์ด ๊ด์ ์ ๊ฐ๊ฒ ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค(ํนํ, https://github.com/golang/go/issues/21161# ๋ฌธ์ ์๊ฒฌ-320294933).
ํนํ, ์๋ก์ด ์ ํ์ ์ ํ์ ์ธํฐํ์ด์ค ์ ํ์์ ์ป์ ์ ์๋ ๋ฌด์์ ์ ๊ณตํฉ๋๊น?
๋ด๊ฐ ๋ณด๊ธฐ์ sum-types์ ์ฃผ์ ์ด์ ์ ์ฌ๋ฌ ๊ฐ์ ๋ฐํํ๋ ๊ฒ๊ณผ ์ฌ๋ฌ ๊ฐ ์ค ํ๋๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๊ตฌ๋ถํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ํนํ ์ด๋ฌํ ๊ฐ ์ค ํ๋๊ฐ ์ค๋ฅ ์ธํฐํ์ด์ค์ ์ธ์คํด์ค์ผ ๋ ๊ทธ๋ ์ต๋๋ค.
์ฐ๋ฆฌ๋ ํ์ฌ ํ์์ ๋ง์ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค
func F(โฆ) (T, error) {
โฆ
}
๊ฐ์ ๊ทธ๋ค ์ค ์ผ๋ถ, io.Reader.Read
๋ฐ io.Reader.Write
ํ๋ ๋ฐํ T
๊ณผ ํจ๊ป error
๋ค๋ฅธ ์ด๋ ๋ฐํ ๋ฐ๋ฉด์ํ๋ T
๋๋ error
์ด์ง๋ง ๋ ๋ค ์ ๋ ์๋๋๋ค. ์ด์ ์คํ์ผ์ API์ ๊ฒฝ์ฐ ์ค๋ฅ์ ๊ฒฝ์ฐ T
๋ฅผ ๋ฌด์ํ๋ ๊ฒ์ ์ข
์ข
๋ฒ๊ทธ์
๋๋ค(์: ์ค๋ฅ๊ฐ io.EOF
). ํ์ ์คํ์ผ์ ๊ฒฝ์ฐ 0์ด ์๋ T
๋ฐํํ๋ ๊ฒ์ ๋ฒ๊ทธ์
๋๋ค.
lint
ํฌํจํ ์๋ํ ๋๊ตฌ๋ ์ค๋ฅ๊ฐ nil์ด ์๋ ๊ฒฝ์ฐ ๊ฐ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ฌด์๋๋์ง(๋๋ ๋ฌด์๋์ง ์๋์ง) ํน์ ํจ์์ ์ฌ์ฉ์ ํ์ธํ ์ ์์ง๋ง ์ด๋ฌํ ๊ฒ์ฌ๋ ์์ฐ์ค๋ฝ๊ฒ ์์์ ํจ์๋ก ํ์ฅ๋์ง ์์ต๋๋ค.
์๋ฅผ ๋ค์ด proto.Marshal
๋ ์ค๋ฅ๊ฐ RequiredNotSetError
์ธ ๊ฒฝ์ฐ "๊ฐ ๋ฐ ์ค๋ฅ" ์คํ์ผ์ด ๋๋๋ก ์๋๋์์ง๋ง ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ "๊ฐ ๋๋ ์ค๋ฅ" ์คํ์ผ๋ก ๋ณด์
๋๋ค. ์ ํ ์์คํ
์ ๋์ ๊ตฌ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ ์ค์๋ก ํ๊ท๋ฅผ ๋์
ํ๊ธฐ ์ฝ์ต๋๋ค. ์ฆ, ๋ฐํํด์ผ ํ ๋ ๊ฐ์ ๋ฐํํ์ง ์๊ฑฐ๋ ๋ฐํํ์ง ์์์ผ ํ ๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ proto.Marshaler
๊ตฌํ์ ๋ฌธ์ ๋ฅผ ๋์ฑ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค.
๋ฐ๋ฉด์ ์ ํ์ ๊ณต์ฉ์ฒด๋ก ํํํ ์ ์๋ค๋ฉด ํจ์ฌ ๋ ๋ช ์์ ์ผ ์ ์์ต๋๋ค.
type PartialMarshal struct {
Data []byte // The marshalled value, ignoring unset required fields.
MissingFields []string
}
func Marshal(pb Message) []byte | PartialMarshal | error
@ianlancetaylor , ๋๋ ์ข ์ด์ ๋น์ ์ ์ ์์ ๊ฐ์ง๊ณ ๋์์ต๋๋ค. ์๋์ ์๋ชป๋ ๊ฒ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ค ์ ์์ต๋๊น?
์ฃผ์ด์ง
var r interface{} restrict { uint, int } = 1
r
์ ๋์ ์ ํ์ int
์ด๊ณ
var _ interface{} restrict { uint32, int32 } = 1
๋ถ๋ฒ์ ๋๋ค.
์ฃผ์ด์ง
type R interface{} restrict { struct { n int }, etc }
type S struct { n int }
var _ R = S{}
๋ ๋ถ๋ฒ์
๋๋ค.
๊ทธ๋ฌ๋ ์ฃผ์ด์ง
type R interface{} restrict { int, error }
type A interface {
error
foo()
}
type C struct { error }
func (C) foo() {}
var _ R = C{}
๋ฐ var _ R = A(C{})
๋ชจ๋ ํฉ๋ฒ์
๋๋ค.
๋ ๋ค
interface{} restrict { io.Reader, io.Writer }
๊ทธ๋ฆฌ๊ณ
interface{} restrict { io.Reader, io.Writer, *bytes.Buffer }
๋๋ฑํฉ๋๋ค.
๋น์ทํ๊ฒ,
interface{} restrict { error, net.Error }
์ ๋๋ฑํ๋ค
interface { Error() string }
์ฃผ์ด์ง
type IO interface{} restrict { io.Reader, io.Writer }
type R interface{} restrict {
interface{} restrict { int, uint },
IO,
}
R
์ ๊ธฐ๋ณธ ์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
interface{} restrict { io.Writer, uint, io.Reader, int }
ํธ์ง: ์ดํค๋ฆญ์ฒด์ ์์ ์์
@jimmyfrasche ์์์ ๋ด๊ฐ ์ด ๊ฒ์ด ์ ์์ด๋ผ๊ณ ๋งํ ๋งํผ ๋ฉ๋ฆฌ ๊ฐ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์์ด๋์ด์ ๋ ๊ฐ๊น์ต๋๋ค. ๋๋ ๋น์ ์ ์๊ฒฌ์ ๋ํด ์๊ฐํด์ผ ํ์ง๋ง, ์ธ๋ป ๋ณด๊ธฐ์๋ ๊ทธ๋ด๋ฏํด ๋ณด์ ๋๋ค.
@jimmyfrasche ์ ์ ์์ Go์์ ์ ํ ์ ํ์ด ์๋ํ ๊ฒ์ผ๋ก ์ง๊ด์ ์ผ๋ก ์์ํ๋ ๋ฐฉ์๊ณผ ๊ฑฐ์ ๋น์ทํฉ๋๋ค. ๋๋ ํ๊ทธ ๊ฐ์ด 0์์ ์์ํ๋ ๊ฒฝ์ฐ ์ ํ์ 0 ๊ฐ์ ๋ํด ์ฒซ ๋ฒ์งธ ํ๋์ 0 ๊ฐ์ ์ฌ์ฉํ๊ฒ ๋ค๋ ๊ทธ์ ์ ์์ด "0 ๊ฐ์ ๋ฐ์ดํธ๋ฅผ 0์ผ๋ก ๋ง๋๋ ๊ฒ์ ์๋ฏธ"์ ํจ๊ป ์ง๊ด์ ์ด๋ผ๋ ์ ์ ํนํ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฏธ ์ธ๊ธ๋์์ต๋๋ค; ์ด ์ค๋ ๋๋ ์ง๊ธ๊น์ง ๋งค์ฐ ๊น๋๋ค...). ๋๋ ๋ํ ์ฑ๋ฅ ์ํฅ(๋ถํ์ํ ํ ๋น ์์)์ ์ข์ํ๋ฉฐ ๊ทธ ์ ํ์ ์ธํฐํ์ด์ค์ ์์ ํ ์ง๊ตํฉ๋๋ค(์ธํฐํ์ด์ค๋ฅผ ํฌํจํ๋ ์ ํ์์ ์ ํํ๋ ๋๋ผ์ด ๋์ ์์).
๋ณ๊ฒฝ์ ๊ณ ๋ คํ ์ ์๋ ์ ์ผํ ๊ฒ์ ํ๊ทธ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์
๋๋ค. foo.X = 0
๋ foo = Foo{X: 0}
์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ช ๊ฐ์ ๋ฌธ์๊ฐ ๋ ์์ง๋ง ํ๊ทธ๋ฅผ ์ฌ์ค์ ํ๊ณ ๊ฐ์ 0์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๋ ๋ช
ํํฉ๋๋ค. ์ด๊ฒ์ ์ฌ์ํ ๋ถ๋ถ์ด๋ฉฐ ๊ทธ์ ์ ์์ด ์๋ ๊ทธ๋๋ก ๋ฐ์๋ค์ฌ์ง๋ค๋ฉด ์ฌ์ ํ ๋งค์ฐ ๊ธฐ์ ๊ฒ์
๋๋ค.
@ns-cweber ๊ฐ์ฌํฉ๋๋ค. ํ์ง๋ง ์ ๋ ๊ฐ์น๊ฐ 0์ธ ํ๋์ ์ธ์ ํ ์ ์์ต๋๋ค. ์์ด๋์ด๋ ์ ์ ๋์ ๋ ๋์๋ค๋ ๊ณ @rogpeppe ์ ์ ์์์ ์ด ์ค๋ ๋์ ์๋ถ๋ถ์ ์์์ต๋๋ค(๋น์ ์ด ๊ฝค ๊ธธ๊ฒ ์ง์ ํ๋ฏ์ด). ๋ด ๋ณ๋ช ์ ๋น์ ์ด ์ค ๊ฒ๊ณผ ๊ฐ์์ต๋๋ค.
foo.X = 0
๋ foo = Foo{X: 0}
๊น์ง ๋ด ์ ์์ ์ค์ ๋ก ๋ ๋ค ํ์ฉํฉ๋๋ค. ๋น์ ์ด ํ ์ ์๋๋ก ์ ํ์ ํ๋ ๊ตฌ์กฐ์ฒด ์ธ ๊ฒฝ์ฐ ํ์์ ์ ์ฉ foo.X.Y = 0
๋์ foo = Foo{X: image.Point{X: foo.[X].X, 0}}
๋ฐํ์์ ์คํจ ํ ์ ์์ต๋๋ค ์์ธํ ๊ฒ ์ด์ธ์.
๋ํ ์๋ฏธ๋ก ์ ๋ํ ์๋ฆฌ๋ฒ ์ดํฐ ํผ์น๋ฅผ ๊ฐํํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก ์ ์งํ๋ ๊ฒ์ด ๋์์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ ๋ฒ์ ํ๋์ ํ๋๋ง ์ค์ ํ ์ ์๋ ๊ตฌ์กฐ์ฒด์ ๋๋ค.
์๋ ๊ทธ๋๋ก ํ์ฉ๋์ง ์๋๋ก ์ฐจ๋จํ ์ ์๋ ํ ๊ฐ์ง๋ ๊ตฌ์กฐ์ฒด์ ์ ํ์ ํฌํจํ๋ ๊ฒ์ด ์๋ํ๋ ๋ฐฉ์์ ๋๋ค. ์์ ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋ฏธ์น๋ ๋ค์ํ ํจ๊ณผ๋ฅผ ๊ฐ๊ณผํ๋ค๋ ์ฌ์ค์ ๊นจ๋ฌ์์ต๋๋ค. ์๋ฆฌํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ๊ฐ์ฅ ์ข์ ์๋ฆฌ๊ฐ ๋ฌด์์ธ์ง ์์ ํ ํ์ ํ ์ ์์ต๋๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋ฉ์๋๋ง ์์ํ๊ณ ํด๋น ํ๋์ ๋๋ฌํ๊ธฐ ์ํด ์ด๋ฆ์ผ๋ก ํฌํจ๋ ์ ํ์ ์ง์ ์ฐธ์กฐํด์ผ ํ๋ฉฐ ๊ตฌ์กฐ์ฒด ํ๋์ ์ ํ ํ๋๊ฐ ๋ชจ๋ ์๋ ๊ตฌ์กฐ์ฒด๋ฅผ ํผํ๊ธฐ ์ํด ๊ทธ ์ชฝ์ผ๋ก ๊ธฐ์ธ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค.
@jimmyfrasche ๊ฐ์ด 0์ธ ๋์์ ๋ํด ์์
๋ง์ง๋ง์ผ๋ก ์ ํ ์๋ฒ ๋ฉ์ ๋ํ ๊ทํ์ ๊ฐ๋จํ ์ ์์ ์ ๊ฐ ์ง๊ฐ์ ์ผ๋ก ์๊ฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์๊ฐ์ด ๋ฐ๋์ด๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์๊ณ ๋จ์ํ ์ ์์์ ๋ณต์กํ ์ ์์ผ๋ก ๊ฐ ์ ์์ง๋ง ๊ทธ ๋ฐ๋๋ ์ฌ์ค์ด ์๋๋๋ค.
@ns-cweber
๋ด๊ฐ foo.XY๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋ณผ ์ ์์์ง๋ง ์ ํ ํ๋๊ฐ ์๋์ผ๋ก ๋ณ๊ฒฝ๋๋ค๋ ๊ฒ์ ๊นจ๋ซ์ง ๋ชปํ์ต๋๋ค.
๊ทธ๊ฒ์ ๊ณต์ ํ ์ง์ ์ด์ง๋ง ๊ทธ ๋ฌธ์ ์ ๋ํด ์ธ์ด ๋๋ ๋ชจ๋ ์ธ์ด๋ก ๋ง์ ๊ฒ์ ๋ํด ๋งํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฐ๋์๋ ์์ ๋ ์ผ์ด ์์ง๋ง ์์ ๊ฐ์๋ ์์ต๋๋ค.
๊ทธ๊ฒ์ ์ ๋ณต์ํค๊ธฐ ์ํด ์ต์ ์ ๋คํ์ง ์์ผ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋น์ ์ ๋ณดํธํ๋ ํฐ ์ผ๋ค์ด ๋ง์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋น์ ์ ์ฌ์ ํ โโ๋น์ ์ด ๋ฌด์์ ํ๊ณ ์๋์ง ์์์ผ ํฉ๋๋ค.
์ด๋ฐ ์ค์๋ฅผ ํ๋ฉด ์ง์ฆ์ด ๋ ์ ์์ง๋ง, "I set bar.X = 0
ํ์ง๋ง bar.Y = 0
๋ฅผ ์ค์ ํ๋ ค๊ณ ํ์ต๋๋ค."๋ผ๊ณ ๊ฐ์ ํ์ ๋์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค. foo
๋ ์ ํ ์ ํ์
๋๋ค.
์ ์ฌํ๊ฒ i.Foo()
, p.Foo()
๋ฐ v.Foo()
๋ชจ๋ ๋์ผํ๊ฒ ๋ณด์ด์ง๋ง i
๊ฐ nil
์ธํฐํ์ด์ค์ธ ๊ฒฝ์ฐ p
nil ํฌ์ธํฐ์ด๊ณ Foo
๊ฐ ์ด ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์ฒ์ ๋ ๊ฐ๋ ํจ๋์ ์ผ์ผํฌ ์ ์์ง๋ง v
๊ฐ ๊ฐ ๋ฉ์๋ ์์ ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค(์ ์ด๋ ํธ์ถ ์์ฒด์์๋ ์๋) .
โ
์๋ฒ ๋ฉ์ ๊ดํด์๋ ๋์ค์ ๋์จํด์ง๊ธฐ ์ฝ๋ค๋ ์ ์์ ์ข์ ์ ์ด๋ผ ๊ทธ๋ฅ ์ ์์ ์์ ํ์ต๋๋ค.
ํฉ๊ณ ์ ํ์๋ ์ข
์ข
๊ฐ์ด ์๋ ํ๋๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด database/sql
ํจํค์ง์๋ ๋ค์์ด ์์ต๋๋ค.
type NullString struct {
String string
Valid bool // Valid is true if String is not NULL
}
ํฉ๊ณ ์ ํ/์ ํ/๊ณต์งํฉ์ด ์๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ํํ๋ ์ ์์ต๋๋ค.
type NullString pick {
Null struct{}
String string
}
์ด ๊ฒฝ์ฐ ํฉ๊ณ ์ ํ์ ๊ตฌ์กฐ์ฒด์ ๋นํด ๋ถ๋ช ํ ์ด์ ์ด ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ชจ๋ ์ ์์ ์์๋ก ํฌํจํ ๊ฐ์น๊ฐ ์์ ๋งํผ ์ถฉ๋ถํ ์ผ๋ฐ์ ์ธ ์ฉ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Bikeshedding (๋ฏธ์), ๋๋ ์ด๊ฒ์ด ๊ตฌ๋ฌธ์ ์ง์๊ณผ ๊ตฌ์กฐ์ฒด ํ๋ ์๋ฒ ๋ฉ ๊ตฌ๋ฌธ๊ณผ์ ๋ถ์ผ์น์ ๊ฐ์น๊ฐ ์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
type NullString union {
Null
String string
}
@neild
๋ง์ง๋ง ํฌ์ธํธ ๋จผ์ ์น๊ธฐ: ๊ฒ์ํ๊ธฐ ์ ๋ง์ง๋ง ์๊ฐ ๋ณ๊ฒฝ์ผ๋ก(์ด๋ค ์๋ฏธ์์๋ ์๊ฒฉํ๊ฒ ์๊ตฌ ๋์ง ์์), ํ๋ ์ด๋ฆ์ด ์๋ ๋ช ๋ช ๋ ์ ํ(๋๋ ๋ช ๋ช ๋ ์ ํ์ ๋ํ ํฌ์ธํฐ)์ด ์๋ ๊ฒฝ์ฐ ์ ํ์ด ์์์ ํ๋๋ฅผ ์์ฑํ๋ค๊ณ ์ถ๊ฐํ์ต๋๋ค. ์ ํ๊ณผ ์ด๋ฆ์ด ๊ฐ์ต๋๋ค. ๊ทธ๊ฒ์ด ์ต์ ์ ์๊ฐ์ ์๋์ง ๋ชจ๋ฅด์ง๋ง "์ด๋ฌํ ์ ํ ์ค ํ๋"์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ค ํ๋๋ฅผ ํฐ ์๋ ์์ด ๋ค๋ฃฐ ๊ฒ ๊ฐ์์ต๋๋ค. ๋ง์ง๋ง ์์ ๋ฅผ ์์ฑํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
type Null = struct{} //though this puts Null in the same scope as NullString
type NullString pick {
Null
String string
}
๊ทธ๋ฌ๋ ์์ ์ผ๋ก ๋์๊ฐ์ ๊ทธ๋ ์ต๋๋ค. ๊ทธ๊ฒ์ ํ๋ฅญํ ์ฉ๋์
๋๋ค. ์ค์ ๋ก type Stoplight pick { Stop, Slow, Go struct{} }
์ด๊ฑฐํ์ ๋น๋ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๊ฒ์ const/iota faux-enum๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ์ฌ์ง์ด ๋์ผํ ์ถ๋ ฅ์ผ๋ก ์ปดํ์ผ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ์ ์ฃผ์ ์ด์ ์ ์ํ๋ฅผ ๋ํ๋ด๋ ์ซ์๊ฐ ์์ ํ ์บก์ํ๋์ด ๋์ด๋ ์ธ ๊ฐ์ง ์ด์ธ์ ์ํ์ ๋ฃ์ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
๋ถํํ๋ Stoplight
๊ฐ์ ์์ฑํ๊ณ ์ค์ ํ๋ ๋ฐ ๋ค์ ์ด์ํ ๊ตฌ๋ฌธ์ด ์์ต๋๋ค. ์ด๋ ์ด ๊ฒฝ์ฐ์ ์
ํ๋ฉ๋๋ค.
light := Stoplight{Slow: struct{}{}}
light.Go = struct{}{}
๋ค๋ฅธ ๊ณณ์์ ์ ์๋ ๊ฒ์ฒ๋ผ {}
๋๋ _
๋ฅผ struct{}{}
์ฝ์ด๋ก ํ์ฉํ๋ฉด ๋์์ด ๋ ๊ฒ์
๋๋ค.
๋ง์ ์ธ์ด, ํนํ ํจ์ํ ์ธ์ด๋ ๋ ์ด๋ธ์ ์ ํ๊ณผ ๋์ผํ ๋ฒ์์ ๋ฐฐ์นํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด๊ฒ์ ๋ง์ ๋ณต์ก์ฑ์ ์์ฑํ๊ณ ๋์ผํ ๋ฒ์์ ์ ์๋ ๋ ๊ฐ์ ์ ํ์ด ํ๋ ์ด๋ฆ์ ๊ณต์ ํ๋ ๊ฒ์ ํ์ฉํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํ๋ ์ ํ์ ์ธ์๋ก ์ฌ์ฉํ๋ ์ ํ์์ ๊ฐ ํ๋์ ์ด๋ฆ์ด ๊ฐ์ ํจ์๋ฅผ ์์ฑํ๋ ์ฝ๋ ์์ฑ๊ธฐ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ํ ํน์ํ ๊ฒฝ์ฐ๋ก ์ ํ์ด 0์ธ ๊ฒฝ์ฐ ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ Stoplight
์์ ์ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func Stop() Stoplight {
return Stoplight{Stop: struct{}{}}
}
func Slow() Stoplight {
return Stoplight{Slow: struct{}{}}
}
func Go() Stoplight {
return Stoplight{Go: struct{}{}}
}
NullString
์์ ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func Null() NullString {
return NullString{Null: struct{}{}}
}
func String(s string) NullString {
return NullString{String: s}
}
์์์ง๋ ์์ง๋ง go generate
๋จ์ด์ ธ ์๊ณ ๋งค์ฐ ์ฝ๊ฒ ์ธ๋ผ์ธ๋ ์ ์์ต๋๋ค.
์ ํ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ์์์ ํ๋๋ฅผ ์์ฑํ ๊ฒฝ์ฐ(์ ํ์ด ๋ค๋ฅธ ํจํค์ง์ ์ ํ์ด ์๋ ๊ฒฝ์ฐ) ๋๋ ํ๋ ์ด๋ฆ์ ๊ณต์ ํ๋ ๋์ผํ ํจํค์ง์์ ๋ ๊ฐ์ ์ ํ์ผ๋ก ์คํ๋ ๊ฒฝ์ฐ์๋ ์๋ํ์ง ์์ง๋ง ๊ด์ฐฎ์ต๋๋ค. ์ ์์ ์ฆ์ ๋ชจ๋ ๊ฒ์ ์ํํ์ง๋ ์์ง๋ง ๋ง์ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๊ณ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์ฃผ์ด์ง ์ํฉ์ ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ ๊ฒฐ์ ํ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
์ถ๊ฐ ๊ตฌ๋ฌธ ๋ฐ์ดํฌ์๋ฉ:
type NullString union {
Null
Value string
}
var _ = NullString{Null}
var _ = NullString{Value: "some value"}
var _ = NullString{Value} // equivalent to NullString{Value: ""}.
๊ตฌ์ฒด์ ์ผ๋ก ํค๊ฐ ํฌํจ๋์ง ์์ ์์ ๋ชฉ๋ก์ด ์๋ ๋ฆฌํฐ๋ด์ ์ค์ ํ ํ๋์ ์ด๋ฆ์ ์ง์ ํ๋ ๊ฒ์ผ๋ก ํด์๋ฉ๋๋ค.
์ด๊ฒ์ ํฉ์ฑ ๋ฆฌํฐ๋ด์ ๋ค๋ฅธ ์ฌ์ฉ๊ณผ ๊ตฌ๋ฌธ์ ์ผ๋ก ์ผ์นํ์ง ์์ต๋๋ค. ๋ค๋ฅธ ํํธ์ผ๋ก, ํค๊ฐ ์๋ ๊ณต์ฉ์ฒด ์ด๊ธฐํ ํ๋ก๊ทธ๋จ์ ๋ํ ํฉ๋ฆฌ์ ์ธ ํด์์ด ์๊ธฐ ๋๋ฌธ์ (์ ์ด๋ ์ ์๊ฒ๋) ๊ณต์ฉ์ฒด/์ ํ/ํฉ ์ ํ์ ๋งฅ๋ฝ์์ ํฉ๋ฆฌ์ ์ด๊ณ ์ง๊ด์ ์ผ๋ก ๋ณด์ด๋ ์ฌ์ฉ๋ฒ์ ๋๋ค.
@neild
์ด๊ฒ์ ํฉ์ฑ ๋ฆฌํฐ๋ด์ ๋ค๋ฅธ ์ฌ์ฉ๊ณผ ๊ตฌ๋ฌธ์ ์ผ๋ก ์ผ์นํ์ง ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋ฌธ๋งฅ์ ์ดํด๊ฐ ๋์ง๋ง ๋์๊ฒ๋ ํฐ ๋ถ์ ์ ์ผ๋ก ๋ณด์ ๋๋ค.
๋ํ ์ฐธ๊ณ
var ns NullString // == NullString{Null: struct{}{}} == NullString{}
ns.String = "" // == NullString{String: ""}
๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ํ struct{}{}
๋ด๊ฐ ์ฌ์ฉํ๊ณ ๊ฒฝ์ฐ map[T]struct{}
I ๋์ ธ
var set struct{}
์ด๋๊ฐ์ theMap[k] = set
ํ๋ฉด ์ ์ฌํ ๊ฒ์ด ์ ํ๊ณผ ํจ๊ป ์๋ํฉ๋๋ค.
์ถ๊ฐ bikeshedding: ๋น ์ ํ(sum ์ ํ์ ์ปจํ ์คํธ์์)์ ์ผ๋ฐ์ ์ผ๋ก "null"์ด ์๋๋ผ "unit"์ผ๋ก ๋ช ๋ช ๋ฉ๋๋ค.
@bcmills ์ํ .
ํจ์ํ ์ธ์ด์์ ํฉ๊ณ ์ ํ์ ์์ฑํ ๋ ํด๋น ๋ ์ด๋ธ์ ์ค์ ๋ก ํด๋น ์ ํ์ ๊ฐ์ ์์ฑํ๋ ํจ์์ ๋๋ค(๋น๋ก ์ปดํ์ผ๋ฌ๊ฐ ํจํด ์ผ์น๋ฅผ ํ์ฉํ๋ ๊ฒ์ผ๋ก ์๊ณ ์๋ "์ ํ ์์ฑ์" ๋๋ "ํ์ด์ฝ"์ผ๋ก ์๋ ค์ง ํน์ ํจ์).
data Bool = False | True
Bool
๋ฐ์ดํฐ ์ ํ๊ณผ ๋์ผํ ๋ฒ์์ True
๋ฐ False
, ๊ฐ๊ฐ () -> Bool
์๋ช
์ด ์๋ ๋ ๊ฐ์ ํจ์๋ฅผ ๋ง๋ญ๋๋ค.
์ฌ๊ธฐ์ ()
๋ ์ ํ ๋ฐ์ ๋จ์(๋จ์ผ ๊ฐ๋ง ์๋ ์ ํ)๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์
๋๋ค. Go์์ ์ด ์ ํ์ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑํ ์ ์์ง๋ง ๊ด์ฉ์ ์ผ๋ก struct{}
๋ก ์์ฑ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์์ฑ์์ ์ธ์ ์ ํ ์ ๋จ์๋ผ๊ณ ํฉ๋๋ค. ์์ฑ์์ ์ด๋ฆ ์ ๋ํ ๊ด๋ก๋ ์ผ๋ฐ์ ์ผ๋ก ์ด์ ๊ฐ์ ์ต์
์ ํ์ผ๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ None
์ด์ง๋ง ๋๋ฉ์ธ์ ๋ง๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ค๋ ๊ฒฝ์ฐ Null
๋ ์ข์ ์ด๋ฆ์
๋๋ค.
@bcmills
๋ด๊ฐ ๋ณด๊ธฐ์ sum-types์ ์ฃผ์ ์ด์ ์ ์ฌ๋ฌ ๊ฐ์ ๋ฐํํ๋ ๊ฒ๊ณผ ์ฌ๋ฌ ๊ฐ ์ค ํ๋๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๊ตฌ๋ถํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ํนํ ์ด๋ฌํ ๊ฐ ์ค ํ๋๊ฐ ์ค๋ฅ ์ธํฐํ์ด์ค์ ์ธ์คํด์ค์ผ ๋ ๊ทธ๋ ์ต๋๋ค.
๋์์ ์ธ ๊ด์ ์์ ์ ๋ ์ด๊ฒ์ด Go์ sum ์ ํ์ ์ฃผ์ ๋จ์ ์ด๋ผ๊ณ ๋ด ๋๋ค.
๋ง์ ์ธ์ด๋ ๋ฌผ๋ก ์ด๋ค ๊ฐ์ด๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ์ ๋ํด ํฉ ์ ํ์ ์ฌ์ฉํ๋ฉฐ ์ด๋ ์ ์๋ํฉ๋๋ค. Go์ sum ์ ํ์ด ์ถ๊ฐ๋๋ฉด ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ์ ํฐ ์ ํน์ด ์์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ Go์๋ ์ด๋ฏธ ์ด๋ฌํ ๋ชฉ์ ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ์ฌ์ฉํ๋ ๋๊ท๋ชจ ์ฝ๋ ์ํ๊ณ๊ฐ ์์ต๋๋ค. ์ ์ฝ๋๊ฐ ํฉ๊ณ ์ ํ์ ์ฌ์ฉํ์ฌ (๊ฐ, ์ค๋ฅ) ํํ์ ๋ฐํํ๋ ๊ฒฝ์ฐ ํด๋น ์ํ๊ณ๋ ๋จํธํ๋ฉ๋๋ค. ์ผ๋ถ ์์ฑ์๋ ๊ธฐ์กด ์ฝ๋์์ ์ผ๊ด์ฑ์ ์ํด ์ฌ๋ฌ ๋ฐํ์ ๊ณ์ ์ฌ์ฉํฉ๋๋ค. ์ผ๋ถ ์ ์๋ ํฉ๊ณ ์ ํ์ ์ฌ์ฉํฉ๋๋ค. ์ผ๋ถ๋ ๊ธฐ์กด API๋ฅผ ๋ณํํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ด๋ค ์ด์ ๋ก๋ ์ด์ Go ๋ฒ์ ์ ๋งค๋ฌ๋ฆฐ ์์ฑ์๋ ์ API์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์๋ง์ด ๋ ๊ฒ์ด๊ณ , ๋๋ ์ด๋์ด ๋น์ฉ์ ๊ฐ์น๊ฐ ์๊ธฐ ์์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ ์ฝ๋๊ฐ ํฉ๊ณ ์ ํ์ ์ฌ์ฉํ์ฌ (๊ฐ, ์ค๋ฅ) ํํ์ ๋ฐํํ๋ ๊ฒฝ์ฐ ํด๋น ์ํ๊ณ๋ ๋จํธํ๋ฉ๋๋ค.
Go 2์ ํฉ๊ณ ์ ํ์ ์ถ๊ฐํ๊ณ ๊ท ์ผํ๊ฒ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ๋จํธํ๊ฐ ์๋ ๋ง์ด๊ทธ๋ ์ด์ ์ผ๋ก ์ถ์๋ฉ๋๋ค. Go 1(๊ฐ, ์ค๋ฅ) API๋ฅผ Go 2(๊ฐ | ์ค๋ฅ)๋ก ๋ณํํ ์ ์์ด์ผ ํฉ๋๋ค. ) API ๋ฐ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ์์ง๋ง ํ๋ก๊ทธ๋จ์ Go 2 ๋ถ๋ถ์์ ๊ณ ์ ํ ์ ํ์ผ ์ ์์ต๋๋ค.
Go 2์ ํฉ๊ณ ์ ํ์ ์ถ๊ฐํ๊ณ ๊ท ์ผํ๊ฒ ์ฌ์ฉํ๋ฉด
์ด๊ฒ์ ์ง๊ธ๊น์ง ๋ณธ ๊ฒ๊ณผ๋ ์๋นํ ๋ค๋ฅธ ์ ์์ ๋๋ค. ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ด๋ฒ์ํ๊ฒ ๋ฆฌํฉํ ๋งํด์ผ ํ๊ณ API ์คํ์ผ ๊ฐ์ ๋ณํ์ ์ ์ํด์ผ ํ๋ ๋ฑ์ ์์ ์ด ํ์ํฉ๋๋ค. ์ด ๊ฒฝ๋ก๋ก ์ด๋ํ๋ฉด ์๋นํ ์ปค์ง๋๋ค. ๋ฐ ํฉ๊ณ ์ ํ์ ์ค๊ณ์ ๊ด๋ จํ์ฌ ์ฌ์ํ codicil๋ก API ์ ํ์ ๋ํ ๋ณต์กํ ์ ์.
์๋๋ Go 1๊ณผ Go 2๊ฐ ๋์ผํ ํ๋ก์ ํธ์์ ์ํํ๊ฒ ๊ณต์กดํ ์ ์๋๋ก ํ๋ ๊ฒ์ด๋ฏ๋ก ๋๊ตฐ๊ฐ๊ฐ "์ด๋ค ์ด์ ๋ก" Go 1 ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๊ณ 2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ด๋ํฉ๋๋ค. ๊ทธ๋ฌ๋, ๋น์ ์ ์์กด์ฑ์ด์๋ ๊ฒฝ์ฐ A
์ ์ฐจ๋ก๋ก ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค B
๋ฐ B
๊ฐ์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์
๋ฐ์ดํธ pick
์์ฌ์ API์, ๊ทธ ํด์ ๊ฒ์ด ์์กด์ฑ A
๊ฐ ์ ๋ฒ์ ์ ์ฌ์ฉ์ผ๋ก ์
๋ฐ์ดํธํ์ง ์๋ ํ B
. A
๋ B
๊ณต๊ธํ๊ณ ์ด์ ๋ฒ์ ์ ๊ณ์ ์ฌ์ฉํ ์ ์์ง๋ง ๋ณด์ ๋ฒ๊ทธ ๋ฑ์ผ๋ก ์ธํด ์ด์ ๋ฒ์ ์ด ์ ์ง ๊ด๋ฆฌ๋์ง ์๊ฑฐ๋ ์ ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ B
์ง์ ์ฌ์ฉํ๊ณ ์ด๋ค ์ด์ ๋ก ํ๋ก์ ํธ์ ๋ ๊ฐ์ง ๋ฒ์ ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ถ๊ทน์ ์ผ๋ก ์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์ธ์ด ๋ฒ์ ๊ณผ ๊ฑฐ์ ๊ด๋ จ์ด ์์ผ๋ฉฐ ๊ธฐ์กด ๋ด๋ณด๋ธ ํจ์์ ์๋ช
์ ๋ณ๊ฒฝํ๋ ๊ฒ๊ณผ ๋ ๊ด๋ จ์ด ์์ต๋๋ค. ์ถ์ง๋ ฅ์ ์ ๊ณตํ๋ ์๋ก์ด ๊ธฐ๋ฅ์ด ๋ ๊ฒ์ด๋ผ๋ ์ฌ์ค์ ์ฝ๊ฐ์ ์ฃผ์๋ฅผ ์ฐ๋งํ๊ฒ ํฉ๋๋ค. ์๋ ํ์ฉํ๋ ๊ฒฝ์ฐ ๊ธฐ์กด์ API๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ pick
์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ๊นจ์ง ์๊ณ , ๋ค์ ๋ช ๊ฐ์ง ์ข
๋ฅ์ ๋ค๋ฆฌ ๊ตฌ๋ฌธ์ด์์ ํ์๊ฐ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด(์์ ํ ๋นจ๊ฐฑ์ด์ฒ๋ผ):
type ReadResult pick(N int, Err error) {
N
PartialResult struct { N; Err }
Err
}
์ปดํ์ผ๋ฌ๋ ๋ ๊ฑฐ์ ์ฝ๋์์ ์ก์ธ์คํ ๋ ReadResult
ํ ์ ์์ผ๋ฉฐ ํน์ ๋ณํ์ ํ๋๊ฐ ์์ผ๋ฉด 0 ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. ๋ค๋ฅธ ๊ธธ๋ก ๊ฐ๋ ๋ฐฉ๋ฒ์ด๋ ๊ทธ๋งํ ๊ฐ์น๊ฐ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ฐ์ API๋ฅผ template.Must
๋จ์ง ์คํ๋ ค๋ณด๋ค๋ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์๋ค์ด๋ ๊ณ์ํด์ผ ํ ์๋ ์์ต๋๋ค pick
ํ๊ณ ์ฐจ์ด๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์คํ๋์ ์์กดํ๊ณ ์์ต๋๋ค. ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
type ReadResult pick(N int, Err error) {
case Err == nil:
N
default:
PartialResult struct { N; Err }
case N == 0:
Err
}
์ด ๋ณต์กํ ์ผ์ํ์ง๋ง, API๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฅ์ ์๊ฐํ๋ ์ธ๊ณ๋ฅผ ํ๊ดดํ์ง ์๊ณ ์ด๋ป๊ฒ ์ ํ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ํ์๋ก ์ด๋ป๊ฒ ๋ณผ ์ ์์ต๋๋ค. ๋ธ๋ฆฌ์ง ๊ตฌ๋ฌธ์ด ํ์ํ์ง ์์ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค.
ํฉ๊ณ ์ ํ์์ ์ ํ ์ ํ(๊ตฌ์กฐ์ฒด, ๋ค์ค ๋ฐํ ๊ฐ)์ผ๋ก ์ด๋ํ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค. ๊ฐ์ด ์๋ ๋ชจ๋ ๊ฒ์ 0์ผ๋ก ์ค์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ ํ ์ ํ์์ ํฉ๊ณ ์ ํ์ผ๋ก ์ด๋ํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ ์๋์ด ์์ง ์์ต๋๋ค.
API๊ฐ ์ ํ ์ ํ ๊ธฐ๋ฐ ๊ตฌํ์์ ํฉ๊ณ ์ ํ ๊ธฐ๋ฐ ๊ตฌํ์ผ๋ก ์ํํ๊ณ ์ ์ง์ ์ผ๋ก ์ ํํ๋ ค๋ ๊ฒฝ์ฐ ๊ฐ์ฅ ์ฌ์ด ๊ฒฝ๋ก๋ ํฉ๊ณ ์ ํ ๋ฒ์ ์ ์ค์ ๊ตฌํ์ด ์๊ณ ์ ํ โโ์ ํ ๋ฒ์ ์ด sum ์ ํ ๋ฒ์ , ๋ฐํ์ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ค๋ฉด ์ ํ ๊ณต๊ฐ์ผ๋ก์ ๋ชจ๋ ํ๋ก์ ์ ์ด ํ์ํฉ๋๋ค.
๊ทธ๊ฒ์ ์ ๋ง ์ถ์์ ์ด๋ฏ๋ก ์ฌ๊ธฐ์ ์๊ฐ ์์ต๋๋ค
ํฉ๊ณ๊ฐ ์๋ ๋ฒ์ 1
func Take(i interface{}) error {
switch i.(type) {
case int: //do something
case string:
default: return fmt.Errorf("invalid %T", i)
}
}
func Give() (interface{}, error) {
i := f() //something
if i == nil {
return nil, errors.New("whoops v:)v")
}
return i
}
ํฉ๊ณ๊ฐ ์๋ ๋ฒ์ 2
type Value pick {
I int
S string
}
func TakeSum(v Value) {
// do something
}
// Deprecated: use TakeSum
func Take(i interface{}) error {
switch x := i.(type) {
case int: TakeSum(Value{I: x})
case string: TakeSum(Value{S: x})
default: return fmt.Errorf("invalid %T", i)
}
}
type ErrValue pick {
Value
Err error
}
func GiveSum() ErrValue { //though honestly (Value, error) is fine
return f()
}
// Deprecated: use GiveSum
func Give() (interface{}, error) {
switch v := GiveSum().(var) {
case Value:
switch v := v.(var) {
case I: return v, nil
case S: return v, nil
}
case Err:
return nil, v
}
}
๋ฒ์ 3์ Give/Take๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
๋ฒ์ 4๋ GiveSum/TakeSum์ ๊ตฌํ์ Give/Take๋ก ์ด๋ํ๊ณ GiveSum/TakeSum์ด Give/Take๋ฅผ ํธ์ถํ๊ณ GiveSum/TakeSum์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋๋ก ํฉ๋๋ค.
๋ฒ์ 5๋ GiveSum/TakeSum์ ์ ๊ฑฐํฉ๋๋ค.
์์๊ฑฐ๋ ๋น ๋ฅด์ง๋ ์์ง๋ง ๋น์ทํ ์ฑ๊ฒฉ์ ๋ค๋ฅธ ๋๊ท๋ชจ ํ๊ดด์ ๋์ผํ๋ฉฐ ์ธ์ด์์ ์ถ๊ฐ๋ก ํ์ํ ๊ฒ์ ์์ต๋๋ค.
(๋๋ถ๋ถ) sum ์ ํ์ ์ ํธ๋ฆฌํฐ๋ ์ปดํ์ผ ํ์์ ์ ํ ์ธํฐํ์ด์ค ์ ํ์ ๋ํ ํ ๋น์ ์ ํํ๋ ๋ฉ์ปค๋์ฆ์ผ๋ก{} ์คํ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฟ์์ ๊ทธ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ ๋๋ค.
type T1 switch {T2,T3} // only nil, T2 and T3 may be assigned to T1
type T2 struct{}
type U switch {} // only nil may be assigned to U
type V switch{interface{} /* ,... */} // V equivalent to interface{}
type Invalid switch {T2,T2} // only uniquely named types
type T3 switch {int,uint} // switches can contain switches but...
... ์ค์์น ์ ํ์ด ๋ช ์์ ์ผ๋ก ์ ์๋์ง ์์ ์ ํ์ด๋ผ๊ณ ์ฃผ์ฅํ๋ ๊ฒ๋ ์ปดํ์ผ ํ์ ์ค๋ฅ๊ฐ ๋ฉ๋๋ค.
var t1 T1
i,ok := t1.(int) // T1 can't be int, only T2 or T3 (but T3 could be int)
switch t := t1.(type) {
case int: // compile error, T1 is just nil, T2 or T3
}
go vet๋ T3์ ๊ฐ์ ์ ํ์ ๋ํ ๋ชจํธํ ์์ ํ ๋น์ ๋ํด ์์ดํ์ง๋ง ๋ชจ๋ ์๋์ ๋ชฉ์ (๋ฐํ์ ์)์ ๋ํด var x T3 = 32
๋ var x interface{} = 32
์
๋๋ค. ์ค์์น๋ ์กฐ๋๋ง๊ณผ ๊ฐ์ ์ด๋ฆ์ ํจํค์ง์ ๋ด์ฅ๋ ์ผ๋ถ ๋ฏธ๋ฆฌ ์ ์๋ ์ค์์น ์ ํ๋ ๊ทธ๋ฃจ๋นํ ์ ์์ต๋๋ค.
@j7b , @ianlancetaylor ๋ https://github.com/golang/go/issues/19412#issuecomment -323256891์์ ๋น์ทํ ์์ด๋์ด๋ฅผ ์ ์ํ์ต๋๋ค.
๋๋ ๋์ค์ https://github.com/golang/go/issues/19412#issuecomment -325048452์ ์ด๊ฒ์ ๋ ผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ ๊ฒ์ํ์ต๋๋ค.
์ ์ฌ์ฑ์ ๊ฐ์ํ ๋ ๋ง์ ๋ถ๋ถ์ด ๋์ผํ๊ฒ ์ ์ฉ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฐ ๊ฒ์ด ์๋ํ๋ค๋ฉด ์ ๋ง ์ข์ ๊ฒ์
๋๋ค. ์ธํฐํ์ด์ค์์ ์ธํฐํ์ด์ค+์ ํ์ผ๋ก ์ฝ๊ฒ ์ ํํ ์ ์์ต๋๋ค(ํนํ Ian์ ๊ตฌ๋ฌธ: ์ธํฐํ์ด์ค๋ก ๋น๋๋ ๊ธฐ์กด ์์ฌ ํฉ๊ณ ๋์ restrict
๋ฅผ ๋ถ์ด๋ฉด ๋ฉ๋๋ค). ๋ฐํ์ ์ ์ธํฐํ์ด์ค์ ๋ณธ์ง์ ์ผ๋ก ๋์ผํ๊ณ ๋๋ถ๋ถ์ ์์
์ ๋ถ๋ณ๋์ด ๊นจ์ก์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ถ๊ฐ ์ค๋ฅ๋ฅผ ๋ด๋ณด๋ด๋๋ก ํ๊ธฐ ๋๋ฌธ์ ๊ตฌํํ๊ธฐ ์ฝ์ต๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ ์๋์ํค๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋๋ฌด ๊ฐ๊น์ด๊ฐ ์ ํฉ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋น์ ์ด ํ๋ํ๊ณ ์ ๋ ฌ ๋ฐ์ผ๋ก ์กฐ๊ธ ๋ฐ์ดํ๊ณ ๋ญ๊ฐ ๋ค๋ฅธ ํ์ ์ค ์ ์๋๋ก ๊ทธ๋ฅ, ๊ฝค ๊ด์ฐฎ ์๋๋ผ๋ ๊ฒ์ ๋ชจ๋ ๋ผ์ธ๊น์ง. ๋ณต๊ตฌ๋ฅผ ์๋ํ ์ ์์ง๋ง ์ธํฐํ์ด์ค์ ๋งค์ฐ ์ ์ฌํ์ง๋ง ์ด์ํ ๊ฒฝ์ฐ์๋ ๋ค๋ฅด๊ฒ ๋์ํ๋ ๊ฒ์ ์ป๊ฒ ๋ฉ๋๋ค.
์ด์ฉ๋ฉด ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์๋ ๊ฒ ๊ฐ๋ค.
์ผ์ด์ค๊ฐ ๋ฐ๋์ ๋ถ๋ฆฌ๋์ด ์์ง ์์๋ ๊ด์ฐฎ๋ค๋ฉด ์ ํ๋ ์ธํฐํ์ด์ค ์ ์์ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ ์ธํฐํ์ด์ค ์ ํ(์ io.Reader
/ io.Writer
) ๊ฐ์ ๊ฒฐํฉ์ด ๋ถ๋ฆฌ๋์ง ์๋๋ค๋ ๊ฒ์ด ๋น์ ๋งํผ ๋๋ผ์ด ์ผ์ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. interface{}
ํ ๋น๋ ๊ฐ์ด io.Reader
๋๋ io.Writer
๋ก ์ ์ฅ๋์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์๋ค๋ ์ฌ์ค๊ณผ ์์ ํ ์ผ์นํฉ๋๋ค. ๊ฐ ๊ฒฝ์ฐ๊ฐ ๊ตฌ์ฒด์ ์ธ ์ ํ์ธ ํ ๋ถ๋ฆฌ๋ ๊ณต์ฉ์ฒด๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค๋ ์ฌ์ค์ ์๋ฒฝํ๊ฒ ์ ์ ํด ๋ณด์
๋๋ค.
๋จ์ ์ ๊ณต์ฉ์ฒด๊ฐ ์ ํ๋ ์ธํฐํ์ด์ค์ธ ๊ฒฝ์ฐ ํด๋น ์ธํฐํ์ด์ค์์ ์ง์ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ํ๋ ์ธํฐํ์ด์ค ์ ํ์ธ ๊ฒฝ์ฐ pick
์ ํ์ด ์ ๊ณตํ๋ ๋ณด์ฅ๋ ์ง์ ์ ์ฅ์๋ฅผ ์ป์ง ๋ชปํฉ๋๋ค. ์ด๋ฌํ ์ถ๊ฐ ์ด์ ์ ์ป๊ธฐ ์ํด ์ธ์ด์ ๊ณ ์ ํ ์ข
๋ฅ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ฐ์น๊ฐ ์๋์ง ์ฌ๋ถ๋ ํ์คํ์ง ์์ต๋๋ค.
type T switch {io.Reader,io.Writer}
๋ํ @jimmyfrasche ReadWriter๋ฅผ T์ ํ ๋นํ๋ ๊ฒ์ ๊ด์ฐฎ์ง๋ง T๊ฐ io.Reader ๋๋ Io.Writer๋ผ๊ณ ์ฃผ์ฅํ ์๋ง ์์ต๋๋ค. io.Reader ๋๋ io.Writer๋ฅผ ์ฃผ์ฅํ๋ ค๋ฉด ๋ค๋ฅธ ์ฃผ์ฅ์ด ํ์ํฉ๋๋ค. ์ ์ฉํ ์ฃผ์ฅ์ธ ๊ฒฝ์ฐ ์ค์์น ์ ํ์ ์ถ๊ฐํ๋๋ก ๊ถ์ฅํด์ผ ํ๋ ReadWriter.
@stevenblenkinsop ๋น์ ์ ๋ฐฉ๋ฒ ์์ด ์ ํ ์ ์ ์ ์ ์ํ ์ ์์ต๋๋ค. ์ค์ ๋ก ๋ฉ์๋์ ์์์ ํ๋ ์ด๋ฆ์ ์ ๊ฑฐํ๋ฉด ์ ํ ์๋ฒ ๋ฉ์ ํ์ฉํ ์ ์์ต๋๋ค. (๋ถ๋ช ํ ๋ด ์๊ฐ์๋ ๋ฉ์๋์ ํจ์ฌ ๋ํ์ง๋ง ์์์ ํ๋ ์ด๋ฆ์ด ๋ ์ ์ฉํ ํธ๋ ์ด๋ ์คํ์ ๋๋ค.)
๊ทธ๋ฆฌ๊ณ ๋ฐ๋ฉด์ @ianlancetaylor ์ ๊ตฌ๋ฌธ์ ๋ค์์ ํ์ฉํฉ๋๋ค.
type IR interface {
Foo()
Bar()
} restrict { A, B, C }
A
, B
, C
๊ฐ๊ฐ์ Foo
๋ฐ Bar
๋ฉ์๋๊ฐ ์๋ ํ ์ปดํ์ผ๋ฉ๋๋ค C
์ฝ nil
๊ฐ).
ํธ์ง: ์ดํค๋ฆญ์ฒด๋ก ๋ ์ค๋ช
๋๋ ์ด๋ค ํํ์ _restricted interface_๊ฐ ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ๋๋ ๊ทธ ๊ตฌ๋ฌธ์ ๋์ํ์ง ์๋๋ค. ์ฌ๊ธฐ ๋ด๊ฐ ์ ์ํ๋ ๊ฒ์ด ์์ต๋๋ค. ๋ฐ๋์ ๊ณตํต ๋์์ ๊ฐ์ง ์๋ ๋๋ฉ์ธ ๊ด๋ จ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฃนํํ๋ ๋์ ๋ฐ์ดํฐ ์ ํ๊ณผ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
//MyGroup can be any of these. It can contain other groups, interfaces, structs, or primitive types
type MyGroup group {
MyOtherGroup
MyInterface
MyStruct
int
string
//..possibly some other types as well
}
//type definitions..
type MyInterface interface{}
type MyStruct struct{}
//etc..
func DoWork(item MyGroup) {
switch t:=item.(type) {
//do work here..
}
}
์ด ์ ๊ทผ ๋ฐฉ์์ ๊ธฐ์กด์ ๋น ์ธํฐํ์ด์ค interface{}
์ ๊ทผ ๋ฐฉ์์ ๋นํด ๋ช ๊ฐ์ง ์ด์ ์ด ์์ต๋๋ค.
๋น ์ธํฐํ์ด์ค interface{}
๋ ๊ด๋ จ๋ ์ ํ์ ์๋ฅผ ์ ์ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค. ๋ฐํ์ ๊ฒ์ฆ์ ์์กดํ ์ ๋ฐ์ ์์ต๋๋ค. ๋ฐ๋ฉด์ ์ ํ ์๊ฐ ์ ํ๋๊ณ ์ปดํ์ผ ์๊ฐ์ ์๋ ค์ง๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์ฐ๋ฆฌ๋ฅผ ๋๋๋ก ํ์ง ์๊ฒ ์ต๋๊น?
@henryas ์ ๋ ๋ ์ ์ฉํ ๋น๊ต๊ฐ ํ์ฌ ๊ถ์ฅ๋๋ (๊ฐ๋ฐฉํ) ํฉ๊ณ ์ ํ์ ์ํํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋น์ด ์์ง ์์ ์ธํฐํ์ด์ค(๋ด
๋๋ ๋น์ ์ ์ฃผ์ฅ์ด ์ค์ํ ๋ฐฉ์์ผ๋ก ๊ทธ๊ฒ์ ์ ์ฉ๋๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋ค์์ Go protobuf์ ๋ํ ๊ฒฝํ ๋ณด๊ณ ์์ ๋๋ค.
proto2 ๊ตฌ๋ฌธ์ 0 ๊ฐ๊ณผ ์ค์ ๋์ง ์์ ๊ฐ์ด ๊ตฌ๋ณ๋๋ ์ ํ์ธ "์ ํ์ " ํ๋๋ฅผ ํ์ฉํฉ๋๋ค. ํ์ฌ ์๋ฃจ์
์ ํฌ์ธํฐ(์: *int
)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์ nil ํฌ์ธํฐ๋ ์ค์ ๋์ง ์์ ๊ฒ์ ๋ํ๋ด๊ณ set ํฌ์ธํฐ๋ ์ค์ ๊ฐ์ ๊ฐ๋ฆฌํต๋๋ค. ์ํ๋ ๊ฒ์ ๊ฐ์ ์ก์ธ์คํ๊ธฐ๋ง ํ๋ฉด ๋๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ๋ณต์กํ๊ฒ ํ์ง ์๊ณ 0๊ณผ ์ค์ ๋์ง ์์ ๊ฒ์ ๊ตฌ๋ณํ ์ ์๊ฒ ํ๋ ์ ๊ทผ ๋ฐฉ์์
๋๋ค(์ฌ๊ธฐ์ 0 ๊ฐ์ ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ๊ด์ฐฎ์).
proto ์ธ์ด๋ proto ๋ฒ์ ์ sum ์ ํ์ธ "one of"๋ฅผ ํ์ฉํฉ๋๋ค. ํ์ฌ ์ทจํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค( ์ ์ฒด ์ ).
type Communique_Union interface { isCommunique_Union() }
)isCommunique_Union
๋ฉ์๋๊ฐ ์๋ ํ์ฉ๋ ๊ฐ ์ ํ(์: type Communique_Number struct { Number int32 }
)์ ๋ํํ๋ ๊ฒ๋ฟ์
๋๋ค.@henryas ์ ๋ ๋ ์ ์ฉํ ๋น๊ต๊ฐ ํ์ฌ ๊ถ์ฅ๋๋ (๊ฐ๋ฐฉํ) ํฉ๊ณ ์ ํ์ ์ํํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋น์ด ์์ง ์์ ์ธํฐํ์ด์ค(๋ด
๋๋ ๋น์ ์ ์ฃผ์ฅ์ด ์ค์ํ ๋ฐฉ์์ผ๋ก ๊ทธ๊ฒ์ ์ ์ฉ๋๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ฒด๋ฅผ ์ธํฐํ์ด์ค๋ก ์ ๋ฌํ ์ ์๋๋ก ๋ด๋ณด๋ด๊ธฐ๋์ง ์์ ๋๋ฏธ ๋ฉ์๋๋ฅผ ๊ฐ์ฒด์ ์ถ๊ฐํ๋ ๊ฒ์ ์๋ฏธํฉ๋๊น?
type MyInterface interface {
belongToMyInterface() //dummy method definition
}
type MyObject struct{}
func (MyObject) belongToMyInterface(){} //dummy method
๋๋ ๊ทธ๊ฒ์ด ์ ํ ๊ถ์ฅ๋์ด์ผํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ํด๊ฒฐ์ฑ ์ด๋ผ๊ธฐ๋ณด๋ค๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ๊น์ต๋๋ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ๋น ๋ฉ์๋์ ๋ถํ์ํ ๋ฉ์๋ ์ ์๊ฐ ์๋ ๊ฒ๋ณด๋ค ์ ์ ์ ํ ๊ฒ์ฆ์ ํฌ๊ธฐํ๊ณ ์ถ์ต๋๋ค.
๋ค์์ _dummy method_ ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์ ์ ๋๋ค.
interface{}
์ ๊ทผ ๋ฐฉ์๋ณด๋ค ํจ์ฌ ๋ ๋์ฉ๋๋ค. ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ด ์์ต๋๋ค.@henryas
๋๋ ๋น์ ์ ์ธ ๋ฒ์งธ ์์ ์ด ๊ฐ๋ ฅํ ์ฃผ์ฅ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ํ๊ณ์ฌ๊ฐ ๊ฐ์ฒด ๊ด๊ณ๋ฅผ ๋ค๋ฅด๊ฒ ๋ณด๋ ค๋ ๊ฒฝ์ฐ ํ๊ณ์ฌ๋ ์ฌ์์ ๋ง๋ ๊ณ ์ ํ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ธํฐํ์ด์ค์ private ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค๊ณ ํด์ ์ด๋ฅผ ๋ง์กฑํ๋ ๊ตฌ์ฒด์ ์ธ ์ ํ์ด ๋ค๋ฅธ ๊ณณ์์ ์ ์๋ ์ธํฐํ์ด์ค์ ํ์ ์งํฉ๊ณผ ํธํ๋์ง ์๋๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
Go ํ์๋ ์ด ๊ธฐ์ ์ ๋ง์ด ์ฌ์ฉํ๋ฉฐ ์์งํ ๋งํด์ ์ ํ์ด ์ธ์ด๋ก ์ ํ์ ๊ตฌํํ๋ ๊ฒ์ ๋ณด์ฆํ ์ ๋๋ก ํจํค์ง๋ฅผ ํจ์ฌ ๋ ์ข๊ฒ ๋ง๋๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค.
@as ๋ด ์์ ์ ์๋ก์ด _๊ด๊ณ ๋ณด๊ธฐ_๊ฐ ์์ฑ๋ ๋๋ง๋ค ์ด ๋ณด๊ธฐ์ ๋ํ ํน์ ์กฐ์ ์ ์ํด ๊ด๋ จ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๊ฒ ํ๊ธฐ ์ํด ๊ฐ์ฒด๋ ์ข ์ข ์๋น์์ ๋๋ฉ์ธ์ ๋ํด ํน์ ๊ฐ์ ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ์ฒด์ ์๋น์๊ฐ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด ์๊ฑฐ๋ Go ํ์์ ๊ฒฝ์ฐ์ ๊ฐ์ด ๋์ผํ ๋๋ฉ์ธ ๋ด์ ๊ฑฐ์ฃผํ๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ์ฌ๋ฌ ๋๋ฉ์ธ์์ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ์ด์ ๊ฐ์ฒด๋ _dummy method_ ์ ๊ทผ ๋ฐฉ์์ด ์๋ํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ชจ๋ ๋๋ฉ์ธ์ ๋ํด ์ฝ๊ฐ ์์์ผ ํฉ๋๋ค.
๊ฐ์ฒด์ ์ฐ๊ฒฐ๋ ๋ง์ ๋น ๋ฉ์๋๊ฐ ์๊ณ , ์ด๋ฌํ ๋ฉ์๋๋ฅผ ํ์๋ก ํ๋ ์ธํฐํ์ด์ค๊ฐ ๋ณ๋์ ๋๋ฉ์ธ/ํจํค์ง/๊ณ์ธต์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฉ์๋๊ฐ ํ์ํ ์ด์ ๊ฐ ๋ ์์๊ฒ ๋ช ํํ์ง ์์ต๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ํตํ ๊ฐ๋ฐฉ ํฉ๊ณ ์ ๊ทผ ๋ฐฉ์์ด ํฉ๊ณ๋ฅผ ์ฝ๊ฒยน ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ ์ถฉ๋ถํ ๊ณตํํฉ๋๋ค. ๋ช ์์ ํฉ๊ณ ์ ํ์ ๋ถ๋ช ํ ํฉ๊ณ๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ "ํฉ๊ณ ์ ํ์ด ์ ํ ์์ ์ฑ์ ์ ๊ณตํฉ๋๋ค"์๋ ๋งค์ฐ ๋ค๋ฅธ ์ฃผ์ฅ์ ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ค๋๋ ์๋ ์ ํ ์์ ์ฑ์ ์ป์ ์ ์์ต๋๋ค.
๋๋ ์ฌ์ ํ ๋ค๋ฅธ ์ธ์ด๋ก ๊ตฌํ๋ ํ์ ์ด์ก์ ๋ ๊ฐ์ง ๋จ์ ์ ๋ด ๋๋ค. ํ๋๋ ๋๊ท๋ชจ ๋ถ์ฐ ๊ฐ๋ฐ ํ๋ก์ธ์ค์์ ์ด๋ฅผ ๋ฐ์ ์ํค๋ ์ด๋ ค์์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋, ๋๋ ์ด๋์ด ๋งค์ฐ ๊ฐ๋ ฅํ ํ์ ์์คํ ์ ๊ฐ์ง๊ณ ํ์ง ์๋ ๊ฒ์ฒ๋ผ ๊ทธ๋ค์ด ๊ทธ ์ข ๋ฅ์ ์ฝ๋ฉ ์คํ์ผ์ ์ฅ๋ คํ๊ณ ๋์ ์ฝ๋ ํ๋ก๊ทธ๋จ์ผ๋ก, ์ ํ ์์คํ ์ ์ ์์ ์ถ๊ฐํ๊ณ ๋ ๊ฒ์ ์๊ฐ - ๋๋ ๋ฌธ์ ๊ฐ ํํ์ ๋๋ฆด ์ ์์์ ๋๋ ๋ ๋ ๊ฐ๋ ฅํ ์ ํ ์์คํ , ๋ ๊ฐ๋ ฅํ ์ธ์ด(์: Haskell ๋๋ Rust)๋ก ์ด๋ํฉ๋๋ค.
์ฆ, ์ ์ด๋ ๋ ๋ฒ์งธ ๊ฒ์ ํ์คํ ์ ํธํ๋ ๊ฒ ์ค ํ๋์ด๋ฉฐ ๋์ํ๋๋ผ๋ ๋จ์ ์ด ์ฅ์ ์ ๋ฅ๊ฐํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋์ง ์ฌ๋ถ๋ ๊ฐ์ธ ์ทจํฅ์ ๋ฌ๋ ค ์์ต๋๋ค. ๋ซํ ํฉ๊ณ ์ ํ ์์ด๋ ์ ํ์ด ์์ ํ ํฉ๊ณ๋ฅผ ์ป์ ์ ์๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์์ต๋๋ค.
[1] ํนํ, ์ฝ์ง๋ ์์ง๋ง ์ฌ์ ํ ๊ฐ๋ฅํฉ๋๋ค . ์๋ฅผ ๋ค์ด ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
type Node interface {
node()
}
type Foo struct {
bar.Baz
}
func (foo) node() {}
@๋ฉ๋ก๋น์ฐ์ค
๋๋ ๋น์ ์ ๋ ๋ฒ์งธ ๋จ์ ์ ๋์ํ์ง ์์ต๋๋ค. ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ํฉ๊ณ ์ ํ์ ์ด์ ์ด ์์ง๋ง ์ด์ ๋น ์ธํฐํ์ด์ค์ ํจ๋์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋๋ ๊ณณ์ด ๋ง๋ค๋ ์ฌ์ค์ ์ด๊ฒ์ด ๋ถ์กฑํ๋ฉด ์ฝ๋ฉ์ ํด๋ฅผ ๋ผ์น๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋ฌผ๋ก ์ฌ๋๋ค์ ๊ทธ๋ฐ ์ฝ๋๊ฐ ์ฒ์์ ์์ฑ๋์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์๊ณ ํฉ๊ณ ์ ํ์ด ํ์ํ์ง ์๋ค๊ณ ๋งํ ์๋ ์์ง๋ง ๊ทธ ๋
ผ๋ฆฌ์ ์ด๋ฆฌ์์์ ํจ์์ ๋ํด ๋ค๋ฅธ ์ ํ์ด ํ์ํ์ง ์๋ค๋ ๊ฒ์
๋๋ค. ์๋ช
ํ๊ณ ๋์ ๋น ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํ์ฌ ํฉ๊ณ ์ ํ์ ๋ํ๋ด๊ธฐ ์ํด ์ผ๋ถ ๋ฐฉ๋ฒ๊ณผ ํจ๊ป ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ํ ๊ฐ์ง ํฐ ๋จ์ ์ด ์์ต๋๋ค. ์์์ ์ผ๋ก ๊ตฌํ๋๊ธฐ ๋๋ฌธ์ ํด๋น ์ธํฐํ์ด์ค์ ์ฌ์ฉํ ์ ์๋ ์ ํ์ ๋ชจ๋ฆ ๋๋ค. ์ ์ ํ ํฉ๊ณ ์ ํ์ ์ฌ์ฉํ๋ฉด ์ ํ ์์ฒด์์ ์ค์ ๋ก ์ฌ์ฉํ ์ ์๋ ์ ํ์ ์ ํํ ์ค๋ช ํ์ต๋๋ค.
๋๋ ๋น์ ์ ๋ ๋ฒ์งธ ๋จ์ ์ ๋์ํ์ง ์์ต๋๋ค.
"ํฉ๊ณ ์ ํ์ ์ ํ์ ์ฌ์ฉํ ํ๋ก๊ทธ๋๋ฐ์ ๊ถ์ฅํฉ๋๋ค"๋ผ๋ ๋ง์ ๋์ํ์ง ์์ต๋๊น, ์๋๋ฉด ๊ทธ๊ฒ์ด ๋จ์ ์ด๋ผ๋ ๋ฐ ๋์ํ์ง ์์ต๋๊น? ๋น์ ์ด ์ฒซ ๋ฒ์งธ ์๊ฒฌ์ ๋์ํ์ง ์๋ ๊ฒ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์(๊ทํ์ ์๊ฒฌ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด์ ๋ํ ์ฌ์ฃผ์ฅ์ ๋๋ค) ๋ ๋ฒ์งธ ์๊ฒฌ์ ๋ํด์๋ ์์ ์ ํธ๋์ ๋ฌ๋ ค ์์์ ์ธ์ ํ์ต๋๋ค.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ํฉ๊ณ ์ ํ์ ์ด์ ์ด ์์ง๋ง ์ด์ ๋น ์ธํฐํ์ด์ค์ ํจ๋์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋๋ ๊ณณ์ด ๋ง๋ค๋ ์ฌ์ค์ ์ด๊ฒ์ด ๋ถ์กฑํ๋ฉด ์ฝ๋ฉ์ ํด๋ฅผ ๋ผ์น๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋ฌผ๋ก ์ฌ๋๋ค์ ๊ทธ๋ฐ ์ฝ๋๊ฐ ์ฒ์์ ์์ฑ๋์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์๊ณ ํฉ๊ณ ์ ํ์ด ํ์ํ์ง ์๋ค๊ณ ๋งํ ์๋ ์์ง๋ง ๊ทธ ๋ ผ๋ฆฌ์ ์ด๋ฆฌ์์์ ํจ์์ ๋ํด ๋ค๋ฅธ ์ ํ์ด ํ์ํ์ง ์๋ค๋ ๊ฒ์ ๋๋ค. ์๋ช ํ๊ณ ๋์ ๋น ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ด๋ฐ ์ข ๋ฅ์ ํ๋ฐฑ ๋ ผ์ ์ ์ค์ ๋ก ๋์์ด ๋์ง ์์ต๋๋ค . ๋๋ ํฉ๊ณ ์ ํ์ด ์ด๋ค ๊ฒฝ์ฐ์๋ ๊ณ ํต์ ์ค์ผ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ํ์ ์์คํ ์ ๋ ๊ฐ๋ ฅํ๊ฒ ๋ชจ๋ ๋ณํ๋ ์ด๋ค ๊ฒฝ์ฐ์๋ ํต์ฆ์ ๊ฐ์์ํฌ ๊ฒ์ด๋ค - ๊ทธ๋ฌ๋ ๋ํ ์ด๋ค ๊ฒฝ์ฐ์๋ ํต์ฆ์ ์์ธ์ด๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ง๋ฌธ์ ๋ค๋ฅธ ๊ฒ๋ณด๋ค ์ค์ํฉ๋๋ค(์ฆ, ์ด๋ ์ ๋ ์ ํธ๋์ ๋ฌธ์ ).
ํ ๋ก ์ ์ฐ๋ฆฌ๊ฐ ํ์ด์ฌ๊ณผ ๊ฐ์ ์ ํ ์์คํ (์ ํ ์์)์ ์ํ๋์ง ์๋๋ฉด coq-esque ์ ํ ์์คํ (๋ชจ๋ ๊ฒ์ ๋ํ ์ ํ์ฑ ์ฆ๋ช )์ ์ํ๋์ง์ ๋ํ ๊ฒ์ด์ด์๋ ์ ๋ฉ๋๋ค. ๋ ผ์๋ "ํฉ๊ณ ์ ํ์ ์ด์ ์ด ๋จ์ ๋ณด๋ค ๋ ์ค์ํจ"์ด์ด์ผ ํ๋ฉฐ ๋ ๋ชจ๋๋ฅผ ์ธ์ ํ๋ ๊ฒ์ด ๋์์ด ๋ฉ๋๋ค.
FTR, ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ๊ณต๊ฐ ํฉ๊ณ ์ ํ์ ๋ฐ๋ํ์ง ์์ ๊ฒ์์ ๋ค์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค(์ฆ, ๋ชจ๋ ํฉ๊ณ ์ ํ์๋ ์์์ ๋๋ ๋ช ์์ "SomethingElse"-์ผ์ด์ค๊ฐ ์์). (๋๋ถ๋ถ ์งํํ๊ธฐ ์ด๋ ต๋ค๋) ๊ธฐ์ ์ ์ธ ์ฅ์ ๋ ๋๋ถ๋ถ ์ ๊ณตํฉ๋๋ค(์ ์ ์ ํ ๊ฒ์ฌ, ์ธ๊ธํ ๋ฌธ์, ๋ค๋ฅธ ํจํค์ง์ ์ ํ์ ์ด๊ฑฐํ ์ ์์ต๋๋ค...).
๊ทธ๋ฌ๋ ๋๋ ๋ํ ๊ณต๊ฐ ํฉ๊ณ๊ฐ a) ์ผ๋ฐ์ ์ผ๋ก ํฉ๊ณ ์ ํ์ ์ถ๊ตฌํ๋ ์ฌ๋๋ค์๊ฒ ๋ง์กฑ์ค๋ฌ์ด ํํ์ด ์๋ ๊ฒ์ด๋ฉฐ b) ์๋ง๋ Go ํ์ ํฌํจ๋๋ ๊ฒ์ ๋ณด์ฆํ ๋งํผ ์ถฉ๋ถํ ํฐ ์ด์ ์ผ๋ก ๊ฐ์ฃผ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ด๋ฌํ ๊ฐ์ ์ค ํ๋ ๋๋ ๋ ๋ชจ๋์์ ์๋ชป๋ ๊ฒ์ผ๋ก ์ ์ฆ๋ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค. :)
์ง๋ฌธ ํ๋ ๋:
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ํฉ๊ณ ์ ํ์ ์ด์ ์ ์ป์ ์ ์๋ ์์น๊ฐ ๋ง์ด ์๋ค๋ ์ฌ์ค
๋๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ค์ํ ์ด์ ์ด ์๋ค๊ณ ๋งํ ์ ์๋ ๋ ๊ณณ๋ง ์๊ฐํ ์ ์์ต๋๋ค. ๋ฐ๋ก Reflect ๋ฐ go/ast์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฑฐ๊ธฐ์์๋ ํจํค์ง๊ฐ ์์ด๋ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ๊ธฐ์ค์ ์์ "ํ๋ถํ"๊ณผ "์์ฒญ๋"์ด๋ผ๋ ๋จ์ด๋ ๊ณผ์ฅ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ฌผ๋ก ํฉ๋ฒ์ ์ธ ์ฅ์๋ฅผ ๋ง์ด ๋ณด์ง ๋ชปํ ์๋ ์์ต๋๋ค.
database/sql/driver.Value
๋ ํฉ๊ณ ์ ํ์ด ๋๋ ์ด์ ์ด ์์ต๋๋ค(#23077 ์ฐธ์กฐ).
https://godoc.corp.google.com/pkg/database/sql/driver#๊ฐ
๊ทธ๋ฌ๋ database/sql.Rows.Scan
์ ๋ ๋ง์ ๊ณต์ฉ ์ธํฐํ์ด์ค๋ ๊ธฐ๋ฅ ์์ค ์์ด๋ ์๋๋๋ค. ์ค์บ์ ๊ธฐ๋ณธ ์ ํ์ด int
์ธ ๊ฐ์ ์ฝ์ ์ ์์ต๋๋ค. ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ํฉ๊ณ ์ ํ์ผ๋ก ๋ณ๊ฒฝํ๋ ค๋ฉด ์
๋ ฅ์ ์ ํ ์ ํ ์ธํธ๋ก ์ ํํด์ผ ํฉ๋๋ค.
https://godoc.corp.google.com/pkg/database/sql#Rows.Scan
@๋ฉ๋ก๋น์ฐ์ค
๋๋ ๊ฐ๋ฐฉํ ํฉ๊ณ ์ ํ(์ฆ, ๋ชจ๋ ํฉ๊ณ ์ ํ์๋ ์์์ ๋๋ ๋ช ์์ "SomethingElse"-์ผ์ด์ค๊ฐ ์์)์ ๋ฐ๋ํ์ง ์์ ๊ฒ์ ๋๋ค. ์ด๋ ๋๋ถ๋ถ์ ๊ธฐ์ ์ ์ธ ๋จ์ ์ ์ํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค(๋๋ถ๋ถ ์งํํ๊ธฐ ์ด๋ ต๋ค)
ํ์ ์ด์ก์ "์งํํ๊ธฐ ์ด๋ ค์ด" ๋ฌธ์ ๋ฅผ ์ํํ๋ ๋ค๋ฅธ ์ต์ ์ด ์ ์ด๋ ๋ ๊ฐ์ง ์์ต๋๋ค.
ํ๋๋ ์ค์ ๋ก ํฉ๊ณ์ ์ผ๋ถ๊ฐ ์๋ ์ ํ์ ๋ํ ์ผ์น๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํฉ๊ณ์ ๊ตฌ์ฑ์์ ์ถ๊ฐํ๋ ค๋ฉด ๋จผ์ ์ ๊ตฌ์ฑ์๊ณผ ์ผ์นํ๋๋ก ํด๋น ์๋น์๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์๋น์๊ฐ ์ ๋ฐ์ดํธ๋ ํ์๋ง ํด๋น ๊ตฌ์ฑ์์ ์ค์ ๋ก ์ถ๊ฐํฉ๋๋ค.
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ "๋ถ๊ฐ๋ฅํ" ๊ตฌ์ฑ์์ ํ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ฆ, ์ผ์น ํญ๋ชฉ์์๋ ๋ช ์์ ์ผ๋ก ํ์ฉ๋์ง๋ง ์ค์ ๊ฐ์์๋ ๋ช ์์ ์ผ๋ก ํ์ฉ๋์ง ์๋ ๊ตฌ์ฑ์์ ๋๋ค. ํฉ๊ณ์ ๊ตฌ์ฑ์์ ์ถ๊ฐํ๋ ค๋ฉด ๋จผ์ ๋ถ๊ฐ๋ฅํ ๊ตฌ์ฑ์์ผ๋ก ์ถ๊ฐํ ๋ค์ ์๋น์๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ๋ง์ง๋ง์ผ๋ก ์ ๊ตฌ์ฑ์์ ๊ฐ๋ฅํ๊ฒ ๋ณ๊ฒฝํฉ๋๋ค.
database/sql/driver.Value
๋ ํฉ๊ณ ์ ํ์ด ๋๋ ์ด์ ์ด ์์ ์ ์์ต๋๋ค.
๋์ํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ํด ๋ชฐ๋์ต๋๋ค. ๊ฐ์ฌ ํด์ :)
ํ๋๋ ์ค์ ๋ก ํฉ๊ณ์ ์ผ๋ถ๊ฐ ์๋ ์ ํ์ ๋ํ ์ผ์น๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํฉ๊ณ์ ๊ตฌ์ฑ์์ ์ถ๊ฐํ๋ ค๋ฉด ๋จผ์ ์ ๊ตฌ์ฑ์๊ณผ ์ผ์นํ๋๋ก ํด๋น ์๋น์๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์๋น์๊ฐ ์ ๋ฐ์ดํธ๋ ํ์๋ง ํด๋น ๊ตฌ์ฑ์์ ์ค์ ๋ก ์ถ๊ฐํฉ๋๋ค.
ํฅ๋ฏธ๋ก์ด ์๋ฃจ์ ์ ๋๋ค.
@Merovius ์ธํฐํ์ด์ค๋ ๋ณธ์ง์ ์ผ๋ก ๋ฌดํํฉ ์ ํ์ ์ ํ๊ตฐ์
๋๋ค. ๋ฌดํ์ด๋ ์๋๋ ๋ชจ๋ ํฉ๊ณ ์ ํ์๋ default:
์ผ์ด์ค๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ํ ํฉ๊ณ ์ ํ์ด ์์ผ๋ฉด default:
๋ ์ด์ ๋ํด ์์ง ๋ชปํ๋ ์ ํจํ ๊ฒฝ์ฐ ๋๋ ํ๋ก๊ทธ๋จ ์ด๋๊ฐ์ ๋ฒ๊ทธ์ธ ์๋ชป๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ ํ ํฉ๊ณ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์์ผ ๋ฟ ํ์๋ ์ ๋ ์๋๋๋ค.
json.Token ๋ฐ sql.Null* ์ ํ์ ๋ค๋ฅธ ์ ์ ์์ ๋๋ค. go/types๋ go/ast์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ๋ด๋ถ ์ํ์ ๋๋ฉ์ธ์ ์ ํํ์ฌ ๋ณต์กํ ๋ฐฐ๊ด์ ๋๋ฒ๊น ํ๊ณ ํ ์คํธํ๋ ๊ฒ์ด ๋ ์ฌ์ ์ ๋ด๋ณด๋ธ API์ ์๋ ๋ง์ ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ผ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ณต๊ฐ API์์ ์์ฃผ ๋ฑ์ฅํ์ง ์๋ ๋ด๋ถ ์ํ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ ์กฐ๊ฑด์ ๊ฐ์ฅ ์ ์ฉํ์ง๋ง ๊ฐ๋ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ ํฉ๊ณ ์ ํ์ด Go์๊ฒ ์ถฉ๋ถํ ์ถ๊ฐ ์ ๋ ฅ์ ์ ๊ณตํ์ง๋ง ๋๋ฌด ๋ง์ด๋ ์ ๊ณตํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. Go ์ ํ ์์คํ ์ ์ด๋ฏธ ๋งค์ฐ ํ๋ฅญํ๊ณ ์ ์ฐํ์ง๋ง ๋จ์ ์ด ์์ต๋๋ค. ์ ํ ์์คํ ์ ์ถ๊ฐ๋ Go2๋ ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒ๋งํผ ๋ง์ ์ ๋ ฅ์ ์ ๊ณตํ์ง ์์ ๊ฒ์ ๋๋ค. ํ์ํ ๊ฒ์ 80-90%๊ฐ ์ด๋ฏธ ์ ์๋ฆฌ์ ์์ต๋๋ค. ๋ด ๋ง์, ์ ๋ค๋ฆญ์กฐ์ฐจ๋ ๊ทผ๋ณธ์ ์ผ๋ก ์๋ก์ด ๊ฒ์ ํ๋๋ก ํ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค. ์ฆ, ์ด๋ฏธ ํ๊ณ ์๋ ์ผ์ ๋ ์์ ํ๊ณ , ๋ ์ฝ๊ณ , ๋ ์ฑ๋ฅ ์ข๊ฒ, ๋ ๋์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ์์ผ๋ก ํ ์ ์์ต๋๋ค. ํฉ๊ณ ์ ํ์ ์ ์ฌํฉ๋๋ค.
ํฉ๊ณ ์ ํ ์ค์์น์ ๋ํด ๊ด๋ จ ์๋ ๊ธฐ๋ณธ๊ฐ(๋ชจ๋ ๊ฒฝ์ฐ + ๊ธฐ๋ณธ๊ฐ์ด ํ์ฉ๋จ)์ ํ์ฉํ๊ณ ์ปดํ์ผ๋ฌ๊ฐ ์์ ์ฑ์ ๊ฐ์ ํ์ง ์๋ ๊ฒฝ์ฐ(๋ฆฐํฐ๋ ๊ฐ๋ฅํ์ง๋ง) ํฉ๊ณ์ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค. ) ๋ค๋ฅธ ๊ณต๊ฐ API๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
json.Token ๋ฐ sql.Null* ์ ํ์ ๋ค๋ฅธ ์ ์ ์์ ๋๋ค.
ํ ํฐ - ๋ฌผ๋ก ์ ๋๋ค. AST ๋ฌธ์ ์ ๋ ๋ค๋ฅธ ์ธ์คํด์ค(๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ํ์๋ ํฉ๊ณ ์ ํ์ ์ด์ ์ ์ป์).
ํ์ง๋ง sql.Null*์ ๋ํ ์ด์ ์ ๋ณด์ด์ง ์์ต๋๋ค. ์ ๋ค๋ฆญ์ด ์์ผ๋ฉด(๋๋ "๋ง๋ฒ ๊ฐ์" ์ ๋ค๋ฆญ ์ ํ์ ๋ด์ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด) ์ฌ์ ํ ์ ํ์ด ์์ด์ผ ํ๋ฉฐ type NullBool enum { Invalid struct{}; Value Int }
์ type NullBool struct { Valid bool; Value Int }
์ฌ์ด์ ํฐ ์ฐจ์ด๊ฐ ์์ด ๋ณด์
๋๋ค. ์, ์ฐจ์ด๊ฐ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ๊ทธ ์ฐจ์ด๋ ์์ฃผ ์์ต๋๋ค.
ํฉ๊ณ ์ ํ ์ค์์น์ ๋ํด ๊ด๋ จ ์๋ ๊ธฐ๋ณธ๊ฐ(๋ชจ๋ ๊ฒฝ์ฐ + ๊ธฐ๋ณธ๊ฐ์ด ํ์ฉ๋จ)์ ํ์ฉํ๊ณ ์ปดํ์ผ๋ฌ๊ฐ ์์ ์ฑ์ ๊ฐ์ ํ์ง ์๋ ๊ฒฝ์ฐ(๋ฆฐํฐ๋ ๊ฐ๋ฅํ์ง๋ง) ํฉ๊ณ์ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค. ) ๋ค๋ฅธ ๊ณต๊ฐ API๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ ์ฐธ์กฐ. ๊ทธ๊ฒ๋ค์ ์ ๊ฐ ์คํ ์ธ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ๋๋ค. ์ ๋ ๊ทธ๊ฒ๋ค์ ๋ ๋ฐ๋ํฉ๋๋ค.
๊ทธ๊ฒ๋ค์ ์ ๊ฐ ์คํ ์ธ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ๋๋ค. ์ ๋ ๊ทธ๊ฒ๋ค์ ๋ ๋ฐ๋ํฉ๋๋ค.
๋ด ๊ตฌ์ฒด์ ์ธ ์ ์์ https://github.com/golang/go/issues/19412#issuecomment -323208336์ด๋ฉฐ ๊ฐ๋ฐฉ์ ๋ํ ๊ทํ์ ์ ์๋ฅผ ๋ง์กฑ์ํฌ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ฌ์ ํ ์ฝ๊ฐ ๊ฑฐ์น ๊ณ ์์ง ๋ ๋ง์ ๊ฒ์ด ์๋ค๊ณ ํ์ ํฉ๋๋ค. ์ ๊ฑฐํ๊ณ ์ฐ๋งํ์ญ์์ค. ํนํ ๋๋ ๋ชจ๋ ์ฌ๋ก๊ฐ ๋์ด๋์ด ์์ด๋ ๊ธฐ๋ณธ ์ฌ๋ก๊ฐ ํ์ฉ๋๋์ง ๋ช ํํ์ง ์์ ๋ฐฉ๊ธ ์ ๋ฐ์ดํธํ์ต๋๋ค.
์ ํ์ ์ ํ์ ํฉ๊ณ ์ ํ์ ํฌ๋ฌ ์ฑ์ด ์๋๋ผ๋ ๋ฐ ๋์ํ์ต๋๋ค. ๊ทธ๋ค์ ๊ฝค ํ๋ฅญํ๊ณ ์ ๋ค๋ฆญ์ ์ ์ํ๋ ๊ฒ์ผ๋ก ์ง์ ํ๋ฏ์ด
type Nullable(T) pick { // or whatever syntax (on all counts)
Null struct{}
Value T
}
ํ ๋ฒ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ๋น์ ์ด ์ง์ ํ๋ฏ์ด ์ฐ๋ฆฌ๋ ์ ๋ค๋ฆญ ์ ํ(๊ตฌ์กฐ์ฒด)์์๋ ๋์ผํ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ์ ํจํ์ง ์์ ์ํ์ธ Valid = false, Value != 0์ด ์์ต๋๋ค. ์ด ์๋๋ฆฌ์ค์์๋ 1 + T๋งํผ ์์ง ์๋๋ผ๋ 2 โจฏ T๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๊ฒฝ์ฐ ๊ทผ์ ํ๊ธฐ ์ฝ์ต๋๋ค.
๋ฌผ๋ก ์ผ์ด์ค๊ฐ ๋ง๊ณ ๋ถ๋ณ๋์ด ๊ฒน์น๋ ๋ ๋ณต์กํ ํฉ๊ณ๋ผ๋ฉด ๋ฐฉ์ด์ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก๋ ์ค์๋ฅผ ํ๊ธฐ ์ฝ๊ณ ์ค์๋ฅผ ๋ฐ๊ฒฌํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋ฏ๋ก ๋ถ๊ฐ๋ฅํ ์ผ์ ์์ ์ปดํ์ผํ์ง ์๋ ๊ฒ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋ง์ ๋จธ๋ฆฌ์นด๋ฝ์ ์ ์ฝํ ์ ์์ต๋๋ค. ๋น๊ธฐ๋.
ํ ํฐ - ๋ฌผ๋ก ์ ๋๋ค. AST ๋ฌธ์ ์ ๋ ๋ค๋ฅธ ์ธ์คํด์ค(๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ํ์๋ ํฉ๊ณ ์ ํ์ ์ด์ ์ ์ป์).
๋๋ ์ฝ๊ฐ์ ์ ๋ ฅ์ ๋ฐ๊ณ , ์ฝ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ , ์ฝ๊ฐ์ ์ถ๋ ฅ์ ์์ฑํ๋ ๋ง์ ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ ์ฌ๊ท์ ์ผ๋ก ๋ง์ ํจ์ค๋ก ๋๋์ด ์ ๋ ฅ์ ์ผ์ด์ค๋ก ๋๋๊ณ ๊ทธ ์ผ์ด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ณํํฉ๋๋ค. ์ํ๋ ์ถ๋ ฅ. ๋๋ ๋ฌธ์ ๊ทธ๋๋ก ํ์๋ฅผ ์์ฑํ๊ณ ์์ง ์์ ์๋ ์์ง๋ง(๋ฌผ๋ก ์ฌ๋ฏธ์๊ธฐ ๋๋ฌธ์ ๋๋๋ก ๊ทธ๋ ์ต๋๋ค!) ํ์ง๋ง AST ๋ฌธ์ ๋ ๋น์ ์ด ๋งํ๋ฏ์ด ๋ง์ ์ฝ๋์ ์ ์ฉ๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ํนํ ๋๋ฌด ๋ง์ ์ด์ํ ๋น์ฆ๋์ค ๋ก์ง์ ๋ค๋ฃฐ ๋ ๊ทธ๋ ์ต๋๋ค. ๋ด ์์ ๋จธ๋ฆฌ์ ๋ง๋ ์๊ตฌ ์ฌํญ๊ณผ ์ฃ์ง ์ผ์ด์ค.
๋ด๊ฐ ์ผ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ ๋ ETL์ ์ํํ๊ฑฐ๋ ๊ธฐ๋ฐํ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๊ฑฐ๋ ์ํ X์ ์ฌ์ฉ์๊ฐ Z๋ก ํ์๋์ง ์์ ๊ฒฝ์ฐ ์์ Y๊ฐ ๋ฐ์ํ๋๋ก ํ๋ ๊ฒ๋งํผ ์์ฃผ API์ ๋ํ๋์ง ์์ต๋๋ค. ๋น๋ก 10๋ถ ๋๋ฒ๊ทธ๋ฅผ 1์ด๋ก ์ค์ด๋ ๊ฒฝ์ฐ์๋ ๋ด๋ถ ์ํ๋ฅผ ์ ํํ ์ ์๋ ๊ณณ์ ์ฐพ์์ง๋ง "์ค ์ปดํ์ผ๋ฌ๊ฐ ๋ด๊ฐ ํ๋ ธ๋ค๊ณ ๋งํ๋ค"๊ณ ํฉ๋๋ค.
Go๋ฅผ ์ฌ์ฉํ๋ฉด ํนํ ํฉ๊ณ ์ ํ์ ์ฌ์ฉํ๋ ๊ณณ์ ํ ๊ณ ๋ฃจํด์ 3๊ฐ์ ์ฑ๋์ ์ ๊ณตํ๊ณ ๋ค๋ฅธ ๊ณ ๋ฃจํด์ 2๊ฐ์ ์ฑ๋์ ์ ๊ณตํด์ผ ํ๋ ๋ง์ ์ฑ๋์ ์ ํํ๋ ๊ณ ๋ฃจํด์
๋๋ค. ๊ทธ๊ฒ์ ๋๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ถ์ ํ๋ ๋ฐ ์ ์ฉํ chan pick { a A; b B; c C }
์ด์ chan A
, chan B
, chan C
๋น๋ก chan stuct { kind MsgKind; a A; b B; c C }
์ ์ถ๊ฐ ๊ณต๊ฐ๊ณผ ๋ ์ ์ ์ ํจ์ฑ ๊ฒ์ฌ ๋น์ฉ์ผ๋ก ์์
์ ์ ์ํ๊ฒ ์ํํ์ญ์์ค.
์๋ก์ด ์ ํ ๋์ ์ ๊ธฐ์กด ์ธํฐํ์ด์ค ์ ํ ์ ํ ๊ธฐ๋ฅ์ ์ถ๊ฐ๋ ์ปดํ์ผ ์๊ฐ ์ ํ ๋ชฉ๋ก ๊ฒ์ฌ๋ ์ด๋ป์ต๋๊น?
func main() {
if FlipCoin() == false {
printCertainTypes(FlipCoin(), int(5))
} else {
printCertainTypes(FlipCoin(), string("5"))
}
}
// this function compiles with main
func printCertainTypes(flip bool, in interface{}) {
if flip == false {
switch v := in.(type) {
case int:
fmt.Printf(โinteger %v\nโ, v)
default:
fmt.Println(v)
}
} else {
switch v := in.(type) {
case int:
fmt.Printf(โinteger %v\nโ, v)
case string:
fmt.Printf(โstring %v\nโ, v)
}
}
}
// this function compiles with main
func printCertainTypes(flip bool, in interface{}) {
switch v := in.(type) {
case int:
fmt.Printf(โinteger %v\nโ, v)
case bool:
fmt.Printf(โbool %v\nโ, v)
}
fmt.Println(flip)
switch v := in.(type) {
case string:
fmt.Printf(โstring %v\nโ, v)
case bool:
fmt.Printf(โbool 2 %v\nโ, v)
}
}
// this function emits a type switch not complete error when compiled with main
func printCertainTypes(flip bool, in interface{}) {
if flip == false {
switch v := in.(type) {
case int:
fmt.Printf(โinteger %v\nโ, v)
case bool:
fmt.Printf(โbool %v\nโ, v)
}
} else {
switch v := in.(type) {
case string:
fmt.Printf(โstring %v\nโ, v)
case bool:
fmt.Printf(โbool %v\nโ, v)
}
}
}
// this function emits a type switch not complete error when compiled with main
func printCertainTypes(flip bool, in interface{}) {
fmt.Println(flip)
switch v := in.(type) {
case int:
fmt.Printf(โinteger %v\nโ, v)
case bool:
fmt.Printf(โbool %v\nโ, v)
}
}
๊ณต์ ํ๊ฒ, ์ฐ๋ฆฌ๋ ํ์ฌ ์ ํ ์์คํ ์์ ํฉ๊ณ ์ ํ์ ๊ทผ์ฌํํ๋ ๋ฐฉ๋ฒ์ ํ์ํ๊ณ ์ฅ๋จ์ ์ ๋น๊ตํด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ๊ฒ์ด ์์ผ๋ฉด ๋น๊ต๋ฅผ ์ํ ๊ธฐ์ค์ ์ ์ ๊ณตํฉ๋๋ค.
ํ์ค ์๋จ์ ๋ด๋ณด๋ด์ง ์๊ณ ์๋ฌด๊ฒ๋ ํ์ง ์๋ ๋ฉ์๋๋ฅผ ํ๊ทธ๋ก ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค์ ๋๋ค.
์ด์ ๋ํ ํ ๊ฐ์ง ์ฃผ์ฅ์ ํฉ๊ณ์ ๊ฐ ์ ํ์ ์ด ํ๊ทธ๊ฐ ์ ์๋์ด ์์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์๋ฐํ ๋งํ๋ฉด ์ฌ์ค์ด ์๋๋๋ค. ์ ์ด๋ ๊ตฌ์กฐ์ฒด์ธ ๋ฉค๋ฒ์ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
type Sum interface { sum() }
type sum struct{}
func (sum) sum() {}
๊ตฌ์กฐ์ฒด์ ๋๋น๊ฐ 0์ธ ํ๊ทธ๋ฅผ ํฌํจํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๋ํผ๋ฅผ ๋์ ํ์ฌ ํฉ๊ณ์ ์ธ๋ถ ์ ํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
type External struct {
sum
*pkg.SomeType
}
์ด๊ฒ์ ์ฝ๊ฐ ๋ถ์พํ์ง๋ง.
ํฉ๊ณ์ ๋ชจ๋ ๋ฉค๋ฒ๊ฐ ๊ณตํต ๋์์ ๊ณต์ ํ๋ ๊ฒฝ์ฐ ์ธํฐํ์ด์ค ์ ์์ ํด๋น ๋ฉ์๋๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.
์ด์ ๊ฐ์ ๊ตฌ์ฑ์ ์ ํ์ด ํฉ๊ณ์ ์๋ค๊ณ ๋งํ์ง๋ง ๊ทธ ํฉ๊ณ์ ์๋ ๊ฒ์ ๋งํ ์ ์์ต๋๋ค. ํ์ nil
์ผ์ด์ค ์ธ์๋ ๋์ผํ ์๋ฒ ๋ฉ ํธ๋ฆญ์ ๋ค์๊ณผ ๊ฐ์ ์ธ๋ถ ํจํค์ง์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import "p"
var member struct {
p.Sum
}
ํจํค์ง ๋ด์์ ์ปดํ์ผ๋์ง๋ง ๋ถ๋ฒ์ธ ๊ฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
๋ฐํ์์ ์ผ๋ถ ์ ํ ์์ ์ฑ์ ๋ณต๊ตฌํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋๋ ๋ค์๊ณผ ๊ฐ์ func์ ๊ฒฐํฉ๋ sum ์ธํฐํ์ด์ค์ ์ ์์ valid() error
๋ฉ์๋๋ฅผ ํฌํจํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
func valid(s Sum) error {
switch s.(type) {
case nil:
return errors.New("pkg: Sum must be non-nil")
case A, B, C, ...: // listing each valid member
return s.valid()
}
return fmt.Errorf("pkg: %T is not a valid member of Sum")
}
ํ ๋ฒ์ ๋ ์ข ๋ฅ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ผ๋ฏ๋ก ์ ์ฉํฉ๋๋ค. ํญ์ ์ ํจํ ๋ฉค๋ฒ์ ๊ฒฝ์ฐ ๋ค์์ ์ฌ์ฉํ์ฌ ์ผ๋ถ ์์ฉ๊ตฌ๋ฅผ ํผํ ์ ์์ต๋๋ค.
type alwaysValid struct{}
func (alwaysValid) valid() error { return nil }
์ด ํจํด์ ๋ํ ๋ ์ผ๋ฐ์ ์ธ ๋ถ๋ง ์ค ํ๋๋ godoc์์ ํฉ๊ณ์ ๊ตฌ์ฑ์ ์๊ฒฉ์ ๋ช
ํํ๊ฒ ํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ๋ํ ๋ฉค๋ฒ๋ฅผ ์ ์ธํ ์ ์๊ณ ์ด์จ๋ ์ ํจ์ฑ์ ๊ฒ์ฌํด์ผ ํ๋ฏ๋ก ์ด๋ฅผ ์ฐํํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ฆ, ๋๋ฏธ ๋ฉ์๋๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ์
๋๋ค.
๋์ ์,
//A Node is one of (list of types).
type Node interface { node() }
์ฐ๋ค
//A Node is only valid if it is defined in this package.
type Node interface {
//Node is a dummy method that signifies that a type is a Node.
Node()
}
์ฐ๋ฆฌ๋ ๋๊ตฐ๊ฐ๊ฐ Node
๋ฅผ ๋ง์กฑ์ํค๋ ๊ฒ์ ๋ง์ ์ ์์ผ๋ฏ๋ก ๊ทธ๋ค์ด ๋ฌด์์ ํ๋์ง ์๋ฆด ์ ์์ต๋๋ค. ์ด๋ค ์ ํ์ด Node
(์ค์ ๋ชฉ๋ก ์์)๋ฅผ ์ถฉ์กฑํ๋์ง ํ ๋์ ๋ช
ํํ๊ฒ ์ ์๋ ์์ง๋ง ํ์ฌ ๋ณด๊ณ ์๋ ํน์ ์ ํ์ด Node
์ถฉ์กฑํ๋์ง ์ฌ๋ถ๋ ๋ถ๋ช
ํฉ๋๋ค.
์ด ํจํด์ ํฉ๊ณ์ ์๋ ๋๋ถ๋ถ์ ์ ํ์ด ๋์ผํ ํจํค์ง์ ์ ์๋์ด ์์ ๋ ์ ์ฉํฉ๋๋ค. ์๋ฌด๋ ์์ ๊ฒฝ์ฐ, ๊ณตํต์ ์์ง๋ ํด๋ฐฑ์
๋๋ค interface{}
๊ฐ์ json.Token
๋๋ driver.Value
. ์ฐ๋ฆฌ๋ ๊ฐ๊ฐ์ ๋ํ ๋ํผ ์ ํ๊ณผ ํจ๊ป ์ด์ ํจํด์ ์ฌ์ฉํ ์ ์์ง๋ง ๊ฒฐ๊ตญ์๋ interface{}
๋งํผ ๋ง์ด ํ์๋๋ฏ๋ก ์๋ฏธ๊ฐ ๊ฑฐ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ์ด ํจํค์ง ์ธ๋ถ์์ ์ฌ ๊ฒ์ผ๋ก ์์ํ๋ฉด ์ ์คํ๊ฒ ํฉํ ๋ฆฌ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
//Sum is one of int64, float64, or bool.
type Sum interface{}
func New(v interface{}) (Sum, error) {
switch v.(type) {
case nil:
return errors.New("pkg: Sum must be non-nil")
case int64, float64, bool:
return v
}
return fmt.Printf("pkg: %T is not a valid member of Sum")
}
ํฉ๊ณ์ ์ผ๋ฐ์ ์ธ ์ฉ๋๋ "๊ฐ ์์"๊ณผ "0์ผ ์ ์๋ ๊ฐ"์ ๊ตฌ๋ณํด์ผ ํ๋ ์ ํ์ ์ ํ์ ๋ํ ๊ฒ์ ๋๋ค. ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
*T
nil
ํฌ์ธํฐ๋ก ๊ฐ์ด ์์์ ๋ํ๋ด๊ณ nil์ด ์๋ ํฌ์ธํฐ๋ฅผ ์ญ์ฐธ์กฐํ ๊ฒฐ๊ณผ๋ก ๊ฐ์ด 0์ด ๋ ์๋ ์์ต๋๋ค.
์ด์ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ ๊ทผ์ฌ ๋ฐ ์ ํ์ด ์๋ ์ธํฐํ์ด์ค๋ก ํฉ๊ณ ์ ํ์ ๊ตฌํํ๊ธฐ ์ํ ๋ค์ํ ์ ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๊ธฐ์๋ ์ถ๊ฐ ํฌ์ธํฐ ์ญ์ฐธ์กฐ ๋ฐ ๊ฐ๋ฅํ ํ ํ ๋น์ด ํ์ํฉ๋๋ค.
์ ํ ์ฌํญ์ ๊ฒฝ์ฐ sql ํจํค์ง์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ํผํ ์ ์์ต๋๋ค.
type OptionalT struct {
Valid bool
Value T
}
์ด๊ฒ์ ์ฃผ์ ๋จ์ ์ ์ ํจํ์ง ์์ ์ํ๋ฅผ ์ธ์ฝ๋ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. Valid๋ false์ผ ์ ์๊ณ Value๋ 0์ด ์๋ ์ ์์ต๋๋ค. Valid๊ฐ false์ธ ๊ฒฝ์ฐ Value๋ฅผ ๊ฐ์ ธ์ฌ ์๋ ์์ต๋๋ค(์ง์ ๋์ง ์์ ๊ฒฝ์ฐ 0 T๋ฅผ ์ํ ๊ฒฝ์ฐ ์ ์ฉํ ์ ์์). Value๋ฅผ 0์ผ๋ก ์ค์ ํ์ง ์๊ณ Valid๋ฅผ false๋ก ์ค์ ํ ๋ค์ Value๋ฅผ ํ ๋นํ์ง ์๊ณ Valid๋ฅผ true๋ก ์ค์ (๋๋ ๋ฌด์)ํ๋ฉด ์ด์ ์ ๋ฒ๋ฆฐ ๊ฐ์ด ์ค์๋ก ๋ค์ ๋ํ๋ฉ๋๋ค. ์ด๋ ์ ํ์ ๋ถ๋ณ๋์ ๋ณดํธํ๊ธฐ ์ํด setter ๋ฐ getter๋ฅผ ์ ๊ณตํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ๋จ์ํ ํํ์ ํฉ๊ณ ์ ํ์ ๊ฐ์ด ์๋ ID์ ๋ํด ๊ด์ฌ์ ๊ฐ์ง ๋์ ๋๋ค. ์ด๊ฑฐํ์ ๋๋ค.
Go์์ ์ด๊ฒ์ ์ฒ๋ฆฌํ๋ ์ ํต์ ์ธ ๋ฐฉ๋ฒ์ const/iota์ ๋๋ค.
type Enum int
const (
A Enum = iota
B
C
)
OptionalT
์ ํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๊ฒ์ ๋ถํ์ํ ๊ฐ์ ์ฐธ์กฐ๊ฐ ์์ต๋๋ค. ์ธํฐํ์ด์ค ํฉ๊ณ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋๋ฉ์ธ์ ์ ํํ์ง ์์ต๋๋ค. ์ ํจํ ๊ฐ์ด 3๊ฐ์ด๊ณ ์ ํจํ์ง ์์ ๊ฐ์ด ๋ง๊ธฐ ๋๋ฌธ์ ๋ฐํ์์ ์ ํจ์ฑ์ ๊ฒ์ฌํด์ผ ํฉ๋๋ค. ์ ํํ ๋ ๊ฐ์ ๊ฐ์ด ์์ผ๋ฉด bool์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ์ ํ์ ๊ทผ๋ณธ์ ์ธ ์์ ๋ฌธ์ ๋ ์์ต๋๋ค. A+B == C
. ํ์ํ๋์ง ์์ ์ ์ ์์๋ฅผ ์ด ํ์์ผ๋ก ๋๋ฌด ์ฝ๊ฒ ๋ณํํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ๋ฐ๋์งํ ๊ณณ์ ๋ง์ด ์์ง๋ง ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ป์ต๋๋ค. ์ฝ๊ฐ์ ์ถ๊ฐ ์์
์ ํตํด ์ด๋ฅผ ID๋ก๋ง ์ ํํ ์ ์์ต๋๋ค.
type Enum struct { v int }
var (
A = Enum{0}
B = Enum{1}
C = Enum{2}
)
์ด์ ์ด๊ฒ๋ค์ ๋ถํฌ๋ช ํ ๋ ์ด๋ธ์ผ ๋ฟ์ ๋๋ค. ๋น๊ตํ ์ ์์ง๋ง ๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค. ๋ถํํ๋ ์ด์ ์ฐ๋ฆฌ๋ const-ness๋ฅผ ์์์ง๋ง, ์กฐ๊ธ ๋ ๋ ธ๋ ฅํ๋ฉด ๋ค์ ์ป์ ์ ์์ต๋๋ค.
func A() Enum { return Enum{0} }
func B() Enum { return Enum{1} }
func C() Enum { return Enum{2} }
์ฐ๋ฆฌ๋ ์ธ๋ถ ์ฌ์ฉ์๊ฐ ์ผ๋ถ ์์ฉ๊ตฌ์ ๊ณ ๋๋ก ์ธ๋ผ์ธ ๊ฐ๋ฅํ ์ผ๋ถ ํจ์ ํธ์ถ์ ํฌ์ํ์ฌ ์ด๋ฆ์ ๋ณ๊ฒฝํ ์ ์๋ ์ํ๋ฅผ ๋์ฐพ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ ํ์ ๊ฑฐ์ ์์ ํ ๋ซ์๊ธฐ ๋๋ฌธ์ ์ธํฐํ์ด์ค ํฉ๊ณ๋ณด๋ค ์ด๋ค ๋ฉด์์๋ ๋ ์ข์ต๋๋ค. ์ธ๋ถ ์ฝ๋๋ A()
, B()
๋๋ C()
์์ต๋๋ค. ๊ทธ๋ค์ VAR์ ์์์์ ๊ฐ์ด ์ฃผ๋ณ์ ๋ผ๋ฒจ์ ๋ฐ๊ฟ ์ ์์ต๋๋ค ๊ทธ๋ค์ ํ ์์๋ A() + B()
์ฐ๋ฆฌ๋์๋ ๊ฑฐ ๋ฌด๋ฃ๋ก ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ Enum
. ๋์ผํ ํจํค์ง์ ์ฝ๋๊ฐ ๊ฐ์ ์๋ชป ์์ฑํ๊ฑฐ๋ ์์ ํ๋ ๊ฒ์ ์ฌ์ ํ โโ๊ฐ๋ฅํ์ง๋ง, ์ด๋ฌํ ์ผ์ด ๋ฐ์ํ์ง ์๋๋ก ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๋ฉด ์ ํจ์ฑ ๊ฒ์ฌ ์ฝ๋๊ฐ ํ์ํ์ง ์์ ์ฒซ ๋ฒ์งธ ํฉ๊ณ ์ ํ์
๋๋ค. ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ ํจํฉ๋๋ค. .
๋๋ก๋ ๋ง์ ๋ ์ด๋ธ์ด ์๊ณ ๊ทธ ์ค ์ผ๋ถ์๋ ์ถ๊ฐ ๋ ์ง๊ฐ ์๊ณ ๋์ผํ ์ข ๋ฅ์ ๋ฐ์ดํฐ๊ฐ ์๋ ๋ ์ด๋ธ๋ ์์ต๋๋ค. 3๊ฐ์ ๊ฐ์ด ์๋ ์ํ(A, B, C), 2๊ฐ๋ ๋ฌธ์์ด ๊ฐ(D, E), 1๊ฐ๋ ๋ฌธ์์ด ๊ฐ๊ณผ int ๊ฐ(F)์ด ์๋ ๊ฐ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์์ ์ ์ ์ ์ฌ๋ฌ ๊ฐ์ง ์กฐํฉ์ผ๋ก ์ฌ์ฉํ ์ ์์ง๋ง ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์
type Value struct {
Which int // could have consts for A, B, C, D, E, F
String string
Int int
}
์ด๊ฒ์ ์์ OptionalT
์ ํ๊ณผ ๋งค์ฐ ์ ์ฌํ์ง๋ง bool ๋์ ์ด๊ฑฐํ์ด ์๊ณ Which
๊ฐ์ ๋ฐ๋ผ ์ค์ ํ ์ ์๋(๋๋ ์ค์ ํ์ง ์์ ์ ์๋) ์ฌ๋ฌ ํ๋๊ฐ ์์ต๋๋ค. ์ ํจ์ฑ ๊ฒ์ฌ๋ ์ด๊ฒ์ด ์ ์ ํ๊ฒ ์ค์ ๋์๋์ง(๋๋ ์๋์ง) ์ฃผ์ํด์ผ ํฉ๋๋ค.
Go์์ "๋ค์ ์ค ํ๋"๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ์ผ๋ถ๋ ๋ค๋ฅธ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ณด์ดํ์ด ํ์ํฉ๋๋ค. ์ข ์ข ๋ฐํ์ ์ ๋ถ๋ณ ๋๋ ๊ด๋ จ ์๋ ์ญ์ฐธ์กฐ "์ค ํ๋"์ ์ ํจ์ฑ์ ๊ฒ์ฌํด์ผ ํฉ๋๋ค. ๊ทธ๋ค์ด ๊ณต์ ํ๋ ์ฃผ์ ๋จ์ ์ ์ธ์ด์ ์ผ๋ถ๊ฐ ์๋ ์ธ์ด๋ก ์๋ฎฌ๋ ์ดํธ๋๊ธฐ ๋๋ฌธ์ "ํ๋์" ๋ถ๋ณ์ด ๋ฐ์ฌ ๋๋ go/types์ ํ์๋์ง ์์ ๋ฉํํ๋ก๊ทธ๋๋ฐ์ด ์ด๋ ต๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ค์. ๋ฉํํ๋ก๊ทธ๋๋ฐ์์ ๊ทธ๊ฒ๋ค์ ์ฌ์ฉํ๋ ค๋ฉด ๋ ๋ค sum์ ์ฌ๋ฐ๋ฅธ ํ๋ฏธ๋ฅผ ์ธ์ํ๊ณ ๊ฒ์ฆํ ์ ์์ด์ผ ํ๋ฉฐ "ํ๋์" ๋ถ๋ณ์ด ์๋ ์ ํจํ ์ฝ๋์ฒ๋ผ ๋ชจ๋ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ด ๋น์ ์ด ์ฐพ๊ณ ์๋ ๊ฒ์ด๋ผ๊ณ ๋งํด์ผ ํฉ๋๋ค.
ํฉ๊ณ ์ ํ์ด ์ธ์ด์ ์ผ๋ถ์ธ ๊ฒฝ์ฐ ์์ค ์ฝ๋์ ๋ฐ์๋๊ณ ์ฝ๊ฒ ์์ค ์ฝ๋์์ ์ ๊ฑฐ๋์ด ๋ ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๊ตฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ "ํ๋์" ๋ถ๋ณ์ฑ์ ์๊ณ ์๋ ๊ฒฝ์ฐ ์ฌ๋ฌ ์ต์ ํ๋ฅผ ์ํํ ์ ์์ต๋๋ค. ํ๋ก๊ทธ๋๋จธ๋ ๊ฐ์ด ์ค์ ๋ก ์ฌ๋ฐ๋ฅธ ๋๋ฉ์ธ์ ์๋์ง ํ์ธํ๋ ์ฌ์ํ ์ ์ง ๊ด๋ฆฌ ๋์ ์ค์ํ ์ ํจ์ฑ ๊ฒ์ฌ ์ฝ๋์ ์ง์คํ ์ ์์ต๋๋ค.
์ด์ ๊ฐ์ ๊ตฌ์ฑ์ ์ ํ์ด ํฉ๊ณ์ ์๋ค๊ณ ๋งํ์ง๋ง ๊ทธ ํฉ๊ณ์ ์๋ ๊ฒ์ ๋งํ ์ ์์ต๋๋ค. ํ์ nil ์ผ์ด์ค ์ธ์๋ ๋์ผํ ์๋ฒ ๋ฉ ํธ๋ฆญ์ ๋ค์๊ณผ ๊ฐ์ ์ธ๋ถ ํจํค์ง์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
[โฆ]
ํจํค์ง ๋ด์์ ์ปดํ์ผ๋์ง๋ง ๋ถ๋ฒ์ธ ๊ฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
์์? ํจํค์ง ์์ฑ์๋ก์ ์ด๊ฒ์ "๋น์ ์ ๋ฌธ์ "์ ์์ญ์์ ํ๊ณ ํ๊ฒ ๋ณด์
๋๋ค. io.Reader
Read
๋ฉ์๋๊ฐ ํจ๋ ์ํ์ธ io.Reader
๋ฅผ ์ ๋ฌํ๋ฉด ๋๋ ๊ทธ ์ํฉ์์ ํ๋ณตํ์ง ์๊ณ ํจ๋ ์ํ๋ก ๋ด๋ฒ๋ ค ๋ก๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ๋ด๊ฐ ์ ์ธํ ์ ํ์ ์๋ชป๋ ๊ฐ์ ์์ฑํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋๋ค๋ฉด ๋ด๊ฐ ๋๊ตฌ์ ๋
ผ์์ ๋ฒ์ด๊ฒ ์ต๋๊น? ์ฆ, "๋๋ ์๋ฎฌ๋ ์ดํธ๋ ํ์ ํฉ๊ณ๋ฅผ ํฌํจํ๋ค"๋ ๋ฌธ์ ๊ฐ ๊ฑฐ์(๋ง์ฝ์๋ผ๋) ์ฐ์ฐํ ๋ฐ์ํ๋ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฆ, ์ธํฐํ์ด์ค๋ฅผ type Sum interface { sum() Sum }
ํ๊ณ ๋ชจ๋ ๊ฐ์ด ์์ฒด์ ์ผ๋ก ๋ฐํ๋๋๋ก ํ์ฌ ํด๋น ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์๋ฒ ๋ฉ ์ํ์์๋ ์ ๋๋ก ์๋ํ๋ sum()
์ ๋ฐํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ํจํด์ ๋ํ ๋ ์ผ๋ฐ์ ์ธ ๋ถ๋ง ์ค ํ๋๋ godoc์์ ํฉ๊ณ์ ๊ตฌ์ฑ์ ์๊ฒฉ์ ๋ช ํํ๊ฒ ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๋น์ ์ ๋์ธ ์ ์์ต๋๋ค .
์ด๊ฒ์ ์ฃผ์ ๋จ์ ์ ์ ํจํ์ง ์์ ์ํ๋ฅผ ์ธ์ฝ๋ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. Valid๋ false์ผ ์ ์๊ณ Value๋ 0์ด ์๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋์๊ฒ ์๋ชป๋ ์ํ๊ฐ ์๋๋๋ค. 0 ๊ฐ์ ๋ง๋ฒ์ด ์๋๋๋ค. sql.NullInt64{false,0}
์ NullInt64{false,42}
์ฌ์ด์๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๋ ๋ค SQL NULL์ ์ ํจํ๊ณ ๋๋ฑํ ํํ์
๋๋ค. ๋ชจ๋ ์ฝ๋๊ฐ Value๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ Valid๋ฅผ ํ์ธํ๋ฉด ํ๋ก๊ทธ๋จ์์ ์ฐจ์ด๋ฅผ ๊ด์ฐฐํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ๊ณต์ ํ๊ณ ์ปดํ์ผ๋ฌ๊ฐ (์๋ง, "์ง์ง"์ ํ์ ํญ๋ชฉ / ํฉ๊ณ ์ ํ์ ๋ํ ๊ฒ), ๋ง๋ค๊ธฐ ์ฝ๊ฒ ๊ทธ๊ฒ์ ํ ์์๋์ด ๊ฒ์ฌ๋ฅผํ๊ณ ์ํํ์ง ์๋ ์ฌ๋ฐ๋ฅธ ๋นํ์ด๋ค. ๊ทธ๋ฌ๋ ์์ด ๋ฒ๋ฆฌ๋ฉด ์ค์๋ก 0์ด ์๋ ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์ค์๋ก 0 ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค(ํฌ์ธํฐ ๋ชจ์ ์ ํ์ ์ฌ์ฉํ ๋ ํจ๋ํ๋ฏ๋ก ์์ธ๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก ํฐ ์๋ฆฌ๋ก ์คํจ - ๊ทธ๋ฌ๋ ๊ทธ๊ฒ๋ค์ ์ํด, ๋น์ ์ ์ด์จ๋ ๋ฒ ์ด ํฌ์ธํฐ ๋ชจ์์ ์ ํ์ ์ฌ์ฉํ๊ณ nil
๋ฅผ "unset"์ผ๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค).
์ด ์ ํ์ ๊ทผ๋ณธ์ ์ธ ์์ ๋ฌธ์ ๋ ์์ต๋๋ค. A+B == C. ์ ํ์ด ์ง์ ๋์ง ์์ ์ ์ ์์๋ฅผ ์ด ์ ํ์ผ๋ก ๋๋ฌด ์ฝ๊ฒ ๋ณํํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ด๋ก ์ ๊ด์ฌ์ฌ์ ๋๊น ์๋๋ฉด ์ค์ ๋ก ๋ํ๋ฌ์ต๋๊น?
ํ๋ก๊ทธ๋๋จธ๋ ๊ฐ์ด ์ค์ ๋ก ์ฌ๋ฐ๋ฅธ ๋๋ฉ์ธ์ ์๋์ง ํ์ธํ๋ ์ฌ์ํ ์ ์ง ๊ด๋ฆฌ ๋์ ์ค์ํ ์ ํจ์ฑ ๊ฒ์ฌ ์ฝ๋์ ์ง์คํ ์ ์์ต๋๋ค.
FTR๋ง, ๋ด๊ฐ sum-types-as-sum-types๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ(์ฆ, ๊ณจ๋ ๋ฒ๋ผ์ด์ดํฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ๋ ์ฐ์ํ๊ฒ ๋ชจ๋ธ๋งํ ์ ์์) ์ ํจ์ฑ ๊ฒ์ฌ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ๋ฆฌ์๋ฒ๋ ์ธ์๋ก ์ ๋ฌ๋ ํฌ์ธํฐ๊ฐ ์๋์ง ํ์ธํ์ง ์๋ ๊ฒ์ฒ๋ผ(์ ํจํ ๋ณํ์ผ๋ก ๋ฌธ์ํ๋์ง ์๋ ํ). ์ปดํ์ผ๋ฌ๊ฐ ๊ทธ๊ฒ์ ์ฒ๋ฆฌํ๋๋ก ๊ฐ์ํ๋ ๊ณณ(์ฆ, "ํจ์ ๋์์ ๋ฐํ ์์" ์คํ์ผ ๋ฌธ์ )์์ ๋๋ ๊ธฐ๋ณธ ๊ฒฝ์ฐ์ ๋นํฉํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ Go์ ์ค์ฉ์ ์ธ ์ธ์ด๋ฅผ ๊ณ ๋ คํฉ๋๋ค. ์ด ์ธ์ด๋ ๋จ์ํ ์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ ์์ฒด๋ฅผ ์ํด ๋๋ "๋ชจ๋๊ฐ ์์ ์ด ๋ ๋ซ๋ค๋ ๊ฒ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์" ์ถ๊ฐํ๋ ๊ฒ์ด ์๋๋ผ ์ ์ฆ๋ ํ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ค์ฉ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ์ค ์๋จ์ ๋ด๋ณด๋ด์ง ์๊ณ ์๋ฌด๊ฒ๋ ํ์ง ์๋ ๋ฉ์๋๋ฅผ ํ๊ทธ๋ก ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค์ ๋๋ค.
์ธํฐํ์ด์ค์ ํฉ๊ณ ์ ํ ์ฌ์ด์๋ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด์ ์ด ์์ต๋๋ค(๊ทํ์ ๊ฒ์๋ฌผ์์ ์ธ๊ธํ์ง ์์์ต๋๋ค). ์ธํฐํ์ด์ค๋ฅผ ํตํด ํฉ๊ณ ์ ํ์ ๊ทผ์ฌํ ๋ ์ค์ ๋ก ๊ฐ์ ์ฒ๋ฆฌํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์๋น์๋ก์ ๋น์ ์ ๊ทธ๊ฒ์ด ์ค์ ๋ก ๋ฌด์์ ๋ด๊ณ ์๋์ง ์ ํ ๋ชจ๋ฅด๊ณ ์ถ์ธก๋ง ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋น ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ซ์ง ์์ต๋๋ค. ๊ตฌํ์ด ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ๋์ผํ ํจํค์ง์์๋ง ์ฌ ์ ์๋ ๊ฒฝ์ฐ์๋ง ์ ์ฉํฉ๋๋ค. ๊ทธ๋์ผ๋ง ์ป์ ์ ์๋ ๊ฒ์ ์ ์ดํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ์์ต๋๋ค.
func foo(val string|int|error) {
switch v:= val.(type) {
case string:
...
}
}
์๋น์์๊ฒ sum ์ ํ์ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค. ๊ทธ ๊ฐ์น๋ ๊ตฌ์ฒด์ ์ด๋ฉฐ ํด์์ ์ด๋ ค ์์ง ์์ต๋๋ค.
@๋ฉ๋ก๋น์ฐ์ค
๊ทํ๊ฐ ์ธ๊ธํ ์ด๋ฌํ "๊ณต๊ฐ ํฉ๊ณ"์๋ "๊ธฐ๋ฅ ํฌ๋ฆฌํ"๋ฅผ ์ํด ๋จ์ฉํ ์ ์๋ค๋ ์ ์์ ์ผ๋ถ ์ฌ๋๋ค์ด ์ค์ํ ๊ฒฐ์ ์ผ๋ก ๋ถ๋ฅํ ์ ์๋ ๊ฒ์ด ์์ต๋๋ค. ์ ํ์ ํจ์ ์ธ์๊ฐ ๊ธฐ๋ฅ์ผ๋ก ๊ฑฐ๋ถ๋ ์ด์ ๋ ๋ฐ๋ก ์ด ๋๋ฌธ์
๋๋ค.
๊ทํ๊ฐ ์ธ๊ธํ ์ด๋ฌํ "๊ณต๊ฐ ํฉ๊ณ"์๋ "๊ธฐ๋ฅ ํฌ๋ฆฌํ"๋ฅผ ์ํด ๋จ์ฉํ ์ ์๋ค๋ ์ ์์ ์ผ๋ถ ์ฌ๋๋ค์ด ์ค์ํ ๊ฒฐ์ ์ผ๋ก ๋ถ๋ฅํ ์ ์๋ ๊ฒ์ด ์์ต๋๋ค. ์ ํ์ ํจ์ ์ธ์๊ฐ ๊ธฐ๋ฅ์ผ๋ก ๊ฑฐ๋ถ๋ ์ด์ ๋ ๋ฐ๋ก ์ด ๋๋ฌธ์ ๋๋ค.
๊ทธ๊ฒ์ ๋์๊ฒ ๋งค์ฐ ์ฝํ ์ฃผ์ฅ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ค๋ฅธ ๊ฒ์ด ์๋ค๋ฉด ๊ทธ๊ฒ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ๊ทธ๋ค์ด ๊ฐ๋ฅํ๊ฒํ๋ ๊ฒ์ ํ์ฉํ๊ณ ์์ต๋๋ค. ์ฌ์ค, ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ์ ํ์ ์ธ์ ๋ชจ๋ ์๋์ ๋ชฉ์ ์, (์ ๋๋ ๊ทธ ํจํด์ฒ๋ผ,ํ์ง๋ง ๋ถ๋ช ํ ์ด๋ฏธ ์ธ์ด๋ก ๊ฐ๋ฅํ๋ค).
์ธํฐํ์ด์ค์ ํฉ๊ณ ์ ํ ์ฌ์ด์๋ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด์ ์ด ์์ต๋๋ค(๊ทํ์ ๊ฒ์๋ฌผ์์ ์ธ๊ธํ์ง ์์์ต๋๋ค). ์ธํฐํ์ด์ค๋ฅผ ํตํด ํฉ๊ณ ์ ํ์ ๊ทผ์ฌํ ๋ ์ค์ ๋ก ๊ฐ์ ์ฒ๋ฆฌํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์๋น์๋ก์ ๋น์ ์ ๊ทธ๊ฒ์ด ์ค์ ๋ก ๋ฌด์์ ๋ด๊ณ ์๋์ง ์ ํ ๋ชจ๋ฅด๊ณ ์ถ์ธก๋ง ํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ๋ ๋ฒ์งธ๋ก ๊ตฌ๋ฌธ ๋ถ์์ ์๋ํ์ง๋ง ์ฌ์ ํ ํ ์ ์์ต๋๋ค. ์ ๊ทธ๊ฒ๋ค์ ์ฌ์ฉํ ์ ์์ต๋๊น? ์ผ๋ฐ ๋ด๋ณด๋ธ ์ ํ์ผ ์ ์์ต๋๋ค. ์, ํจํค์ง์์ ์์ฑ๋ ์ ํ์ด์ด์ผ ํ์ง๋ง(๋ถ๋ช ํ), ๊ทธ ์ธ์๋ ์ค์ ๋ซํ ํฉ๊ณ์ ๋น๊ตํ์ฌ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ ํ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ์ด๊ฒ์ ๋ ๋ฒ์งธ๋ก ๊ตฌ๋ฌธ ๋ถ์์ ์๋ํ์ง๋ง ์ฌ์ ํ ํ ์ ์์ต๋๋ค. ์ ๊ทธ๊ฒ๋ค์ ์ฌ์ฉํ ์ ์์ต๋๊น? ์ผ๋ฐ ๋ด๋ณด๋ธ ์ ํ์ผ ์ ์์ต๋๋ค. ์, ํจํค์ง์์ ์์ฑ๋ ์ ํ์ด์ด์ผ ํ์ง๋ง(๋ถ๋ช ํ), ๊ทธ ์ธ์๋ ์ค์ ๋ซํ ํฉ๊ณ์ ๋น๊ตํ์ฌ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ ํ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ฏธ ๋ฉ์๋๋ฅผ ๋ด๋ณด๋ด๊ณ ์ 3์๊ฐ "ํฉ๊ณ ์ ํ"์ ๊ตฌํํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ๋ฉ๋๊น? ์๋๋ฉด ํ ๊ตฌ์ฑ์์ด ์ธํฐํ์ด์ค์ ๋ค์ํ ์๋น์์ ์ต์ํ์ง ์๊ณ ๋์ผํ ํจํค์ง์ ๋ค๋ฅธ ๊ตฌํ์ ์ถ๊ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ํด๋น ๊ตฌํ์ ์ธ์คํด์ค๊ฐ ๋ค์ํ ์ฝ๋ ์๋จ์ ํตํด ์ด๋ฌํ ์๋น์์๊ฒ ์ ๋ฌ๋๋ ๋งค์ฐ ํ์ค์ ์ธ ์๋๋ฆฌ์ค์ ๋๊น? ๋ด ๋ช ๋ฐฑํ "ํ์ฑํ ์ ์๋" ์ง์ ์ ๋ฐ๋ณตํ ์ํ์ด ์์ต๋๋ค. "์๋น์๋ก์, [ํฉ๊ณ ๊ฐ]์ด ์ค์ ๋ก ๋ฌด์์ ๋ณด์ ํ๊ณ ์๋์ง ์ ํ ๋ชจ๋ฅด๊ณ ์ถ์ธก๋ง ํ ์ ์์ต๋๋ค." ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ๋๊ฐ ๊ตฌํํ๋์ง ์๋ ค์ฃผ์ง ์์ต๋๋ค.
@๋ฉ๋ก๋น์ฐ์ค
FTR๋ง, ๋ด๊ฐ sum-types-as-sum-types๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ(์ฆ, ๊ณจ๋ ๋ฒ๋ผ์ด์ดํฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ๋ ์ฐ์ํ๊ฒ ๋ชจ๋ธ๋งํ ์ ์์) ์ ํจ์ฑ ๊ฒ์ฌ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ๋ฆฌ์๋ฒ๋ ์ธ์๋ก ์ ๋ฌ๋ ํฌ์ธํฐ๊ฐ ์๋์ง ํ์ธํ์ง ์๋ ๊ฒ์ฒ๋ผ(์ ํจํ ๋ณํ์ผ๋ก ๋ฌธ์ํ๋์ง ์๋ ํ). ์ปดํ์ผ๋ฌ๊ฐ ๊ทธ๊ฒ์ ์ฒ๋ฆฌํ๋๋ก ๊ฐ์ํ๋ ๊ณณ(์ฆ, "ํจ์ ๋์์ ๋ฐํ ์์" ์คํ์ผ ๋ฌธ์ )์์ ๋๋ ๊ธฐ๋ณธ ๊ฒฝ์ฐ์ ๋นํฉํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ํญ์ ๋๋ ๊ฒฐ์ฝ ํ์ง ์์ต๋๋ค .
์๋ชป๋ ์ ๋ ฅ์ ์ ๋ฌํ๋ ์ฌ๋์ด ์ฆ์ ํญ๋ฐํ๋ ๊ฒฝ์ฐ ์ ํจ์ฑ ๊ฒ์ฌ ์ฝ๋์ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์๋ชป๋ ์ ๋ ฅ์ ์ ๋ฌํ๋ ์ฌ๋์ด ๊ฒฐ๊ตญ ํจ๋์ ์ผ์ผํฌ ์ ์์ง๋ง ์ ์ ๋์ ํ์๋์ง ์๋ ๊ฒฝ์ฐ ์๋ชป๋ ์ ๋ ฅ์ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ํ๋๊ทธ๊ฐ ์ง์ ๋๊ณ ์๋ฌด๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ ์ฌ์ค์ ์์๋ผ ํ์๊ฐ ์๋๋ก ์ ํจ์ฑ ๊ฒ์ฌ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. (ํนํ ์๋ชป๋ ๊ฐ์ด ๋์ ๋ ์์น๋ฅผ ํ์ ํ๊ธฐ ์ํด ํธ์ถ ์คํ์์ 150ํ๋ ์์ ๋ ์ฌ๋ผ๊ฐ์ผ ํ ์ ์๊ธฐ ๋๋ฌธ์).
์ ์ฌ์ ์ผ๋ก ๋์ค์ ๋๋ฒ๊น 30๋ถ์ ์ ์ฝํ๊ธฐ ์ํด ์ง๊ธ 30๋ถ์ ๋ณด๋ด๋ ๊ฒ์ ์ค์ฉ์ ์ ๋๋ค. ํนํ ์ ์๊ฒ๋ ํญ์ ์ด๋ฆฌ์์ ์ค์๋ฅผ ํ๊ณ ํ๊ต์ ๋นจ๋ฆฌ ๋์ฐฉํ๋ฉด ๋ค์ ์ด๋ฆฌ์์ ์ค์๋ฅผ ์ ์ง๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
๋ ์๋ฅผ ๊ฐ์ ธ์ ์ฆ์ ์ฌ์ฉํ๊ธฐ ์์ํ๋ func๊ฐ ์๋ ๊ฒฝ์ฐ nil์ ํ์ธํ์ง ์๊ฒ ์ง๋ง func๊ฐ ํน์ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๊น์ง ๋ ์๋ฅผ ํธ์ถํ์ง ์๋ ๊ตฌ์กฐ์ฒด์ ํฉํ ๋ฆฌ๋ผ๋ฉด nil์ ํ์ธํ๊ณ ํจ๋์ ์ผ์ผํค๊ฑฐ๋ "reader๋ nil์ด ์๋์ด์ผ ํจ"๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ฐํํ์ฌ ์ค๋ฅ์ ์์ธ์ด ๊ฐ๋ฅํ ์ค๋ฅ์ ์์ธ์ ๊ฐ๊น๋๋ก ํฉ๋๋ค.
godoc - ๋ถ์
์๊ณ ์์ง๋ง ์ ์ฉํ์ง ์์ต๋๋ค. ^C๋ฅผ ๋๋ฅด๊ธฐ ์ ์ ๋ด ์์ ๊ณต๊ฐ์์ 40๋ถ ๋์ ์คํ๋์์ผ๋ฉฐ ํจํค์ง๋ฅผ ์ค์นํ๊ฑฐ๋ ์์ ํ ๋๋ง๋ค ์๋ก ๊ณ ์ณ์ผ ํฉ๋๋ค. ํ์ง๋ง #20131(๋ฐ๋ก ์ด ์ค๋ ๋์์ ๋ถ๊ธฐ๋์์ต๋๋ค!)์ด ์์ต๋๋ค.
์ฆ, ์ธํฐํ์ด์ค๋ฅผ
type Sum interface { sum() Sum }
ํ๊ณ ๋ชจ๋ ๊ฐ์ด ์์ฒด์ ์ผ๋ก ๋ฐํ๋๋๋ก ํ์ฌ ํด๋น ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์๋ฒ ๋ฉ ์ํ์์๋ ์ ๋๋ก ์๋ํ๋sum()
๋ฐํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ ์ฉํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ง ๋ชปํ์ต๋๋ค. ๋ช ์์ ์ ํจ์ฑ ๊ฒ์ฌ๋ณด๋ค ๋ ๋ง์ ์ด์ ์ ์ ๊ณตํ์ง ์์ผ๋ฉฐ ๋ ์ ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
[const/iota ์ด๊ฑฐํ์ ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐํ ์ ์๋ค๋ ์ฌ์ค]์ด ์ด๋ก ์ ์ธ ๋ฌธ์ ์ ๋๊น, ์๋๋ฉด ์ค์ ๋ก ๋ฐ์ํ์ต๋๊น?
๊ทธ ํน์ ํ ๊ฒ์ ์ด๋ก ์ ์ธ ๊ฒ์ด์์ต๋๋ค. ์ ๋ ์ ๊ฐ ์๊ฐํ ์ ์๋ ์ด๋ก ์ ์ด๊ณ ์ค์ฉ์ ์ธ ๋ชจ๋ ์ฅ๋จ์ ์ ๋์ดํ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋์ ๋ ํฐ ์์ ์ ์๋นํ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋์ง๋ง ์ธ์ด์์ ์ผ์ข ์ ์ ํ์ด ๋๋๋ก ํ๋ ๊ฒ๋งํผ ๊ฐ๋จํ ๊ฒ์ ์๋ ์ธ์ด์์ "ํ๋์" ๋ถ๋ณ์ฑ์ ํํํ๋ ค๊ณ ์๋ํ๋ ๋ง์ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
[const/iota ์ด๊ฑฐ์ ์ ํ์ด ์ง์ ๋์ง ์์ ์ ๋ถ์ ํ ๋นํ ์ ์๋ค๋ ์ฌ์ค]์ด ์ด๋ก ์ ์ธ ๋ฌธ์ ์ ๋๊น ์๋๋ฉด ์ค์ ๋ก ๋ฐ์ํ์ต๋๊น?
๊ทธ ์ฌ๋์ด ์ค์ ๋ก ๋ํ๋ฌ์ต๋๋ค. ๋ฌด์์ด ์๋ชป๋์๋์ง ์์๋ด๋ ๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง ์์์ง๋ง ์ปดํ์ผ๋ฌ๊ฐ "๊ฑฐ๊ธฐ, ์ ์ค, ์๋ชป๋ ์ค์ ๋๋ค"๋ผ๊ณ ๋งํ๋ค๋ฉด ํจ์ฌ ๋ ์ ์ ์๊ฐ์ด ๊ฑธ๋ ธ์ ๊ฒ์ ๋๋ค. ๊ทธ ํน์ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ํ ์ด์ผ๊ธฐ๊ฐ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด๊ฒ์ ๋์๊ฒ ์๋ชป๋ ์ํ๊ฐ ์๋๋๋ค. 0 ๊ฐ์ ๋ง๋ฒ์ด ์๋๋๋ค.
sql.NullInt64{false,0}
์NullInt64{false,42}
์ฌ์ด์๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๋ ๋ค SQL NULL์ ์ ํจํ๊ณ ๋๋ฑํ ํํ์ ๋๋ค. ๋ชจ๋ ์ฝ๋๊ฐ Value๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ Valid๋ฅผ ํ์ธํ๋ฉด ํ๋ก๊ทธ๋จ์์ ์ฐจ์ด๋ฅผ ๊ด์ฐฐํ ์ ์์ต๋๋ค.
์ปดํ์ผ๋ฌ๊ฐ ์ด ๊ฒ์ฌ("์ค์ " ์ต์ ๋/ํฉ ์ ํ์ ๊ฒฝ์ฐ ๊ทธ๋ ๊ฒ ํ ์ ์์)๋ฅผ ๊ฐ์ ํ์ง ์์ ์ํํ์ง ์๋ ๊ฒ์ด ๋ ์ฝ๋ค๋ ๊ฒ์ ๊ณต์ ํ๊ณ ์ ํํ ๋นํ์ ๋๋ค. ๊ทธ๋ฌ๋ ์์ด ๋ฒ๋ฆฌ๋ฉด ์ค์๋ก 0์ด ์๋ ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์ค์๋ก 0 ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค(ํฌ์ธํฐ ๋ชจ์ ์ ํ์ ์ฌ์ฉํ ๋ ํจ๋ํ๋ฏ๋ก ์์ธ๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก ํฐ ์๋ฆฌ๋ก ์คํจ - ๊ทธ๋ฌ๋ ๊ทธ๊ฒ๋ค์ ์ํด, ๋น์ ์ ์ด์จ๋ ๋ฒ ์ด ํฌ์ธํฐ ๋ชจ์์ ์ ํ์ ์ฌ์ฉํ๊ณ nil์ "unset"์ผ๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค).
"๋ชจ๋ ์ฝ๋๊ฐ Value๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ์ ํจํ์ง ํ์ธํ๋ ๊ฒฝ์ฐ"๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๊ณ ์ปดํ์ผ๋ฌ๊ฐ ์ ์ฉํ ์ ์๋ ๋ถ๋ถ์ ๋๋ค. ๋๋ ๊ทธ๋ฐ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ต๋๋ค(ํ ๊ฐ ์ด์์ ๊ฐ ํ๋์ ํ๋ณ์์ ๋ํ ๋ ๊ฐ ์ด์์ ์ํ๊ฐ ์๋ ํจํด์ ๋ ํฐ ๋ฒ์ ์ด ์์์๋ ๋ถ๊ตฌํ๊ณ ). ๋๋ ๊ฐ๋ฐ ๋ฐ ํ ์คํธ ์ค์ ์ด ๋ชจ๋ ๊ฒ์ ์ฐพ์๊ณ ๋๊ตฌ๋ ์ผ์์ผ๋ก ํ์ถํ์ง ๋ชปํ๋ค๊ณ ๋ฏฟ๊ณ /ํฌ๋งํฉ๋๋ค. ์ค์๋ ์ปดํ์ผ๋ฌ์ ๋ฒ๊ทธ๊ฐ ์๋ ๊ฒฝ์ฐ์์ต๋๋ค. int ์ ํ์ ๋ณ์์ ๋ฌธ์์ด์ ํ ๋นํ๋ ค๊ณ ํ๋ฉด ์๋ ค์ฃผ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก , ๋๋ ์ ํ์ ์ ํ์ ๋ํด *T
๋ฅผ ์ ํธํ์ง๋ง ์คํ ์๊ณต๊ฐ๊ณผ ์ฝ๋ ๊ฐ๋
์ฑ ๋ชจ๋์์ ๊ด๋ จ ๋น์ฉ์ด 0์ด ์๋๋๋ค.
(ํน์ ์์ ๊ฒฝ์ฐ ์ค์ ๊ฐ ๋๋ ์ ํ ์ ์๊ณผ ํจ๊ป ์ฌ๋ฐ๋ฅธ 0 ๊ฐ์ ๊ฐ์ ธ์ค๋ ์ฝ๋๋ ๊ฐ๊ฒฐํ๊ณ ์์ ํ v, _ := nullable.[Value]
์
๋๋ค.)
๊ทธ๊ฒ์ ๋ด๊ฐ ์ํ๋ ๊ฒ์ด ์๋๋๋ค. ์ ํ ์ ํ์ ๊ฐ ์ ํ์ด์ด์ผ ํฉ๋๋ค.
๋ฌ์คํธ์์์ฒ๋ผ. ํ์ํ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ๋จ์ด๋ GC ๋ฉํ๋ฐ์ดํฐ์ ๋ํ ํฌ์ธํฐ์ฌ์ผ ํฉ๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
๋ฐ์๋ค์ผ ์ ์๋. ๋์๊ฒ๋ ์ค์ 10์ 41๋ถ, "Josh Bleecher Snyder" <
[email protected]>์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
์ ํ ์ ์์ ์ฌ์ฉํ๋ฉด ๋ ๋ง์ ๊ฒ์ ์ ๊ณตํ๋ ap ๋๋ *p๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ํธ๋ ์ด๋ ์คํ์ ๋ํ ๋ ํฐ ์ ์ด.
์ธํฐํ์ด์ค๊ฐ ์ค์นผ๋ผ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ํ ๋นํ๋ ์ด์ ๋
๋ค๋ฅธ ๋จ์ด๊ฐ a์ธ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ ํ ๋จ์ด๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค.
๋ฐ๋; ์์ธํ ๋ด์ฉ์ #8405 https://github.com/golang/go/issues/8405 ๋ฅผ ์ฐธ์กฐ
๋
ผ์. ๋์ผํ ๊ตฌํ ๊ณ ๋ ค ์ฌํญ์ด
์ ํ ์ ํ, ์ด๋ ์ค์ ๋ก p๊ฐ ๊ฒฐ๊ตญ ํ ๋น๋๊ณ
์ด์จ๋ ๋น ๋ก์ปฌ.
โ
์ค๋ ๋๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๋ ๊ฒ์
๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/19412#issuecomment-323371837 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe-auth/AGGWB-wQD75N44TGoU6LWQhjED_uhKGUks5sZaKbgaJpZM4MTmSr
.
@urandom
๋๋ฏธ ๋ฉ์๋๋ฅผ ๋ด๋ณด๋ด๊ณ ์ 3์๊ฐ "ํฉ๊ณ ์ ํ"์ ๊ตฌํํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ๋ฉ๋๊น?
๋ด๋ณด๋ด๋ ๋ฐฉ๋ฒ๊ณผ ๋ด๋ณด๋ด๋ ์ ํ ๊ฐ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์๋ก ๊ณผ๊ฑฐ๋ฅผ ์ด์ผ๊ธฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋์๊ฒ ์ด๊ฒ์ ์ด๋ฆฐ ํฉ๊ณ์ ๋ซํ ํฉ๊ณ์ ์ฐจ์ด ์์ด ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
type X interface { x() X }
type IntX int
func (v IntX) x() X { return v }
type StringX string
func (v StringX) x() X { return v }
type StructX struct{
Foo bool
Bar int
}
func (v StructX) x() X { return v }
๊ฐ๋ฅํ ํจํค์ง ์ธ๋ถ์ ํ์ฅ์ ์์ง๋ง ํจํค์ง์ ์๋น์๋ ๋ค๋ฅธ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ ์ฌ์ฉ, ์์ฑ ๋ฐ ์ ๋ฌํ ์ ์์ต๋๋ค.
X ๋๋ ์ด๋ฅผ ์ถฉ์กฑํ๋ ๋ก์ปฌ ์ ํ ์ค ํ๋๋ฅผ ์ธ๋ถ์ ํฌํจ์ํจ ๋ค์ X๋ฅผ ์ฌ์ฉํ๋ ํจํค์ง์ ํจ์์ ์ ๋ฌํ ์ ์์ต๋๋ค.
ํด๋น ํจ์๊ฐ x๋ฅผ ํธ์ถํ๋ฉด ํจ๋(X ์์ฒด๊ฐ ํฌํจ๋์ด ์๊ณ ์๋ฌด ๊ฒ๋ ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ)ํ๊ฑฐ๋ ์ฝ๋๊ฐ ์๋ํ ์ ์๋ ๊ฐ์ ๋ฐํํฉ๋๋ค. (๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ด ๋ฌธ์๋ฅผ ์ฝ์ง ์์๊ธฐ ๋๋ฌธ์ ์ด์ ๊ฐ์ ๊ฒ์ ์๋ํ๊ณ ์๋ค๋ฉด ๊ทธ๋ค์ ์ฝ๋๋ ์ด๋ฏธ ์์ฌ์ค๋ฝ์ต๋๋ค.)
"ํ์ง๋ง"๋ผ๋ ๋ฉ์์ง์ ํจ๊ป ํจ๋ ์ํ์ธ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ณ ํธ์ถ์๊ฐ ์ฝ๋๋ฅผ ์์ ํ ์ ์๋๋ก ํ๋ ๊ฐ์ฅ ๋๋ผ์ด ๋ฐฉ๋ฒ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๊ทธ ํจ์๊ฐ x๋ฅผ ํธ์ถํ๋ฉด ํจ๋ [โฆ]ํ๊ฑฐ๋ ์ฝ๋๊ฐ ์๋ํ ์ ์๋ ๊ฐ์ ๋ฐํํฉ๋๋ค.
์์์ ๋งํ๋ฏ์ด: ์๋ชป๋ ๊ฐ์ ์๋์ ์ธ ๊ตฌ์ฑ์ด ์๋ชป๋์๋ค๋ ์ฌ์ค์ ๋๋๋ค๋ฉด ๊ธฐ๋์น๋ฅผ ๋ค์ ์๊ฐํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ค ๊ฒฝ์ฐ๋ , ์ด ํน์ ํ ๋ก ์ ์ฃผ์ ๋ ๊ทธ๊ฒ์ด ์๋๋ฉฐ ๋ณ๋์ ์ฃผ์ฅ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ @urandom ์ด ํ๊ทธ ๋ฉ์๋๊ฐ ์๋ ์ธํฐํ์ด์ค๋ฅผ ํตํ ๋ฏธ๊ฒฐ ํฉ๊ณ๊ฐ ๋ค๋ฅธ ํจํค์ง์์ ๋ด์ฑ์ด
๋ฌธ์ ๋ ๋๊ตฐ๊ฐ ์ปดํ์ผํ๊ณ ํจํค์ง์ ์ ๋ฌํ ์ ์๋ ํฉ๊ณ์ ์๋ ํ์์ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ธ์ด์ ์ ์ ํ ํฉ๊ณ ์ ํ์ ์ถ๊ฐํ์ง ์๊ณ ์ฒ๋ฆฌํ๋ ์ธ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
3์ 1๊ณผ 2์ ์ด์ํ ํผํฉ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ฌด์์ ์ฌ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
"์๋์ ์ผ๋ก ์๋ชป๋ ๊ฐ์ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์๋ชป๋์๋ค๋ ์ฌ์ค์ ๋๋๋ค๋ฉด ๊ธฐ๋์น๋ฅผ ๋ค์ ์๊ฐํด์ผ ํฉ๋๋ค"๋ผ๋ ๋ฐ ๋์ํ์ง๋ง 3์ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ ์์์ฐจ๋ฆฌ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ด์ ๋ฅผ ์๊ธฐ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค.
2๊ฐ ์ฝ๋๊ฐ ์ ํจํ์ง ์์ ์ํ๋ก ๋ฏธ๋๋ฌ์ง๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๋๊ตฐ๊ฐ๊ฐ ์๋ชปํ ์ด์ ์ ์์ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ๋ ๊ฒฝ์ฐ ํ๋ ์ด๋ฅผ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์ ๊ฐ ํจํด์ ์๋๋ฅผ ์๋ชป ์ดํดํ๊ณ ์๋ ๊ฑด๊ฐ์ ์๋๋ฉด ๋ค๋ฅธ ์ฒ ํ์ผ๋ก ์ ๊ทผํ๊ณ ์๋ ๊ฑด๊ฐ์?
@urandom ์ค๋ช ๋ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๋๋ ๋น์ ์ด ๋งํ๋ ค๋ ๊ฒ์ด 100% ํ์คํ์ง ์์ต๋๋ค.
๋ฌธ์ ๋ ๋๊ตฐ๊ฐ ์ปดํ์ผํ๊ณ ํจํค์ง์ ์ ๋ฌํ ์ ์๋ ํฉ๊ณ์ ์๋ ํ์์ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋น์ ์ ํญ์ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. ์์ฌ์ค๋ฌ์ฐ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ํ์ธํ๋ ํฉ๊ณ ์ ํ์ ์ฌ์ฉํ๋๋ผ๋ ํญ์ ์์ ํ์ง ์์ ๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํจํ ๊ฐ). ๋ฌธ์ ๋ "์ด๊ฒ์ด ์ค์ ๋ก ์ผ๋ง๋ ์์ฃผ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ๊ฒ์ด๋ฉฐ ๊ทธ ๋ฌธ์ ๊ฐ ์ผ๋ง๋ ์ฌ๊ฐํ ๊ฒ์ธ๊ฐ"์ ๋๋ค. ์ ์๊ฐ์๋ ์์ ์๋ฃจ์ ์ ๋ํ ๋๋ต์ "๊ฑฐ์ ์๊ณ ๋งค์ฐ ๋ฎ์ต๋๋ค"์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์ชฝ์ด๋ , ์ด๊ฒ์ ๋ํด ๋ง์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด๋ ์์ ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ํน์ ์์ ์ ๋ํ ์์ธก์ ์ฃผ์ฅ๊ณผ ๊ฒฌํด๊ฐ ์ถฉ๋ถํ ๋ช ํํด์ผ ํ๋ฉฐ ๋๋ฌด ๋ง์ ์๋๋ฌ์ด ๋ฐ๋ณต์ ํผํ๊ณ ์ง์ ์ผ๋ก ์ด์ ์ ๋ง์ถ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ์๋ก์ด ์ฃผ์ฅ. ๋๋ ์ผ๋ฅ ํฉ๊ณ ์ ํ๊ณผ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์๋ฎฌ๋ ์ดํธ๋ ํฉ๊ณ ๊ฐ์ ๋ด๋ณด๋ด๊ธฐ ๊ฐ๋ฅ์ฑ์ ์ฐจ์ด๊ฐ ์์์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๊ตฌ์ฑ์ ์ธ๊ธํ์ต๋๋ค. ๊ทธ๋ค์ด ๋ชจ๋ ๋ฉด์์ ์๊ฒฉํ๊ฒ ๋ ๋ซ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ค๋ ๊ฒ์ ์๋๋๋ค.
์์ฌ์ค๋ฌ์ฐ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ํ์ธํ๋ ํฉ๊ณ ์ ํ์ ์ฌ์ฉํ๋๋ผ๋ ํญ์ ์์ ํ์ง ์์ ๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํจํ ๊ฐ).
๋๋ ๊ทธ๊ฒ์ด ์ง์ ์ผ๋ก ๋ค๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๋๋ค์ด ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์๋ฒ ๋ฉ์ ์ค์ฉํ ๋(์ ์ด๋ proto.Message
๋ฐ ๊ทธ๊ฒ์ ๊ตฌํํ๋ ๊ตฌ์ฒด์ ์ธ ์ ํ์ ๋ํด), ๊ทธ๋ค์ ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๊ฒ์ด ์์ ํ์ง์ ๊ทธ๊ฒ์ด ๊นจ์ง ์ ์๋ ๋ถ๋ณ์ฑ์ ๋ํด ์๊ฐํ์ง ์์ต๋๋ค . (์ฌ์ฉ์๋ ์ธํฐํ์ด์ค๊ฐ ํ์ํ ๋์์ ์์ ํ ์ค๋ช
ํ๋ค๊ณ ๊ฐ์ ํ์ง๋ง ์ธํฐํ์ด์ค๊ฐ ํตํฉ ๋๋ ํฉ๊ณ ์ ํ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. https://github.com/golang/protobuf/issues/364๋ ์ฐธ์กฐํ์ธ์.)
๋์กฐ์ ์ผ๋ก ๋๊ตฐ๊ฐ๊ฐ unsafe
ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฐ์ ์ผ๋ก ์ฐธ์กฐํ ์ ์๋ ์ ํ์ผ๋ก ๋ณ์๋ฅผ ์ค์ ํ๋ ๊ฒฝ์ฐ ์ต์ํ ์์๋ โโ์ ์๋ ๊ฒ๊ณผ ๊ทธ ์ด์ ์ ๋ํด ์๊ฐํ๋ค๊ณ ๋ช
์์ ์ผ๋ก ์ฃผ์ฅํ๋ ๊ฒ์
๋๋ค.
@Merovius ์๋ง๋ ๋๋ ๋ช ํํ์ง ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์๋ชป๋ ์๋ฒ ๋ฉ์ ์ฌ์ฉํ๋ค๊ณ ๋๊ตฐ๊ฐ์๊ฒ ๋งํ ๊ฒ์ด๋ผ๋ ์ฌ์ค์ ์ข์ ๋ถ์์ ์ด์ ์ ๋๋ค.
์์ ๊ธฐ๋ฅ์ ๊ฐ์ฅ ํฐ ์ด์ ์ ๋ฐ์ฌ์ ์ํด ์กด์ค๋๊ณ go/types๋ก ํ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ ๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ ํ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. Go์์ ํฉ๊ณ ์ ํ์ ์๋ฎฌ๋ ์ดํธํ๋ ๋ฐฉ๋ฒ์ ๋ง์ด ์์ง๋ง ๋ชจ๋ ๋นํฉ ์ ํ ์ฝ๋์ ๋์ผํ๋ฏ๋ก ๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํฉ๊ณ ์ ํ์ด๊ณ ํน์ ํจํด์ ์ธ์ํ ์ ์์ด์ผ ํ๋ค๋ ๊ฒ์ ์๊ธฐ ์ํด ๋์ญ ์ธ ์ ๋ณด๊ฐ ํ์ํฉ๋๋ค. ์ฌ์ฉ ์ค์ด์ง๋ง ์ด๋ฌํ ํจํด์กฐ์ฐจ๋ ์๋นํ ๋ณํ๋ฅผ ํ์ฉํฉ๋๋ค.
๋ํ ์ ํจํ์ง ์์ ๊ฐ์ ์์ฑํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์์ ํ์ง ์๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ด์ ์ผ๋ฐ ์ฝ๋, ์์ฑ๋ ์ฝ๋ ๋ฐ ๋ฐ์์ด ์์ต๋๋ค. ํ์์ ๋ ๊ฐ์ง๋ ๋ฌธ์๋ฅผ ์ฝ์ ์ ์๋ ์ฌ๋๊ณผ ๋ฌ๋ฆฌ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ต๋๋ค.
์์ ์ ๋ ๋ค๋ฅธ ๋ถ์์ ์ด์ ์ ์ปดํ์ผ๋ฌ๊ฐ ๋ ๋ง์ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๊ณ ๋ ๋น ๋ฅธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์์ฌ ํฉ์ ์ธํฐํ์ด์ค๋ก ๋์ฒดํ ์ ์๋ ๊ฒ ์ธ์๋ json.Token
๋๋ driver.Value
์ ๊ฐ์ "์ด ์ผ๋ฐ ์ ํ ์ค ํ๋"๋ฅผ ์์ฌ ํฉ์ผ๋ก ๋์ฒดํ ์ ์๋ค๋ ์ฌ์ค๋ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ๊ฑฐ์ ์์ง๋ง interface{}
๊ฐ ํ์ํ ๊ณณ์ ํ ๊ณณ ์ ์ต๋๋ค.
๋ํ ์ ํจํ์ง ์์ ๊ฐ์ ์์ฑํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์์ ํ์ง ์๊ฒ ๋ฉ๋๋ค.
์ด ์ง์ ๋ก ์ด์ด์ง๋ "์ ํจํ์ง ์์ ๊ฐ"์ ์ ์๋ฅผ ์ดํดํ์ง ๋ชปํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@neild ๋น์ ์ด ์์๋ค๋ฉด
var v pick {
None struct{}
A struct { X int; Y *T}
B int
}
๊ทธ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์น๋ฉ๋๋ค
struct {
activeField int //which of None (0), A (1), or B (2) is the current field
theInt int // If None always 0
thePtr *T // If None or B, always nil
}
unsafe๋ฅผ ์ฌ์ฉํ๋ฉด activeField
๊ฐ 0 ๋๋ 2์ธ ๊ฒฝ์ฐ์๋ thePtr
์ค์ ํ๊ฑฐ๋ activeField
๊ฐ 0์ธ ๊ฒฝ์ฐ์๋ theInt
๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ด๊ฒ์ ์ปดํ์ผ๋ฌ๊ฐ ๋ง๋๋ ๊ฐ์ ์ ๋ฌดํจํํ๊ณ ์ค๋๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ์ข ๋ฅ์ ์ด๋ก ์ ๋ฒ๊ทธ๋ฅผ ํ์ฉํฉ๋๋ค.
๊ทธ๋ฌ๋ @bcmills๊ฐ ์ง์ ํ๋ฏ์ด ์์ ํ์ง ์์ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํต ์ต์ ์ด๊ธฐ ๋๋ฌธ์ ๋ฌด์์ ํ๊ณ ์๋์ง ๋ ์ ์ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ์ดํดํ ์ ์๋ ๊ฒ์ ์ ์์ ํ์ง ์์ ๊ฒ์ด ์๋ชป๋ ๊ฐ์ ์์ฑํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ธ์ง์ ๋๋ค.
var t time.Timer
t
๋ ์๋ชป๋ ๊ฐ์
๋๋ค. t.C
๊ฐ ์ค์ ๋์ง ์์์ผ๋ฉฐ t.Stop
ํธ์ถํ๋ฉด ํจ๋ ์ํ๊ฐ ๋ฉ๋๋ค. ์์ ํ์ง ์์ ๊ฒ์ ํ์ํ์ง ์์ต๋๋ค.
์ผ๋ถ ์ธ์ด์๋ "์ ํจํ์ง ์์" ๊ฐ ์์ฑ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ง์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด๋ ์ ํ ์์คํ ์ด ์์ต๋๋ค. Go๋ ๊ทธ๋ค ์ค ํ๋๊ฐ ์๋๋๋ค. ๋ ธ์กฐ๊ฐ ๊ทธ ๋ฐ๋์ ์ด๋ป๊ฒ ํฌ๊ฒ ์์ง์ด๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. (๋ฌผ๋ก ๋ ธ์กฐ๋ฅผ ์ง์งํ๋ ๋ค๋ฅธ ์ด์ ๋ ์๋ค.)
@neild ์, ์ ์ ์๊ฐ ๋์จํด์ ธ์ ์ฃ์กํฉ๋๋ค.
๋๋ sum ์ ํ์ ๋ถ๋ณ๋์ ๋ํด ๋ฌดํจ๋ผ๊ณ ๋งํ์ด์ผ ํ๋ค.
๋ฌผ๋ก ํฉ๊ณ์ ๊ฐ๋ณ ์ ํ์ ์๋ชป๋ ์ํ์ผ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํฉ๊ณ ์ ํ ๋ถ๋ณ์ฑ์ ์ ์งํ๋ ๊ฒ์ ํ๋ก๊ทธ๋๋จธ๋ฟ๋ง ์๋๋ผ ๋ฆฌํ๋ ์ ๋ฐ go/types์ ์ก์ธ์คํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋๊ตฌ์์ ์ด๋ฅผ ์กฐ์ํ๋ฉด ์์ ์ด ์ ์ง๋๊ณ ๋ฉํํ๋ก๊ทธ๋๋จธ์๊ฒ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
@jimmyfrasche , ๊ฐ๋ฅํ ๋ชจ๋ ์ ํ์ ์๋ ค์ฃผ๋ ํฉ๊ณ ์ ํ๊ณผ ๋ฌ๋ฆฌ ์ธํฐํ์ด์ค๋ ์ ํ ๋ชฉ๋ก์ด ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฑฐ๋ ์ ์ด๋ ์ฌ์ฉํ ์ ์๋ค๋ ์ ์์ ๋ถํฌ๋ช
ํฉ๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์ฝ๋์ switch
๋ถ๋ถ์ โโ์ฝ๊ฐ ์ถ์ธกํ๊ฒ ๋ง๋ญ๋๋ค.
func F(sum SumInterface) {
switch v := sum {
case Screwdriver:
...
default:
panic ("Someone implementing a new type which gets passed to F and causes a runtime panic 3 weeks into production")
}
}
๋ฐ๋ผ์ ์ฌ๋๋ค์ด ์ธํฐํ์ด์ค ๊ธฐ๋ฐ ํฉ๊ณ ์ ํ ์๋ฎฌ๋ ์ด์
๊ณผ ๊ด๋ จํ์ฌ ๊ฒช๊ณ ์๋ ๋๋ถ๋ถ์ ๋ฌธ์ ๋ ํจ๋ง ๋ฐ/๋๋ ๊ด๋ก๋ก ํด๊ฒฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ธํฐํ์ด์ค์ ๋ด๋ณด๋ด์ง ์์ ๋ฉ์๋๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ๊ฐ๋ฅํ ๋ชจ๋ ๊ตฌํ(์, ์๋์ ์ฐํ)์ ํ์
ํ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, iota ๊ธฐ๋ฐ ์ด๊ฑฐํ๊ณผ ๊ด๋ จ๋ ๋๋ถ๋ถ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด "์ด๊ฑฐํ์ const ( FooA Foo = iota; FooB; FooC )
ํ์์ ์ ์ธ์ด ์๋ type Foo int
์
๋๋ค"๋ผ๋ ๊ฐ๋จํ ๊ท์น์ ์ฌ์ฉํ๋ฉด ๊ด๋ฒ์ํ๊ณ ์ ํํ ๋๊ตฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ค์๊ฒ๋.
์, ์ด๊ฒ์ ์ค์ ํฉ๊ณ ์ ํ๊ณผ ๋์ผํ์ง ์์ง๋ง(๋ฌด์๋ณด๋ค๋ ์ด๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง ์ดํดํ์ง ๋ชปํ์ง๋ง ์ผ๋ฅ ๋ฐ์ฌ ์ง์์ ์ป์ง๋ ๋ชปํจ) ๊ธฐ์กด ์๋ฃจ์ ์ด ๋ด ๊ด์ ์์ ๋ณผ ๋ ์ข ์ข ์น ํด์ง๋ ๊ฒ๋ณด๋ค ๋ ์ ๋ํ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ IMO๋ ์ค์ ๋ก Go 2์ ๋ฃ๊ธฐ ์ ์ ํด๋น ๋์์ธ ๊ณต๊ฐ์ ํ์ํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ต์ํ ์ฌ๋๋ค์๊ฒ ์ ๋ง ์ค์ํ๋ค๋ฉด ๋ง์ด์ฃ .
(๊ทธ๋ฆฌ๊ณ ๋๋ sum ์ ํ์ ์ฅ์ ์ ์๊ณ ์์ผ๋ฏ๋ก ๋ด ์ด์ต์ ์ํด ๋ค์ ๋งํ ํ์๊ฐ ์์์ ๋ค์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. ๋๋ ๋จ์ง ๋ค๋ฅธ ์ฌ๋๋ค๋งํผ ์ค์ํ์ง ์๊ณ ๋จ์ ๋ ๋ณด๊ณ ๋ฐ๋ผ์ ๋์ผํ ๋ฐ์ดํฐ์ ๋ํด ๋ค๋ฅธ ๊ฒฐ๋ก ์ ๋๋ฌ)
@Merovius ์ข์ ์์น์ ๋๋ค.
๋ฆฌํ๋ ํธ ์ง์์ ํตํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์คํ๋ผ์ธ ๋๊ตฌ(๋ฆฐํฐ, ์ฝ๋ ์์ฑ๊ธฐ ๋ฑ)๊ฐ ์ ๋ณด์ ์ก์ธ์คํ๊ณ ์ ์ ์ผ๋ก ์ ํํ๊ฒ ๊ฐ์งํ ์ ์๋ ๋ถ์ ์ ํ๊ฒ ์์ ํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ด์จ๋ ํ์ํ๋ ๊ฒ์ด ๊ณต์ ํ ์์ด๋์ด์ด๋ฏ๋ก ํ์ํด ๋ณด๊ฒ ์ต๋๋ค.
Go์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์์ฌํฉ ๊ณ์ด์ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. (๋๋ต ๋ฐ์ ์์๋๋ก)
*T
์ต์
์ ๊ฒฝ์ฐ T
T
)interface{}
ํ์ ๋ ์ ํ์ ๊ฐ๋ฐฉ์ผ๋ก ์ ํ๋ฉ๋๋ค.์ด๋ค ๋ชจ๋๋ ํฉ๊ณ ์ ํ๊ณผ ๋นํฉ๊ณ ์ ํ ๋ชจ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฒ์ ๋ ๊ฐ๋ ๋ค๋ฅธ ์ฉ๋๋ก ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ผ๋ฏ๋ก ํฉ๊ณ ์ ํ์ ๋ํ๋ด๊ณ ๊ฐ๋ ๊ฑฐ์ง ๊ธ์ ์ ํ์ฉํ๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค. ์ธํฐํ์ด์ค ํฉ๊ณ์ ๊ฒฝ์ฐ ๋งค๊ฐ๋ณ์ ๋๋ ๋ฐํ์ด ์๊ณ ๋ฉค๋ฒ์ ๋ณธ๋ฌธ์ด ์๋ ๋ด๋ณด๋ด์ง ์์ ๋ฉ์๋๋ก ์ ํํ ์ ์์ต๋๋ค. ์ด๊ฑฐ ํ์ ๊ฒฝ์ฐ ๊ทธ๊ฒ์ ๊ทธ๋ค์ด ๊ทธ๋ฅ์์ ๋ ๋ง ์ธ์ ํ ๋์ Type = iota
์ด์คํ๋ ์์ ์ผ๋ถ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋์ฒํ์ง ๊ทธ๋์.
์ ํ์ T
*T
๋ํ type O = *T
๊ด๋ก๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ณ์นญ ์ด๋ฆ์ด ์ ํ์ ์ผ๋ถ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ์ด๋ ต์ง๋ง ๊ฐ์งํ ์ ์์ต๋๋ค. type O *T
๋ ๊ฐ์งํ๊ธฐ๋ ์ฝ์ง๋ง ์ฝ๋์์ ์์
ํ๊ธฐ๋ ๋ ์ด๋ ต์ต๋๋ค. ๋ฐ๋ฉด์ ์ํํด์ผ ํ๋ ๋ชจ๋ ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ์ ๋ด์ฅ๋์ด ์์ผ๋ฏ๋ก ์ด๋ฅผ ์ธ์ํ์ฌ ๋๊ตฌ๋ก ์ป์ ์ ์๋ ๊ฒ์ ๊ฑฐ์ ์์ต๋๋ค. ์ด๊ฒ๋ง์ ๋ฌด์ํฉ์๋ค. (์ ๋ค๋ฆญ์ type Optional(T) *T
๋ผ์ธ์ ๋ฐ๋ผ ๋ฌด์ธ๊ฐ๋ฅผ ํ์ฉํ ๊ฐ๋ฅ์ฑ์ด ๋์ "ํ๊ทธ ์ง์ "์ ๋จ์ํํ ์ ์์ต๋๋ค.)
์ด๊ฑฐํ์ด ์๋ ๊ตฌ์กฐ์ฒด๋ ๋๊ตฌ์์ ์ถ๋ก ํ๊ธฐ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค. ์ด๊ฑฐํ์ ๋ํด ์ด๋ค ํ๋๊ฐ ์ด๋ค ๊ฐ๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๊น? ์ด๊ฑฐํ์ ๋ฉค๋ฒ๋น ํ๋์ ํ๋๊ฐ ์์ด์ผ ํ๊ณ ์ด๊ฑฐํ ๊ฐ๊ณผ ํ๋ ๊ฐ์ด ๋์ผํด์ผ ํ๋ค๋ ๊ท์น์ผ๋ก ์ด๊ฒ์ ๋จ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
type Which int
const (
A Which = iota
B
C
)
type Sum struct {
Which
A struct{} // has to be included to line up with the value of Which
B struct { X int; Y float64 }
C struct { X int; Y int }
}
๊ทธ๊ฒ์ ์ ํ์ ์ ํ์ ์ป์ง ๋ชปํ์ง๋ง ์ธ์๊ธฐ์์ "2 ํ๋, ์ฒซ ๋ฒ์งธ๋ bool"์ด๋ผ๋ ํน์ํ ๊ฒฝ์ฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
//gosum: int, float64, string, Foo
์ ๊ฐ์ ๋ง๋ฒ์ ์ฃผ์ ์์ด๋ ๊ฐ๋ฐฉ ํฉ๊ณ์ interface{}
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ฐ์งํ ์ ์์ต๋๋ค.
๋๋ ๋ค์ ์ ์๋ฅผ ๊ฐ์ง ํน์ ํจํค์ง๊ฐ ์์ ์ ์์ต๋๋ค.
package sum
type (
Type struct{}
Enum int
OneOf interface{}
)
type MyEnum sum.Enum
ํ์์ธ ๊ฒฝ์ฐ์๋ง ์ด๊ฑฐํ์ ์ธ์ํ๊ณ , sum.Type
๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ์๋ง ์ธํฐํ์ด์ค์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ธ์ํ๊ณ , type GrabBag sum.OneOf
์ ๊ฐ์ interface{}
๊ฐ๋ฐฉ๋ง ์ธ์ํฉ๋๋ค. type GrabBag sum.OneOf
(ํ์ง๋ง ์ฃผ์์ ์ค๋ช
ํ๋ ค๋ฉด ์ฌ์ ํ ๊ธฐ๊ณ๊ฐ ์ธ์ํ ์ ์๋ ์ฃผ์์ด ํ์ํฉ๋๋ค). ๋ค์๊ณผ ๊ฐ์ ์ฅ๋จ์ ์ด ์์ต๋๋ค.
์ฅ์
์ด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํฉ๊ณ ์ ํ์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ ๊ด๊ณ์์ด ํด๋น ์ ํ์ด ์ธ์๋์๋ค๊ณ ๊ฐ์ ํ๊ณ ํด๋น ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ํ ์ ์๋ ๋๊ตฌ์ ์ข ๋ฅ๋ฅผ ํ์ธํฉ๋๋ค.
ํด๋ง์ ์์ฑ(์คํธ๋ง๊ฑฐ์ ๊ฐ์) ๋ฐ ๋ด์ฑ(๊ณจ๋ฆฐํธ์ ๊ฐ์)์ผ๋ก ๋๋ต ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ๊ฐ๋จํ ์์ฑ ์ฝ๋๋ ๋๋ฝ๋ ์ผ์ด์ค๋ก switch ๋ฌธ์ ์ฑ์ฐ๋ ๋๊ตฌ์ ๋๋ค. ์ด๊ฒ์ ํธ์ง์๊ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํฉ๊ณ ์ ํ์ด ํฉ๊ณ ์ ํ์ผ๋ก ์๋ณ๋๋ฉด ์ด๊ฒ์ ์ฌ์ํฉ๋๋ค(์กฐ๊ธ ์ง๋ฃจํ์ง๋ง ์ค์ ์์ฑ ๋ ผ๋ฆฌ๋ ์ธ์ด ์ง์ ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋์ผํ ๊ฒ์ ๋๋ค).
๋ชจ๋ ๊ฒฝ์ฐ์ "ํ๋์" ๋ถ๋ณ์ฑ์ ๊ฒ์ฆํ๋ ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด๊ฑฐํ์ ๊ฒฝ์ฐ ์คํธ๋ง๊ฑฐ์ ๊ฐ์ ๋ ๋ง์ ๋๊ตฌ๊ฐ ์์ ์ ์์ต๋๋ค. https://github.com/golang/go/issues/19814#issuecomment -291002852์์ ๋ช ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ ์ธ๊ธํ์ต๋๋ค.
๊ฐ์ฅ ํฐ ์์ฑ ๋๊ตฌ๋ ์ด ์ ๋ณด๋ก ๋ ๋์ ๊ธฐ๊ณ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ์ปดํ์ผ๋ฌ์ ๋๋ค.
๋๋ ํ์ฌ ๋ค๋ฅธ ์ฌ๋์ ์๊ฐํ ์ ์์ต๋๋ค. ๋๊ตฐ๊ฐ์ ์์๋ฆฌ์คํธ์ ๋ฌด์ธ๊ฐ๊ฐ ์์ต๋๊น?
๋ด์ฑ์ ๊ฒฝ์ฐ ๋ช ๋ฐฑํ ํ๋ณด๋ ์ฒ ์ ํ ๋ฆฐํธ์ ๋๋ค. ์ธ์ด ์ง์์ด ์์ผ๋ฉด ์ค์ ๋ก ๋ ๊ฐ์ง ์ข ๋ฅ์ ๋ฆฐํธ๊ฐ ํ์ํฉ๋๋ค.
1์ ์ฌ์ํ์ง๋ง 2๋ 100% ๊ฒ์ฆ๋ ์ ์๊ณ (์์ ํ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ๋ฌด์ํ๋๋ผ๋) ๋ชจ๋ ๊ฐ๋ฅํ ์ํ์ ๊ธฐ๋ณธ ์ผ์ด์ค๊ฐ ํ์ํ๋ฉฐ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฝ๋๊ฐ ์ด์จ๋ ์ด ๋ฆฐํฐ๋ฅผ ์คํํ๋ค๊ณ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
2 ์ค์ ๋ก ๊ฐ์ ๋ฐ์ํ๊ฑฐ๋ ํฉ๊ณ์ ๋ํด ์ ํจํ์ง ์์ ์ํ๋ฅผ ์์ฑํ ์ ์๋ ๋ชจ๋ ์ฝ๋๋ฅผ ์๋ณํ ์๋ ์์ง๋ง ํฉ๊ณ ์ ํ์ ํฌํจํ๊ณ ํจ๊ป func๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ๋ง์ ๊ฐ๋จํ ์ค๋ฅ๋ฅผ ์ก์ ์ ์์ต๋๋ค. "pkg.F(v)๋ฅผ ์์ฑํ์ง๋ง pkg.F(v.EmbeddedField)๋ฅผ ์๋ฏธํ์ต๋๋ค." ๋๋ "2๋ฅผ pkg.F์ ์ ๋ฌํ์ต๋๋ค. pkg.B๋ฅผ ์ฌ์ฉํ์ธ์." ๊ตฌ์กฐ์ฒด์ ๊ฒฝ์ฐ "์ด๋ ๊ฒ์ ์ผ๊ณ ์๊ณ X์ ๊ฒฝ์ฐ ํ๋ F๋ฅผ 0์ด ์๋ ๊ฐ์ผ๋ก ์ค์ ํ๋์ง"์ ๊ฐ์ ์ ๋ง ๋ช ๋ฐฑํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ํ ๋ฒ์ ํ๋์ ํ๋๊ฐ ์ค์ ๋๋ค๋ ๋ถ๋ณ์ฑ์ ์ ์ฉํ ์ ์์ต๋๋ค. ". ํจํค์ง ์ธ๋ถ์์ ๊ฐ์ ์๋ฝํ ๋ ์์ฑ๋ ์ ํจ์ฑ ๊ฒ์ฌ ํจ์๋ฅผ ์ฌ์ฉํ๋๋ก ์ฃผ์ฅํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ํฐ ๊ฒ์ godoc์ ๋ํ๋ ๊ฒ์ ๋๋ค. godoc์ ์ด๋ฏธ const/iota๋ฅผ ๊ทธ๋ฃนํํ๊ณ #20131์ ์ธํฐํ์ด์ค pseudosums์ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ๋ถ๋ณ์ ์ง์ ํ๋ ๊ฒ ์ธ์๋ ์ ์์ ๋ช ์๋์ง ์์ ๊ตฌ์กฐ์ฒด ๋ฒ์ ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
๋ฟ๋ง ์๋๋ผ ์คํ๋ผ์ธ ๋๊ตฌ(๋ฆฐํฐ, ์ฝ๋ ์์ฑ๊ธฐ ๋ฑ)
์๋์. ์ ์ ์ ๋ณด๊ฐ ์กด์ฌํฉ๋๋ค. ์ด๋ฅผ ์ํด ์ ํ ์์คํ (๋๋ ๋ฐ์)์ด ํ์ํ์ง ์์ต๋๋ค. ๊ท์น์ ์ ์๋ํฉ๋๋ค. ์ธํฐํ์ด์ค์ ๋ด๋ณด๋ด์ง ์์ ๋ฉ์๋๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด ๋ชจ๋ ์ ์ ๋๊ตฌ์์ ์ด๋ฅผ ๋ซํ ํฉ๊ณ๋ก ์ฒ๋ฆฌํ๊ณ (ํจ๊ณผ์ ์ผ๋ก ์๊ธฐ ๋๋ฌธ์) ์ํ๋ ๋ถ์/์ฝ๋ ์์ฑ์ ์ํํ๋๋ก ์ ํํ ์ ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก iota-enums์ ๊ท์น๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
Reflect๋ ๋ฐํ์ ์ ํ ์ ๋ณด๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ์ด๋ค ์๋ฏธ์์ ์ปดํ์ผ๋ฌ๋ ์ฌ๊ธฐ์์ sum-by-convention์ด ์๋ํ๋๋ก ํ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ง์๋๋ค(ํจ์ ๋ชฉ๋ก, ์ ์ธ๋ ์ ํ ๋๋ ์ ์ธ๋ const์ ๋ํ ์ก์ธ์ค ๊ถํ์ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์). ์ด๊ฒ์ด ์ค์ ๊ธ์ก์ด ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ค๋ ๋ฐ ๋์ํ๋ ์ด์ ์ ๋๋ค.
(๋ํ FTR์ ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ ํ์ํ ๋ฐํ์ ์ ๋ณด๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ ์ ์ผ๋ก ์๋ ค์ง ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ ๋๊ตฌ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ์ํ ํ๊ทธ ๋ฉ์๋๊ฐ ์๋ ์ ํ์ ์ด๊ฑฐํ๊ณ ์กฐํ ํ ์ด๋ธ์ ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ ์ค ์ผ์ด์ค๊ฐ ๋ฌด์์ธ์ง ์ดํดํ์ง ๋ชปํ๋ฏ๋ก ์ด๊ฒ์ ์ค์ฉ์ฑ์ ํ๊ฐํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค).
๊ทธ๋์ ๋ด ์ง๋ฌธ์ ์๋์ ์ผ๋ก: ๋ฐํ์์ ์ด ์ ๋ณด๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ฌ์ฉ ์ฌ๋ก๋ ๋ฌด์์ ๋๊น?
์ด์จ๋ ํ์ํ๋ ๊ฒ์ด ๊ณต์ ํ ์์ด๋์ด์ด๋ฏ๋ก ํ์ํด ๋ณด๊ฒ ์ต๋๋ค.
๋ด๊ฐ "ํ๊ตฌํ๋ผ"๊ณ ๋งํ์ ๋, ๋๋ "๊ทธ๊ฒ๋ค์ ์ด๊ฑฐํ๊ณ ๊ทธ๊ฒ๋ค์ ๋ํด ์ง๊ณต ์ํ์์ ๋ ผ์ํ๋ผ"๋ ๊ฒ์ ์๋ฏธํ์ง ์์๊ณ , ๋๋ "์ด๋ฌํ ๊ด๋ก๋ฅผ ์ฌ์ฉํ๋ ๋๊ตฌ๋ฅผ ๊ตฌํํ๊ณ ๊ทธ๊ฒ๋ค์ด ์ผ๋ง๋ ์ ์ฉ/ํ์/์ค์ฉ์ ์ธ์ง ํ์ธํ๋ผ"๋ฅผ ์๋ฏธํ๋ค.
๊ฒฝํ ๋ณด๊ณ ์ ์ ์ฅ์ ์
"๊ธฐ์กด ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ ค๊ณ ์๋ํ๋" ๋ถ๋ถ์ ๊ฑด๋๋ฐ๊ณ ์์ต๋๋ค. ํฉ๊ณ(๋ฌธ์ )์ ๋ํ ์ ์ ์ธ ์์ ์ฑ ๊ฒ์ฌ๋ฅผ ์ํฉ๋๋ค. ๋ด๋ณด๋ด์ง ์์ ๋ฉ์๋๊ฐ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ฐพ๋ ๋๊ตฌ๋ฅผ ์์ฑํ๊ณ , ์ฌ์ฉ๋ ๋ชจ๋ ์ ํ ์ค์์น์ ๋ํ ์ฒ ์ ํ ๊ฒ์ฌ๋ฅผ ์ํํ๊ณ , ์ ์ ๋์ ํด๋น ๋๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค(๊ธฐ์กด ๋ฉ์ปค๋์ฆ ์ฌ์ฉ). ์คํจํ ๊ณณ์ ๊ธฐ๋กํ์ญ์์ค.
๋๋ ํฐ ์๋ฆฌ๋ก ์๊ฐํ๊ณ ๋๊ตฌ๊ฐ ์ฌ์ฉํ ์ ์๋ ์๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ ์ธ์๊ธฐ์ ๋ํ ์์ ์ ์์ํ์ต๋๋ค. ๋๋ ์๋ฌต์ ์ผ๋ก ํผ๋๋ฐฑ๊ณผ ๋ ๋ง์ ์์ด๋์ด๋ฅผ ์ฐพ๊ณ ์์๋ ๊ฒ ๊ฐ๋ค.
FWIW, ๋ง์ฝ ๋น์ ์ด ๋ณต์กํ ๊ฒฝ์ฐ๋ฅผ ๋ฌด์ํ๊ณ ์๋ํ๋ ๊ฒ๋ค์ ์ง์คํ ๊ฒ์ด๋ผ๋ฉด: a) ์ธํฐํ์ด์ค์์ ๋ด๋ณด๋ด์ง ์์ ๋ฉ์๋์ b) ๊ธฐ๋ณธ ์ ํ์ผ๋ก int๋ฅผ ๊ฐ๊ณ ๋จ์ผ const๋ฅผ ๊ฐ๋ ๊ฐ๋จํ const-iota-enums ์์ ํ์ ์ ์ธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ด ๋ ๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ฌ์ฉํด์ผ ํ์ง๋ง IMO๋ ๊ด์ฐฎ์ต๋๋ค(์ปดํ์ผ๋ฌ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ช ์์ ์ผ๋ก ํฉ๊ณ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก ๊ด์ฐฎ์ ๋ณด์ ๋๋ค).
๊ทธ๊ฒ์ ํ์คํ ์์ํ๊ธฐ์ ์ข์ ๊ณณ์ด๋ฉฐ ๋ง์ ํจํค์ง ์ธํธ๋ฅผ ์คํํ๊ณ ์ผ๋ง๋ ๋ง์ ์คํ์ง/๋ถ์ ์ฑ์ด ์๋์ง ํ์ธํ ํ ์ ํ๋ฅผ ๊ฑธ ์ ์์ต๋๋ค.
https://godoc.org/github.com/jimmyfrasche/closed
์ฌ์ ํ ๋ง์ ์์ ์ด ์งํ ์ค์ ๋๋ค. ์์ฑ์์ ์ถ๊ฐ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ ํ์๊ฐ ์๋ค๊ณ ์ฅ๋ดํ ์ ์์ต๋๋ค. ํ ์คํธ๋ณด๋ค ๋ฒ๊ทธ๊ฐ ๋ ๋ง์ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ฐ์ง๊ณ ๋๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
๊ฐ์ ธ์ค๊ธฐ ๊ฒฝ๋ก๋ก ์ง์ ๋ ํจํค์ง์์ ๊ฐ์ง๋ ๋ชจ๋ ๋ซํ ์ ํ๋ ๋์ดํ๋ cmds/closed-exporter์ ์ฌ์ฉ ์๊ฐ ์์ต๋๋ค.
๋ด๋ณด๋ด์ง ์์ ๋ฉ์๋๋ก ๋ชจ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์งํ๊ธฐ ์์ํ์ง๋ง ์๋นํ ์ผ๋ฐ์ ์ด๋ฉฐ ์ผ๋ถ๋ ๋ถ๋ช ํ ํฉ๊ณ ์ ํ์ธ ๋ฐ๋ฉด ๋ค๋ฅธ ์ผ๋ถ๋ ๋ถ๋ช ํ ๊ทธ๋ ์ง ์์์ต๋๋ค. ๊ทธ๋ฅ ๋น ํ๊ทธ ๋ฐฉ์ ๊ท์ฝ์ผ๋ก๋ง ํ์ ํ๋ฉด ํฉํ์ด ๋ง์ด ์์ด์ ธ์ ๋ ๋ค ๋ฐ๋ก ๊ธฐ๋กํ๊ณ ํจํค์ง๋ฅผ ํฉํ์ ๋์ด ํ์ํ์ผ๋ก ์ผ๋ฐํํ๊ธฐ๋ก ํ๋ค.
์ด๊ฑฐํ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ํ์ฌ ์ ์๋ ์ ํ์ bitset์ด ์๋ ๋ชจ๋ const๋ฅผ ๊ธฐ๋กํ์ต๋๋ค. ๋ฐ๊ฒฌ๋ ๋นํธ์ ๋ ๊ณต๊ฐํ ๊ณํ์ ๋๋ค.
์ผ์ข ์ ๋ง์ปค ์ฃผ์์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ ํ์ ๊ตฌ์กฐ์ฒด ๋๋ ์ ์๋ ๋น ์ธํฐํ์ด์ค๋ ์์ง ๊ฐ์งํ์ง ๋ชปํ์ง๋ง stdlib์ ์๋ ํน์ํ ๊ฒฝ์ฐ์๋ ๊ฐ์งํฉ๋๋ค.
๋ด๋ณด๋ด์ง ์์ ๋ฉ์๋๋ก ๋ชจ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์งํ๊ธฐ ์์ํ์ง๋ง ์๋นํ ์ผ๋ฐ์ ์ด๋ฉฐ ์ผ๋ถ๋ ๋ถ๋ช ํ ํฉ๊ณ ์ ํ์ธ ๋ฐ๋ฉด ๋ค๋ฅธ ์ผ๋ถ๋ ๋ถ๋ช ํ ๊ทธ๋ ์ง ์์์ต๋๋ค.
๊ทธ๋ ์ง ์์ ๋ช ๊ฐ์ง ์๋ฅผ ์ ๊ณตํ ์ ์๋ค๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
@Merovius ์ฃ์กํฉ๋๋ค ๋ชฉ๋ก์ ๋ณด๊ดํ์ง ์์์ต๋๋ค. stdlib.sh(cmds/closed-explorer์์)๋ฅผ ์คํํ์ฌ ์ฐพ์์ต๋๋ค. ๋ค์์ ์ข์ ์๋ฅผ ๋ง๋๋ฉด ์ด๊ฒ์ ์ฌ์ฉํ์ฌ ๊ฒ์ํ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ํฉ๊ณ ์ ํ์ผ๋ก ๊ณ ๋ คํ์ง ์๋ ๊ฒ์ ์ฌ๋ฌ ๊ตฌํ ์ค ํ๋๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ด๋ณด๋ด์ง ์์ ์ธํฐํ์ด์ค์์ต๋๋ค. ํฉ์ด ์๋ ์ธํฐํ์ด์ค๋ก ๋ง์ด ์ฌ์ฉํ๊ณ ์์๋๋ฐ, ๊ทธ๋ฅ ๋ด๋ณด๋ด์ง ์์์ ๋ซํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ์๋ง๋ ๊ทธ๊ฒ์ ์ฐจ์ด๊ฐ ์๋ ๊ตฌ๋ณ์ผ์ง ๋ชจ๋ฅด์ง๋ง, ๋๋ ์ถ๊ฐ ์กฐ์ฌ ํ์ ํญ์ ๋ง์์ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
@jimmyfrasche ๋๋ ๊ทธ๊ฒ๋ค์ด ํ์ ์ด์ก์ผ๋ก ์ ์ ํ๊ฒ ์ทจ๊ธ๋์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ๋๋ ๊ทธ๋ค์ด ๋์ ์ ํ์ ์ ๊ฒฝ ์ฐ์ง ์๋๋ค๋ฉด(์ฆ, ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ง ํธ์ถํ๋ ๊ฒฝ์ฐ) ์ ์ ๋ฆฐํฐ๋ "๋ชจ๋ ์ค์์น๊ฐ ์ฒ ์ ํ๋ค"๊ณ ๋ถํํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์ฃผ์ฅํฉ๋๋ค. ํ์ ์ด์ก์ผ๋ก. ๋ง์ฝ, OTOH, ๊ทธ๋ค์ด ์ค์์น๋ฅผ ์ ๋ ฅ ๋๋ก๋ ์๊ณ ์ฌ๋ฐ๋ฅธ ๊ฒ์ ๋๋ค ๋ถํ ์ฌ๋ก๋ฅผ ์๋ต - ๊ทธ๊ฒ ์ ํํ ๋ฆฐํฐ๊ฐ ์บ์น๋ก ์ถ์ ๋๋ ๋ฌผ๊ฑด์ ์ข ๋ฅ๊ฐ ๋ ๊ฒ์ ๋๋ค.
์ ๋์จ ์ ํ์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๋ ๋ฐฉ๋ฒ์ ํ๊ตฌํ๋ ๋ฐ ์ข์ ๋จ์ด๋ฅผ ๋ฃ๊ณ ์ถ์ต๋๋ค. ์ ๋ Go์์ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์์ฑ ์ค์ด๋ฉฐ Values๋ ๋ค๋ฅธ ์ ํ์ ๋ํ ํฌ์ธํฐ์ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ์ธํฐํ์ด์ค๋ก ๊ตฌํ๋์ด์ผ ํ๋ Value ์ ํ์ด ์์ต๋๋ค. ์ด๊ฒ์ ์๋ง๋ C์์ ํ ์ ์๋ ์์ ๋นํธ ํ๊ทธ๋ก ํฌ์ธํฐ๋ฅผ ํจํนํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ []Value๊ฐ ๋ ๋ฐฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํจ์ ์๋ฏธํฉ๋๋ค. ๋ง์ ๊ฒ ๊ฐ์ต๋๊น?
์ธ์ด ์ฌ์์ ์ด๊ฒ์ ์ธ๊ธํ ํ์๊ฐ ์์ง๋ง ์ผ๋ถ ์์ ๊ณต์ฉ์ฒด ์ ํ์ ๋ํด ๋ฐฐ์ด์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ ๋ฐ์ผ๋ก ์ค์ด๋ ๊ฒ์ด ๊ณต์ฉ์ฒด์ ๋ํ ๊ฝค ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ์ด ๋ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ด๊ฐ ์๋ ํ ์ค๋๋ Go์์๋ ๋ถ๊ฐ๋ฅํ ์ผ์ ํ ์ ์์ต๋๋ค. ๋์กฐ์ ์ผ๋ก ์ธํฐํ์ด์ค ์์ ๊ณต์ฉ์ฒด๋ฅผ ๊ตฌํํ๋ฉด ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ๊ณผ ์ดํด๋์ ๋์์ด ๋ ์ ์์ง๋ง ๊ธฐ๊ณ ์์ค์์๋ ์๋ก์ด ์์ ์ ์ํํ์ง ์์ต๋๋ค.
์ฑ๋ฅ ํ ์คํธ๋ฅผ ํด๋ณธ ์ ์ด ์์ต๋๋ค. ์ฐ๊ตฌ ๋ฐฉํฅ์ ์ ์ํ ๋ฟ์ ๋๋ค.
๋์ ์ ๊ฐ์ unsafe.Pointer๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
2018๋ 2์ 6์ผ ์คํ 3์ 54๋ถ์ "Brian Slesinsky" [email protected]์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
์ ๋์จ ์ ํ์ด
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋. ์ ๋ Go์์ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์์ฑ ์ค์ด๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๊ฐ ์ ํ์ด ์์ต๋๋ค.
Values๋ ํฌ์ธํฐ๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ์ธํฐํ์ด์ค๋ก ๊ตฌํ๋์ด์ผ ํฉ๋๋ค.
๋ค๋ฅธ ์ ํ์. ์ด๊ฒ์ ์๋ง๋ []๊ฐ์ด ๋ ๋ฐฐ๋ฅผ ์ฐจ์งํจ์ ์๋ฏธํฉ๋๋ค.
ํ ์ ์๋ ๊ฒ์ฒ๋ผ ์์ ๋นํธ ํ๊ทธ๋ก ํฌ์ธํฐ๋ฅผ ํจํนํ๋ ๊ฒ๊ณผ ๋น๊ตํ ๋ฉ๋ชจ๋ฆฌ
C. ๋ง์ ๊ฒ ๊ฐ์ต๋๊น?์ธ์ด ์ฌ์์ ์ด๊ฒ์ ์ธ๊ธ ํ ํ์๊ฐ ์์ง๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ฅด๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ผ๋ถ ์์ ๊ณต์ฉ์ฒด ์ ํ์ ๋ํด ๋ฐฐ์ด์ ๋ฐ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๊ฝค ๋ ์ ์์ต๋๋ค.
๋ ธ์กฐ์ ๋ํ ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ? ๊ทธ๊ฒ์ ๋น์ ์ด ๋๋งํผ ํ ์ ์์ต๋๋ค
์ค๋ ๋ฐ๋์์ ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ด์ ๋ฐํด ๋ ธ๋์กฐํฉ์ ์ํํ๋ ๊ฒ์
์ธํฐํ์ด์ค์ ์๋จ์ ํ๋ก๊ทธ๋จ ์ ํ์ฑ ๋ฐ
์ดํดํ๊ธฐ ์ฌ์ฐ๋ ๊ธฐ๊ณ ์์ค์์ ์๋ก์ด ์ผ์ ํ์ง ์์ต๋๋ค.์ฑ๋ฅ ํ ์คํธ๋ฅผ ํด๋ณธ ์ ์ด ์์ต๋๋ค. ๋ฐฉํฅ์ ์ ์ํ ๋ฟ์ด๋ค.
์ฐ๊ตฌ.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/19412#issuecomment-363561070 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe-auth/AGGWBz-L3t0YosVIJmYNyf2iQ-YgIXLGks5tSLv9gaJpZM4MTmSr
.
@skybrian ํฉ๊ณ ์ ํ์ ๊ตฌํ๊ณผ ๊ด๋ จํ์ฌ ๊ฝค ์ฃผ์ ๋์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๊ฒ์ ํฉ๊ณ ์ ํ์ ์๊ตฌํ ๋ฟ๋ง ์๋๋ผ ์ปดํ์ผ๋ฌ๊ฐ ํฉ๊ณ์ ์๋ ํฌ์ธํฐ๋ง์ ํน์ํ ๊ฒฝ์ฐ๋ฅผ ์ธ์ํ๊ณ ์์ถ๋ ํฌ์ธํฐ๋ก ์ต์ ํํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ GC๊ฐ ํฌ์ธํฐ์ ํ์ํ ํ๊ทธ ๋นํธ ์๋ฅผ ์ธ์ํด์ผ ํฉ๋๋ค. , ๋ง์คํนํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด, ๋๋ ์ด๋ฐ ์ผ์ด ์ผ์ด๋๋ ๊ฒ์ ์ค์ ๋ก ๋ณด์ง ๋ชปํฉ๋๋ค, TBH.
๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. Sum ์ ํ์ ํ๊ทธ๊ฐ ์ง์ ๋ ๊ณต์ฉ์ฒด์ผ ๊ฒ์ด๋ฉฐ ์๋ง๋ ์ง๊ธ์ฒ๋ผ ์ฌ๋ผ์ด์ค์์ ๋ง์ ๊ณต๊ฐ์ ์ฐจ์งํ ๊ฒ์ ๋๋ค. ์ฌ๋ผ์ด์ค๊ฐ ๊ท ์งํ์ง ์๋ค๋ฉด ์ง๊ธ ๋น์ฅ ๋ ๊ตฌ์ฒด์ ์ธ ์ฌ๋ผ์ด์ค ์ ํ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
๊ทธ๋. ๋งค์ฐ ํน๋ณํ ๊ฒฝ์ฐ์ ํน๋ณํ ์ต์ ํํ๋ฉด ์ฝ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์ง๋ง ์ค์ ๋ก ํ์ํ ๊ฒฝ์ฐ ์๋์ผ๋ก ์ต์ ํํ ์๋ ์์ต๋๋ค.
@DemiMarie unsafe.Pointer๋ App Engine์์ ์๋ํ์ง ์์ผ๋ฉฐ ์ด๋ค ๊ฒฝ์ฐ์๋ ๊ฐ๋น์ง ์์ง๊ธฐ๋ฅผ ๋ง์น์ง ์๊ณ ๋นํธ๋ฅผ ํฌ์ฅํ ์ ์์ต๋๋ค. ๊ฐ๋ฅํ๋๋ผ๋ ํด๋๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
@Merovius ์, ํจํน๋ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ์ดํดํ๋ ค๋ฉด ๋ฐํ์ ๋ฐ ๊ฐ๋น์ง ์์ง๊ธฐ๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ผ์ข ์ ์์ ์ ๋๋ค. ํฌ์ธํฐ๋ Go ๋ฐํ์์ ์ํด ๊ด๋ฆฌ๋๋ฏ๋ก ์์ ํ ๋ฐฉ์์ผ๋ก ์ธํฐํ์ด์ค๋ณด๋ค ๋ ๋์ ์์ ์ ์ํํ๋ ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ปดํ์ผ๋ฌ์์ ์ํํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋น ๋ฅธ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ฌธ ์ฌ์ฉ ์ฌ๋ก๋ผ๋ ๊ฒ์ ์ฝ๊ฒ ์ธ์ ํ ๊ฒ์ ๋๋ค. ์๋ง๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ต๋๊น? ์ธ์ด ๊ธฐ๋ฅ์ ๋๊ธฐ๋ฅผ ๋ถ์ฌํ๋ ์ข์ ๋ฐฉ๋ฒ์ ์ค๋๋ Go์์ ์ฝ๊ฒ ์ํํ ์ ์๋ ์์ ์ ์ฐพ๋ ๊ฒ์ ๋๋ค.
๊ทธ๊ฒ์ ์ฌ์ค์ด๋ค.
๋ด ์๊ฐ์ ๋ฐ๋์ ํต์ญ์ฌ๋ฅผ ์ฐ๊ธฐ์ ๊ฐ์ฅ ์ข์ ์ธ์ด๋ ์๋์ง๋ง,
๊ทธ๋ฌํ ์ํํธ์จ์ด์ ์์ฒญ๋ ์ญ๋์ฑ ๋๋ฌธ์
๋๋ค. ๊ณ ์ฑ๋ฅ์ด ํ์ํ๋ค๋ฉด,
ํซ ๋ฃจํ๋ ์ด์
๋ธ๋ฆฌ๋ก ์์ฑ๋์ด์ผ ํฉ๋๋ค. ๋ฌด์จ ์ด์ ๋ผ๋ ์๋์
App Engine์์ ์๋ํ๋ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์์ฑํด์ผ ํฉ๋๊น?
2018๋ 2์ 6์ผ ์คํ 6์ 15๋ถ์ "Brian Slesinsky" [email protected]์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@DemiMarie https://github.com/demimarie unsafe.Pointer๊ฐ ์ฑ์์ ์๋ํ์ง ์์ต๋๋ค
์์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๊ฒฝ์ฐ์๋ ๋น์ ์ด
๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ๋ง์น๋ค. ๊ฐ๋ฅํ๋ค ํด๋ ๊ทธ๋ด ์ ์๋ค.
๊ฐ์ง๊ณ ๋ค๋ ์ ์๋.
@metrovius ์, ๋ฐํ์ ๋ฐ ๊ฐ๋น์ง ์์ง๊ธฐ๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
ํจํน๋ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ์ดํดํฉ๋๋ค. ๊ทธ๊ฒ์ ์ผ์ข
์ ์์ ์
๋๋ค. ํฌ์ธํฐ๋
Go ๋ฐํ์์ ์ํด ๊ด๋ฆฌ๋๋ฏ๋ก ์ธํฐํ์ด์ค๋ณด๋ค ๋ ๋์ ์์
์ ์ํ๋ ๊ฒฝ์ฐ
์์ ํ ๋ฐฉ๋ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ปดํ์ผ๋ฌ์์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ๋น ๋ฅธ ํต์ญ์ฌ๋ฅผ ์ฐ๋ ๊ฒ์ด ํํ์ง ์๋ค๋ ๊ฒ์ ์ฝ๊ฒ ์ธ์ ํ ๊ฒ์
๋๋ค.
์ฌ๋ก. ์๋ง๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ต๋๊น? ๋๊ธฐ๋ถ์ฌ๋ฅผ ํ๋ ์ข์ ๋ฐฉ๋ฒ์ธ๊ฒ ๊ฐ์ต๋๋ค
์ธ์ด ๊ธฐ๋ฅ์ ์ค๋ ๋ฐ๋์์ ์ฝ๊ฒ ํ ์ ์๋ ์ผ์ ์ฐพ๋ ๊ฒ์
๋๋ค.
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์
๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/19412#issuecomment-363598572 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe-auth/AGGWB65jRKg_qVPWTiq8LbGk3YM1RUasks5tSN0tgaJpZM4MTmSr
.
@rogpepp ์ ์์ด ์๋นํ ๋งค๋ ฅ์ ์ ๋๋ค. ๋ํ @griesemer๊ฐ ์ด๋ฏธ ์๋ณํ ํํ๊ณผ ํจ๊ป ์ถ๊ฐ ํํ์ ์ ๊ธ ํด์ ํ ๊ฐ๋ฅ์ฑ์ด ์๋์ง๋ ๊ถ๊ธํฉ๋๋ค.
์ ์์๋ "ํฉ๊ณ ์ ํ์ ๋ฉ์๋ ์ธํธ๋ ๋ฉ์๋ ์ธํธ์ ๊ต์งํฉ์ ๋ณด์ ํฉ๋๋ค.
๋์ผํ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ ์ธํ ๋ชจ๋ ๊ตฌ์ฑ ์์ ์ ํ
์ด๋ฆ์ด์ง๋ง ์๋ช
์ด ๋ค๋ฆ
๋๋ค."
๊ทธ๋ฌ๋ ์ ํ์ ๋จ์ํ ๋ฉ์๋ ์ธํธ ๊ทธ ์ด์์ ๋๋ค. ํฉ๊ณ ์ ํ์ด ํด๋น ๊ตฌ์ฑ ์์ ์ ํ์์ ์ง์ํ๋ ์ฐ์ฐ์ ๊ต์ฐจ๋ฅผ ์ง์ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์๋ฅผ ๋ค์ด ๋ค์์ ๊ณ ๋ คํ์ญ์์ค.
var x int|float64
๋ค์์ด ํจ๊ณผ๊ฐ ์๋ค๋ ์์ด๋์ด์ ๋๋ค.
x += 5
์ ์ฒด ์ ํ ์ค์์น๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
switch i := x.(type) {
case int:
x = i + 5
case float64:
x = i + 5
}
๋ ๋ค๋ฅธ ๋ณํ์๋ ๊ตฌ์ฑ ์์ ์ ํ ์์ฒด๊ฐ ํฉ๊ณ ์ ํ์ธ ์ ํ ์ค์์น๊ฐ ํฌํจ๋ฉ๋๋ค.
type Num int | float64
type StringOrNum string | Num
var x StringOrNum
switch i := x.(type) {
case string:
// Do string stuff.
case Num:
// Would be nice if we could use i as a Num here.
}
๋ํ sum ์ ํ๊ณผ ์ ํ ์ ์ฝ ์กฐ๊ฑด์ ์ฌ์ฉํ๋ ์ ๋ค๋ฆญ ์์คํ ์ฌ์ด์ ์ ์ฌ์ ์ผ๋ก ์ ๋ง ์ข์ ์๋์ง ํจ๊ณผ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
var x int|float64
var x, y int | float64
์ด๋ป์ต๋๊น? ์ฌ๊ธฐ์ ์ถ๊ฐํ ๋์ ๊ท์น์ ๋ฌด์์
๋๊น? ์ด๋ค ์์ค ๋ณํ์ด ์ด๋ฃจ์ด์ง๋์(์)? ๊ฒฐ๊ณผ ์ ํ์ ๋ฌด์์
๋๊น?
Go๋ ์๋์ ์ผ๋ก (C์ฒ๋ผ) ํํ์์์ ์๋ ๋ณํ์ ์ํํ์ง ์์ต๋๋ค. ์ด๋ฌํ ์ง๋ฌธ์ ๋๋ตํ๊ธฐ ์ฝ์ง ์๊ณ ๋ฒ๊ทธ๋ก ์ด์ด์ง๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ๋ง์ ์ฌ๋ฏธ๋ฅผ ์ํด:
var x, y, z int|string|rune
x = 42
y = 'a'
z = "b"
fmt.Println(x + y + z)
fmt.Println(x + z + y)
fmt.Println(y + x + z)
fmt.Println(y + z + x)
fmt.Println(z + x + y)
fmt.Println(z + y + x)
๋ชจ๋ int
, string
๋ฐ rune
์๋ +
์ฐ์ฐ์๊ฐ ์์ต๋๋ค. ์์ ์ธ์๋ ๋ฌด์์ด๋ฉฐ ๋ฌด์๋ณด๋ค ์ ๊ฒฐ๊ณผ๊ฐ ์์ ํ ํผ๋์ค๋ฝ์ง ์์ ์ ์์ต๋๊น?
var x, y int | float64
์ด๋ป์ต๋๊น? ์ฌ๊ธฐ์ ์ถ๊ฐํ ๋์ ๊ท์น์ ๋ฌด์์ ๋๊น? ์ด๋ค ์์ค ๋ณํ์ด ์ด๋ฃจ์ด์ง๋์(์)? ๊ฒฐ๊ณผ ์ ํ์ ๋ฌด์์ ๋๊น?
@Merovius ๋ด ํํ์ด ์ด๋ป๊ฒ ๊ทธ ์ธ์์ ์ ๊ฐ์ค๋ฝ๊ฒ ๋ง๋ค ์ ์๋์ง ์ ์ ์์ง๋ง ์์์ ์ผ๋ก ์์ค ๋ณํ์ด x + y
๋ ์์์ ๋ณํ ๊ฐ๋ฅ์ฑ์ ์์ํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ ์ค ํ๋๊ฐ ์ปดํ์ผ๋ฉ๋๋ค.
z = int(x) + int(y)
z = float64(x) + float64(y)
๋ง์ฐฌ๊ฐ์ง๋ก xyz ์์ ๋ ๊ฐ๋ฅํ ์์์ ๋ณํ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋์ง ์์ต๋๋ค.
"์ง์๋๋ ์์ ์ ๊ต์ฐจ ์ง์"์ ์ข๊ฒ ๋ค๋ฆฌ์ง๋ง ์๋ํ ๋ฐ๋ฅผ ์ ๋๋ก ์ ๋ฌํ์ง ๋ชปํ๋ค๊ณ ์๊ฐํฉ๋๋ค. "๋ชจ๋ ๊ตฌ์ฑ ์์ ์ ํ์ ๋ํด ์ปดํ์ผ"๊ณผ ๊ฐ์ ๊ฒ์ ์ถ๊ฐํ๋ฉด ์๋ ๋ฐฉ์์ ์ค๋ช ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ ๋ค๋ฅธ ์๋ ๋ชจ๋ ๊ตฌ์ฑ ์์ ์ ํ์ด ์ฌ๋ผ์ด์ค ๋ฐ ๋งต์ธ ๊ฒฝ์ฐ์ ๋๋ค. ์ ํ ์ ํ ์์ด sum ์ ํ์์ len์ ํธ์ถํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๋ชจ๋ int, string ๋ฐ rune์๋ + ์ฐ์ฐ์๊ฐ ์์ต๋๋ค. ์์ ์ธ์๋ ๋ฌด์์ด๋ฉฐ ๋ฌด์๋ณด๋ค ์ ๊ฒฐ๊ณผ๊ฐ ์์ ํ ํผ๋์ค๋ฝ์ง ์์ ์ ์์ต๋๊น?
"ํฉ๊ณ ์ ํ์ด ํด๋น ๊ตฌ์ฑ ์์ ์ ํ์ด ์ง์ํ๋ ์ฐ์ฐ์ ๊ต์ฐจ๋ฅผ ์ง์ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?"๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์์ต๋๋ค. "์ ํ์ ํด๋น ๊ฐ์ ํน์ ํ ์์ ๋ฐ ๋ฉ์๋์ ํจ๊ป ๊ฐ ์งํฉ์ ๊ฒฐ์ ํฉ๋๋ค."๋ผ๋ Go Spec์ ์ ํ ์ค๋ช ์์ ์๊ฐ์ ๋ฐ์์ต๋๋ค.
๋ด๊ฐ ๋งํ๋ ค๊ณ ํ๋ ์์ ์ ์ ํ์ด ๊ฐ๊ณผ ๋ฉ์๋ ๊ทธ ์ด์์ด๋ฏ๋ก ํฉ๊ณ ์ ํ์ด ๊ตฌ์ฑ ์์ ์ ํ์์ ๋ค๋ฅธ ํญ๋ชฉ์ ๊ณตํต์ฑ์ ํฌ์ฐฉํ๋ ค๊ณ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด "๊ธฐํ ํญ๋ชฉ"์ ๋จ์ํ ์ฐ์ฐ์ ์งํฉ๋ณด๋ค ๋ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ์๋ nil๊ณผ์ ๋น๊ต์ ๋๋ค.
var x []int | []string
fmt.Println(x == nil) // Prints true
x = []string(nil)
fmt.Println(x == nil) // Still prints true
๋ ๊ตฌ์ฑ ์์ ์ ํ ๋ชจ๋ ์ต์ํ ํ๋์ ์ ํ์ nil๊ณผ ๋น๊ตํ ์ ์์ผ๋ฏ๋ก ์ ํ ์ ํ ์์ด sum ์ ํ์ nil๊ณผ ๋น๊ตํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ ์ธํฐํ์ด์ค๊ฐ ํ์ฌ ์๋ํ๋ ๋ฐฉ์๊ณผ ๋ค์ ์์ถฉ๋์ง๋ง https://github.com/golang/go/issues/22729์ ๋ฐ๋ผ ๋์์ง ์์ ์ ์์ต๋๋ค.
ํธ์ง: ํ๋ฑ ํ ์คํธ๋ ๋ ๊ด๋ํด์ผ ํ๊ณ ํ๋ ์ด์์ ๊ตฌ์ฑ ์์ ์ ํ์์ ์ ์ฌ์ ์ธ ์ผ์น๋ง ํ์๋ก ํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ๋์ ์์ ๋๋ค. ๊ทธ๋ฐ ์ ์์ ๋ฏธ๋ฌ ํ ๋น.
๋ฌธ์ ๋ ๊ทธ ๊ฒฐ๊ณผ๊ฐ a) ์๋ ๋ณํ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ b) ๋ฒ์๊ฐ ๊ทน๋๋ก (๊ทธ๋ฆฌ๊ณ IMO๋ ํผ๋์ค๋ฝ๊ฒ) ์ ํ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ๋ชจ๋ ์ฐ์ฐ์๋ ๊ธฐ๊ปํด์ผ ํ์ํ๋์ง ์์ ๋ฆฌํฐ๋ด๋ก๋ง ์๋ํฉ๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํ์ฉํ๋ฉด ๊ตฌ์ฑ ์ ํ์ ์งํ์ ๋ํ ๊ฒฌ๊ณ ์ฑ์ด ๋์ฑ ์ ํ๋ฉ๋๋ค. ์ด์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ ์ถ๊ฐํ ์ ์๋ ์ ํ์ ๊ตฌ์ฑ ์ ํ์ ๋ชจ๋ ์์ ์ ํ์ฉํ๋ ์ ํ๋ฟ์ ๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ด ์์ฃผ ์์(์๋ ๊ฒฝ์ฐ) ์ ํ์ ์ด์ต์ ์ํด ์ ๋ง ์ง์ ๋ถํด ๋ณด์ ๋๋ค.
์ด์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ ์ถ๊ฐํ ์ ์๋ ์ ์ผํ ์ ํ์ ๊ตฌ์ฑ ์ ํ์ ๋ชจ๋ ์์ ์ ํ์ฉํ๋ ์ ํ์ ๋๋ค.
์, ๊ทธ๋ฆฌ๊ณ ๋๋ฌด ์ด๊ฒ์ ๋ํ ๋ช ์ํฉ๋๋ค : ๊ทธ๊ฒ์ ๋น์ ์ด ํฉ์ ์ฑ๊ธ ํ์์ ๋งค๊ฐ ๋ณ์ ๋๋ ๋ฐํ ํ์์ด๋ ๋ณ์ ๋๋๋ฅผ ... ํ์ฅํ๊ณ ์ถ์ต๋๋ค ๊ฒฐ์ ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ์๋ก์ด ์ ํ์ ์ถ๊ฐํ๋ฉด ์ผ๋ถ ์์ (์: ํ ๋น)์ด ์ปดํ์ผ์ ์คํจํ๊ธฐ ๋๋ฌธ์ ๋๋ค.l
@Merovius๋ "ํฉ๊ณ ์ ํ์ ๋ฉ์๋ ์ธํธ๊ฐ ๋ฉ์๋ ์ธํธ์ ๊ต์งํฉ์ ๋ณด์ ํ๊ธฐ ๋๋ฌธ์ ์๋ ์ ์์ ํธํ์ฑ ๋ฌธ์ ์ ๋ณํ์ด ์ด๋ฏธ ์กด์ฌํฉ๋๋ค.
๋ชจ๋ ๊ตฌ์ฑ ์์ ์ ํ ์ค"์
๋๋ค. ๋ฐ๋ผ์ ํด๋น ๋ฉ์๋ ์งํฉ์ ๊ตฌํํ์ง ์๋ ์ ๊ตฌ์ฑ ์์ ์ ํ์ ์ถ๊ฐํ๋ฉด ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฉ๋๋ค.
์, ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋ํด์๋ ๋ช ์์ ์ผ๋ก ๋งํด์ผ ํฉ๋๋ค. ๋งค๊ฐ๋ณ์๋ ๋ฐํ ์ ํ ๋๋ ๋ณ์๋ฅผ ํ์ฅํ๊ฑฐ๋โฆ ์๋ก์ด ์ ํ์ ์ถ๊ฐํ๋ฉด ์ผ๋ถ ์์ (์: ํ ๋น)์ด ์ปดํ์ผ์ ์คํจํ๊ธฐ ๋๋ฌธ์ ๋๋ค.l
ํ ๋น ๋์์ @rogpeppe ์์ ์ค๋ช ํ ๋๋ก ์ ์ง๋์ง๋ง ์ ๋ฐ์ ์ผ๋ก ์ด ์ ์ ์ดํดํ๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ค๋ฅธ ๊ฒ์ด ์๋๋ผ๋ฉด ์ ํ ์ค์์น ์ธ๋ถ์ ํฉ๊ณ ์ ํ ๋์์ ๋ํด ์๋ rogpeppe ์ ์์ ๋ช ํํ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ ๋น ๋ฐ ๋ฉ์๋ ์งํฉ์ด ํฌํจ๋์ง๋ง ๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค. ํ๋ฑ์ ์ด๋ป์ต๋๊น? ์ธํฐํ์ด์ค๊ฐ ํ๋ ๊ฒ๋ณด๋ค{} ๋ ์ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
var x int | float64
fmt.Println(x == "hello") // compilation error?
x = 0.0
fmt.Println(x == 0) // true or false? I vote true :-)
๋ฐ๋ผ์ ํด๋น ๋ฉ์๋ ์งํฉ์ ๊ตฌํํ์ง ์๋ ์ ๊ตฌ์ฑ ์์ ์ ํ์ ์ถ๊ฐํ๋ฉด ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฉ๋๋ค.
ํญ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง ์ ํ์์์ ์๋ํ๋๋ก ์ฐ์ฐ์๋ฅผ ์ค๋ฒ๋ก๋ํ ์๋ ์์ต๋๋ค. ์ด๊ฒ์ด ์ ํํ ์ฐจ์ด์ ์ ๋๋ค. ๊ทธ๋ค์ ์ ์์์ type-assertion/-switch๋ก ๋ํ์ ํด์ ํ์ง ์๋ ํ ํฉ๊ณ ๊ฐ์ ๋ํด์๋ง ๊ณตํต ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋ ํ ๋นํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ถ๊ฐํ๋ ์ ํ์ ํ์ํ ๋ฉ์๋๊ฐ ์๋ ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์๋๋๋ค. ์ฌ์ฉ์๊ฐ ์ค๋ฒ๋ก๋ํ ์ ์๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์์์์๋ ์ฌ์ ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ ๊ฒ์ ๋๋ค.
(์ ํ ์ค์์น์๋ ์๋ก์ด ์ ํ์ด ํฌํจ๋์ง ์๊ธฐ ๋๋ฌธ์ ํฉ๊ณ์ ์ ํ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ฌ์ ํ โโ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ์ด๋ผ๋ ์ ์ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์ ๊ฐ ์๋ ์ ์์ ์ฐฌ์ฑํ์ง ์๋ ์ด์ ์ ๋๋ค. ๋ฐ๋ก ๊ทธ ์ด์ ๋ก ํ์ ์ด์ก์ ์ํ์ง ์์ต๋๋ค)
ํ ๋น ๋์์ @rogpeppe์์ ์ค๋ช ํ ๋๋ก ์ ์ง๋ฉ๋๋ค.
์ด๋ค์ ์ ์์ ํฉ๊ณ ๊ฐ์ ํ ๋น์ ๋ํด ์ด์ผ๊ธฐ, ๋๋ (๊ทธ ๊ตฌ์ฑ ๋ถํ ์ค ํ๋์) ํฉ ๊ฐ์์ ํ ๋น์ ๋ํด ์ด์ผ๊ธฐ. ๋๋ ๊ทธ๋ค์ ์ ์์ด ์ด๊ฒ์ ํ์ฉํ์ง ์๋๋ค๋ ๋ฐ ๋์ํ์ง๋ง ์ฐจ์ด์ ์ ๊ทธ๋ค์ ์ ์์ด ์ด๋ฌํ ๊ฐ๋ฅ์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ดํ ๊ฒ์ด ์๋๋ผ๋ ๊ฒ์ ๋๋ค. ์ฆ, ๋ด ์ฃผ์ฅ์ ์ ํํ ๋น์ ์ด ์ ์ํ ์๋ฏธ๋ก ์ด ํนํ ์ ์ตํ์ง ์๋ค๋ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ์ค์ ๋ก ๊ทธ๋ค์ด ์ป๋ ์ฌ์ฉ๋ฒ์ ์ฌ๊ฐํ๊ฒ ์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
fmt.Println(x == "hello") // compilation error?
์ด๊ฒ์ ์๋ง๋ ๊ทธ๋ค์ ์ ์์๋ ์ถ๊ฐ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ธํฐํ์ด์ค ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค . ์ฆ,
๋น์ธํฐํ์ด์ค ์ ํ X์ ๊ฐ x์ ์ธํฐํ์ด์ค ์ ํ T์ ๊ฐ t๋ ์ ํ X์ ๊ฐ์ด ๋น๊ต ๊ฐ๋ฅํ๊ณ X๊ฐ T๋ฅผ ๊ตฌํํ๋ ๊ฒฝ์ฐ ๋น๊ต ๊ฐ๋ฅํฉ๋๋ค. t์ ๋์ ์ ํ์ด X์ ๋์ผํ๊ณ t์ ๋์ ๊ฐ์ด x์ ๋์ผํ ๊ฒฝ์ฐ ๋์ผํฉ๋๋ค. .
fmt.Println(x == 0) // true or false? I vote true :-)
์๋ง๋ ๊ฑฐ์ง. ์ ์ฌํ๋ค๋ ์ ์ ๊ฐ์ํ๋ฉด
var x int|float64 = 0.0
y := 0
fmt.Println(x == y)
์ปดํ์ผ ์ค๋ฅ์ฌ์ผ ํฉ๋๋ค(์์์ ๊ฒฐ๋ก ์ ๋ด๋ ธ๋ฏ์ด). ์ด ์ง๋ฌธ์ ํ์ํ๋์ง ์์ ์ซ์ ์์์ ๋น๊ตํ ๋๋ง ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ทธ ์์ ์์ ์ด๊ฒ์ด ์ฌ์์ ์ถ๊ฐ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์ด๊ฒ์ ์ธํฐํ์ด์ค ์ ํ์ ์์๋ฅผ ํ ๋นํ๋ ๊ฒ๊ณผ ์ ์ฌํ๋ฏ๋ก ๊ธฐ๋ณธ ์ ํ์ ๊ฐ์ ธ์ผ ํ๋ค๊ณ ์ฃผ์ฅํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋น๊ต๋ ๊ฑฐ์ง์ด ๋ฉ๋๋ค. ์ด๋ค IMO๊ฐ ๊ด์ฐฎ์ ๊ฒ ์ด์์ธ์ง, ์ฐ๋ฆฌ๋ ์ค๋๋ ๋ง์ ํผ๋ ์์ด ๋ฐ์๋ค์ ๋๋ค . ๊ทธ๋ฌ๋ ํฉ๊ณ์ ํ ๋น/๋น๊ตํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃจ๋ ํ์ํ๋์ง ์์ ์์์ ์ฌ์์ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ๊ณ ๊ทธ๋ฐ ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์๋ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ ์ชฝ์ด๋ ์ด ์ง๋ฌธ์ ๋ตํ๋ค๊ณ ํด์ ๊ตฌ์ฑ ๋ถ๋ถ์ ์๋ฏธ๊ฐ ์์ ์ ์๋ ํฉ๊ณ ์ ํ์ ์ฌ์ฉํ๋ ๋ชจ๋ ํํ์์ ํ์ฉํ ํ์๋ ์์ต๋๋ค.
ํ์ง๋ง ๋ฐ๋ณตํด์ ๋ง์๋๋ฆฌ์๋ฉด, ์ ๋ ์ก์์ ๋ํด ๋ค๋ฅธ ์ ์์ ์ฐฌ์ฑํ๋ ๊ฒ์ด ์๋๋๋ค. ๋๋ ์ด๊ฒ์ ๋ํด ๋ ผ์ํ๊ณ ์์ต๋๋ค.
fmt.Println(x == "hello") // compilation error?
์ด๊ฒ์ ์๋ง๋ ๊ทธ๋ค์ ์ ์์๋ ์ถ๊ฐ๋ ๊ฒ์ ๋๋ค.
์์ : ์ฌ์์ ๋ช ๋ น๋ฌธ์ด ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ ์ด ์ปดํ์ผ ์ค๋ฅ๊ฐ ์ด๋ฏธ ํฌํจ๋์ด ์์ต๋๋ค.
๋ชจ๋ ๋น๊ต์์ ์ฒซ ๋ฒ์งธ ํผ์ฐ์ฐ์๋ ๋ ๋ฒ์งธ ํผ์ฐ์ฐ์์ ์ ํ์ ํ ๋นํ ์ ์์ด์ผ ํ๋ฉฐ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
@Merovius ๋น์ ์ ์ ์์ ๋ณํ์ ๋ํด ๋ช ๊ฐ์ง ์ข์ ์ ์ ์ง์ ํฉ๋๋ค. ๋ ์ด์์ ๋ ผ์์ ์ผ๊ฐ๊ฒ ์ง๋ง, 0๋ฒ ์ง๋ฌธ์ ๋ํ ๋น๊ต๋ ์๋ ์ ์์๋ ๋์ผํ๊ฒ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ ๋ ํ๊ณ ๋ค๊ณ ์ถ์ต๋๋ค.
fmt.Println(x == 0) // true or false? I vote true :-)
์๋ง๋ ๊ฑฐ์ง. ์ ์ฌํ๋ค๋ ์ ์ ๊ฐ์ํ๋ฉด
var x int|float64 = 0.0
y := 0
fmt.Println(x == y)
์ปดํ์ผ ์ค๋ฅ์ฌ์ผ ํฉ๋๋ค(์์์ ๊ฒฐ๋ก ).
์ฒซ ๋ฒ์งธ ์ค์ var x float64 = 0.0
๋ก ๋ณ๊ฒฝํ๋ฉด ๋์ผํ ์ถ๋ก ์ ์ฌ์ฉํ์ฌ float64๋ฅผ 0๊ณผ ๋น๊ตํ๋ ๊ฒ์ด ๊ฑฐ์ง์ด์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ์์ ๊ฐ ๊ทธ๋ค์ง ๋งค๋ ฅ์ ์ด์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. (์ฌ์ํ ์ : (a) 0.0์ด int์ ํ ๋น ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ฒซ ๋ฒ์งธ ์ค์์ float64(0)์ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. (b) x==y๋ ์์ ์์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ์๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋๋ false๋ก ์ธ์๋์ด์ผ ํฉ๋๋ค.)
"์ด๊ฒ์ ์ธํฐํ์ด์ค ์ ํ์ ์์๋ฅผ ํ ๋นํ๋ ๊ฒ๊ณผ ์ ์ฌํ๋ฏ๋ก ๊ธฐ๋ณธ ์ ํ์ ๊ฐ์ ธ์ผ ํ๋ค"๋ ๊ทํ์ ์๊ฐ์ด ๋ ์ค๋๋ ฅ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค(ํฉ๊ณ ์ ํ์ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ). ๋ฐ๋ผ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
var x,y int|float64 = float64(0), 0
fmt.Println(x == y)
// ๊ฑฐ์ง
๋๋ ์ฌ์ ํ x == 0
๊ฐ ์ฌ์ค์ด์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ๋ด ์ ์ ๋ชจ๋ธ์ ๊ฐ๋ฅํ ํ ๋ฆ๊ฒ ์ ํ์ด 0์ผ๋ก ์ง์ ๋๋ค๋ ๊ฒ์
๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ฐ๋ก ๋ด๊ฐ ๊ทธ๊ฒ์ ๊ฐ์ ธ์จ ์ด์ ์ธ ์ธํฐํ์ด์ค์ ํ์ฌ ๋์์ ๋ฐ๋๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด "๋ง์ ํผ์ง"๋ก ์ด์ด์ง์ง ์๋๋ค๋ ๋ฐ ๋์ํ์ง๋ง ์ธํฐํ์ด์ค๋ฅผ nil๊ณผ ๋น๊ตํ๋ ์ ์ฌํ ๋ฌธ์ ๋ก ์ธํด ๋ง์ ํผ๋์ด ๋ฐ์ํ์ต๋๋ค. ํฉ๊ณ ์ ํ์ด ์กด์ฌํ๊ณ ์ด์ ํ๋ฑ ์๋ฏธ ์ฒด๊ณ๊ฐ ์ ์ง๋๋ค๋ฉด 0๊ณผ ๋น๊ตํ๊ธฐ ์ํด ๋น์ทํ ์ ๋์ ํผ๋์ ๊ฒช์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ์ค์ var x float64 = 0.0์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ๋์ผํ ์ถ๋ก ์ ์ฌ์ฉํ์ฌ float64๋ฅผ 0๊ณผ ๋น๊ตํ๋ ๊ฒ์ด ๊ฑฐ์ง์ด์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ์์ ๊ฐ ๊ทธ๋ค์ง ๋งค๋ ฅ์ ์ด์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋์ด์ผ ํ๋ค๊ณ ๋งํ์ง ์์๊ณ , ์๋ง๋ ๊ทธ๊ฒ์ด ๋ด๊ฐ ๊ทธ๋ค์ ์ ์์ด ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋จ์์ฑ/์ ์ฉ์ฑ ์ฌ์ด์ ๊ฐ์ฅ ๊ฐ๋ฅ์ฑ ์๋ ์ ์ถฉ์์ผ๋ก ์ธ์๋๋ ๊ฒ์ ๊ฐ์ํ ๋ ๊ทธ๋ ๊ฒ ๋ ๊ฒ์ด๋ผ๊ณ ๋งํ์ต๋๋ค. ๋๋ ๊ฐ์น ํ๋จ์ ํ๋ ค๊ณ ํ์ง ์์๋ค. ์ฌ์ค, ๊ฐ๋จํ ๊ท์น์ผ๋ก ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ฌ์ค๋ก ์ธ์ํ ์ ์๋ค๋ฉด ๋๋ ์๋ง๋ ๊ทธ๊ฒ์ ์ ํธํ๋ ๊ฒฝํฅ์ด ์์ ๊ฒ์ ๋๋ค. ์ ๋ ๋๊ด์ ์ด์ง ์์ต๋๋ค.
float64(0)
๋ฅผ int(0)
์ ๋น๊ตํ๋ ๊ฒ(์ฆ, ํฉ๊ณ๊ฐ var x float64 = 0.0
๋ก ๋์ฒด๋ ์)์ false
๊ฐ ์๋์ง๋ง ์ปดํ์ผ ์๊ฐ์
๋๋ค. ์ค๋ฅ (๋น์ฐํ). ์ด๊ฒ์ด ๋ฐ๋ก ์ ์์ ์
๋๋ค . ๋น์ ์ ์ ์์ ํ์์ด ์ง์ ๋์ง ์์ ์์์ ๊ฒฐํฉ๋ ๋๋ง ์ ๋ง ์ ์ฉํฉ๋๋ค. ๋ค๋ฅธ ๊ฒ์ ์ปดํ์ผ๋์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
(a) 0.0์ int์ ํ ๋นํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฒซ ๋ฒ์งธ ์ค์์ float64(0)์ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ฌผ๋ก ์ ๋๋ค(๋๋ ์์ ํํ์์ ๋ํ ํ์ฌ "๊ธฐ๋ณธ ์ ํ"์ ๋ ๊ฐ๊น์ด ์๋ฏธ๋ก ์ ๊ฐ์ ํ์ง๋ง ํ์ฌ ๋ฌธ๊ตฌ๊ฐ ๊ทธ๊ฒ์ ์๋ฏธํ์ง ์๋๋ค๋ ๋ฐ ๋์ํฉ๋๋ค).
(b) x==y๋ ์์ ์์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋์ด์๋ ์ ๋ฉ๋๋ค. ๊ทธ๋๋ false๋ก ์ธ์๋์ด์ผ ํฉ๋๋ค.)
์๋์, ์ปดํ์ผ ์๊ฐ ์ค๋ฅ์ฌ์ผ ํฉ๋๋ค. e1
๊ฐ ํฉ๊ณ ์ ํ ํํ์์ธ e1 == y
์์
์ ํํ์์ด ๊ตฌ์ฑ ์ ํ์ ์ ํํ์ฌ ์ปดํ์ผ๋๋ ๊ฒฝ์ฐ์๋ง ํ์ฉ๋์ด์ผ ํ๋ค๊ณ ๋งํ์ต๋๋ค. ๋ด ์์์ x
์๋ int|float64
์ ํ์ด ์๊ณ y
์๋ int
์ ํ์ด ์๊ณ float64
๋ฐ int
์๋ค๊ณ ๊ฐ์ ํ๋ฉด
์ด ์ปดํ์ผ์ ํ๋ ค๋ฉด ๋์ฒดํ๋ ๋ชจ๋ ๊ตฌ์ฑ ์ ํ ํํ์๋ ์ปดํ์ผํด์ผ ํ๋ ์กฐ๊ฑด์ ์ญ์ ํด์ผ ํฉ๋๋ค. ์ด ์์ ์์ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ํํ์("C ์๋ง"์ด๋ผ๊ณ ๋ ํจ)์์ ์ฌ์ฉ๋ ๋ ์ ํ์ด ์น๊ฒฉ๋๊ฑฐ๋ ๋ณํ๋๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ท์น์ ์ค์ ํด์ผ ํ๋ ์ํฉ์ ์์ต๋๋ค.
๊ณผ๊ฑฐ์ ํฉ์๋ sum ์ ํ์ด ์ธํฐํ์ด์ค ์ ํ์ ๋ณ๋ก ์ถ๊ฐ๋์ง ์๋๋ค๋ ๊ฒ์ด์์ต๋๋ค.
Go์ ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์๋ ์ค์ ๋ก ์ ์ฉ๋์ง ์์ต๋๋ค: ์ฌ์ํ ๋คํธ์ํฌ ์๋น์ค ๋ฐ ์ ํธ๋ฆฌํฐ. ๊ทธ๋ฌ๋ ์์คํ
์ด ์ปค์ง๋ฉด ์ ์ฉํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ ๋ ํ์ฌ ๋ง์ ๋ก์ง์ ํตํด ๊ตฌํ๋ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ณด์ฅ๊ณผ ํจ๊ป ์ฌํ๊ฒ ๋ถ์ฐ๋ ์๋น์ค๋ฅผ ์์ฑํ๊ณ ์์ผ๋ฉฐ ํธ๋ฆฌํ ์ํฉ์ ๋ชฐ๋ ธ์ต๋๋ค. ์ด๋ฌํ NPD๋ ์๋น์ค๊ฐ ์ปค์ง์ ๋ฐ๋ผ ๋๋ฌด ์ง์ฆ์ด ๋ฌ๊ณ ์ด๋ฅผ ๋ถํ ํ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด ๋ณด์ด์ง ์์ต๋๋ค.
Go์ ์ ํ ์์คํ
๋ณด์ฆ์ ์ผ๋ฐ์ ์ธ ๊ธฐ๋ณธ ๋คํธ์ํฌ ์๋น์ค๋ณด๋ค ๋ ๋ณต์กํ ๊ฒ์ ๋ํด ๋๋ฌด ์ฝํฉ๋๋ค.
๊ทธ๋ฌ๋ Rust์ ๋ํ ์ด์ผ๊ธฐ๋ Haskell์์ ํ๋ ๊ฒ์ฒ๋ผ NPD ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ์ ํฉ๊ณ ์ ํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ง ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ผ๋ฐ์ ์ธ ์์ฐ ๋ช ๋ นํ ์ํฌํ๋ก๊ฐ ์๊ณ Haskellish ์ ๊ทผ ๋ฐฉ์์ ์ด์ ์ ๋ง์ง ์์ต๋๋ค.
์์ฌ ์ฝ๋์์ iotuils.WriteFile
๊ฐ์ ๊ธฐ๋ฅ์ ๊ณ ๋ คํ์ญ์์ค. ๋ช
๋ น ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
file = open(name, os.write)
if file is error
return error("cannot open " + name + " writing: " + file.error)
if file.write(data) is error:
return error("cannot write into " + name + " : " + file.error)
return ok
Rust์์ ์ด๋ป๊ฒ ๋ณด์ด๋์ง
match open(name, os.write)
file
match file.write(data, os.write)
err
return error("cannot open " + name + " writing: " + err)
ok
return ok
err
return error("cannot write into " + name + " : " + err)
์์ ํ์ง๋ง ์ถํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ด ์ ์:
type result[T, Err] oneof {
default T
Error Err
}
ํ๋ก๊ทธ๋จ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ( result[void, string]
= !void
)
file := os.Open(name, ...)
if !file {
return result.Error("cannot open " + name + " writing: " + file.Error)
}
if res := file.Write(data); !res {
return result.Error("cannot write into " + name + " : " + res.Error)
}
return ok
์ฌ๊ธฐ์ ๊ธฐ๋ณธ ๋ถ๊ธฐ๋ ์ต๋ช
์ด๊ณ ์ค๋ฅ ๋ถ๊ธฐ๋ .Error
๋ก ์ก์ธ์คํ ์ ์์ต๋๋ค(์๋ ค์ง๋ฉด ๊ฒฐ๊ณผ๋ ์ค๋ฅ์). ํ์ผ์ด ์ฑ๊ณต์ ์ผ๋ก ์ด๋ฆฌ๋ฉด ์ฌ์ฉ์๋ ๋ณ์ ์์ฒด๋ฅผ ํตํด ํ์ผ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๋จผ์ file
๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ด๋ ธ๋์ง ํ์ธํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์ข
๋ฃํฉ๋๋ค(๋ฐ๋ผ์ ์ถ๊ฐ ๋ช
๋ น๋ฌธ์ ํ์ผ์ด ์ค๋ฅ๊ฐ ์๋์ ์๊ณ ์์ต๋๋ค).
๋ณด์๋ค์ํผ ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ช ๋ น์ ํ๋ฆ์ ์ ์งํ๊ณ ํ์ ์์ ์ฑ์ ์ ๊ณตํฉ๋๋ค. NPD ์ฒ๋ฆฌ๋ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
type Reference[T] oneof {
default T
nil
}
// Reference[T] = *T
์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ์ ์ ์ฌํฉ๋๋ค.
@sirkon , ๊ทํ์ Rust ์์ ๋ Rust์์์ ๊ฐ์ด ๊ฐ๋จํ ํฉ๊ณ ์ ํ์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ํ์ ํ์ง ๋ชปํฉ๋๋ค. ์คํ๋ ค, ํฉ๊ณ ์ ํ์ ๋ํ ํจํด ์ผ์น๊ฐ if
๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ Go-like๊ฐ ๋ ์ ์์์ ์์ฌํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒ:
ferr := os.Open(name, ...)
if err(e) := ferr { // conditional match and unpack, initializing e
return fmt.Errorf("cannot open %v: %v", name, e)
}
ok(f) := ferr // unconditional match and unpack, initializing f
werr := f.Write(data)
...
(Sum ์ ํ์ ์ ์ ์์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฌด์กฐ๊ฑด ์ผ์นํ๋ ๊ฒฝ์ฐ๊ฐ ์ ํํ ํ๋๋ง ๋จ์ ์๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด ์ผ์น๊ฐ ํญ์ ์ฑ๊ณตํ๋ค๋ ๊ฒ์ ์ฆ๋ช ํ ์ ์์ผ๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฉ๋๋ค.)
๊ธฐ๋ณธ ์ค๋ฅ ๊ฒ์ฌ์ ๊ฒฝ์ฐ ํ ์ค ๋ ๊ธธ๊ณ ์ง์ญ ๋ณ์๋ฅผ ํ๋ ๋ ์ ์ธํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋ฐํ ๊ฐ์ ๋นํด ๊ฐ์ ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ (if ๋ฌธ์ ๋ ์ถ๊ฐํ์ฌ) ์ฌ๋ฌ ์ฌ๋ก๋ก ํ์ฅํ ์ ์์ผ๋ฉฐ ์ปดํ์ผ๋ฌ๋ ๋ชจ๋ ์ฌ๋ก๊ฐ ์ฒ๋ฆฌ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค.
@sirkon
Go์ ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์๋ ์ค์ ๋ก ์ ์ฉ๋์ง ์์ต๋๋ค: ์ฌ์ํ ๋คํธ์ํฌ ์๋น์ค ๋ฐ ์ ํธ๋ฆฌํฐ. ๊ทธ๋ฌ๋ ์์คํ ์ด ์ปค์ง๋ฉด ์ ์ฉํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
[โฆ]
Go์ ์ ํ ์์คํ ๋ณด์ฆ์ ์ผ๋ฐ์ ์ธ ๊ธฐ๋ณธ ๋คํธ์ํฌ ์๋น์ค๋ณด๋ค ๋ ๋ณต์กํ ๊ฒ์ ๋ํด ๋๋ฌด ์ฝํฉ๋๋ค.
์ด๋ฌํ ๋ฐ์ธ์ ๋ถํ์ํ๊ฒ ๋๋ฆฝ์ ์ด๊ณ ๊ฒฝ๋ฉธ์ ์ ๋๋ค. ๊ทธ๋ค์ ๋ํ ์ผ์ข ์ ๋นํน์ค๋ฌ์ด TBH์ ๋๋ค. Go๋ก ์์ฑ๋ ๋งค์ฐ ํฌ๊ณ ์ฌ์ํ ์๋น์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋น ๋ถ๋ถ์ ๊ฐ๋ฐ์๊ฐ Google์์ ์ผํ๊ณ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ํฌ๊ณ ์ฌ์ํ ์๋น์ค๋ฅผ ์์ฑํ๋ ๋ฐ ์ ํฉํ๋ค๋ฉด ๊ทธ๋ค์ด ๋น์ ๋ณด๋ค ๋ ์ ์๊ณ ์๋ค๊ณ ๊ฐ์ ํด์ผ ํฉ๋๋ค. Go๋ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ์ง ์์ ์๋ ์์ง๋ง(IMO๋ ๋ง์ฐฌ๊ฐ์ง์) ๊ฒฝํ์ ์ผ๋ก "๊ธฐ๋ณธ ๋คํธ์ํฌ ์๋น์ค"์์๋ง ์๋ํ๋ ๊ฒ์ ์๋๋๋ค.
NPD ์ฒ๋ฆฌ๋ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๊ทํ์ ์ ๊ทผ ๋ฐฉ์์ด ์ค์ ๋ก ์ค์ํ ๊ฐ์น๋ฅผ ์ถ๊ฐํ์ง ์๋๋ค๋ ๊ฒ์ ์ค์ ๋ก ๋ณด์ฌ์ค๋๋ค. ์ง์ ํ๋ฏ์ด ์ญ์ฐธ์กฐ๋ฅผ ์ํด ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ AFAICT๋ ํ๋ก๊ทธ๋๋จธ๊ฐ nil-value(์๋ง๋ ์ฌ์ ํ ํจ๋ ์ํ์ผ ๊ฒ์
๋๋ค)์์ ํด๋น ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐฉํดํ์ง ์์ต๋๋ค. ์ฆ, *p
์ฌ์ฉํ์ฌ ์ ํจํ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ p.T
์ฌ์ฉํ์ฌ๋ ์ ํจํฉ๋๋ค(๋๋ p.default
์
๋๊น? ๊ทํ์ ์์ด๋์ด ๊ฐ ๊ตฌ์ฒด์ ์ผ๋ก ๋ฌด์์ธ์ง ๋งํ๊ธฐ ์ด๋ ต์ต๋๋ค).
ํฉ๊ณ ์ ํ์ด ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ nil-dereferences์ ์ถ๊ฐํ ์ ์๋ ํ ๊ฐ์ง ์ด์ ์ ์ปดํ์ผ๋ฌ์์ ํจํด ์ผ์น๋ฅผ ํตํด ์์ ์ด ์์ ํ๋ค๋ ๊ฒ์ ์ฆ๋ช ํด์ผ ํ๋ค๊ณ ๊ฐ์ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ฅผ ์๋ต๋ ์งํ ํ ์ด๋ธ์ ์ค์ํ ์๋ก์ด ์ผ์ ๊ฐ์ง๊ณ ๋ณด์ด์ง ์๋ ๊ฒ์ํ๋ ์ ์์ ํฌํจ ์๋ ์ ์์ ๋น์ ์ด "๋ชป์๊ธด"๋ก ์ค๋ช ์ ํํ ๋ฌด์์ํ๋ ๋์, (ํ๋ฆผ์์ด,์ด ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ณต๊ฐ ๊ธ์ก์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๋์๋ค).
@๋ฉ๋ก๋น์ฐ์ค
๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์์ ์๋น ๋ถ๋ถ์ด Google์์ ๊ทผ๋ฌดํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๊ทธ๋ค์ด ๋น์ ๋ณด๋ค ๋ ์ ์๊ณ ์๋ค๊ณ ๊ฐ์ ํด์ผ ํฉ๋๋ค.
๋ฏฟ๋ ์๋ ๋ณต์ด ์์ต๋๋ค.
์ง์ ํ๋ฏ์ด ์ญ์ฐธ์กฐ๋ฅผ ์ํด ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๋ค์
var written int64
...
res := os.Stdout.Write(data) // Write([]byte) -> Result[int64, string] โ !int64
written += res // Will not compile as res is a packed result type
if !res {
// we are living on non-default res branch thus the only choice left is the default
return Result.Error(...)
}
written += res // is OK
@skybrian
ferr := os.Open(...)
์ด ์ค๊ฐ ๋ณ์๊ฐ ๋ด๊ฐ ์ด ์๊ฐ์ ๋ ๋๊ฒ ๋ง๋๋ ์์ธ์ ๋๋ค. ๋ณด์๋ค์ํผ, ์ ์ ๊ทผ ๋ฐฉ์์ ํนํ ์ค๋ฅ ๋ฐ nil ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์์ ์์ ์ ๋๋ฌด ์ค์ํ๋ฉฐ IMO์ ํน๋ณํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
@sirkon ๋น์ ์ ์ฌ๋๋ค๊ณผ ๋์
๋ํ๋ฅผ ์ ์คํ๊ฒ ์ ์งํ๊ณ ๊ฑด์ค์ ์ด์ง ์์ ๋ง์ ํผํ์ญ์์ค. ์ฐ๋ฆฌ๋ ์ผ์ ๋ํด ์๊ฒฌ์ด ๋ค๋ฅผ ์ ์์ง๋ง ์ฌ์ ํ ์กด๊ฒฝํ ๋งํ ๋ด๋ก ์ ์ ์งํฉ๋๋ค. https://golang.org/conduct.
๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์์ ์๋น ๋ถ๋ถ์ด Google์์ ์ผํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๊ทธ๋ค์ด ๋น์ ๋ณด๋ค ๋ ์ ์๊ณ ์๋ค๊ณ ๊ฐ์ ํด์ผ ํฉ๋๋ค.
๋๋ ๋น์ ์ด ๊ตฌ๊ธ์์ ๊ทธ๋ฐ ์ข ๋ฅ์ ๋ ผ์์ ํ ์ ์์์ง ์์ฌ์ค๋ฝ๋ค.
@hasufell ๊ทธ ์ฌ๋์ ๋ ์ผ์์ ์์ผ๋ฉฐ ๋ฉด์ ๊ด์ ์์กด์ฌ๊ณผ ๊ฑฐ๋ฌผ ๊ฒฝ์์ ํํํ๊ธฐ ์ํด ์ฐ๋ ๊ธฐ ์ธํฐ๋ทฐ๋ฅผํ๋ ๋๊ท๋ชจ IT ํ์ฌ๊ฐ ์์ต๋๋ค. ๋์ต๋๋ค .
@sirkon๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. Ad-hominem ๋ฐ ์ฌํ์ ๋ ผ์์ ์ ์ฉํ์ง ์์ต๋๋ค. ์ด๊ฒ์ CoC ๋ฌธ์ ์ด์์ ๋๋ค. ์ ๋ ํต์ฌ ์ธ์ด์ ๋ํด ์ด๋ฐ ์ข ๋ฅ์ "์ฌํ์ ๋ ผ์"์ด ๋ค์ ์์ฃผ ๋ํ๋๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ์ปดํ์ผ๋ฌ ๊ฐ๋ฐ์๊ฐ ๋ ์ ์๊ณ , ์ธ์ด ๋์์ด๋๊ฐ ๋ ์ ์๊ณ , Google ์ฌ๋๋ค์ด ๋ ์ ์๋๋ค.
์๋, ๊ทธ๋ค์ํ์ง ์์ต๋๋ค. ์ง์ ๊ถ์๊ฐ ์์ต๋๋ค. ๋ค๋ง ๊ฒฐ์ ๊ถ์ด ์์ ๋ฟ์ด๋ค. ๊ทน๋ณตํด.
๋ํ๋ฅผ ์ฌ์ค์ ํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์๊ฒฌ์ ์จ๊ฒผ ์ต๋๋ค. (๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ ธ๋ ฅํ @agnivade ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค).
์ฌ๋ฌ๋ถ, ์ฐ๋ฆฌ์ Gopher ๊ฐ์น ์ ๋น์ถ์ด ์ด๋ฌํ ํ ๋ก ์์ ๊ทํ์ ์ญํ ์ ๊ณ ๋ คํ์ญ์์ค. ์ปค๋ฎค๋ํฐ์ ๋ชจ๋ ์ฌ๋์ ๊ด์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ฐ๋ฆฌ๋ ์๋ก๋ฅผ ํด์ํ๊ณ ๋์ํ๋ ๋ฐฉ์์์ ์กด์คํ๊ณ ์์ ํ๊ธฐ ์ํด ๋ ธ๋ ฅํด์ผ ํฉ๋๋ค.
์ด ํ ๋ก ์ ๋ด 2์ผํธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
(์ธํฐํ์ด์ค์ ๊ฐ์ด) ๋ฉ์๋ ์ธํธ ์ด์ธ์ ๊ธฐ๋ฅ์ผ๋ก ์๋ก ๋ค๋ฅธ ์ ํ์ ํจ๊ป ๊ทธ๋ฃนํํ๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ์๋ก์ด ๊ทธ๋ฃนํ ๊ธฐ๋ฅ์ ๋ฉ์๋๊ฐ ์๋ ๊ธฐ๋ณธ(๋๋ ๊ธฐ๋ณธ) ์ ํ์ ํฌํจํ๊ณ ์ธํฐํ์ด์ค ์ ํ์ด ๊ด๋ จ ์ ์ฌํ๊ฒ ๋ถ๋ฅ๋๋๋ก ํ์ฉํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ธฐ๋ณธ ์ ํ(boolean, numeric, string, ์ฌ์ง์ด []byte, []int ๋ฑ)์ ์๋ ๊ทธ๋๋ก ์ ์งํ ์ ์์ง๋ง ์ ํ ์ ์๊ฐ ํจ๋ฐ๋ฆฌ๋ก ๊ทธ๋ฃนํํ๋ ์ ํ ๊ฐ์ ์ฐจ์ด์ ์ ์ถ์ํํ ์ ์์ต๋๋ค.
์ธ์ด์ type _family_ ๊ตฌ์กฐ์ ๊ฐ์ ๊ฒ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ตฌ๋ฌธ
์ ํ ํจ๋ฐ๋ฆฌ๋ ๋ค๋ฅธ ์ ํ๊ณผ ๋งค์ฐ ์ ์ฌํ๊ฒ ์ ์ํ ์ ์์ต๋๋ค.
type theFamilyName family {
someType
anotherType
}
ํ์ ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
FamilyType = "family" "{" { TypeName ";" } "}" .
์ ํ ํจ๋ฐ๋ฆฌ๋ ํจ์ ์๋ช ๋ด๋ถ์ ์ ์๋ ์ ์์ต๋๋ค.
func Display(s family{string; fmt.Stringer}) { /* function body */ }
์ฆ, ํ ์ค ์ ์์์๋ ์ ํ ์ด๋ฆ ์ฌ์ด์ ์ธ๋ฏธ์ฝ๋ก ์ด ํ์ํฉ๋๋ค.
ํจ๋ฐ๋ฆฌ ์ ํ์ 0 ๊ฐ์ nil ์ธํฐํ์ด์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก nil์ ๋๋ค.
(ํ๋์์ ํจ๋ฐ๋ฆฌ ์ถ์ํ ๋ค์ ์๋ ๊ฐ์ ์ธํฐํ์ด์ค์ ๋งค์ฐ ์ ์ฌํ๊ฒ ๊ตฌํ๋ฉ๋๋ค.)
์ถ๋ก
ํจ์์ ๋ํ ์ธ์ ๋๋ ํจ์์ ๋ฐํ์ผ๋ก ์ ํจํ ์ ํ์ ์ง์ ํ๋ ค๋ ๋น ์ธํฐํ์ด์ค๋ณด๋ค ๋ ์ ํํ ๊ฒ์ด ํ์ํฉ๋๋ค.
์ ์๋ ์๋ฃจ์ ์ ๋ ๋์ ํ์ ์์ ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ๊ณ ์ปดํ์ผ ์๊ฐ์ ์์ ํ ๊ฒ์ฌ๋๋ฉฐ ๋ฐํ์์ ์ถ๊ฐ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค.
์์ ์ _Go ์ฝ๋๊ฐ ๋ ์์ฒด ๋ฌธ์ํ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค_. ํจ์๊ฐ ์ธ์๋ก ์ทจํ ์ ์๋ ๊ฒ์ ์ฝ๋ ์์ฒด์ ๋ด์ฅ๋์ด์ผ ํฉ๋๋ค.
๋๋ฌด ๋ง์ ์ฝ๋๋ "์ธํฐํ์ด์ค{}๊ฐ ์๋ฌด ๊ฒ๋ ๋งํ์ง ์์"์ด๋ผ๋ ์ฌ์ค์ ์๋ชป ์ ์ฉํฉ๋๋ค. Go์์ ๊ทธ๋ ๊ฒ ๋๋ฆฌ ์ฌ์ฉ๋๋(๊ทธ๋ฆฌ๊ณ ๋จ์ฉ๋๋) ๊ตฌ์ฑ์ด ์์ผ๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ง์ ๊ฒ์ ํ ์ ์์ ๊ฒ์ด๋ผ๊ณ _์๋ฌด๊ฒ๋_ ๋งํฉ๋๋ค.
๋ช ๊ฐ์ง ์
sql.Rows.Scan
ํจ์์ ๋ํ ๋ฌธ์์๋ ํจ์์ ์ ๋ฌํ ์ ์๋ ์ ํ์ ์์ธํ ์ค๋ช
ํ๋ ํฐ ๋ธ๋ก์ด ํฌํจ๋์ด ์์ต๋๋ค.
Scan converts columns read from the database into the following common Go types and special types provided by the sql package:
*string
*[]byte
*int, *int8, *int16, *int32, *int64
*uint, *uint8, *uint16, *uint32, *uint64
*bool
*float32, *float64
*interface{}
*RawBytes
any type implementing Scanner (see Scanner docs)
๊ทธ๋ฆฌ๊ณ sql.Row.Scan
ํจ์์ ๊ฒฝ์ฐ ๋ฌธ์์๋ "์์ธํ ๋ด์ฉ์ Rows.Scan ๋ฌธ์ ์ฐธ์กฐ"๋ผ๋ ๋ฌธ์ฅ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ _์ผ๋ถ ๋ค๋ฅธ ๊ธฐ๋ฅ_์ ๋ํ ์ค๋ช
์๋ฅผ ์ฐธ์กฐํ์ธ์. ์ด๊ฒ์ Go-like๊ฐ ์๋๋ฉฐ ์ค์ ๋ก Rows.Scan
๋ *RawBytes
๊ฐ์ ๊ฐ์ง ์ ์์ง๋ง Row.Scan
๋ ๊ทธ๋ ์ง ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ฅ์ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค.
๋ฌธ์ ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ํํ ์ ์๋ ๋ณด์ฆ ๋ฐ ํ๋ ๊ณ์ฝ์ ๋ํ ์ฃผ์์ ์์กดํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๋ ๊ฒ์ ๋๋ค.
ํจ์์ ๋ํ ๋ฌธ์์์ ํจ์๊ฐ ๋ค๋ฅธ ํจ์์ฒ๋ผ ์๋ํ๋ค๊ณ ๋งํ ๋("๊ทธ๋ฌ๋ฏ๋ก ๋ค๋ฅธ ํจ์์ ๋ํ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.") ๋๋๋ก ํด๋น ํจ์๊ฐ ์ค์ฉ๋๋ค๋ ๊ฒ์ ๊ฑฐ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ๋๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์์ ์ฒ๋ผ ๋ง ๋ฐ๊ฒฌํ๋ค๊ณ ์ฅ๋ดํ๋ *RawBytes
์ ์ธ์๋ก ํ์ฉ๋์ง ์์ต๋๋ค Row.Scan
๋จ์ง์์ ์ค๋ฅ๊ฐ ๋ฐ์ ํ Row.Scan
( "sql: RawBytes๋ Row.Scan์์ ํ์ฉ๋์ง ์์ต๋๋ค"). ์ ํ ์์คํ
์ด ๊ทธ๋ฌํ ์ค์๋ฅผ ํ์ฉํ๋ค๋ ๊ฒ์ ์ฌํ ์ผ์
๋๋ค.
๋์ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
type Value family {
*string
*[]byte
*int; *int8; *int16; *int32; *int64
*uint; *uint8; *uint16; *uint32; *uint64
*bool
*float32; *float64
*interface{}
*RawBytes
Scanner
}
์ด๋ฐ ์์ผ๋ก ์ ๋ฌ๋ ๊ฐ์ ์ง์ ๋ ํจ๋ฐ๋ฆฌ์ ์ ํ ์ค ํ๋์ฌ์ผ ํ๋ฉฐ Rows.Scan
ํจ์ ๋ด๋ถ์ ์ ํ ์ ํ์ ์๊ธฐ์น ์์ ๋๋ ๊ธฐ๋ณธ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค. Row.Scan
ํจ์์ ๋ํ ๋ ๋ค๋ฅธ ํจ๋ฐ๋ฆฌ๊ฐ ์์ต๋๋ค.
cloud.google.com/go/datastore.Property
๊ตฌ์กฐ์ฒด์ interface{}
์ ํ์ "๊ฐ" ํ๋๊ฐ ์๊ณ ์ด ๋ชจ๋ ๋ฌธ์๊ฐ ํ์ํ ๋ฐฉ๋ฒ๋ ๊ณ ๋ คํ์ญ์์ค.
// Value is the property value. The valid types are:
// - int64
// - bool
// - string
// - float64
// - *Key
// - time.Time
// - GeoPoint
// - []byte (up to 1 megabyte in length)
// - *Entity (representing a nested struct)
// Value can also be:
// - []interface{} where each element is one of the above types
// This set is smaller than the set of valid struct field types that the
// datastore can load and save. A Value's type must be explicitly on
// the list above; it is not sufficient for the underlying type to be
// on that list. For example, a Value of "type myInt64 int64" is
// invalid. Smaller-width integers and floats are also invalid. Again,
// this is more restrictive than the set of valid struct field types.
//
// A Value will have an opaque type when loading entities from an index,
// such as via a projection query. Load entities into a struct instead
// of a PropertyLoadSaver when using a projection query.
//
// A Value may also be the nil interface value; this is equivalent to
// Python's None but not directly representable by a Go struct. Loading
// a nil-valued property into a struct will set that field to the zero
// value.
์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
type PropertyVal family {
int64
bool
string
float64
*Key
time.Time
GeoPoint
[]byte
*Entity
nil
[]int64; []bool; []string; []float64; []*Key; []time.Time; []GeoPoint; [][]byte; []*Entity
}
(์ด๊ฒ์ด ์ด๋ป๊ฒ ๋ ๊ฐ์กฑ์ผ๋ก ๋ ๊น๋ํ๊ฒ ๋๋ ์ ์๋์ง ์์ํ ์ ์์ต๋๋ค.)
json.Token
์ ํ์ ์์์ ์ธ๊ธํ์ต๋๋ค. ์ ํ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
type Token family {
Delim
bool
float64
Number
string
nil
}
๋ด๊ฐ ์ต๊ทผ์ ์ป์ ๋ ๋ค๋ฅธ ์:
๊ฐ์ ํจ์๋ฅผ ํธ์ถํ๋ฉด sql.DB.Exec
๋๋ sql.DB.Query
๋๋์ ๊ฐ๋ณ์์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ interface{}
๊ฐ ์์๋ ํน์ ์ธํธ์ ํํ๋ฅผ ๊ฐ์ ธ์ผ ์ด๋์ ์์ฒด๊ฐ ๋ _not์ slice_, []interface{}
์์ ์ด๋ฌํ ํจ์๋ก ์ธ์๋ฅผ ์ ๋ฌํ ๋ "ํ์ฐ" ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. DB.Exec("some query with placeholders", emptyInterfaceSlice)
๋ผ๊ณ ๋งํ๋ ๊ฒ์ ์๋ชป๋์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ DB.Exec("the query...", emptyInterfaceSlice...)
emptyInterfaceSlice
์ ํ์ด []interface{}
์
๋๋ค. ์ด๋ฌํ ์ค์๋ฅผ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ์ฐ์ํ ๋ฐฉ๋ฒ์ ์ด ํจ์๊ฐ Value
์ ๊ฐ๋ณ ์ธ์๋ฅผ ์ทจํ๋๋ก ํ๋ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์ Value
๋ ์์์ ์ค๋ช
ํ ๋๋ก ํจ๋ฐ๋ฆฌ๋ก ์ ์๋ฉ๋๋ค.
์ด ์์ ์ ์์ ์ interface{}
์ ๋ถ์ ํ์ฑ ๋๋ฌธ์ _์ค์ ์ค์๊ฐ ๋ฐ์ํ๊ณ ์๋ค๋ ๊ฒ์
๋๋ค.
var x int | float64 | string | rune
z = int(x) + int(y)
z = float64(x) + float64(y)
์ ์ข
๋ฅ ๋๋ฌธ์ ์ด๊ฒ์ ํ์คํ ์ปดํ์ผ๋ฌ ์ค๋ฅํด์ผ x
์ ๋ฌ ๋ ์์๋ ์ ๋ง ํธํ๋์ง ์์ต๋๋ค int()
.
family
๋ผ๋ ์์ด๋์ด๊ฐ ๋ง์์ ๋ญ๋๋ค. ๋ณธ์ง์ ์ผ๋ก ๋์ด๋ ์ ํ์ผ๋ก ์ ํ๋(์ ํ๋?) ์ธํฐํ์ด์ค๊ฐ ๋ ๊ฒ์ด๋ฉฐ ์ปดํ์ผ๋ฌ๋ ํญ์ ์ผ์นํ๋์ง ํ์ธํ๊ณ ํด๋น case
์ ๋ก์ปฌ ์ปจํ
์คํธ ๋ด์์ ๋ณ์ ์ ํ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋ฌธ์ ๋ ์ฐ๋ฆฌ๊ฐ ์ข ์ข ๋ณด์ฆ๊ณผ
์ปดํ์ผ๋ฌ๊ฐ ์ํํ ์ ์๋ ํ๋ ๊ณ์ฝ.
๊ทธ๊ฒ์ด ์ฌ์ค ๋ด๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์ฝ๊ฐ ์ซ์ดํ๊ธฐ ์์ํ ์ด์ ์ ๋๋ค.
func foo() (..., error)
์ด๋ค ์ข ๋ฅ์ ์ค๋ฅ๊ฐ ๋ฐํ๋๋์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ตฌ์ฒด์ ์ธ ์ ํ ๋์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐํํ๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๊ฒ๋ค. ์ผ๋ถ ๊ธฐ๋ฅ
net.Addr
๋ฐํํ๊ณ ์ค์ ๋ก ์ด๋ค ์ข
๋ฅ์ net.Addr
๋ฐํํ๊ณ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋์ง ํ์
ํ๊ธฐ ์ํด ์์ค ์ฝ๋๋ฅผ ํํค์น๋ ๊ฒ์ด ๋๋๋ก ์ฝ๊ฐ ์ด๋ ต์ต๋๋ค. ๊ตฌ์ฒด์ ์ธ ์ ํ์ ๋ฐํํ๋ ๋ฐ ์ค์ ๋ก ํฐ ๋จ์ ์ ์์ต๋๋ค(์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฏ๋ก ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ).
๋์ค์ ๋ค๋ฅธ ์ข
๋ฅ์ net.Addr
๋ฅผ ๋ฐํํ๋๋ก ๋ฉ์๋๋ฅผ ํ์ฅํ ๊ณํ์
๋๋ค. ํ์ง๋ง ๋ง์ฝ ๋น์ ์
API์์ OpError
๋ฅผ ๋ฐํํ๋ค๊ณ ์ธ๊ธํ ๊ฒฝ์ฐ ํด๋น ๋ถ๋ถ์ "์ปดํ์ผ ์๊ฐ" ์ฌ์์ผ๋ก ์ง์ ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์๋ฅผ ๋ค์ด:
OpError is the error type usually returned by functions in the net package. It describes the operation, network type, and address of an error.
๋๊ฐ? ์ด๋ค ํจ์๊ฐ ์ด ์ค๋ฅ๋ฅผ ๋ฐํํ๋์ง ์ ํํ ์๋ ค์ฃผ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ํจ์๊ฐ ์๋๋ผ ์ ํ์ ๋ํ ๋ฌธ์์
๋๋ค. Read
๋ํ ๋ฌธ์์๋ OpError๊ฐ ๋ฐํ๋๋ค๋ ์ธ๊ธ์ด ์์ต๋๋ค. ๋ํ ํ๋ฉด
err := blabla.(*OpError)
๋ค๋ฅธ ์ข
๋ฅ์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ฉด ์ถฉ๋ํฉ๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ ์ด๊ฒ์ ํจ์ ์ ์ธ์ ์ผ๋ถ๋ก ๋ณด๊ณ ์ถ์ ์ด์ ์
๋๋ค. ์ ์ด๋ *OpError | error
๋ ๋ฐํํ๋ค๊ณ ๋งํ ๊ฒ์
๋๋ค.
์ด๋ฌํ ์ค๋ฅ์ ์ปดํ์ผ๋ฌ๋ ๋ฏธ๋์ ํ๋ก๊ทธ๋จ์ ์ถฉ๋์ํค๋ ๊ฒ์ฌ๋์ง ์์ ํ์ ์ฃผ์ฅ์ ์ํํ์ง ์๋๋ก ํฉ๋๋ค.
BTW: Haskell์ ์ ํ ๋คํ์ฑ๊ณผ ๊ฐ์ ์์คํ ์ด ์์ง ๊ณ ๋ ค๋์ง ์์์ต๋๊น? ๋๋ 'ํน์ฑ' ๊ธฐ๋ฐ ์ ํ ์์คํ ์:
func calc(a < add(a, a) a >, b a) a {
return add(a, b)
}
func drawWidgets(widgets []< widgets.draw() error >) error {
for _, widgets := range widgets {
err := widgets.draw()
if err != nil {
return err
}
}
return nil
}
a < add(a, a) a
๋ "a์ ์ ํ์ด ๋ฌด์์ด๋ ๊ฐ์ add(typeof a, typeof a) typeof a) ํจ์๊ฐ ์์ด์ผ ํจ"์ ์๋ฏธํฉ๋๋ค. < widgets.draw() error>
๋ "์์ ฏ์ ์ ํ์ด ๋ฌด์์ด๋ ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์ ๊ณตํด์ผ ํจ"์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ณด๋ค ์ผ๋ฐ์ ์ธ ํจ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
func Sum(a []< add(a,a) a >) a {
sum := a[0]
for i := 1; i < len(a); i++ {
sum = add(sum,a[i])
}
return sum
}
(์ด๊ฒ์ ๊ธฐ์กด์ "์ ๋ค๋ฆญ"๊ณผ ๊ฐ์ง ์์ต๋๋ค.)
๋ค๋ฅธ ์ข ๋ฅ์
net.Addr
๋ฅผ ๋ฐํํ๋๋ก ๋์ค์ ๋ฉ์๋๋ฅผ ํ์ฅํ ๊ณํ์ธ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๊ตฌ์ฒด์ ์ธ ์ ํ์ ๋ฐํํ๋ ๋ฐ ์ค์ ๋ก ํฐ ๋จ์ ์ด ์์ต๋๋ค(์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ๋ฐ๋ผ์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค). .
๋ํ Go์๋ ๋ณํ ํ์ ์ ํ์ด ์์ผ๋ฏ๋ก ํ์ํ ๊ฒฝ์ฐ func() *FooError
๋ฅผ func() error
๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ธํฐํ์ด์ค ๋ง์กฑ๋์ ํนํ ์ค์ํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ด๊ฒ์ ์ปดํ์ผ๋์ง ์์ต๋๋ค.
func Foo() (FooVal, FooError) {
// ...
}
func Bar(f FooVal) (BarVal, BarError) {
// ...
}
func main() {
foo, err := Foo()
if err != nil {
log.Fatal(err)
}
bar, err := Bar(foo) // Type error: Can not assign BarError to err (type FooError)
if err != nil {
log.Fatal(err)
}
}
์ฆ, ์ด ์์ ์ ์ํํ๋ ค๋ฉด(์ด๋ป๊ฒ๋ ํ ์๋ง ์๋ค๋ฉด) ํจ์ฌ ๋ ์ ๊ตํ ์ ํ ์ถ๋ก ์ด ํ์ํฉ๋๋ค. ํ์ฌ Go๋ ๋จ์ผ ํํ์์ ๋ก์ปฌ ์ ํ ์ ๋ณด๋ง ์ฌ์ฉํฉ๋๋ค. ๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ์ด๋ฌํ ์ ํ์ ์ ์ถ ์๊ณ ๋ฆฌ์ฆ์ ์๋นํ ๋๋ฆด ๋ฟ๋ง ์๋๋ผ(์ปดํ์ผ ์๋๊ฐ ๋๋ ค์ง๊ณ ์ผ๋ฐ์ ์ผ๋ก ๋ฐํ์ ์ ํ๋ ์์) ์ดํดํ๊ธฐ ํจ์ฌ ์ด๋ ค์ด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์์ฑํฉ๋๋ค.
๋ํ Go์๋ ๋ณํ ํ์ ์ ํ์ด ์์ผ๋ฏ๋ก ํ์ํ ๊ฒฝ์ฐ func() *FooError๋ฅผ func() ์ค๋ฅ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ธํฐํ์ด์ค ๋ง์กฑ๋์ ํนํ ์ค์ํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ด๊ฒ์ ์ปดํ์ผ๋์ง ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด Go์์ ์ ์๋ํ ๊ฒ์ด๋ผ๊ณ ์์ํ์ง๋ง ํ์ฌ ๊ดํ์ error
์ฌ์ฉํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ ์ด๊ฒ์ ์ฐ์ฐํ ๋ณธ ์ ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์, ์ด ๊ฒฝ์ฐ ์ด๋ฌํ ์ ํ์ผ๋ก ์ธํด ์ค์ ๋ก error
๋ฅผ ๋ฐํ ์ ํ์ผ๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค.
func main() {
foo, err := Foo()
if err != nil {
log.Fatal(err)
}
bar, err := Bar(foo) // Type error: Can not assign BarError to err (type FooError)
if err != nil {
log.Fatal(err)
}
}
๋๋ ์ด๊ฒ์ ํ์ฉํ๋ ์ธ์ด๋ฅผ ์์ง ๋ชปํ์ง๋ง (esolang์ ์ ์ธ) "์ ํ ์ธ๊ณ"(๊ธฐ๋ณธ์ ์ผ๋ก variable -> type
์ ์ง๋์)๋ฅผ ์ ์งํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. - "์ ํ ์ธ๊ณ"์์ ์ ํ์ ์
๋ฐ์ดํธํ ๋ณ์๋ฅผ ํ ๋นํฉ๋๋ค.
์ด ์์ ์ ์ํํ๊ธฐ ์ํด ๋ณต์กํ ์ ํ ์ถ๋ก ์ด ํ์ํ๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง ๋ณ์ ์ ํ์ ์ถ์ ํด์ผ ํ์ง๋ง ์ด์จ๋ ๊ทธ๋ ๊ฒ ํด์ผ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
var int i = 0;
i = "hi";
์ด๋ค ๋ณ์/์ ์ธ์ ์ด๋ค ์ ํ์ด ์๋์ง ๊ธฐ์ตํด์ผ ํ๋ฉฐ i = "hi"
์ ๋ํด ๋ฌธ์์ด์ ํ ๋นํ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด i
์ ๋ํ "์ ํ ์กฐํ"๋ฅผ ์ํํด์ผ ํฉ๋๋ค.
func () *ConcreteError
๋ฅผ func() error
ํ ๋นํ๋ ๊ฒ์ ๋ณต์กํ๊ฒ ๋ง๋๋ ์ค์ง์ ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๊น(์: ๋ฐํ์ ์ด์ /์ปดํ์ผ๋ ์ฝ๋ ์ด์ )? ํ์ฌ ๋ค์๊ณผ ๊ฐ์ ํจ์๋ก ๋ํํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.
type MyFunc func() error
type A struct {
}
func (_ *A) Error() string { return "" }
func NewA() *A {
return &A{}
}
func main() {
var err error = &A{}
fmt.Println(err.Error())
var mf MyFunc = MyFunc(func() error { return NewA() }) // type checks fine
//var mf MyFunc = MyFunc(NewA) // doesn't type check
_ = mf
}
func (a, b) c
์ง๋ฉดํ์ง๋ง func (x, y) z
๋ฅผ ๋ฐ์๋ค๋ฉด z
๊ฐ c
(๋ฐ a
, b
๋ x
, y
ํ ๋นํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด๋ ์ต์ํ ์ ํ ์์ค์์ ๋ณต์กํ ์ ํ ์ถ๋ก ์ ํฌํจํ์ง ์์ต๋๋ค(๋จ์ง ์ ํ์ ๋ค๋ฅธ ์ ํ์ ํ ๋น ๊ฐ๋ฅ/ํธํ ๊ฐ๋ฅ). ๋ฌผ๋ก ์ด๊ฒ์ด ๋ฐํ์/์ปดํ์ผ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋์ง ์ฌ๋ถ๋... ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํ์ง๋ง ์ ์ด๋ ํ์ ์์ค์ ์๊ฒฉํ๊ฒ ์ดํด๋ณด๋ฉด ์ ์ด๊ฒ์ด ๋ณต์กํ ํ์ ์ ์ถ๋ฅผ ํฌํจํ๋์ง ์ ์ ์์ต๋๋ค. ์ ํ ๊ฒ์ฌ๊ธฐ๋ x
๊ฐ a
ํ ๋น๋ ์ ์๋์ง ์ด๋ฏธ ์๊ณ ์์ผ๋ฏ๋ก func () x
๊ฐ func () a
ํ ๋น๋ ์ ์๋์ง ์ฌ๋ถ๋ ์ฝ๊ฒ ์ ์ ์์ต๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ด ์ฝ๊ฒ ๊ฐ๋ฅํ์ง ์์ ์ค์ ์ ์ธ ์ด์ (๋ฐํ์ ํํ์ ๋ํด ์๊ฐํ๋ ๊ฒ)๊ฐ ์์ ์ ์์ต๋๋ค. (๋๋ ๊ทธ๊ฒ์ด ์ค์ ์ ํ ๊ฒ์ฌ๊ฐ ์๋๋ผ ์ค์ ํต์ฌ์ด๋ผ๊ณ ์์ฌํ๊ณ ์์ต๋๋ค.)
์ด๋ก ์ ์ผ๋ก ์์ ์ค๋ํซ์์์ ๊ฐ์ด ์๋์ผ๋ก ํจ์๋ฅผ ๋ํํ๋ ๋ฐํ์ ๋ฌธ์ (์๋ ๊ฒฝ์ฐ)๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. _์ ์ฌ์ ์ผ๋ก ๊ฑฐ๋ํ_ ๋จ์ ์ func์ func์ ๋น๊ต๋ฅผ ๋ง์น๋ค๋ ๊ฒ์ ๋๋ค(๋ํ๋ func๊ฐ func์ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค). ๋ฉ).
๋๋ ์ด๊ฒ์ ํ์ฉํ๋ ์ธ์ด๋ฅผ ์์ง ๋ชปํฉ๋๋ค (๊ธ์, esolang ์ ์ธ)
์ ํํ์ง๋ ์์ง๋ง ๊ฐ๋ ฅํ ์ ํ ์์คํ
์ ๊ฐ์ง ์ธ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ณ์๋ฅผ ์ค์ ๋ก ์ฌ์ฉ ํ์ง ์๋ ๊ธฐ๋ฅ์ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์(๋ฐ๋ผ์ ์๋ณ์๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด ์ค์ ๋ก ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์ฃผ์ฅํ๊ณ ์ถ์ต๋๋ค.) FWIW, ์๋ฅผ ๋ค์ด Haskell์ ์ ํ ์์คํ
์ด ์ด๊ฒ์ ์ ์ฒ๋ฆฌํ ์ ์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ ์ด๋ FooError
๋๋ BarError
๋ค๋ฅธ ์์ฑ์ ์ฌ์ฉํ์ง ์๋ ํ err
๊ฐ error
์ ํ์์ ์ถ๋ก ํ๊ณ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ์ด ์ ํํ ์ํฉ์ด ํจ์ํ ์ธ์ด๋ก ์ฝ๊ฒ ์ ํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๊ฐ์์ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ๋น์ ์ด ์ด์จ๋ ๊ทธ๋ ๊ฒ ํ ํ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์๋ํ๋ฉด
์ฐจ์ด์ ์กด์ฌ, ๊ทํ์ ์์ ์์ i
์ฒซ ๋ฒ์งธ ํ ๋ค์์ ๋ช
ํํ๊ณ ์ ์๋ ค์ง ์ ํ์ ๊ฐ์ง๊ณ int
๊ทธ๋ฆฌ๊ณ ๋น์ ์ ํ ๋น ํ ๋ ๋น์ ์ ๋ค์ ์ ํ์ ์ค๋ฅ๋ก ์คํ string
. ํํธ, ๋ด๊ฐ ์ธ๊ธํ ๊ฒ๊ณผ ๊ฐ์ด ์๋ณ์์ ๋ชจ๋ ์ฌ์ฉ์ ๋ณธ์ง์ ์ผ๋ก ์ฌ์ฉ๋ ์ ํ์ ๋ํ ์ผ๋ จ์ ์ ์ฝ ์กฐ๊ฑด์ ์์ฑํ๊ณ ์ ํ ๊ฒ์ฌ๊ธฐ๋ ์ฃผ์ด์ง ๋ชจ๋ ์ ์ฝ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ ํ์ ์ ์ถํ๋ ค๊ณ ์๋ํฉ๋๋ค(๋๋ ์ด๋ฅผ ์ถฉ์กฑํ๋ ์ ํ์ด ์๋ค๊ณ ๋ถํํฉ๋๋ค. ๊ณ์ฝ). ๊ทธ๊ฒ์ด ํ์์ ์ ํ ์ด๋ก ์ด ํ์ํ ์ด์ ์
๋๋ค.
func () *ConcreteError
๋ฅผfunc() error
ํ ๋นํ๋ ๊ฒ์ ๋ณต์กํ๊ฒ ๋ง๋๋ ์ค์ง์ ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๊น(์: ๋ฐํ์ ์ด์ /์ปดํ์ผ๋ ์ฝ๋ ์ด์ )?
์ค์ฉ์ ์ธ ๋ฌธ์ ๊ฐ ์์ง๋ง func
๊ฒฝ์ฐ ํด๊ฒฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค(์ธํฐํ์ด์ค ์ ๋ฌ ์๋ ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ un/-wrapping ์ฝ๋๋ฅผ ๋ด๋ณด๋์ผ๋ก์จ). ๋๋ Go์ ๋ณํ์ ๋ํด ์ฝ๊ฐ ์ผ๊ณ ํ๋จ์์ ๋ณผ ์ ์๋ ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ๋ฌธ์ ๋ฅผ ์ค๋ช
ํ์ต๋๋ค. ๊ทธ๋๋ ์ถ๊ฐํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์์ ํ ํ์ ํ์ง๋ ์์ต๋๋ค. ์ฆ, ์ค์ํ ๋ฌธ์ ๋ฅผ ์์ฒด์ ์ผ๋ก ํด๊ฒฐํ๋์ง ํ์ ํ ์ ์์ต๋๋ค.
์ ์ฌ์ ์ผ๋ก ํฐ ๋จ์ ์ func์ func์ ๋น๊ต๋ฅผ ๋ง์น๋ค๋ ๊ฒ์ ๋๋ค(๋ํ๋ func๊ฐ ๊ฐ์ธ๋ func์ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์).
๊ธฐ๋ฅ์ ๋น๊ตํ ์ ์์ต๋๋ค.
์ด์จ๋ , TBH, ์ด ๋ชจ๋ ๊ฒ์ด ์ด ๋ฌธ์ ์ ์ฃผ์ ์์ ์ฝ๊ฐ ๋ฒ์ด๋ ๊ฒ ๊ฐ์ต๋๋ค. :)
์ฐธ๊ณ : ๋ฐฉ๊ธ ํ์ต๋๋ค . ์ข์ง๋ ์์ง๋ง ์ ํ ์์ ํฉ๋๋ค. (#19814 FWIW์์๋ ๋์ผํ ์์ ์ ์ํํ ์ ์์ต๋๋ค.)
ํํฐ์ ์กฐ๊ธ ๋ฆ์์ง๋ง ๋ฐ๋ 4๋ ํ์ ๋๋์ ์ฌ๋ฌ๋ถ๊ณผ ํจ๊ป ๋๋๊ณ ์ถ์ต๋๋ค.
์ง๋ 4๋ ๋์ ๋๋ ์ด์ ๊ด๋ จ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
nil
๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ nil์ด ์๋ ์ธํฐํ์ด์ค("Go๋ ์ฌ์ด ์ธ์ด์
๋๋ค"๋ผ๋ ๋ง์ ๋์ ๋๋ด์ฒ๋ผ ๋ง๋๋ ์ฌ๋๋ค์ ํผ๋์ค๋ฝ๊ฒ ํฉ๋๋ค).nil
(์!)๊ทธ๋ฌ๋ ์ด๋ฌํ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ ๋ก๋ ์คํ๋์ง ์์ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์๋ Go 2.0.0(Go2 ์๋) ๋ฒ์ ์ด ํ์ํฉ๋๋ค. ์ด์จ๋ ...
์ค๋ฅ ์ฒ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ํ์๋์ด์ผ ํฉ๋๋ค.
// Divide returns either a float64 or an arbitrary error
func Divide(dividend, divisor float64) float64 | error {
if dividend == 0 {
return errors.New("dividend is zero")
}
if divisor == 0 {
return errors.New("divisor is zero")
}
return dividend / divisor
}
func main() {
// type-switch statements enforce completeness:
switch v := Divide(1, 0).(type) {
case float64:
log.Print("1/0 = ", v)
case error:
log.Print("1/0 = error: ", v)
}
// type-assertions, however, do not:
divisionResult := Divide(3, 1)
if v, ok := divisionResult.(float64); ok {
log.Print("3/1 = ", v)
}
if v, ok := divisionResult.(error); ok {
log.Print("3/1 = error: ", v.Error())
}
// yet they don't allow asserting types not included in the union:
if v, ok := divisionResult.(string); ok { // compile-time error!
log.Print("3/1 = string: ", v)
}
}
์ธํฐํ์ด์ค๋ ์ฐจ๋ณ๋ ๊ณต์ฉ์ฒด๋ฅผ ๋์ฒดํ๋ ๊ฒ์ด ์๋๋ผ ์์ ํ ๋ค๋ฅธ ๋ ๋๋ฌผ์ ๋๋ค. ์ปดํ์ผ๋ฌ๋ ํ๋ณ๋ ๊ณต์ฉ์ฒด์ ๋ํ ์ ํ ์ ํ์ด ์์ ํ์ง ํ์ธํฉ๋๋ค. ์ฆ, ์ผ์ด์ค๊ฐ ๊ฐ๋ฅํ ๋ชจ๋ ์ ํ์ ํฌ๊ดํ๋ค๋ ์๋ฏธ์ ๋๋ค. ์ด๋ฅผ ์ํ์ง ์์ผ๋ฉด ์ ํ ์ฃผ์ฅ ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๋ ์ฌ๋๋ค์ด _nil ๊ฐ์ ๋ํ non-nil ์ธํฐํ์ด์ค_์ ๋ํด ์์ ํ ํผ๋์ค๋ฌ์ํ๋ ๊ฒ์ ๋๋ฌด ์์ฃผ ๋ณด์์ต๋๋ค : https://play.golang.org/p/JzigZ2Q6E6F. ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋๋ค์ error
์ธํฐํ์ด์ค๊ฐ nil
๊ฐ๋ฆฌํค๋ ์ปค์คํ
์ค๋ฅ ์ ํ์ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ ๋ ํผ๋์ค๋ฌ์ ํฉ๋๋ค. ์ด๊ฒ์ด ์ ๊ฐ ์ธํฐํ์ด์ค๋ฅผ nil-able๋ก ๋ง๋๋ ๊ฒ์ด ์ค์๋ผ๊ณ ์๊ฐํ๋ ์ด์ ์ค ํ๋์
๋๋ค.
์ธํฐํ์ด์ค๋ ์ ์์๊ณผ ๊ฐ์์ ๋ํ๋ฅผ ํ๋ฉด ์ฌ๋์ด๋ผ๋ ๊ฒ์ ์ ์ ์์ง๋ง Go์์๋ ์นด๋๋ณด๋ ๋ชจ์์ผ ์ ์์ผ๋ฉฐ ๋ํ๋ฅผ ์๋ํ๋ฉด ์ธ์์ด ๊ฐ์๊ธฐ ๋ฌด๋์ง๋๋ค.
์ต์
๋(์๋ง๋ ์ ํ)์ ๋ํด ์ ๋์จ์ ๊ตฌ๋ณํด์ผ ํ๊ณ ์ธํฐํ์ด์ค์ nil
ํฌ์ธํฐ๋ฅผ ์ ๋ฌํ๋ฉด ํจ๋์ด ๋ฐ์ํด์ผ ํฉ๋๋ค.
type CustomErr struct {}
func (err *CustomErr) Error() string { return "custom error" }
func CouldFail(foo int) error | nil {
var err *customErr
if foo > 10 {
// you can't return a nil pointer as an interface value
return err // this will panic!
}
// no error
return nil
}
func main() {
// assume no error
if err, ok := CouldFail().(error); ok {
log.Fatalf("it failed, Jim! %s", err)
}
}
ํฌ์ธํฐ์ ์๋ง๋ ์ ํ์ ์ํธ ๊ตํํ ์ ์์ต๋๋ค. ์ ํ์ ์ ํ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด API๊ฐ ํผ๋์ค๋ฌ์์ง๊ธฐ ๋๋ฌธ์ ์ข์ง ์์ต๋๋ค.
// P returns a pointer to T, but it's not clear whether or not the pointer
// will always reference a T instance. It might be an optional T,
// but the documentation usually doesn't tell you.
func P() *T {}
// O returns either a pointer to T or nothing, this implies (but still doesn't guarantee)
// that the pointer is always expected to not be nil, in any other case nil is returned.
func O() *T | nil {}
๊ทธ๋ฐ ๋ค์ JSON๋ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ฌ์ฉํ๊ธฐ ์ ์ ๊ฐ์ ๋ก ๊ฒ์ฌํ๋๋ก ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ ๋์จ์์๋ ์ ๋ ์ผ์ด๋ ์ ์์ต๋๋ค . JSON ๋ฌธ์์ ํ์ ํ๋(ํฌ์ธํฐ ์ ํ์ ํ๋ ํฌํจ)๊ฐ ํฌํจ๋์ด ์์ง ์์ผ๋ฉด JSON ์ธ๋ง์ฌ๋ฌ๊ฐ ์คํจํด์ผ ํฉ๋๋ค.
type DataModel struct {
// Optional needs to be type-checked before use
// and is therefore allowed to no be included in the JSON document
Optional string | nil `json:"optional,omitempty"`
// Required won't ever be nil
// If the JSON document doesn't include it then unmarshalling will return an error
Required *T `json:"required"`
}
์ถ์
์ ๋ ๋ํ ํ์ฌ ๊ธฐ๋ฅ์ ์ธ์ด ๋์์ธ ์์
์ ํ๊ณ ์์ผ๋ฉฐ ์ด๊ฒ์ด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด ํ๋ณ๋ ๊ณต์ฉ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
read = (s String) -> (Array<Byte> or Error) => match s {
"A" then Error<NotFound>
"B" then Error<AccessDenied>
"C" then Error<MemoryLimitExceeded>
else Array<Byte>("this is fine")
}
main = () -> ?Error => {
// assume the result is a byte array
// otherwise throw the error up the stack wrapped in a "type-assertion-failure" error
r = read("D") as Array<Byte>
log::print("data: %s", r)
}
์ธ์ ๊ฐ๋ ์ด๊ฒ์ด ํ์ค์ด ๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ์ ๊ฐ ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋์์ผ๋ฉด ํฉ๋๋ค.
์๋ง๋ ๋ฌธ์ ๋ ์ฐ๋ฆฌ๊ฐ ์ ์์ผ๋ก ๋๋ฌด ๋ง์ ๊ฒ์ ๋ค๋ฃจ๋ ค๊ณ ํ๋ ๊ฒ์ ๋๋ค. ๋จ๊ธฐ์ ์ผ๋ก ์ธ์ด์ ์ถ๊ฐํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ฌ์ธ ์ ์๋๋ก ๋๋ถ๋ถ์ ๊ฐ์น๋ฅผ ๊ฐ์ ธ์ค๋ ๋จ์ํ๋ ๋ฒ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ด ๊ด์ ์์ ์ด ๋จ์ํ๋ ๋ฒ์ ์ nil
์ ๊ด๋ จ์ด ์์ ๊ฒ ์
๋๋ค. ๋ค์์ ์ฃผ์ ์์ด๋์ด์
๋๋ค(๊ฑฐ์ ๋ชจ๋ ์์ด๋์ด๊ฐ ์ด๋ฏธ ์ฃผ์์์ ์ธ๊ธ๋์์ต๋๋ค).
<any pointer type> | nil
nil
ํ ๋น์ ๊ธ์งํฉ๋๋ค. nil์ ์ง์ ํ๋ ค๋ฉด ์ ํ์ด <pointer type> | nil
์ฌ์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด:var n *int = nil // Does not compile, wrong type
var n *int | nil = nil // Ok!
var set map[string] bool = nil // Does not compile
var set map[string] bool | nil = nil // Ok!
var myFunc func(int) err = nil // Nope!
var myFunc func(int) err | nil = nil // All right.
์ด๊ฒ์ด ์ฃผ์ ์์ด๋์ด์ ๋๋ค. ๋ค์์ ์ฃผ์ ์์ด๋์ด์์ ํ์๋ ์์ด๋์ด์ ๋๋ค.
| nil
ํ๋ณ ์ ํ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.var maybeAString *string // Wrong: invalid initial value
var maybeAString *string | nil // Good
var value int = 42
var barePointer *int = &value // Valid
var nilablePointer *int | nil = &value // Valid
nilablePointer = barePointer // Valid
barePointer = nilablePointer // Invalid: Incompatible types
nilablePointer
์ barePointer
, ์ฐ๋ฆฌ๋ํด์ผ ํ ๊ฒ์
๋๋ค :switch val := nilablePointer.(type) {
case *int:
barePointer = val // Yeah! Types are compatible now. It is imposible that "val = nil"
case nil:
// Do what you need to do when nilablePointer is nil
}
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ ๋ค์ผ. ๋๋ ์ฐจ๋ณ๋ ๊ณต์ฉ์ฒด๋ฅผ ํจ์ฌ ๋ ๋ง์ด ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง(ํนํ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ), ์์์ ์์ฑํ ๊ฒ์ ๊ณ ์ํ๋ฉด ๋ ์ ์ ๋
ธ๋ ฅ์ผ๋ก ์ธ์ด์ ์์ฒญ๋ ๊ฐ์น๋ฅผ ๊ฐ์ ธ๋ค์ค ๊ฒ์
๋๋ค. ํ์ ์ด์์ผ๋ก ๋ณต์กํฉ๋๋ค.
์ด ๊ฐ๋จํ ์ ์์ ํตํด ์ป์ ์ ์๋ ์ด์ :
nil pointer dereference
์ค๋ฅ๊ฐ ๋ค์ ๋ฐ์ํฉ๋๋ค! ๐ฅmap | nil
์ ํ์ด ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ ํ ์ค์์น๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค ๐๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ๋ง์ ๊ฐ์น๋ฅผ ๊ฐ์ ธ๋ค์ฃผ๋ ๋ ๋ค๋ฅธ ๋ฌดํ ์์ฐ์ด ์์ต๋๋ค. ๋ฐ๋ก ๊ฐ๋ฐ์์ ๋ง์์ ํํ์ ๋๋ค . ํฌ์ธํฐ, ๊ธฐ๋ฅ, ์ฑ๋, ๋งต ๋ฑ์ ์ฌ์ฉํ์ฌ ์์ ํ๊ณ ํ๋ ์ดํ ์ ์์ผ๋ฉฐ ๊ทธ๊ฒ๋ค์ด 0์ด ๋๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค๋ ํธ์ํ ๋๋์ ๋ฐ์ ์ ์์ต๋๋ค. _๋ด๊ฐ ์ง๋ถํ ๊ฑฐ์ผ!_ ๐
์ด ๋ ๊ฐ๋จํ ์ ์์ ๋ฒ์ ์ผ๋ก ์์ํ๋ ์ด์ ์ ๋ฏธ๋์ ์ ์ฒด ์ ์์๋ฅผ ์งํํ๊ฑฐ๋ ๋จ๊ณ๋ณ๋ก ์งํํ๋ ๊ฒ์ ์ค๋จํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. , ํ์ง๋ง ์ง๊ธ์ ์์ด๋ฒ๋ฆฌ์).
ํ ๊ฐ์ง ๋ฌธ์ ๋ ์ ์์ ์ด ๊ฐ๋จํ ๋ฒ์ ๋ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ง๋ง gofix
๋ก ์ฝ๊ฒ ๊ณ ์น ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ชจ๋ ํฌ์ธํฐ ์ ํ ์ ์ธ์ <pointer type> | nil
๋ฉ๋๋ค.
์ด๋ป๊ฒ ์๊ฐํ๋์? ์ด๊ฒ์ด ์ฝ๊ฐ์ ๋น์ ๋น์ถ๊ณ ์ธ์ด์ nil-safety๋ฅผ ํฌํจํ๋ ์๋๋ฅผ ๋์ผ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ด ๋ฐฉ๋ฒ("์ฐจ๋ณํ๋ ์กฐํฉ"์ ํตํด)์ด ์ด๋ฅผ ๋ฌ์ฑํ๋ ๋ ๊ฐ๋จํ๊ณ ์ง๊ต์ ์ธ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
@alvaroloes
๋ฒ ์ด ํฌ์ธํฐ ์ ํ์ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ์ด๊ธฐํํ์ง ์์ ์ํ๋ก ๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ๋ฌธ์ ์ ํต์ฌ์
๋๋ค. ๊ทธ๊ฒ์ Go๊ฐ ํ๋ ์ผ์ด ์๋๋๋ค. ๋ชจ๋ ์ ํ์ 0 ๊ฐ, ๋ง์นจํ๋ฅผ ๊ฐ์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด, ์๋ฅผ ๋ค์ด make([]T, 100)
๊ฐ ๋ฌด์์ ํฉ๋๊น? ๋น์ ์ด ์ธ๊ธํ ๋ค๋ฅธ ๊ฒ๋ค(์: ์ฐ๊ธฐ ์ ํจ๋์ด ๋ฐ์ํ๋ nil ๋งต)์ ์ด ๊ธฐ๋ณธ ๊ท์น์ ๊ฒฐ๊ณผ์
๋๋ค. (๊ทธ๋ฆฌ๊ณ ์ ์ณ๋๊ณ , ๋๋ nil-slice๊ฐ ๋งต๋ณด๋ค ๋ ์์ ํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์ ๋ง๋ก ์ฌ์ค์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. nil-slice์ ์ฐ๋ ๊ฒ์ nil-map์ ์ฐ๋ ๊ฒ๋งํผ ํจ๋ํ ๊ฒ์
๋๋ค.)
๋ค์ ๋งํด์, ๋น์ ์ ์ ์์ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ๊ฐ๋จํ์ง ์์ต๋๋ค. Go ์ธ์ด์ ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ๋์์ธ ๊ฒฐ์ ์์ ์๋นํ ๋ฒ์ด๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
Go๊ฐ ํ๋ ๋ ์ค์ํ ์ผ์ ๋จ์ํ ๋ชจ๋ ๊ฒ์ 0์ ๊ฐ์น๋ฅผ ๋ถ์ฌํ๋ ๊ฒ์ด ์๋๋ผ 0์ ๊ฐ์น๋ฅผ ์ ์ฉํ๊ฒ ๋ง๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. Nil ๋งต์ 0 ๊ฐ์ด์ง๋ง ์ ์ฉํ์ง ์์ต๋๋ค. ์ฌ์ค ํด๋กญ์ต๋๋ค. ๋ฐ๋ผ์ ์ ์ฉํ์ง ์์ ๊ฒฝ์ฐ 0 ๊ฐ์ ํ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ด์ ๊ด๋ จํ์ฌ Go๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋์์ด ๋ ๊ฒ์ด์ง๋ง ์ ์์ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ๊ฐ๋จํ์ง ์์ต๋๋ค.
์์ ์ ์์ Swift ๋ฐ ๊ธฐํ์์์ ๊ฐ์ด ์ ํ์ /๋น์ ํ์ ์ข ๋ฅ์ ๋น์ทํฉ๋๋ค. ๋ฉ์ง์ง๋ง ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<pointer type> | nil
๋ก ๋ฐ๊ฟ ์๋ ์์ต๋๋ค.๋ฐ๋ผ์ ์ ์ฉํ์ง ์์ ๊ฒฝ์ฐ 0 ๊ฐ์ ํ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ ์ฐธ์กฐ. ์ด๋ ์ ๋ ดํด ๋ณด์ด๋ ์ผ๋ถ ํ๋ชฉ์๋ ๋งค์ฐ ์ฌ์ํ์ง ์์ ๋น์ฉ์ด ์๋ฐ๋๋ค๋ ์๋ฏธ์ ๋๋ค.
์ด์ ๊ด๋ จํ์ฌ Go๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์ด์ ์ด ์์ง๋ง ์ ์ตํ ๊ฒ๊ณผ๋ ๋ค๋ฆ ๋๋ค. ํด๋ก์๋ ์์ต๋๋ค. ์ด๋ ์ชฝ์ด ๋ ๋ฌด๊ฑฐ์ด์ง๋ ์ ํธ๋์ ํธ๋ ์ด๋์คํ์ ๋ฌ๋ ค ์์ต๋๋ค. Go ๋์์ด๋๋ ์ด๊ฒ์ ์ ํํ์ต๋๋ค.
FTR, ์ด๊ฒ์ ์ด ์ค๋ ๋์ ์ผ๋ฐ์ ์ธ ํจํด ์ด๋ฉฐ ๋ชจ๋ ํฉ๊ณ ์ ํ ๊ฐ๋ ์ ๋ํ ์ฃผ์ ๋ฐ๋ก ์ค ํ๋์ ๋๋ค. ์ฆ, 0 ๊ฐ์ด ๋ฌด์์ธ์ง ๋งํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ์๋ก์ด ์์ด๋์ด๊ฐ ๋ช ์์ ์ผ๋ก ๋ค๋ฃจ์ด์ผ ํ๋ ์ด์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ ์ค๋ง์ค๋ฝ๊ฒ๋ ์์ฆ ์ฌ๊ธฐ์ ๊ฒ์ํ๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ๋๋จธ์ง ์ค๋ ๋๋ฅผ ์ฝ์ง ์๊ณ ๊ทธ ๋ถ๋ถ์ ๋ฌด์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
๐ค ์ํ! ๋๋ ๋ด๊ฐ ๋์น๊ณ ์๋ ๊ฒ์ด ๋ถ๋ช ํ๋ค๋ ๊ฒ์ ์์๋ค. ๋! "๋จ์ํ"์ด๋ผ๋ ๋จ์ด์๋ ๋ณต์กํ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ข์, ๋ด ์ด์ ๋๊ธ์์ "๋จ์ํ" ๋จ์ด๋ฅผ ์์ ๋กญ๊ฒ ์ ๊ฑฐํ์ญ์์ค.
๋ช๋ช ๋ถ๋ค๊ป ์ค๋ง์ ๋๋ ธ๋ค๋ฉด ์ฃ์กํฉ๋๋ค. ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋๊ณ ์ ํ๋ ์๋์์ต๋๋ค. ๋๋ ์ค๋ ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง ์ด๊ฒ์ ์ธ ์ฌ๊ฐ ์๊ฐ์ด ๋๋ฌด ์์ต๋๋ค.
๋ค์ ๋ฌธ์ ๋ก ๋์๊ฐ์ ์ด๊ฒ์ ๋ณด๋ฅํ๋ ์ฃผ๋ ์ด์ ๋ 0 ๊ฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ ์ ์๊ฐํ๊ณ ๋ง์ ์ต์
์ ๋ฒ๋ฆฌ๊ณ ๊ฐ์น๋ฅผ ์ถ๊ฐํ ์ ์๊ณ ์ธ๊ธํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ๋ ์ ์ผํ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฌ๋ฐ๋ฅด๊ฒ ๊ธฐ์ตํ๋ค๋ฉด ๋ชจ๋ ์ ํ์ 0 ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ 0์ผ๋ก ์ฑ์ฐ๋ ๊ฒ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
์ด๋ฏธ ์๊ณ ์๋ฏ์ด ํฌ์ธํฐ๊ฐ ์๋ ์ ํ์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง ํฌ์ธํฐ ์ ํ์ ๋ํ ๋ฒ๊ทธ์ ์์ธ์ด ๋ฉ๋๋ค.
type S struct {
n int
}
var s S
s.n // Fine
var s *S
s.n // runtime error
var f func(int)
f() // runtime error
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๋๋ ์ด๊ฒ์ด ํ์คํ์ง ์์ ๋ค๋ฅธ ๋ฌธ์ ์์ ์ ์๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด ์ ์์ ์ฃผ์ ๊ฑธ๋ฆผ๋์ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์๋๋ค.
๋ค์์ ํฌ์ธํฐ ์ ํ์ ๋ํ 0 ๊ฐ ๋ชฉ๋ก์ผ ์ ์์ต๋๋ค. ์ด๋ฌํ 0 ๊ฐ์ ๊ฐ์ ์ก์ธ์คํ ๋๋ง ์ฌ์ฉ
| ํฌ์ธํฐ ์ ํ | ์ ๋ก ๊ฐ | ๋์ ์ ๋ก ๊ฐ | ๋๊ธ |
| --- | --- | --- | --- |
| *T | nil
| ์๋ก์ด(T) |
| []ํฐ | nil
| []T{} |
| ์ง๋[T]U | nil
| ์ง๋[T]U{} |
| func
| nil
| ๋ฉ์ฒญ์ด | ๋ฐ๋ผ์ ํจ์์ ๋์ 0 ๊ฐ์ ์๋ฌด ์์
๋ ์ํํ์ง ์๊ณ 0 ๊ฐ์ ๋ฐํํฉ๋๋ค. ๋ฐํ ๊ฐ ๋ชฉ๋ก์ด error
์์ ๋๋๋ฉด ํจ์๊ฐ "no operation"์ด๋ผ๋ ๊ธฐ๋ณธ ์ค๋ฅ๊ฐ ๋ฐํ๋ฉ๋๋ค. |
| chan T
| nil
| ๋ฉ์ดํฌ(์ฐฌํฐ) |
| interface
| nil
| - | ๋ชจ๋ ๋ฉ์๋๊ฐ ์์์ ์ค๋ช
ํ noop
ํจ์๋ก ์ด๊ธฐํ๋๋ ๊ธฐ๋ณธ ๊ตฌํ |
| ์ฐจ๋ณ ๋
ธ์กฐ | nil
| ์ฒซ ๋ฒ์งธ ์ ํ์ ๋์ 0 ๊ฐ | |
์ด์ ์ด๋ฌํ ์ ํ์ด ์ด๊ธฐํ๋๋ฉด ํ์ฌ์ ๊ฐ์ด nil
๊ฐ ๋ฉ๋๋ค. ์ฐจ์ด์ ์ nil
์ ์ก์ธ์คํ๋ ์๊ฐ์
๋๋ค. ๊ทธ ์๊ฐ ๋์ ์ ๋ก ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค. ๋ช ๊ฐ์ง ์:
type S struct {
n int
}
var s *S
if s == nil { // true. Nothing different happens here
...
}
s.n = 1 // At this moment the go runtime would check if it is nil, and if it is,
// do "s = new(S)". We could say the code would be replaced by:
/*
if s == nil {
s = new(S)
}
s.n = 1
*/
// -------------
var pointers []*S = make([]*S, 100) // Everything as usual
for _,p := range pointers {
p.n = 1 // This is translated to:
/*
if p == nil {
p = new(S)
}
p.n = 1
*/
}
// ------------
type I interface {
Add(string) (int, error)
}
var i I
n, err := i.Add("yup!") // This method returns 0, and the default error "Noop"
if err != nil { // This condition is true and the error is returned
return err
}
๊ตฌํ ์ธ๋ถ ์ฌํญ๊ณผ ๊ฐ๋ฅํ ์ด๋ ค์์ด ๋๋ฝ๋์์ ์ ์์ง๋ง ๋จผ์ ์์ด๋์ด์ ์ง์คํ๊ณ ์ถ์์ต๋๋ค.
์ฃผ์ ๋จ์ ์ ํฌ์ธํฐ ์ ํ์ ๊ฐ์ ์ก์ธ์คํ ๋๋ง๋ค nil-check๋ฅผ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๋งํ ๊ฒ์ ๋๋ค :
์ด๋ฅผ ํตํด ์ด์ ์ฃผ์์์ ์ค๋ช ํ ๋ชจ๋ ์ด์ ๊ณผ ํจ๊ป ๊ฐ์ ์ก์ธ์คํ๊ธฐ ์ํด ์ ํ ์ค์์น๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ผ๋ฉฐ(์ฐจ๋ณํ๋ ๊ณต์ฉ์ฒด์๋ง ํด๋น) go ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊นจ๋ํ๊ฒ ์ ์งํฉ๋๋ค. ์ง๊ธ์ด์ผ.
์ด๋ป๊ฒ ์๊ฐํ๋์? ์ด๋ฏธ ๋
ผ์๋์๋ค๋ฉด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๋ํ ์ด ์๊ฒฌ ์ ์์ด ์ฐจ๋ณ์ ์ธ ๋
ธ๋ ์กฐํฉ๋ณด๋ค nil
์ ๋ ๊ด๋ จ์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ nil ๊ด๋ จ ๋ฌธ์ ๋ก ์ฎ๊ธธ ์ ์์ง๋ง ๋ด๊ฐ ๋งํ๋ฏ์ด ๊ตฌ๋ณ ๋ ๊ณต์ฉ์ฒด์ ์ฃผ์ ๋ฌธ์ ์ธ ์ ์ฉํ 0 ๊ฐ์ ์์ ํ๋ ค๊ณ ์๋ํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ๊ฒ์ํ์ต๋๋ค.
๋ค์ ๋ฌธ์ ๋ก ๋์๊ฐ์ ์ด๊ฒ์ ๋ณด๋ฅํ๋ ์ฃผ๋ ์ด์ ๋ 0 ๊ฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
ํด๊ฒฐํด์ผ ํ ์ค์ํ ๊ธฐ์ ์ ์ด์ ์ค ํ๋ ์
๋๋ค. ์ ์๊ฒ ์ฃผ๋ ์ด์ ๋ ์ ์ง์ ์ธ ์๋ฆฌ๋ฅผ ์ ๋์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์
๋๋ค(์ ์ฐธ์กฐ). ์ฆ, ๊ฐ์ธ์ ์ผ๋ก ๊ทธ๊ฒ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ฌธ์ ๊ฐ ์๋๋ผ ๊ทผ๋ณธ์ ์ผ๋ก ๊ทธ ๊ฐ๋
์ ๋ฐ๋ํ๋ค๋ ๊ฒ์
๋๋ค.
์ด์จ๋ ์ด๋ค ์ด์ ๊ฐ "์ฃผ์"์ธ์ง๋ ์ค์ ๋ก ์ทจํฅ๊ณผ ์ ํธ๋์ ๋ฌธ์ ์
๋๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
- ๋ชจ๋ ํฌ์ธํฐ ์ ํ์ ๋ํด ์ ์ฉํ 0 ๊ฐ ์ ์
- ์ฒ์ ์ฌ์ฉํ ๋๋ง ์ด๊ธฐํํ์ญ์์ค(์ง์ฐ ์ด๊ธฐํ).
ํฌ์ธํฐ ์ ํ์ ์ ๋ฌํ๋ฉด ์คํจํฉ๋๋ค. ์
func F(p *T) {
*p = 42 // same as if p == nil { p = new(T) } *p = 42
}
func G() {
var p *T
F(p)
fmt.Println(p == nil) // Has to be true, as F can't modify p. But now F is silently misbehaving
}
์ด ํ ๋ก ์ ์๋กญ์ง๋ง์ ์์ต๋๋ค. ์ฐธ์กฐ ์ ํ์ด ์๋ํ๋ ๋ฐฉ์์๋ ์ด์ ๊ฐ ์์ผ๋ฉฐ Go ๊ฐ๋ฐ์๊ฐ ์ด์ ๋ํด ์๊ฐํ์ง ์์ ๊ฒ์ ์๋๋๋ค. :)
์ด๊ฒ์ด ๋ฌธ์ ์ ํต์ฌ์ ๋๋ค. ๊ทธ๊ฒ์ Go๊ฐ ํ๋ ์ผ์ด ์๋๋๋ค. ๋ชจ๋ ์ ํ์ 0 ๊ฐ, ๋ง์นจํ๋ฅผ ๊ฐ์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ฅผ ๋ค์ด make([]T, 100)์ด ๋ฌด์์ ํ๋์ง์ ๋ํด ๋๋ตํด์ผ ํฉ๋๊น?
T
์ 0 ๊ฐ์ด ์์ผ๋ฉด ์ด (๋ฐ new(T)
)๋ ํ์ฉ๋์ง ์์์ผ ํฉ๋๋ค. make([]T, 0, 100)
๋ฅผ ์ํํ ๋ค์ append
๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ผ์ด์ค๋ฅผ ์ฑ์์ผ ํฉ๋๋ค. ๋ ํฌ๊ฒ( v[:0][:100]
) ๋ค์ ์๋ฅด๋ ๊ฒ๋ ์ค๋ฅ์ฌ์ผ ํฉ๋๋ค. [10]T
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ ์ ํ์
๋๋ค(๋ฐฐ์ด ํฌ์ธํฐ์ ๋ํ ์ฌ๋ผ์ด์ค๋ฅผ ์ฃผ์ฅํ๋ ๊ธฐ๋ฅ์ด ์ธ์ด์ ์ถ๊ฐ๋์ง ์๋ ํ). ๊ทธ๋ฆฌ๊ณ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๋ ค๋ฉด ๊ธฐ์กด์ nilable ์ ํ์ nilable๋ก ํ์ํ๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
์ด๊ฒ์ ์ ๋ค๋ฆญ์ด ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ์ฆ, ์ผ๋ถ ๊ฒฝ๊ณ๋ฅผ ์ถฉ์กฑํ์ง ์๋ ํ ๋ชจ๋ ์ ํ ๋งค๊ฐ๋ณ์๋ฅผ 0 ๊ฐ์ด ์๋ ๊ฒ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์ ํ์ ํ์ ์งํฉ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ณณ์์ ์ด๊ธฐํ ์ถ์ ์ด ํ์ํฉ๋๋ค. ์ด๊ฒ์ ๊ทธ ์์ ํฉ๊ณ ์ ํ์ ์ถ๊ฐํ์ง ์๊ณ ๋ ๊ทธ ์์ฒด๋ก ์๋นํ ํฐ ๋ณํ๊ฐ ๋ ๊ฒ์ ๋๋ค. ํ์คํ ๊ฐ๋ฅํ์ง๋ง ๋น์ฉ/ํธ์ต ๋ถ์์ ๋น์ฉ ์ธก๋ฉด์ ํฌ๊ฒ ๊ธฐ์ฌํฉ๋๋ค. ์ด๊ธฐํ๋ฅผ ๋จ์ํ๊ฒ ์ ์งํ๋ ค๋ ์๋์ ์ธ ์ ํ("ํญ์ 0 ๊ฐ")์ ์ด๊ธฐํ ์ถ์ ์ด 1์ผ์ฐจ๋ถํฐ ์ธ์ด๋ก ๋ ๊ฒฝ์ฐ๋ณด๋ค ์ด๊ธฐํ๋ฅผ ๋ ๋ณต์กํ๊ฒ ๋ง๋๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
ํด๊ฒฐํด์ผ ํ ์ค์ํ ๊ธฐ์ ์ ์ด์ ์ค ํ๋์ ๋๋ค. ๋์๊ฒ ์ฃผ๋ ์ด์ ๋ ์ ์ง์ ์ธ ์๋ฆฌ๋ฅผ ์ ๋์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋๋ค(์ ์ฐธ์กฐ). ์ฆ, ๊ฐ์ธ์ ์ผ๋ก ๊ทธ๊ฒ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ฌธ์ ๊ฐ ์๋๋ผ ๊ทผ๋ณธ์ ์ผ๋ก ๊ทธ ๊ฐ๋ ์ ๋ฐ๋ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ด์จ๋ ์ด๋ค ์ด์ ๊ฐ "์ฃผ์"์ธ์ง๋ ์ค์ ๋ก ์ทจํฅ๊ณผ ์ ํธ๋์ ๋ฌธ์ ์ ๋๋ค.
์๊ฒ ์ต๋๋ค. ์ดํดํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ํ ๋ค๋ฅธ ์ฌ๋๋ค์ ๊ด์ ๋ ๋ด์ผ ํฉ๋๋ค(๋น์ ์ด ๊ทธ๋ ๊ฒ ํ์ง ์๋๋ค๋ ๋ง์ ์๋๋๋ค. ๋๋ ๋จ์ง ์์ ์ ๋งํ๊ณ ์์ต๋๋ค :wink:). ๊ทธ๋ค์ด ์ด๊ฒ์ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๋ฐ ๊ฐ๋ ฅํ ๊ฒ์ผ๋ก ๋ณด๋ ๊ณณ์ ๋๋ค. Go์ ์ด์ธ๋ฆฌ๋์? ๊ทธ๊ฒ์ ์์ด๋์ด๊ฐ ์ด๋ป๊ฒ ์คํ๋๊ณ ์ธ์ด์ ํตํฉ๋๋์ง์ ๋ฌ๋ ค ์์ผ๋ฉฐ, ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ด ์ค๋ ๋์์ ํ๋ ค๊ณ ํ๋ ๊ฒ์ ๋๋ค(๋ด ์๊ฐ์)
ํฌ์ธํฐ ์ ํ์ ์ ๋ฌํ๋ฉด ์คํจํฉ๋๋ค. ์๋ฅผ ๋ค์ด(...)
๋๋ ์ด๊ฒ์ ์ ์ดํดํ์ง ๋ชปํ๋ค. ์ด๊ฒ์ด ์ ์คํจ์
๋๊น? nil
๊ฐ์ ๊ฐ์ง ํฌ์ธํฐ์ธ ํจ์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ ๋ฌํ๊ธฐ
// Augmenting your example with more comments:
func FCurrentGo(p *T) {
// Here "p" is just a value, which happens to be a pointer type. Doing...
*p = 42
// ...without checking first for "nil" is the recipe for hiding a bug that will crash the entire program,
// which is exactly what is happening in current Go code bases
// The correct code would be:
if p == nil {
// panic or return error
}
*p = 42
}
func FWithDynamicZero(p *T) {
// Here, again, p is just a value of a pointer type. Doing...
*p = 42
// would allocate a new T and assign 42. It is true that this doesn't have any effect on the "outside
// world", which could be considered "incorrect" because you expected the function to do that.
// If you really want to be sure "p" is pointing to something valid in the "outside world", then
// check that:
if p == nil {
// panic or return error
}
*p = 42
}
func main() {
var p *T
FCurrentGo(p) // This will crash the program
FWithDynamicZero(p) // This won't have any effect on "p". This is expected because "p" is not pointing
// to anything. No crash here.
fmt.Println(p == nil) // It is true, as expected
}
ํฌ์ธํฐ๊ฐ ์๋ ์์ ๊ธฐ ๋ฉ์๋์์๋ ๋น์ทํ ์ํฉ์ด ๋ฐ์ํ๋ฉฐ Go๋ฅผ ์ฒ์ ์ ํ๋ ์ฌ๋๋ค์๊ฒ๋ ํผ๋์ค๋ฝ์ต๋๋ค(ํ์ง๋ง ์ผ๋จ ์ดํดํ๊ณ ๋๋ฉด ์ดํด๊ฐ ๋ฉ๋๋ค).
type Point struct {
x, y int
}
func (p Point) SetXY(x, y int) {
p.x = x
p.y = y
}
func main() {
p := Point{x: 1, y: 2}
p.SetXY(24, 42)
pointerToP := &Point{x: 1, y: 2}
pointerToP.SetXY(24, 42)
fmt.Println(p, pointerToP) // Will print "{1 2} &{1 2}", which could confuse at first
}
๋ฐ๋ผ์ ๋ค์ ์ค์์ ์ ํํด์ผ ํฉ๋๋ค.
๋ ๊ฒฝ์ฐ์ ๋ํ ์์ ์ฌํญ์ ๋์ผํฉ๋๋ค. ์์
์ ์ํํ๊ธฐ ์ ์ nil์ ํ์ธํ์ญ์์ค. ๊ทธ๋ฌ๋ ๋์๊ฒ๋ A) ํจ์ฌ ๋ ํด๋กญ์ต๋๋ค(์ ์ฒด ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ถฉ๋ํฉ๋๋ค!).
B) "์กฐ์ฉํ ์ค๋ฅ"๋ก ๊ฐ์ฃผ๋ ์ ์์ง๋ง ์ค๋ฅ๋ก ๊ฐ์ฃผํ์ง ์์ต๋๋ค. ํจ์์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ ๋ฌํ ๋๋ง ๋ฐ์ํ๋ฉฐ, ๋ด๊ฐ ๋ณด์ฌ์คฌ๋ฏ์ด ์ ์ฌํ ๋ฐฉ์์ผ๋ก ๋์ํ๋ ๊ตฌ์กฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๊ทธ๊ฒ์ด ๊ฐ์ ธ์ค๋ ์์ฒญ๋ ์ด์ ์ ๊ณ ๋ คํ์ง ์๊ณ ์์ต๋๋ค.
์ฐธ๊ณ : ๋๋ "๋์" ์์ด๋์ด๋ฅผ ๋งน๋ชฉ์ ์ผ๋ก ์นํธํ๋ ค๋ ๊ฒ์ด ์๋๋ผ ์ง์ ์ผ๋ก Go(์ด๋ฏธ ์ ๋ง ์ข์)๋ฅผ ๊ฐ์ ํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ๊ทธ ์์ด๋์ด๋ฅผ ๊ฐ์น๊ฐ ์๊ฒ ๋ง๋๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์ ์ด ์๋ค๋ฉด, ๋๋ ๊ทธ๊ฒ์ ๋ฒ๋ฆฌ๊ฑฐ๋ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๊ณ์ ์๊ฐํ๋ ๊ฒ์ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค.
์ฐธ๊ณ 2: ๊ฒฐ๊ตญ ์ด ์์ด๋์ด๋ "nil" ๊ฐ์๋ง ํด๋น๋๋ฉฐ ํ๋ณ๋ ๊ณต์ฉ์ฒด์ ๊ด๋ จ์ด ์์ต๋๋ค. ๊ทธ๋์ ๋๋ ์ด๊ฒ์ ์ค์ผ์ํค๋ ๊ฒ์ ํผํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค.
์๊ฒ ์ต๋๋ค. ์ดํดํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ ๊ด์ ๋ ๋ด์ผ ํฉ๋๋ค.
ํ์ง๋ง ๊ทธ ์นผ์ ์์ชฝ์ ์๋ผ๋
๋๋ค. ๋น์ ์ "์ด๊ฒ์ ๋ณด๋ฅํ ์ฃผ๋ ์ด์ ๋
์ด๊ฒ์ด ์ ์คํจ์ ๋๊น?
ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ ํจ์๋ ์ ์ด๋ ์ข ์ข pointee๋ฅผ ์์ ํ๊ฒ ๋ค๊ณ ์ฝ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํจ์๊ฐ ์กฐ์ฉํ ์๋ฌด ๊ฒ๋ ํ์ง ์๋๋ค๋ฉด ๋๋ ๊ทธ๊ฒ์ ๋ฒ๊ทธ๋ก ๊ฐ์ฃผํ ๊ฒ์ ๋๋ค. ๋๋ ์ ์ด๋ ์ด๋ฐ ์์ผ๋ก nil-panic์ ๋ฐฉ์งํจ์ผ๋ก์จ ์๋ก์ด ์ข ๋ฅ์ ๋ฒ๊ทธ๋ฅผ ๋์ ํ๋ค๋ ๊ฒ์ ์ฝ๊ฒ ์ฃผ์ฅํ ์ ์์ต๋๋ค.
๊ฑฐ๊ธฐ์ ๋ญ๊ฐ๋ฅผ ๊ธฐ๋ํ๋ ํจ์์ nil ํฌ์ธํฐ๋ฅผ ์ ๋ฌํ๋ฉด ๊ทธ๊ฒ์ ๋ฒ๊ทธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฒ๊ทธ๊ฐ ๋ง์ ์ํํธ์จ์ด๋ฅผ ์กฐ์ฉํ ๊ณ์ํ๋ ๊ฒ์ ์ค์ ๊ฐ์น๋ฅผ ๋ณด์ง ๋ชปํฉ๋๋ค. ๋๋ non-nilable ํฌ์ธํฐ๋ฅผ ์ง์ํจ์ผ๋ก์จ ์ปดํ์ผ ํ์์ ๊ทธ ๋ฒ๊ทธ๋ฅผ ์ก๋ ์๋์ ์์ด๋์ด์์ ๊ฐ์น๋ฅผ ๋ณผ ์ ์์ง๋ง, ๋๋ ๊ทธ ๋ฒ๊ทธ๊ฐ ์ ํ ํฌ์ฐฉ๋์ง ์๋๋ก ํ์ฉํ๋ ์์ ์ ๋ณด์ง ๋ชปํฉ๋๋ค.
๋งํ์๋ฉด, ๋น์ ์ nilable์ด ์๋ ํฌ์ธํฐ์ ์ค์ ์ ์๊ณผ ์ผ์ข
์ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๊ณ ์์ต๋๋ค. ๊ทธ ์ ์์ ๊ฒฝ์ฐ ๋ฐํ์ ํจ๋์ ๋ฌธ์ ๊ฐ ์๋๋ผ ๋จ์ง ์ฆ์์
๋๋ค . ๋ฌธ์ ๋ ์ค์๋ก ํต๊ณผํ๋ ๋ฒ๊ทธ์
๋๋ค. nil
๋ ์์ํ์ง ๋ชปํ ๊ฒ์ผ๋ก ์ด ๋ฒ๊ทธ๋ ๋ฐํ์์๋ง ํฌ์ฐฉ๋ฉ๋๋ค.
ํฌ์ธํฐ๊ฐ ์๋ ์์ ๊ธฐ ๋ฉ์๋์์๋ ๋น์ทํ ์ํฉ์ด ๋ฐ์ํฉ๋๋ค.
๋๋ ์ด ๋น์ ๋ฅผ ์ฌ์ง ์๋๋ค. IMO ๊ณ ๋ คํ๋ ๊ฒ์ด ์์ ํ ํฉ๋ฆฌ์ ์ ๋๋ค.
func Foo(p *int) { *p = 42 }
func main() {
var v int
Foo(&v)
if v != 42 { panic("") }
}
์ฌ๋ฐ๋ฅธ ์ฝ๋๊ฐ ๋ฉ๋๋ค. ๊ณ ๋ คํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค
func Foo(v int) { v = 42 }
func main( ){
var v int
Foo(v)
if v != 42 { panic("") }
}
์ ํํ๋ค. ์๋ง๋ ๋น์ ์ด Go์ ์ ๋์ ์ธ ์ด๋ณด์ ์ด๊ณ ๋ชจ๋ ๊ฐ์ด ์ฐธ์กฐ์ธ ์ธ์ด์์ ์จ ๊ฒฝ์ฐ์ผ ์ ์์ต๋๋ค(์์งํ ํ๋๋ฅผ ์ฐพ๊ธฐ๊ฐ ํ๋ค์ง๋ง Python๊ณผ Java์กฐ์ฐจ๋ ๋๋ถ๋ถ์ ๊ฐ ์ฐธ์กฐ๋ง ๋ง๋ญ๋๋ค). ๊ทธ๋ฌ๋ IMO๋ ๊ทธ ๊ฒฝ์ฐ์ ๋ํด ์ต์ ํํ๋ ๊ฒ์ ํ๋ ์ผ์
๋๋ค. ์ฌ๋๋ค์ด ํฌ์ธํฐ ๋ ๊ฐ์ ๋ํด ์ด๋ ์ ๋ ์ต์ํ๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ ๊ณตํํฉ๋๋ค. ๋
ธ๋ จํ Go ๊ฐ๋ฐ์๋ผ๋ ์๋ฅผ ๋ค์ด ํฌ์ธํฐ ์์ ๊ธฐ๊ฐ ํด๋น ํ๋์ ์ก์ธ์คํ๋ ๋ฉ์๋๊ฐ ์ฌ๋ฐ๋ฅธ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅธ ๊ฒ์ผ๋ก ๋ณผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ค์ ๋ก ์ด๊ฒ์ด nil
-pointers๋ฅผ ์ ์ ์ผ๋ก ๋ฐฉ์งํ๊ธฐ ์ํ ์ ์ฒด ์ฃผ์ฅ ์
๋๋ค. ์๋์น ์๊ฒ ํฌ์ธํฐ๊ฐ 0์ด ๋๊ณ ๋ฐํ์์ ์ฌ๋ฐ๋ฅธ ๋ชจ์์ ์ฝ๋๊ฐ ์คํจํ๋ ๊ฒ์ ๋๋ฌด ์ฝ์ต๋๋ค.
๋ ๊ฒฝ์ฐ์ ๋ํ ์์ ์ฌํญ์ ๋์ผํฉ๋๋ค. ์์ ์ ์ํํ๊ธฐ ์ ์ nil์ ํ์ธํ์ญ์์ค.
ํ์ฌ ์๋ฏธ ์ฒด๊ณ์ IMO ์์ ์ฌํญ์ nil์ ํ์ธ ํ์ง ์๊ณ ๋๊ตฐ๊ฐ๊ฐ nil์ ์ ๋ฌํ๋ฉด ๋ฒ๊ทธ๋ก ๊ฐ์ฃผํ๋ ๊ฒ์ ๋๋ค. ๊ทํ์ ์์์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ญ์์ค.
// The correct code would be:
if p == nil {
// panic or return error
}
*p = 42
๊ทธ๋ฌ๋ ๋๋ ๊ทธ ์ฝ๋๊ฐ ์ ํํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. nil
-check๋ nil
์ญ์ฐธ์กฐํ๋ฉด ์ด๋ฏธ ํจ๋ ์ํ์ด๋ฏ๋ก ์๋ฌด ์์
๋ ์ํํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋์๊ฒ๋ A) ํจ์ฌ ๋ ํด๋กญ์ต๋๋ค(์ ์ฒด ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ถฉ๋ํฉ๋๋ค!).
๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ง์ ์ฌ๋๋ค์ด ์ด์ ๋ํด ๊ฐํ๊ฒ ๋์ํ์ง ์์ ๊ฒ์ด๋ผ๋ ์ ์ ์ผ๋์ ๋์ญ์์ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์์๋ ๋ฐ์ดํฐ์ ์๋ชป๋ ๊ฐ์ ์ ๊ณ์ํ๋ ๊ฒ๋ณด๋ค ํญ์ ์ถฉ๋์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด์์ ์ธ ์ธ๊ณ์์ ๋ด ์ํํธ์จ์ด์๋ ๋ฒ๊ทธ๊ฐ ์๊ณ ์ถฉ๋๋ ์์ต๋๋ค. ๋ ์ด์์ ์ธ ์ธ์์์๋ ๋ด ํ๋ก๊ทธ๋จ์ ๋ฒ๊ทธ๊ฐ ์๊ณ ๊ฐ์ง๋ ๋ ์ถฉ๋ํ์ฌ ์์ ํ๊ฒ ์คํจํฉ๋๋ค. ์ต์ ์ ์ํฉ์์ ๋ด ํ๋ก๊ทธ๋จ์๋ ๋ฒ๊ทธ๊ฐ ์๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๊ณ์ํด์ ํผ๋์ ์ผ์ผํฌ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ๊ทธ ์นผ์ ์์ชฝ์ ์๋ผ๋ ๋๋ค. ๋น์ ์ "์ด๋ฅผ ๋ณด๋ฅํ ์ฃผ๋ ์ด์ ๋"๋ผ๊ณ ๋งํ์ต๋๋ค. ๊ทธ ์ง์ ์ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ด ์ ์์ ํจ๊ณผ๋ฅผ ์ํ๋์ง ์ฌ๋ถ์ ๋์ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ํน์ ์ ์์ ๋ณด๋ฅํ๋ ๊ธฐ์ ์ ์ธ ์ธ๋ถ ์ฌํญ์ด๋ผ๋ ๋ฐ ํ์คํ ๋์ํ ์ ์์ต๋๋ค(๋๋ ์ ์ด๋ ๋ชจ๋ ์ ์์ ํด๋น ์ง๋ฌธ์ ๋ํด ๋งํด์ผ ํจ). ๊ทธ๋ฌ๋ ๋๋ ํ ๋ก ์ด ๋ชจ๋ ์ฌ๋์ด ์ค์ ๋ก ๊ทธ๊ฒ์ ์ํ๋ค๊ณ ๊ฐ์ ํ๋ ํํ ์ธ๊ณ๋ก ์กฐ์ฉํ ์ฌ๊ตฌ์ฑ๋๋ ๊ฒ์ ์ข์ํ์ง ์์ต๋๋ค.
๊ธ์, ๋๋ ์ด๊ฒ์ ์์ํ๊ณ ์ถ์ง ์์๋ค. ๊ทธ๋ ๊ฒ ์ดํดํ์ จ๋ค๋ฉด ์ ๊ฐ ๋จ์ด๋ฅผ ์๋ชป ์ ํํ์ ์๋ ์๊ณ ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ๊ฐ๋ฅํ ์๋ฃจ์ ์ ๋ํ ๋ช ๊ฐ์ง ์์ด๋์ด๋ฅผ ์ ๊ณตํ๊ณ ์ถ์์ต๋๋ค. ๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค.
๋๋ _"... ์ด๊ฒ์ ๋ง๋ ์ฃผ๋ ์ด์ ๋...."๋ผ๊ณ ์ผ์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ 0 ๊ฐ์ด ์ด๊ฒ์ ์ ์งํ๋ ์ฃผ์ ์์๋ผ๊ณ ๊ฐ์ ํ์ต๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ ๋์ ์๋ชป๋ ๊ฐ์ ์ด์์ต๋๋ค.
nil
์๋์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ์ปดํ์ผํ ๋ ํ์ธํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ: ์ปดํ์ผํ ๋ ํ์ธํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. "๋์ 0 ๊ฐ"์ ๋ด๊ฐ ๋ชจ๋ ์ ํ์ ๊ฐ์ด 0์ด์ด์ผ ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ค์ ์ ๋ ๋ ์๋ ์ ์์ ๋ํ ๋ฐ๋ณต์ด์์ต๋๋ค. ๋ ๋ค๋ฅธ ๋๊ธฐ๋ ๊ทธ๊ฒ์ด ์ฐจ๋ณ์ ๋
ธ๋์กฐํฉ ์ ์์ ์ฃผ์ ๊ฑธ๋ฆผ๋์ด๊ธฐ๋ ํ๋ค๊ณ _์๊ฐ_ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
nil ๊ด๋ จ ๋ฌธ์ ์๋ง ์ด์ ์ ๋ง์ถ๋ฉด ์ปดํ์ผ ์๊ฐ์ nil์ด ์๋ ํฌ์ธํฐ ์ ํ์ ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๋ ์์ ์์ ์ฐ๋ฆฌ("์ฐ๋ฆฌ"๋ ์ ์ฒด Go ์ปค๋ฎค๋ํฐ๋ฅผ ์๋ฏธํจ)๊ฐ _์ด๋ค ์ข
๋ฅ์_ ๋ณํ๋ฅผ ๋ฐ์๋ค์ฌ์ผ ํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ์๋ฅผ ๋ค์ด: nil
์ค๋ฅ๋ฅผ ์์ ํ ๋ฐฉ์งํ ์ ์๋ ์ข์ ์๋ฃจ์
์ด ์๊ณ ์ด๋ฅผ ๋ณด๋ฅํ๋ ๊ฒ์ด "๋ชจ๋ ์ ํ์ ๊ฐ์ 0์ด๊ณ 0์ผ๋ก ๋ง๋ค์ด์ง๋๋ค"๋ผ๋ ์ค๊ณ ๊ฒฐ์ ์ธ ๊ฒฝ์ฐ ๋ค์ ์์ด๋์ด๋ฅผ ๊ณ ๋ คํ ์ ์์ต๋๋ค. ๊ฐ์น๊ฐ ์๋ค๋ฉด ๊ทธ ๊ฒฐ์ ์ ์ฝ๊ฐ์ ์กฐ์ ์ด๋ ๋ณ๊ฒฝ์ ๊ฐํ๋ ๊ฒ.
๋ด๊ฐ ์ด๊ฒ์ด ๋น์ ์ ๋ฌธ์ฅ์ด๋ผ๊ณ ๋งํ๋ ์ฃผ๋ ์ด์ ๋ _"๋ชจ๋ ์ ํ์๋ 0 ๊ฐ, ๋ง์นจํ "_๊ฐ ์์ต๋๋ค. ๋๋ ์ผ๋ฐ์ ์ผ๋ก "์์ ํ ๋ง์นจํ๋ฅผ ์ฐ๋ ๊ฒ"์ ์ข์ํ์ง ์์ต๋๋ค. ์คํดํ์ง ๋ง์ธ์! ๋๋ ๋น์ ์ด ๊ทธ๋ ๊ฒ ์๊ฐํ๋ค๋ ๊ฒ์ ์์ ํ ์ธ์ ํฉ๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ์ ์๊ฐ์ ๋๋ค. ๋๋ ๋ ๋์ ์๋ฃจ์ ์ผ๋ก ์ด์ด์ง ์ ์๋ ๊ธธ์ ์จ๊ธธ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ค ๋ ๋จ๋ ์ ํธํ์ง ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ด์ ๋ํด:
๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ง์ ์ฌ๋๋ค์ด ์ด์ ๋ํด ๊ฐํ๊ฒ ๋์ํ์ง ์์ ๊ฒ์ด๋ผ๋ ์ ์ ์ผ๋์ ๋์ญ์์ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์์๋ ๋ฐ์ดํฐ์ ์๋ชป๋ ๊ฐ์ ์ ๊ณ์ํ๋ ๊ฒ๋ณด๋ค ํญ์ ์ถฉ๋์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด์์ ์ธ ์ธ๊ณ์์ ๋ด ์ํํธ์จ์ด์๋ ๋ฒ๊ทธ๊ฐ ์๊ณ ์ถฉ๋๋ ์์ต๋๋ค. ๋ ์ด์์ ์ธ ์ธ์์์๋ ๋ด ํ๋ก๊ทธ๋จ์ ๋ฒ๊ทธ๊ฐ ์๊ณ ๊ฐ์ง๋ ๋ ์ถฉ๋ํ์ฌ ์์ ํ๊ฒ ์คํจํฉ๋๋ค. ์ต์ ์ ์ํฉ์์ ๋ด ํ๋ก๊ทธ๋จ์๋ ๋ฒ๊ทธ๊ฐ ์๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๊ณ์ํด์ ํผ๋์ ์ผ์ผํฌ ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ํฐ ์๋ฆฌ๋ก ์คํจํ๋ ๊ฒ์ด ์กฐ์ฉํ ์คํจํ๋ ๊ฒ๋ณด๋ค ํญ์ ๋ซ์ต๋๋ค. ๊ทธ๋ฌ๋ Go์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
(์๋นํ ์ํํ๊ธด ํ์ง๋ง) ๊ทธ๊ฒ์ ์ ์ณ๋๊ณ , ์์ด๋์ด๋ ์ ์ฒด ๋ฒ์ฃผ์ ์คํจ( nil
๊ด๋ จ ์คํจ)๋ฅผ ํผํ๋ ๊ฒ์
๋๋ค.
๋ฐ๋ผ์ ์ด๊ฒ์ ๊ณ์ ๋ฐ๋ณตํ๊ณ ํด๊ฒฐ์ฑ ์ ์ฐพ๋๋ก ํฉ์๋ค.
์๊ฐ๊ณผ ์๋์ง๋ฅผ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
๋๋ Haskell์ ํฉ ์ ํ๋ณด๋ค Rust์ ๊ตฌ๋ณ๋ ๊ณต์ฉ์ฒด ๊ตฌ๋ฌธ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ๋ณํ ์ด๋ฆ์ ์ง์ ํ๊ณ ๋ ๋์ ํจํด ์ผ์น ๊ตฌ๋ฌธ ์ ์์ ํ์ฉํฉ๋๋ค.
๊ตฌํ์ ํ๊ทธ ํ๋(๋จ์ ์ ํ, ๋ณํ ์์ ๋ฐ๋ผ ๋ค๋ฆ) ๋ฐ ํตํฉ ํ๋(๋ฐ์ดํฐ ๋ณด์ )๊ฐ ์๋ ๊ตฌ์กฐ์ฒด์ ๊ฐ์ด ์ํํ ์ ์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋ซํ ๋ณํ ์งํฉ์ ํ์ํฉ๋๋ค(์ปดํ์ผ ์๊ฐ ํ์ธ์ ํตํด ์ํ ํํ์ด ํจ์ฌ ์ฝ๊ณ ๊นจ๋ํจ). ์ธํฐํ์ด์ค์ ๊ทธ ํํ์ ๋ํ ์ง๋ฌธ์ ๋ฐ๋ฅด๋ฉด, ๋๋ ์ธํฐํ์ด์ค๊ฐ ์ผ๋ถ ์๊ตฌ ์ฌํญ์ ๋ง๋ ๋ชจ๋ ์ ํ์ ๊ดํ ๊ฒ์ด์ง๋ง sum ์ ํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ sum ์ ํ์ ๊ตฌํ์ sum ์ ํ์ ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ ์ด์์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํต์ฌ๋ก :
type Type enum {
Tuple (int,int),
One int,
None,
};
์์ ์์์ ํฌ๊ธฐ๋ sizeof((int,int))์
๋๋ค.
ํจํด ์ผ์น๋ ์๋ก ์์ฑ๋ ์ผ์น ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ธฐ์กด ์ค์์น ์ฐ์ฐ์ ๋ด์์ ์ํํ ์ ์์ต๋๋ค.
var a Type
switch (a) {
case Tuple{(b,c)}:
//do something
case One{b}:
//do something else
case None:
//...
}
์์ฑ ๊ตฌ๋ฌธ:
var a Type = Type{One=12}
์ด๊ฑฐํ ์ธ์คํด์ค ์์ฑ์์๋ ํ๋์ ๋ณํ๋ง ์ง์ ํ ์ ์์ต๋๋ค.
0 ๊ฐ(๋ฌธ์ ):
์ด๋ฆ์ ์ํ๋ฒณ ์์๋ก ์ ๋ ฌํ ์ ์์ต๋๋ค. enum ๊ฐ์ด 0์ด๋ฉด ์ ๋ ฌ๋ ๋ฉค๋ฒ ๋ชฉ๋ก์ ์ฒซ ๋ฒ์งธ ๋ฉค๋ฒ ์ ํ ๊ฐ์ด 0์ด ๋ฉ๋๋ค.
PS Zero Value ๋ฌธ์ ์ ์๋ฃจ์ ์ ๋๋ถ๋ถ ํฉ์์ ์ํด ์ ์๋ฉ๋๋ค.
๋๋ ํฉ๊ณ์ 0 ๊ฐ์ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์ ์ ์ ํฉ๊ณ ํ๋์ 0 ๊ฐ์ผ๋ก ์ ์งํ๋ ๊ฒ์ด ๋ ํผ๋์ค๋ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ํฉ๊ณ์ 0 ๊ฐ์ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์ ์ ์ ํฉ๊ณ ํ๋์ 0 ๊ฐ์ผ๋ก ์ ์งํ๋ ๊ฒ์ด ๋ ํผ๋์ค๋ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ํ๋ ์ ์ธ ์์์ ๋ฐ๋ผ ๊ฐ์ 0์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๋ ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ๋์์ธ ๋ฌธ์๋ฅผ ์์ฑํ์ต๋๊น?
๋ด๊ฐ ํ๋๊ฐ:
19412-discriminated_unions_and_pattern_matching.md.zip
๋๋ ์ด๊ฒ์ ๋ฐ๊ฟจ๋ค:
๋๋ ํฉ๊ณ์ 0 ๊ฐ์ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์ ์ ์ ํฉ๊ณ ํ๋์ 0 ๊ฐ์ผ๋ก ์ ์งํ๋ ๊ฒ์ด ๋ ํผ๋์ค๋ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด์ Zero Value (Problem)์ ๋ํ ๋ด ์ ์ ๋์์์์ urandoms ์์น๋ก ์ด๋ํ์ต๋๋ค.
UPD: ๋์์ธ ๋ฌธ์๊ฐ ๋ณ๊ฒฝ๋๊ณ ์ฝ๊ฐ ์์ ๋์์ต๋๋ค.
๋๋ ๋ด์ฅ ํฉ๊ณ ์ ํ์ด ํ์ํ ๋ ๊ฐ์ง ์ต๊ทผ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค.
๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ์ต๋๋ค(๋ ๋ฒ์งธ ์์ ์ ์์์).
type Task interface {
task()
}
type SearchAdd struct {
Ctx context.Context
ID string
Attrs Attributes
}
func (SearchAdd) task() {}
type SearchUpdate struct {
Ctx context.Context
ID string
UpdateAttrs UpdateAttributes
}
func (SearchUpdate) task() {}
type SearchDelete struct {
Ctx context.Context
ID string
}
func (SearchDelete) task() {}
๊ทธ๋ฆฌ๊ณ
task := <- taskChannel
switch v := task.(type) {
case tasks.SearchAdd:
resp, err := search.Add(task.Ctx, &search2.RequestAdd{โฆ}
if err != nil {
log.Error().Err(err).Msg("blah-blah-blah")
} else {
if resp.GetCode() != search2.StatusCodeSuccess {
โฆ
}
}
case tasks.SearchUpdate:
โฆ
case tasks.SearchDelete:
โฆ
}
์ด๊ฒ์ ๊ฑฐ์ ์ข์ต๋๋ค. ๋์ ์ ์ Go๊ฐ ์์ ํ ์ ํ ์์ ์ฑ์ ์ ๊ณตํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ์๋ก์ด ๊ฒ์ ์์ธ ์์ ์์ ์ด ์ถ๊ฐ๋ ํ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
sum ์ ํ์ ์ฌ์ฉํ๋ IMHO๋ ๋ฐฉ๋ฌธ์์ ๊ธฐ๋ฅ์ด ๋ง์ง ์๊ณ ์์ผ๋ฉฐ ๋ฐฉ๋ฌธ์ ์์ฒด๊ฐ ๊ณ ์ ์ ํ์ธ ๋ฐฉ๋ฌธ์ ๋ฐ ๋ฐ์ก์ ์งํฉ์ผ๋ก ์ผ๋ฐ์ ์ผ๋ก ํด๊ฒฐ๋๋ ์ด๋ฌํ ์ข ๋ฅ์ ์์ ์ ๋ํ ๊ฐ์ฅ ๋ช ํํ ์๋ฃจ์ ์ ๋๋ค.
๋๋ ์ง์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค.
type Task oneof {
// SearchAdd holds a data for a new record in the search index
SearchAdd {
Ctx context.Context
ID string
Attrs Attributes
}
// SearchUpdate update a record
SearchUpdate struct {
Ctx context.Context
ID string
UpdateAttrs UpdateAttributes
}
// SearchDelete delete a record
SearchDelete struct {
Ctx context.Context
ID string
}
}
+
switch task {
case tasks.SearchAdd:
// task is tasks.SearchAdd in this scope
case tasks.SearchUpdate:
case tasks.SearchDelete:
}
Go๊ฐ ํ์ฌ ์ํ์์ ํ์ฉํ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ณด๋ค ํจ์ฌ ๋ Goish ์ ์ ์ด ๋ ๊ฒ์ ๋๋ค. Haskellish ํจํด ๋งค์นญ์ด ํ์ํ์ง ์์ผ๋ฉฐ ํน์ ์ ํ๊น์ง juist ๋ค์ด๋นํ๋ฉด ์ถฉ๋ถํฉ๋๋ค.
์, ๊ตฌ๋ฌธ ์ ์์ ์์ ์ ๋์ณค์ต๋๋ค. ์์ ํฉ๋๋ค.
๋ ๊ฐ์ง ๋ฒ์ , ํ๋๋ ์ผ๋ฐ ํฉ๊ณ ์ ํ์ฉ์ด๊ณ ํ๋๋ ์ด๊ฑฐํ์ฉ ํฉ๊ณ ์ ํ:
type Sum oneof {
Tโ TypeDeclโ
Tโ TypeDeclโ
โฆ
Tโ TypeDeclโ
}
์ฌ๊ธฐ์ Tโ
... Tโ
๋ Sum
( oneof
๋ ๋ฒ์ ์ธ๋ถ์ ๋
ธ์ถ)์ ๋์ผํ ์์ค์ ์ ํ ์ ์์ด๊ณ Sum
์ ์ธ Tโ
... Tโ
๋ง์กฑํ๋ ์ผ๋ถ ์ธํฐํ์ด์ค.
์ฒ๋ฆฌ๋ oneof
๊ฐ์ฒด์ ๋ํด ์์์ ์ผ๋ก ์ํ๋๊ณ ๋ชจ๋ ๋ณํ์ด ๋์ด๋์๋์ง ์ปดํ์ผ๋ฌ ๊ฒ์ฌ๊ฐ ์์ด์ผ ํ๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ (type)
์ค์์น๊ฐ ์๋ ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค.
type Enum oneof {
Value = iota
}
๋ช
์์ ์ผ๋ก ๋์ด๋ ๊ฐ๋ง Enum์ด๊ณ ๋ค๋ฅธ ๋ชจ๋ ๊ฐ์ ๊ทธ๋ ์ง ์๋ค๋ ์ ์ ์ ์ธํ๋ฉด iota
of const์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
switch task { case tasks.SearchAdd: // task is tasks.SearchAdd in this scope case tasks.SearchUpdate: case tasks.SearchDelete: }
Go๊ฐ ํ์ฌ ์ํ์์ ํ์ฉํ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ณด๋ค ํจ์ฌ ๋ Goish ์ ์ ์ด ๋ ๊ฒ์ ๋๋ค. Haskellish ํจํด ๋งค์นญ์ด ํ์ํ์ง ์์ผ๋ฉฐ ํน์ ์ ํ๊น์ง juist ๋ค์ด๋นํ๋ฉด ์ถฉ๋ถํฉ๋๋ค.
task
๋ณ์์ ์๋ฏธ๋ฅผ ์กฐ์ํ๋ ๊ฒ์ ํ์ฉ๋์ง๋ง ์ข์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
```go switch task { case tasks.SearchAdd: // task is tasks.SearchAdd in this scope case tasks.SearchUpdate: case tasks.SearchDelete: }
Go๊ฐ ํ์ฌ ์ํ์์ ํ์ฉํ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ณด๋ค ํจ์ฌ ๋ Goish ์ ์ ์ด ๋ ๊ฒ์ ๋๋ค. Haskellish ํจํด ๋งค์นญ์ด ํ์ํ์ง ์์ผ๋ฉฐ ํน์ ์ ํ๊น์ง juist ๋ค์ด๋นํ๋ฉด ์ถฉ๋ถํฉ๋๋ค.
๋๋ ์์ ๋ณ์์ ์๋ฏธ๋ฅผ ์กฐ์ํ๋ ๊ฒ์ด ํ์ฉ๋์ง๋ง ์ข์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
```
๊ทธ๋ผ ๋ฐฉ๋ฌธ์ ์ฌ๋ฌ๋ถ์ ๊ฑด์น์ ๋น๋๋ค.
@sirkon ๋ฐฉ๋ฌธ์๋ ๋ฌด์์ ์๋ฏธํฉ๋๊น? ๋๋ ์ด ๊ตฌ๋ฌธ์ด ๋ง์์ ๋ค์์ง๋ง ์ค์์น๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋์ด์ผ ํฉ๋๋ค.
switch task {
case Task.SearchAdd:
// task is Task.SearchAdd in this scope
case Task.SearchUpdate:
case Task.SearchDelete:
}
๋ํ Task
๊ฐ์น๊ฐ ์๋ ๊ฒ์ ๋ฌด์์
๋๊น? ์๋ฅผ ๋ค์ด:
var task Task
nil
์ผ๊น์? ๊ทธ๋ ๋ค๋ฉด switch
์ ์ถ๊ฐ case nil
๊ฐ ์์ด์ผ ํฉ๋๊น?
์๋๋ฉด ์ฒซ ๋ฒ์งธ ์ ํ์ผ๋ก ์ด๊ธฐํ๋ฉ๋๊น? ์ ํ ์ ์ธ์ ์์๊ฐ ์ด์ ์๋ ์์๋ ๋ฐฉ์์ผ๋ก ์ค์ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ด์ํ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ซ์ ์ด๊ฑฐํ์๋ ์๋ง๋ ๊ด์ฐฎ์ ๊ฒ์
๋๋ค.
๋๋ ์ด๊ฒ์ด switch task.(type)
์ ๋์ผํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์์ง๋ง ์ค์์น๋ ๋ชจ๋ ์ผ์ด์ค๊ฐ ๊ฑฐ๊ธฐ์ ์์ด์ผ ํ๋ ๊ฒ์ด ๋ง์ต๋๊น? as in.. ํ๋์ ๊ฒฝ์ฐ๋ฅผ ๋์น๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ default
ํ์ฉ๋์ง ์์ต๋๋ค. ๋ง๋์?
๋ฐฉ๋ฌธ์์ ๋ํด ๋ฌด์์ ์๋ฏธ ํฉ๋๊น?
์ด๋ฌํ ์ข ๋ฅ์ ๊ธฐ๋ฅ์ ์ํ Go์ ์ ์ผํ ์ ํ ์์ ์ต์ ์ ๋๋ค. ํน์ ์ฌ๋ก ์งํฉ์ ๊ฒฝ์ฐ ํจ์ฌ ๋ ๋์ฉ๋๋ค(๋ฏธ๋ฆฌ ์ ์๋ ๋์์ ์๊ฐ ์ ํ๋จ).
๋ํ Task์ ๊ฐ์น๊ฐ ์๋ ๊ฒ์ ๋ฌด์์ ๋๊น? ์๋ฅผ ๋ค์ด:
var task Task
๋๋ ์ด๊ฒ์ด Go์์ nilable ์ ํ์ด์ด์ผํ๋ค๋ ๊ฒ์ ๋๋ ค์ํฉ๋๋ค.
์๋๋ฉด ์ฒซ ๋ฒ์งธ ์ ํ์ผ๋ก ์ด๊ธฐํ๋ฉ๋๊น?
ํนํ ์๋ ํ ๋ชฉ์ ์ ๋ํด ๋๋ฌด ์ด์ํ ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ด ์ค์์น ์์ ๊ณผ ๋์ผํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์์ต๋๋ค.(์ ํ) ํ์ง๋ง ์ค์์น๋ ๋ชจ๋ ๊ฒฝ์ฐ๊ฐ ์์ด์ผ ํฉ๋๋ค. ๋ง์ฃ ? as in.. ํ๋์ ๊ฒฝ์ฐ๋ฅผ ๋์น๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ค, ๊ทธ๋ฌ์ฃ .
๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ๊ฐ์ ํ์ฉ๋์ง ์์ต๋๋ค. ๋ง๋์?
์๋์, ๊ธฐ๋ณธ๊ฐ์ด ํ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์ฌํ๋ค.
์ถ์ : Go @ianlancetaylor ๋ฐ ๋ค๋ฅธ Go ์ฌ๋๋ค์ด ํฉ๊ณ ์ ํ์ ๋ํด ๊ฐ์ง๊ณ ์๋ ์์ด๋์ด๋ฅผ ์ป์ ๊ฒ ๊ฐ์ต๋๋ค. Go๋ nil ๊ฐ์ ์ ์ดํ ์ ์๊ธฐ ๋๋ฌธ์ nilness๊ฐ NPD์ ์ทจ์ฝํ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
nil์ด๋ฉด ๊ด์ฐฎ์ ๊ฒ ๊ฐ์์. case nil
๊ฐ switch ๋ฌธ์ ๋ํ ์๊ตฌ ์ฌํญ์ด์์ผ๋ฉด ํฉ๋๋ค. ์ ์ if task != nil
๊ฒ๋ ๊ด์ฐฎ์ต๋๋ค. ์ ๋ ๋ณ๋ก ์ข์ํ์ง ์์ต๋๋ค :|
์ด๊ฒ๋ ํ์ฉ๋ ๊น์?
type Foo oneof {
A = 3
B = "3"
C = 3.0
D = struct { E bool }{ true }
}
์ด๊ฒ๋ ํ์ฉ๋ ๊น์?
type Foo oneof { A = 3 B = "3" C = 3.0 D = struct { E bool }{ true } }
์, const๋ ์์ต๋๋ค.
type Foo oneof {
A <type reference>
}
๋๋
type Foo oneof {
A = iota
B
C
}
๋๋
type Foo oneof {
A = 1
B = 2
C = 3
}
iota์ ๊ฐ์ ์กฐํฉ์ด ์์ต๋๋ค. ๋๋ ๊ฐ์ ๋ํ ์ ์ด์ ์กฐํฉํ์ฌ ๋ฐ๋ณตํด์๋ ์ ๋ฉ๋๋ค.
FWIW, ์ต์ ์ ๋ค๋ฆญ ๋์์ธ ์์ ํฅ๋ฏธ๋ก์ด ์ ์ 0 ๊ฐ์ ๋ํ ํจ์ ์ ํผํ๋ฉด์ sum ์ ํ์ ์ฌ์ฉ ์ฌ๋ก ์ค ์ ์ด๋ ์ผ๋ถ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ ๋ค๋ฅธ ์ฅ์๋ฅผ ๋ณด์ฌ์ฃผ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์ด๋ค ๋ฉด์์ ์์ฝ์ ์ด์ง๋ง ํ์์ด ์๋ ์ ์ฝ ์กฐ๊ฑด์ ์ค๋ช ํ๊ธฐ ๋๋ฌธ์ 0 ๊ฐ์ ๊ฐ์ง ํ์๊ฐ ์๋ ๋ถ๋ฆฌ ๊ณ์ฝ์ ์ ์ํฉ๋๋ค(ํด๋น ํ์์ ๋ณ์๋ฅผ ์ ์ธํ ์ ์๊ธฐ ๋๋ฌธ์). ์ฆ, ๊ฐ๋ฅํ ์ ํ์ ์ ํ๋ ์งํฉ์ ์ทจํ๋ ํจ์๋ฅผ ์์ฑํ๊ณ ํด๋น ์งํฉ์ ์ปดํ์ผ ์๊ฐ ํ์ ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ฌผ๋ก ์ง๊ธ์ ์๋ ๊ทธ๋๋ก์ ๋์์ธ์ด ์ฌ๊ธฐ์์ ์๋ํ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์ค์ ๋ก ์๋ํ์ง ์์ต๋๋ค. ๋ถ๋ฆฌ๋ ๊ธฐ๋ณธ ์ ํ ๋๋ ๋ฉ์๋๋ง ๋์ดํ๋ฏ๋ก ์ฌ์ ํ ๋๋ฆฌ ์ด๋ ค ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก , ์ผ๋ฐ์ ์ธ ์์ด๋์ด๋ผ๊ณ ํด๋ ์ผ๋ฐ์ ์ธ(๋๋ ์ข ํฉ์ ์ธ) ํจ์๋ ๊ฐ์ ์ธ์คํด์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ์ ํ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ IMO๋ sum์ ์ฌ์ฉ ์ฌ๋ก ์ค ์ผ๋ถ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋์์ธ ๊ณต๊ฐ์ด sum ์ ํ ์์ฒด์ ์์ด๋์ด๋ณด๋ค ํจ์ฌ ๋ ํฌ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋ฐ๋ผ์ ํฉ๊ณ์ ๋ํด ์๊ฐํ๋ ๊ฒ์ ํน์ ๋ฌธ์ ๋ณด๋ค๋ ํน์ ์๋ฃจ์ ์ ๋ ์ง์ฐฉํฉ๋๋ค.
์ด์จ๋ . ํฅ๋ฏธ๋กญ๋ค๊ณ ๋ง ์๊ฐํ์ต๋๋ค.
@Merovius ๋ sum ์ ํ์ ์ผ๋ถ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ต์ ์ผ๋ฐ ๋์์ธ์ ๋ํด ํ๋ฅญํ ์ง์ ์ ํ์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ค๋ ๋์์ ์ด์ ์ ์ฌ์ฉ๋ ์ด ํจ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
func addOne(x int|float64) int|float64 {
switch x := x.(type) {
case int:
return x + 1
case float64:
return x + 1
}
}
๋ ๊ฒ์ ๋๋ค:
contract intOrFloat64(T) {
T int, float64
}
func addOne(type T intOrFloat64) (x T) T {
return x + 1
}
ํฉ๊ณ ์ ํ ์์ฒด์ ๊ดํ ํ, ์ ๋ค๋ฆญ์ด ๊ฒฐ๊ตญ ์ถ์๋๋ฉด ์ด๋ฅผ ๋์ ํ๋ ์ด์ ์ด Go์ ๊ฐ์ ๊ฐ๋จํ ์ธ์ด์ ๋ํ ๋น์ฉ์ ๋ฅ๊ฐํ๋์ง ์ฌ๋ถ์ ๋ํด ์ง๊ธ๋ณด๋ค ํจ์ฌ ๋ ์์ฌ์ค๋ฝ์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ฌด์ธ๊ฐ๊ฐ ์ํ๋์ด์ผ ํ๋ค๋ฉด ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ๊ฐ์ฅ ๋ฐฉํด๊ฐ ์ ์ ์๋ฃจ์ IMO๋ @ianlancetaylor ์ '์ ํ๋ ์ธํฐํ์ด์ค' ์์ด๋์ด๊ฐ ๋ ๊ฒ์ ๋๋ค. ์ด ์์ด๋์ด๋ ์ค๋๋ ์ '๋ฌด์ ํ' ์ธํฐํ์ด์ค์ ๋๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ง๋ง ๋ง์กฑํ ์ ์์ ๋ฟ์ ๋๋ค. ์ง์ ๋ ์ ํ๋ณ๋ก. ์ฌ์ค, ์ ๋ค๋ฆญ ๋์์ธ ์ฑ ์์ ํ ์ฅ์ ๊บผ๋ด ์ธํฐํ์ด์ค ๋ธ๋ก์ ์ฒซ ๋ฒ์งธ ์ค์ ํ์ ์ ์ฝ ์กฐ๊ฑด์ ๋ง๋ ๊ฒฝ์ฐ:
type intOrFloat64 interface{ type int, float64 }
๊ทธ๋ฌ๋ฉด ์ ํค์๋(์: restrict
)๊ฐ ์ ํ ํ์ํ์ง ์์ผ๋ฏ๋ก ์์ ํ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋ฉ๋๋ค. ์ฌ์ ํ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ ๋ฉ์๋๊ฐ ์ง์ ๋ ๋ชจ๋ ํ์์์ ์ง์๋์ง ์์ผ๋ฉด ์ปดํ์ผ ์๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ ํ๋ ์ธํฐํ์ด์ค ์ ํ์ ๋ณ์์ ๊ฐ์ ํ ๋นํ๋ ๋ฐ ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. RHS์ ๊ฐ ์ ํ(๋๋ ์ ํ์ด ์ง์ ๋์ง ์์ ๋ฆฌํฐ๋ด์ ๊ธฐ๋ณธ ์ ํ)์ด ์ง์ ๋ ์ ํ ์ค ํ๋์ ์ ํํ ์ผ์นํ์ง ์์ผ๋ฉด ๋จ์ํ ์ปดํ์ผ๋์ง ์์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋:
var v1 intOrFloat64 = 1 // compiles, dynamic type int
var v2 intOrFloat64 = 1.0 // compiles, dynamic type float64
var v3 intOrFloat64 = 1 + 2i // doesn't compile, complex128 is not a specified type
์ง์ ๋ ์ ํ๊ณผ ์ผ์นํ์ง ์๋ ์ ํ ์ ํ์ ๊ฒฝ์ฐ ์ปดํ์ผ ์๊ฐ ์ค๋ฅ๊ฐ ๋๊ณ ์์ ์ฑ ๊ฒ์ฌ๊ฐ ๊ตฌํ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ํ๋ ์ธํฐํ์ด์ค ๊ฐ์ ์ค๋๋ ๊ณผ ๊ฐ์ ๋์ ์ ํ ๊ฐ์ผ๋ก ๋ณํํ๋ ค๋ฉด ์ ํ ์ด์ค์ ์ด ์ฌ์ ํ ํ์ํฉ๋๋ค.
0 ๊ฐ์ ์ด ์ ๊ทผ ๋ฐฉ์์์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ์ ํ๋ ์ธํฐํ์ด์ค์ 0 ๊ฐ์ nil
(ํ์ฌ ์๋ฌด๊ฒ๋ ํฌํจํ์ง ์์์ ์๋ฏธ)์ด๊ณ ์ง์ ๋ ์ ํ์ ๋ฌผ๋ก ๋ด๋ถ์ ์ผ๋ก ์์ฒด 0 ๊ฐ์ ๊ฐ์ง๋ฉฐ nil
nilable ์ ํ์ ๊ฒฝ์ฐ.
์ด ๋ชจ๋ ๊ฒ์ด ๋์๊ฒ ์๋ฒฝํ๊ฒ ์คํ ๊ฐ๋ฅํ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์์ ๋งํ๋ฏ์ด ์ปดํ์ผ ์๊ฐ์ ์์ ์ฑ์ ์ถ๊ฐ ๋ณต์ก์ฑ์ ๊ฐ์น๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ด ์์ ์ ํ๋ก๊ทธ๋๋ฐ์์ ํฉ ์ ํ์ ํ์์ฑ์ ์ค์ ๋ก ๋๊ปด๋ณธ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์์ฌ์ด ๋ญ๋๋ค.
IIUC ์ ๋ค๋ฆญ์ ๋์ ์ ํ์ด ์๋๋ฏ๋ก ์ด ์์ ์ ์ ํจํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ธํฐํ์ด์ค๊ฐ ๊ณ์ฝ์ผ๋ก ์๋ํ๋๋ก ํ์ฉ๋๋ฉด(๋๋ ์์ฌ์ค๋ฝ์ต๋๋ค) sumtypes์ ๋ํ ์ฒ ์ ํ ๊ฒ์ฌ ๋ฐ ์ด๊ฑฐํ์ ํด๊ฒฐํ์ง ๋ชปํ ๊ฒ์ ๋๋ค.
@alanfo , @Merovius ํํธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด ๋ ผ์๊ฐ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์๋ค๋ ๊ฒ์ด ํฅ๋ฏธ๋กญ์ต๋๋ค.
๋๋ ์ ์ ๋์ ๊ด์ ์ ๋ฐ๊พธ๋ ๊ฒ์ ์ข์ํฉ๋๋ค. ์์์ ์ธ๊ธํ ์ ํ ์ ํ์ ํ์ฉํ๋ ๋งค๊ฐ๋ณ์ํ๋ ์ธํฐํ์ด์ค๋ก ๊ณ์ฝ์ ์์ ํ ๋์ฒดํ ์ ์๋ ์ด์ ๋ฅผ ์ดํดํ๋ ค๊ณ ํฉ๋๋ค. ํ์ฌ๋ก์๋ ๊ทธ๋ฌํ "ํฉ๊ณ" ์ธํฐํ์ด์ค ์ ํ์ด "ํฉ๊ณ" ์ ํ์ผ๋ก ์ฌ์ฉ๋ ๋ ๊ฐ๋ฅํ ๋์ ๊ฐ์ ์ธํฐํ์ด์ค์ ์ด๊ฑฐ๋ ์ ํ์ผ๋ก ์ ํํ ์ ํํ๊ธฐ๋ฅผ ์ํ๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ์ด์ ๊ฐ ์์ต๋๋ค. ๋์ผํ ์ธํฐํ์ด์ค๊ฐ ๊ณ์ฝ ์์น์ ์ฌ์ฉ๋์์ต๋๋ค. ์ธํฐํ์ด์ค์ ์ด๊ฑฐ ์ ํ์ ํฉ๋ฆฌ์ ์ผ๋ก ์ ์ฉํ ์ผ๋ฐ ์ ํ์ด ๋๊ธฐ ์ํด ๊ธฐ๋ณธ ์ ํ์ผ๋ก ์ ๊ณต๋์ด์ผ ํฉ๋๋ค.
@๊ตฟ์์ธ
๋๋ ์ ๋ค๋ฆญ ๋์์ธ์ด ํฉ๊ณ ์ ํ์ผ๋ก ์ํํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ๋ค๋ฃฐ ๊ฒ์ด๋ผ๊ณ ์ ์ํ์ง ์์์ต๋๋ค. @Merovius ๊ฐ ๊ทธ์ ๋ง์ง๋ง ๊ฒ์๋ฌผ์์ ๋ช
ํํ๊ฒ ์ค๋ช
ํ๋ฏ์ด ๊ทธ๋ ์ง ์์ ๊ฒ์
๋๋ค. ํนํ ์ ๋ค๋ฆญ์ ๋ํด ์ ์๋ ํ์ ์ ์ฝ ์กฐ๊ฑด์ ๊ธฐ๋ณธ ์ ๊ณต ํ์๊ณผ ์ด ํ์์์ ํ์๋ ํ์๋ง ๋ค๋ฃน๋๋ค. ํํ์ ๊ด์ ์์ ์ ์๋ ๋๋ฌด ์ข๊ณ ํ์๋ ๋๋ฌด ๋๋ค.
๊ทธ๋ฌ๋ ์ ๋ค๋ฆญ ๋์์ธ์ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์ํํ ์ ํ๋ ์ ํ ์งํฉ์์ ์๋ํ๋ ํจ์๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ ์ด๋ ํ์ฌ๋ก์๋ ์ ํ ํ ์ ์๋ ๊ฒ์ ๋๋ค.
์ ํ๋ ์ธํฐํ์ด์ค์ ๊ดํ ํ ์ปดํ์ผ๋ฌ๋ ์ฌ์ฉํ ์ ์๋ ์ ํํ ์ ํ์ ์๊ณ ์์ผ๋ฏ๋ก ์ ํ switch ๋ฌธ์์ ์ฒ ์ ํ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง๋๋ค.
@๊ทธ๋ฆฌ์ ๋จธ
์ ๋ค๋ฆญ ๋์์ธ ๋ฌธ์ ์ด์์ด ("๊ณ์ฝ ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ " ์น์ ์์) ์ ๋ค๋ฆญ ์ ์ฝ ์กฐ๊ฑด์ ํํํ๋ ๋ฐ ์ ์๋ณด๋ค ํ์๊ฐ ๋ ๋์ ์๋จ์ผ๋ก ๊ฐ์ฃผ๋๋ ์ด์ ๋ฅผ ๋งค์ฐ ๋ช ํํ๊ฒ ์ค๋ช ํ๋ค๊ณ ์๊ฐํ๋ฉด์ ๋น์ ์ด ๋งํ๋ ๊ฒ์ ์์ํดํฉ๋๋ค.
ํนํ, ๊ณ์ฝ์ ํ์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ํํํ ์ ์์ผ๋ฏ๋ก ๋จ์ผ ๊ณ์ฝ๋ง ํ์ํฉ๋๋ค. ๋ชจ๋ ์ ํ ๋งค๊ฐ๋ณ์๋ ๊ณ์ฝ์ ๋์ด๋ ๋ฉ์๋์ ์์ ์ ์ ํ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋งค๊ฐ๋ณ์ํ ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ธํฐํ์ด์ค์ ๋ํด์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ ์ฝ ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ ๊ฐ ์ ํ ๋งค๊ฐ๋ณ์์ ๋ณ๋์ ์ธํฐํ์ด์ค๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ํ ์์ ์์ ๋ณผ ์ ์๋ฏ์ด ๋ถ๊ฐ๋ฅํ์ง๋ ์์ง๋ง ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ํํํ๋ ๊ฒ์ด ๋ ์ด์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ธํฐํ์ด์ค์ ์ ํ ์ ์ฝ ์กฐ๊ฑด์ ์ถ๊ฐํ ๋ค์ ์ผ๋ฐ ๋ฐ ํฉ๊ณ ์ ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ์ฌ "ํ ๋๋ก ๋ ๋ง๋ฆฌ์ ์๋ฅผ ์ฃฝ์ผ" ์ ์๋ค๊ณ ์๊ฐํ๋ค๋ฉด (๋น์ ์ด ์ธ๊ธํ ๋ฌธ์ ๋ ๋ณ๋๋ก) ์ ์๊ฐ์๋ ์๋ง๋ ์ด๊ฒ์ด ๊ธฐ์ ์ ์ผ๋ก ์คํ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด ์ณ์ ๊ฒ์ ๋๋ค.
์ธํฐํ์ด์ค ์ ํ ์ ์ฝ ์กฐ๊ฑด์ด ์ ๋ค๋ฆญ์ ๊ดํ ํ '๋ด์ฅ๋์ง ์์' ์ ํ์ ํฌํจํ ์ ์๋์ง ์ฌ๋ถ๋ ์ค์ ๋ก ์ค์ํ์ง ์์ง๋ง ์ ํํ ์ ํ(๋ฐ ํ์ ์ ํ์ด ์๋)์ผ๋ก ์ ํํ๊ธฐ ์ํด ์ด๋ค ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋์ ๊ทธ๋ค์ ํฉ๊ณ ์ ํ์ ์ ํฉํฉ๋๋ค. ํ์ฌ ํค์๋๋ฅผ ๊ณ์ ์ฌ์ฉํ๋ ค๋ฉด ํ์์ const type
๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค(๋๋ const
).
@griesemer ๋งค๊ฐ๋ณ์ํ๋ ์ธํฐํ์ด์ค ์ ํ์ด ๊ณ์ฝ์ ์ง์ ๋์ฒดํ์ง ๋ชปํ๋ ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค.
์ ํ ๋งค๊ฐ๋ณ์๋ ๋ค๋ฅธ ๋งค๊ฐ๋ณ์ํ๋ ์ ํ๊ณผ ๋์ผํฉ๋๋ค.
์ ๊ฐ์ ์ ํ์ผ๋ก
type C2(type T C1) interface { ... }
์ ํ ๋งค๊ฐ๋ณ์ T
๋ ์ธํฐํ์ด์ค ์์ฒด ์ธ๋ถ์ ์กด์ฌํฉ๋๋ค. T
๋ก ์ ๋ฌ๋ ๋ชจ๋ ์ ํ ์ธ์๋ C1
๊ณ์ฝ์ ์ถฉ์กฑํ๊ธฐ ์ํด ์ด๋ฏธ ์๋ ค์ ธ ์์ด์ผ ํ๋ฉฐ ์ธํฐํ์ด์ค์ ๋ณธ๋ฌธ์ T
๋ ์ด์ ์ ํํ ์ ์์ต๋๋ค. ์ด๋ ์ ๋ฌ๋ ๊ฒฐ๊ณผ๋ก ๊ณ์ฝ ๋ณธ๋ฌธ์ ์ํด ์ ์ฝ์ ๋ฐ๋ ๊ณ์ฝ ๋งค๊ฐ๋ณ์์ ๋ค๋ฆ
๋๋ค. ์ด๋ ํจ์์ ๋ํ ๊ฐ ์ ํ ๋งค๊ฐ๋ณ์๊ฐ ๋ค๋ฅธ ์ ํ ๋งค๊ฐ๋ณ์์ ์ ์ฝ ์กฐ๊ฑด์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๊ธฐ ์ ์ ๋
๋ฆฝ์ ์ผ๋ก ์ ์ฝ๋์ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
์ธํฐํ์ด์ค ๋ณธ๋ฌธ์ ์์ ๊ธฐ ์ ํ์ ์ด๋ฆ์ ์ง์ ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ด์ผ ํฉ๋๋ค.
type C3(type U C1) interface(T) {
Add(T) T
}
์ฌ๊ธฐ์ T
๋ ์์ ๊ธฐ ์ ํ์ ๋ํ๋
๋๋ค.
์ผ๋ถ ์ธํฐํ์ด์ค ์ ํ์ ์ ๋ค๋ฆญ ์ ์ฝ ์กฐ๊ฑด์ ์ถฉ์กฑํ์ง ์์ต๋๋ค.
์์ ๊ธฐ ์ ํ์ ์ฌ๋ฌ ๊ฐ์ ์์กดํ๋ ์์
์ ๋์ ๋์คํจ์น์ ํธํ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ์์
์ ์ธํฐํ์ด์ค ๊ฐ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ์ธํฐํ์ด์ค๊ฐ ์์ฒด๋ฅผ ๋ง์กฑํ์ง ์์์ ์๋ฏธํฉ๋๋ค(์: ๋์ผํ ์ธํฐํ์ด์ค๋ก ์ ํ๋๋ ์ ํ ๋งค๊ฐ๋ณ์์ ๋ํ ์ ํ ์ธ์๋ก). ์ด๊ฒ์ ๋๋ผ์ด ๊ฒ์
๋๋ค. ํ ๊ฐ์ง ํด๊ฒฐ์ฑ
์ ๊ทธ๋ฌํ ์ธํฐํ์ด์ค์ ๋ํ ์ธํฐํ์ด์ค ๊ฐ ์์ฑ์ ์ ํ ํ์ฉํ์ง ์๋ ๊ฒ์ด์ง๋ง, ์ด๋ ์ด์จ๋ ์ฌ๊ธฐ์์ ๊ตฌ์ ์ค์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค.
๊ธฐ๋ณธ ์ ํ ์ ์ฝ ์กฐ๊ฑด๊ณผ ์ ํ ID ์ ์ฝ ์กฐ๊ฑด์ ๊ตฌ๋ณํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ์๋ํ ์ ์๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ์ ์ฝ ์กฐ๊ฑด์ ์ ์ํ ์ ์๋ค๊ณ ์์ํด๋ณด์ญ์์ค.
contract (T) indenticalTo(U) {
*T *U
}
(์ฌ๊ธฐ์ ์ ๋ ๋ฐ๋ช ๋ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ๋จ์ผ ์ ํ์ "์์ ์"๋ก ์ง์ ํ๊ณ ์์ต๋๋ค. ์์ ์๊ฐ ์๋ func๊ฐ "๋ฉ์๋"๋ก ๋ฐ์๋๋ ๊ฒ์ฒ๋ผ ๋ช ์์ ์์ ์ ์ ํ์ด ์๋ ๊ณ์ฝ์ "์ ์ฝ์กฐ๊ฑด"์ผ๋ก ๋ฐ์ํ๊ฒ ์ต๋๋ค. ์ปจํธ๋ํธ ์ด๋ฆ ๋ค์ ๋งค๊ฐ๋ณ์๋ ์ผ๋ฐํ ๋งค๊ฐ๋ณ์๋ก, ์ ์ฝ ๋ณธ๋ฌธ์์ ์ ์ฝ ์กฐ๊ฑด ์ ์ ์ผ์ชฝ์ ๋ํ๋ ์ ์์ต๋๋ค.)
๋ฆฌํฐ๋ด ํฌ์ธํฐ ์ ํ์ ๊ธฐ๋ณธ ์ ํ์ด ์์ฒด์ด๊ธฐ ๋๋ฌธ์ ์ด ์ ์ฝ ์กฐ๊ฑด์ T
๊ฐ U
๋์ผํจ์ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ ์ ์ฝ ์กฐ๊ฑด์ผ๋ก ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ (identicalTo(int)), (identicalTo(uint)), ...
๋ฅผ ์ ์ฝ ์กฐ๊ฑด ๋ถ๋ฆฌ๋ก ์ธ ์ ์์ต๋๋ค.
๊ณ์ฝ์ ์ผ์ข ์ ํฉ๊ณ ์ ํ์ ํํํ๋ ๋ฐ ์ ์ฉํ ์ ์์ง๋ง ์ผ๋ฐ์ ์ธ ํฉ๊ณ ์ ํ์ ํํํ ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด์์์ ๋ณธ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ๊ตฌ์ฒด์ ์ธ ์ ํ์ ๋์ดํด์ผ ํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
contract Foo(T, U) {
T U, int64
}
์๋ ค์ง์ง ์์ ์ ํ๊ณผ ํ๋ ์ด์์ ์๋ ค์ง ์ ํ์ ์ผ๋ฐ ํฉ๊ณ ์ ํ์ ํํํด์ผ ํ๋ ๊ฒ์ ๋ฌด์์ ๋๊น? ๋์์ธ์ด ๊ทธ๋ฌํ ๊ตฌ์ฑ์ ํ์ฉํ๋๋ผ๋ ๋ ๋งค๊ฐ๋ณ์๊ฐ ์ฌ์ค์ ๊ฐ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ด์ํ๊ฒ ๋ณด์ผ ๊ฒ์ ๋๋ค.
์ธํฐํ์ด์ค๊ฐ ์ ํ ์ ์ฝ ์กฐ๊ฑด์ ํฌํจํ๋๋ก ํ์ฅ๋ ๋ค์ ๋์์ธ์์ ๊ณ์ฝ์ ๋์ฒดํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ด์ ์ ๋ค๋ฆญ ๋์์ธ์ด ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋ ์ง์ ๋ํด ์ข ๋ ์๊ฐํ์ต๋๋ค.
๋ค๋ฅธ ์์ ์ ํ ๋งค๊ฐ๋ณ์๋ฅผ ๊ณ ๋ คํ๋ฉด ์ํฉ์ ๋ถ์ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ฌ์ธ ๊ฒ์ ๋๋ค.
๋งค๊ฐ๋ณ์ ์์
๋ณ๊ฒฝ ์์ :)
ํ๋์ ๋งค๊ฐ๋ณ์
์ฌ๊ธฐ์๋ ์ค์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋งค๊ฐ๋ณ์ํ๋ ์ธํฐํ์ด์ค(์ผ๋ฐ์ด ์๋ ๊ฒ๊ณผ ๋์กฐ์ ์ผ๋ก)๋ ์ธํฐํ์ด์ค๋ฅผ ์ธ์คํด์คํํ๊ธฐ ์ํด ์ฐธ์กฐ๋๋ ์ ํ ๋งค๊ฐ๋ณ์ ๋ฐ/๋๋ ๋ค๋ฅธ ๋ ๋ฆฝ์ ์ธ ๊ณ ์ ์ ํ์ด ํ์ํ ๊ฒฝ์ฐ์๋ง ํ์ํฉ๋๋ค.
๋ ๊ฐ ์ด์์ ๋งค๊ฐ๋ณ์
์ด์ ์ ์ธ๊ธํ๋ฏ์ด ๊ฐ ์ ํ ๋งค๊ฐ๋ณ์๋ ์ ์ฝ ์กฐ๊ฑด์ด ์ ํ ํ์ํ์ง ์์ ๊ฒฝ์ฐ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ฝ๋์ด์ผ ํฉ๋๋ค.
๋งค๊ฐ๋ณ์ํ๋ ์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ง ํ์ํฉ๋๋ค.
์์ ์ ์ฐธ์กฐํ๋ ํ์ ๋งค๊ฐ๋ณ์์ ๋๋ค.
์ธํฐํ์ด์ค๊ฐ ์ ํ ๋งค๊ฐ๋ณ์ ์น์ ์์ _์ด๋ฏธ ์ ์ธ๋_ ๋ค๋ฅธ ์ ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐธ์กฐํ์ต๋๋ค(์ฌ๊ธฐ์ ์ญ์ถ์ ํ๊ณ ์ถ์ง ์์ ๊ฒ์ ๋๋ค).
์ธํฐํ์ด์ค๋ฅผ ์ธ์คํด์คํํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ๋ค๋ฅธ ๋ ๋ฆฝ์ ์ธ ๊ณ ์ ์ ํ์ด ํ์ํ์ต๋๋ค.
์ด ์ค (2)๋ ๊ทธ๋ํ ์์ ์์์ ๊ฐ์ด ์๋ก ์ฐธ์กฐํ๋ ์ ํ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐฐ์ ํ๋ฏ๋ก ์ค์ ๋ก ์ ์ผํ ๊ณจ์นซ๊ฑฐ๋ฆฌ์ ๋๋ค. ํ๋๊ฐ 'Node' ๋๋ 'Edge'๋ฅผ ๋จผ์ ์ ์ธํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ ํ ์ธํฐํ์ด์ค๋ ์ฌ์ ํ ๋ค๋ฅธ ํ๋๊ฐ ์ ํ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋์์ธ ๋ฌธ์์ ํ์๋ ๋๋ก ๋งค๊ฐ๋ณ์ํ๋์ง ์์(์์ ์ ์ฐธ์กฐํ์ง ์๊ธฐ ๋๋ฌธ์) NodeInterface ๋ฐ EdgeInterface๋ฅผ ์ต์์ ์์ค์์ ์ ์ธํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ ์ธ ๋ช ๋ น. ๊ทธ๋ฐ ๋ค์ ์ด๋ฌํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ Graph ๊ตฌ์กฐ์ฒด์ ํ์ ๋งค๊ฐ๋ณ์์ ์ฐ๊ฒฐ๋ 'New' ๋ฉ์๋์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๊ณ์ฝ ์์ด๋์ด๊ฐ ๋ ๋ซ๋ค๊ณ ํด๋ ์ฌ๊ธฐ์ ๊ทน๋ณตํ ์ ์๋ ๋ฌธ์ ๋ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๋ง๋ comparable
๋ ์ด์ ๊ณ์ฝ์ด ์๋ ๋ด์ฅ ์ธํฐํ์ด์ค๊ฐ ๋ ์ ์์ต๋๋ค.
๋ฌผ๋ก ์ธํฐํ์ด์ค๋ ์ด๋ฏธ ๊ฐ๋ฅํ ๊ฒ์ฒ๋ผ ์๋ก ๋ด์ฅ๋ ์ ์์ต๋๋ค.
์ธํฐํ์ด์ค ๋ฉ์๋์ ๋ํ ์์ ๊ธฐ๋ฅผ ์ง์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ํฌ์ธํฐ ๋ฉ์๋ ๋ฌธ์ (๊ณ์ฝ์ ์ง์ ํด์ผ ํ๋ ๊ฒฝ์ฐ)๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํฌ์ธํฐ ๋ฉ์๋๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์ผ๋ถ ํน์ ๊ตฌ๋ฌธ(์: ๋ฉ์๋ ์ด๋ฆ ์์ ๋ณํ ํ์)์ด ํ์ํ ์ ์์ต๋๋ค.
์ด์ @stevenblenkinsop ์ ๊ด์ฐฐ๋ก ์ง์ง ๊ถ๊ธํฉ๋๋ค. ์ด์จ๋ ๋๊ตฐ๊ฐ๊ฐ ํฉ๋ฆฌ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์๊ฐํ ์ ์๋ค๋ฉด ์ด๊ฒ์ด ์ ๋ง๋ก ์ ์ฉํ ๊ธฐ๋ฅ์ธ์ง ํ์ ํ ์ ์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ผ๋ถ ์ธํฐํ์ด์ค ์ ํ์ด ์ ๋ค๋ฆญ ์ ์ฝ ์กฐ๊ฑด์ ์ถฉ์กฑํ์ง ๋ชปํ๋ค๋ ์ฌ์ค์ด ๋๋์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ธํฐํ์ด์ค ์ ํ์ ์ด๋ค ๊ฒฝ์ฐ์๋ ์ ํจํ ์์ ์ ์ ํ์ด ์๋๋ฏ๋ก ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
ํจ์์ ๋ด์ฅ๋ sameTo()์ ๋ํ Steven์ ์์ด๋์ด๋ ํจ๊ณผ๊ฐ ์์ง๋ง ํฉ๊ณ ์ ํ์ ์ง์ ํ๋ ๊ฒ์ ์ ์ฌ์ ์ผ๋ก ์ฅํฉํ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ ํ์ ์ ์ฒด ํ์ ์ ํํ ๊ฒ์ผ๋ก ์ง์ ํ ์ ์๋ ๊ตฌ๋ฌธ์ ์ ํธํฉ๋๋ค.
๋ฌผ๋ก @urandom ์ ํ์ฌ ์ ๋ค๋ฆญ ์ด์์ด ์กด์ฌํ๋ฏ๋ก ๊ตฌ์ฒด์ ์ธ(๋ด์ฅ ๋๋ ์ง๊ณ ๋ด์ฅ) ์ ํ๋ง ๋์ดํ ์ ์๋ค๋ ๊ฒ์ด ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ค๋ฆญ ๋ฐ ํฉ๊ณ ์ ํ ๋ชจ๋์ ๋ํด ์ ํ๋ ์ธํฐํ์ด์ค๊ฐ ๋์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ด๋ ๋ถ๋ช ํ ๋ณ๊ฒฝ๋์ด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ํตํฉ ํ๊ฒฝ์์ ํ์ฉ๋๋ค๋ ์ ์ ๋ฐฐ์ ํ์ง ์์ต๋๋ค.
interface Foo(T) {
const type T, int64 // 'const' indicates types are exact i.e. no derived types
}
์ ์ฐ๋ฆฌ๋ Discriminated Unions์ ๋ถ์ฌ์ ๋ํ ๋ ๋ค๋ฅธ ์ฐ์ฑ ์ ๋ฐ๋ช ํ๋ ๋์ ์ธ์ด์ Discriminated Unions๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๊น?
@griesemer ๋น์ ์ ์๊ณ ์์ ์๋ ์๊ณ ๋ชจ๋ฅผ ์๋ ์์ง๋ง, ์ ๋ ์ฒ์๋ถํฐ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฝ ์กฐ๊ฑด์ ์ง์ ํ๋ ๋ฐ ์ฐฌ์ฑํ์ต๋๋ค. :) ์ ๋ ๋ ์ด์ ๊ทธ ๊ฒ์๋ฌผ์์ ์ ๊ธฐํ ์ ํํ ์์ด๋์ด๊ฐ ๊ฐ ๊ธธ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค(ํนํ ์ฌ๋ฌผ ๋๋ ์ฐ์ฐ์๋ฅผ ๋ค๋ฃฐ ๊ฒ์ ์ ์ํ๋ค). ๊ทธ๋ฆฌ๊ณ ์ ๋ ๊ฐ์ฅ ์ต๊ทผ์ ๋ฐ๋ณต๋ ๊ณ์ฝ ๋์์ธ์ด ์ด์ ๋ฒ์ ๋ณด๋ค ํจ์ฌ ๋ ๋ง์์ ๋ญ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฝ ์กฐ๊ฑด์ผ๋ก์์ (ํ์ฅ ๊ฐ๋ฅ์ฑ์ด ์๋) ์ธํฐํ์ด์ค๊ฐ ์คํ ๊ฐ๋ฅํ๊ณ ๊ณ ๋ คํ ๊ฐ์น๊ฐ ์๋ค๋ ๋ฐ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค.
@urandom
๋๋ ๋น์ ์ด ๊ทธ๊ฒ๋ค๋ก ์ผ๋ฐ์ ์ธ ํฉ๊ณ ์ ํ์ ํํํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ ์์ ์ "ํฉ ์ ํ์ ๋ง๋ค ์ ์์ต๋๋ค"๊ฐ ์๋๋ผ "ํฉ ์ ํ์ด ๊ทธ ์ ํ์ผ๋ก ํด๊ฒฐํ๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค"๋ผ๋ ์ ์ ๋ค์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. ๋ฌธ์ ์ค๋ช ์ด "ํฉ๊ณ ์ ํ์ ์ํฉ๋๋ค"์ธ ๊ฒฝ์ฐ ํฉ๊ณ ์ ํ์ด ์ ์ผํ ์๋ฃจ์ ์ด๋ผ๋ ๊ฒ์ ๋๋ผ์ด ์ผ์ด ์๋๋๋ค. ๋๋ ๋จ์ํ ๋น์ ์ด ๊ทธ๋ค๊ณผ ํจ๊ป ํด๊ฒฐํ๊ณ ์ถ์ ๋ฌธ์ ์ ์ด์ ์ ๋ง์ถ๋ค๋ฉด ๊ทธ๊ฒ๋ค ์์ด๋ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ํํํ๊ณ ์ถ์์ต๋๋ค.
@alanfo
๊ทธ๋ํ ์์ ์์ ๋ณผ ์ ์๋ฏ์ด ๋ถ๊ฐ๋ฅํ์ง๋ ์์ง๋ง ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ํํํ๋ ๊ฒ์ด ๋ ์ด์ํฉ๋๋ค.
"์ด์ํ๋ค"๋ ๊ฒ์ ์ฃผ๊ด์ ์ธ ๊ฒ ๊ฐ์์. ๊ฐ์ธ์ ์ผ๋ก ๋งค๊ฐ๋ณ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ฐ์ค๋ฝ๊ณ ๊ทธ๋ํ ์์ ๊ฐ ๋งค์ฐ ์ข์ ์๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋์๊ฒ ๊ทธ๋ํ๋ ์ผ์ข ์ ์์ง์ ์ผ์ข ์ ๋ ธ๋ ์ฌ์ด์ ๊ด๊ณ๊ฐ ์๋๋ผ ์ํฐํฐ์ ๋๋ค.
๊ทธ๋ฌ๋ TBH, ๋๋ ๊ทธ๋ค ์ค ์ด๋ ๊ฒ๋ ์ ๋ง๋ก ๋ค์ ์ด์ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋น์ ์ ๊ฑฐ์ ๋๊ฐ์ ๊ฒ์ ํํํ๊ธฐ ์ํด ๊ฑฐ์ ๋๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ FWIW ์๋ ์ด์ ๋ํ
@stevenblenkinsop
์ธํฐํ์ด์ค ๋ณธ๋ฌธ์ ์์ ๊ธฐ ์ ํ์ ์ด๋ฆ์ ์ง์ ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ usage-site์์ type-arguments๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ฆ
type Adder(type T) interface {
Add(t T) T
}
func Sum(type T Adder(T)) (vs []T) T {
var t T
for _, v := range vs {
t = t.Add(v)
}
return t
}
์ด๊ฒ์ ํตํฉ์ด ์๋ํ๋ ๋ฐฉ์์ ๋ํด ์ฝ๊ฐ์ ์ฃผ์๊ฐ ํ์ํ๋ฏ๋ก ์์ฒด ์ฐธ์กฐ ์ ํ ๋งค๊ฐ๋ณ์๋ฅผ ํ์ฉํ ์ ์์ง๋ง ์๋ํ๋๋ก ๋ง๋ค ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋น์ ์ 1.๊ณผ 3. ๋๋ ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ธ์ ํด์ผํฉ๋๋ค. ๋๋ ๋ช ๊ฐ์ง ๊ตฌ์ฒด์ ์ธ ์์์ ์ด์ต์ ์ป์ ๊ฒ์ ๋๋ค.
์ด์จ๋ , ์ด ๋ ผ์๋ฅผ ๊ณ์ํ๋ ๋ง์ง๋ง์ ์ด๊ฒ์ ์ญ์ ํ๋ ๊ฒ์ ๋ค์ ์ ์งํ์ง ์์ง๋ง, ์ด๊ฒ์ ์๋ง๋ ์ ๋ค๋ฆญ ๋์์ธ์ ์ธ๋ถ ์ฌํญ์ ํตํด ์ด์ผ๊ธฐํ๋ ์ฌ๋ฐ๋ฅธ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ๋๋ค. ์ด๋ฒ ํธ์ ๋์์ธ ๊ณต๊ฐ์ ์กฐ๊ธ ๋ ๋ํ๊ธฐ ์ํด ๊ฐ์ ธ์์ต๋๋ค. :) ํํ ์ ํ์ ๋ํ ํ ๋ก ์ ์๋ก์ด ์์ด๋์ด๊ฐ ๋์จ์ง ๊ฝค ์ค๋ ๋ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค.
```go switch task { case tasks.SearchAdd: // task is tasks.SearchAdd in this scope case tasks.SearchUpdate: case tasks.SearchDelete: }
Go๊ฐ ํ์ฌ ์ํ์์ ํ์ฉํ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ณด๋ค ํจ์ฌ ๋ Goish ์ ์ ์ด ๋ ๊ฒ์ ๋๋ค. Haskellish ํจํด ๋งค์นญ์ด ํ์ํ์ง ์์ผ๋ฉฐ ํน์ ์ ํ๊น์ง juist ๋ค์ด๋นํ๋ฉด ์ถฉ๋ถํฉ๋๋ค.
๋๋ ์์ ๋ณ์์ ์๋ฏธ๋ฅผ ์กฐ์ํ๋ ๊ฒ์ด ํ์ฉ๋์ง๋ง ์ข์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.๊ทธ๋ผ ๋ฐฉ๋ฌธ์ ์ฌ๋ฌ๋ถ์ ๊ฑด์น์ ๋น๋๋ค.
์ ๊ทธ ํจํด ๋งค์นญ์ Go์์ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๊น? ํจํด ์ผ์น์ ์๊ฐ ๋ถ์กฑํ๋ฉด ์๋ฅผ ๋ค์ด Rust๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
@Merovius re: "๋์๊ฒ ๊ทธ๋ํ๋ ์ํฐํฐ์ ๋๋ค"
์ปดํ์ผ ํ์ ์ํฐํฐ์ ๋๊น ์๋๋ฉด ๋ฐํ์์ ํํ์ด ์์ต๋๊น? ๊ณ์ฝ๊ณผ ์ธํฐํ์ด์ค์ ์ฃผ์ ์ฐจ์ด์ ์ค ํ๋๋ ์ธํฐํ์ด์ค๊ฐ ๋ฐํ์ ๊ฐ์ฒด๋ผ๋ ๊ฒ์ ๋๋ค. ๊ฐ๋น์ง ์์ง์ ์ฐธ์ฌํ๊ณ ๋ค๋ฅธ ๋ฐํ์ ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ ๋ฑ์ ๊ฐ์ต๋๋ค. ๊ณ์ฝ์์ ์ธํฐํ์ด์ค๋ก ๋ณํํ๋ ๊ฒ์ ํฌํจ๋ ๋ ธ๋/๊ผญ์ง์ (๋ช ๊ฐ)์ ๋ํ ํฌ์ธํฐ๊ฐ ์๋ ์๋ก์ด ์์ ๋ฐํ์ ๊ฐ์ฒด๋ฅผ ๋์ ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๊ทธ๋ํ ํจ์ ๋ชจ์์ด ์์ ๋ ์ด์ํด ๋ณด์ ๋๋ค. ํจ์์ ํ์์ ๋ฐ๋ผ ์์ฒด ๋ฐฉ์์ผ๋ก ๊ทธ๋ํ์ ๋ค์ํ ๋ถ๋ถ์ ๊ฐ๋ฆฌํค๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
"๊ทธ๋ํ"๊ฐ ๊ฐ์ฒด์ฒ๋ผ ๋ณด์ด๊ณ ๊ณ์ฝ์ด ์ค์ ๋ก ํน์ ํ์ ๊ทธ๋ํ๋ฅผ ์ง์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ณ์ฝ์ "๊ทธ๋ํ"๋ฅผ ์ฌ์ฉํ๋ฉด ์ง๊ด์ด ์๋ชป ์ธ๋๋ ์ ์์ต๋๋ค. ์ํ์ด๋ ๋ฒ๋ฅ ์์์ ๊ฐ์ด ๋์ค์ ์ฌ์ฉํ ์ฉ์ด ์งํฉ์ ์ ์ํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ๊ทธ๋ํ ๊ณ์ฝ๊ณผ ๊ทธ๋ํ ์ธํฐํ์ด์ค๋ฅผ ๋ชจ๋ ์ํ ์ ์์ผ๋ฏ๋ก ์ฑ๊ฐ์ ์ด๋ฆ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋จธ๋ฆฌ ์๋ก ๋ ์ข์ ์ด๋ฆ์ด ์๊ฐ๋์ง ์์ต๋๋ค.
์ด์ ๋์กฐ์ ์ผ๋ก ํ๋ณ๋ ๊ณต์ฉ์ฒด๋ ๋ฐํ์ ๊ฐ์ฒด์ ๋๋ค. ๊ตฌํ์ ์ ํํ์ง ์์ผ๋ฉด์ ๊ทธ๊ฒ๋ค์ ๋ฐฐ์ด์ด ์ด๋จ์ง ์๊ฐํด์ผ ํฉ๋๋ค. N๊ฐ ํญ๋ชฉ ๋ฐฐ์ด์๋ N๊ฐ์ ํ๋ณ์์ N๊ฐ์ ๊ฐ์ด ํ์ํ๋ฉฐ ์ํํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. (Julia๋ ๋๋๋ก ํ๋ณ์์ ๊ฐ์ ๋ณ๋์ ๋ฐฐ์ด์ ๋ฃ๋ ํฅ๋ฏธ๋ก์ด ํํ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.)
interface{}
์ฒด๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ๋ชจ๋ ๊ณณ์์ ๋ฐ์ํ๋ ์ค๋ฅ์ ๊ฐ์๋ฅผ ์ ์ํ์ง๋ง |
์ฐ์ฐ์์ ์ฐ์ ์
๋ ฅ์ ์ ๊ฑฐํ๋ ค๋ฉด ๋ค์์ ์ ์ํฉ๋๋ค.
type foobar union {
int
float64
}
๋ง์ interface{}
๋ฅผ ์ด๋ฐ ์ข
๋ฅ์ ์์ ์ผ๋ก ๋์ฒดํ๋ ์ ์ค ์ผ์ด์ค๋ง์ผ๋ก๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฒญ๋ ์ด๋์ด ๋ ๊ฒ์
๋๋ค. ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ๊ฒ์ ์ ๋ฐ๋ง ๋ณด๋ฉด ์ด๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ์ ๋ฌธ์ : ์ ๋น์ ์์ ์ค ecdsa.PrivateKey
๋์ *ecdsa.PrivateKey
- ์ฌ๊ธฐ์๋ง ecdsa.PrivateKey๊ฐ ์ง์ํ๋ ์ผ๋ฐ ์ค๋ฅ์
๋๋ค. ์ด๊ฒ๋ค์ด ๋ช
ํํ ๊ณต์ฉ์ฒด ์ ํ์ด์ด์ผ ํ๋ค๋ ๋จ์ํ ์ฌ์ค์ ์ ํ ์์ ์ฑ์ ์๋นํ ์ฆ๊ฐ์ํฌ ๊ฒ์
๋๋ค.
์ด ์ ์์ int|float64
๋นํด ๋ ๋ง์ _๊ณต๊ฐ_์ ์ฐจ์งํ์ง๋ง ์ฌ์ฉ์๊ฐ ์ด์ ๋ํด ์๊ฐํ๊ฒ ํฉ๋๋ค. ์ฝ๋ ๊ธฐ๋ฐ์ ํจ์ฌ ๋ ๊นจ๋ํ๊ฒ ์ ์งํฉ๋๋ค.
interface{}
์ฒด๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ๋ชจ๋ ๊ณณ์์ ๋ฐ์ํ๋ ์ค๋ฅ์ ๊ฐ์๋ฅผ ์ ์ํ์ง๋ง|
์ฐ์ฐ์์ ์ฐ์ ์ ๋ ฅ์ ์ ๊ฑฐํ๋ ค๋ฉด ๋ค์์ ์ ์ํฉ๋๋ค.type foobar union { int float64 }
๋ง์
interface{}
๋ฅผ ์ด๋ฐ ์ข ๋ฅ์ ์์ ์ผ๋ก ๋์ฒดํ๋ ์ ์ค ์ผ์ด์ค๋ง์ผ๋ก๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ฒญ๋ ์ด๋์ด ๋ ๊ฒ์ ๋๋ค. ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ๊ฒ์ ์ ๋ฐ๋ง ๋ณด๋ฉด ์ด๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.๊ฐ์ ๋ฌธ์ : ์ ๋น์ ์์ ์ค
ecdsa.PrivateKey
๋์*ecdsa.PrivateKey
- ์ฌ๊ธฐ์๋ง ecdsa.PrivateKey๊ฐ ์ง์ํ๋ ์ผ๋ฐ ์ค๋ฅ์ ๋๋ค. ์ด๊ฒ๋ค์ด ๋ช ํํ ๊ณต์ฉ์ฒด ์ ํ์ด์ด์ผ ํ๋ค๋ ๋จ์ํ ์ฌ์ค์ ์ ํ ์์ ์ฑ์ ์๋นํ ์ฆ๊ฐ์ํฌ ๊ฒ์ ๋๋ค.์ด ์ ์์
int|float64
๋นํด ๋ ๋ง์ _๊ณต๊ฐ_์ ์ฐจ์งํ์ง๋ง ์ฌ์ฉ์๊ฐ ์ด์ ๋ํด ์๊ฐํ๊ฒ ํฉ๋๋ค. ์ฝ๋ ๊ธฐ๋ฐ์ ํจ์ฌ ๋ ๊นจ๋ํ๊ฒ ์ ์งํฉ๋๋ค.
this(comment)๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ์ ์ ์์ ๋๋ค.
์ค์ ๋ก ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ง ์์ด๋์ด๋ฅผ ์ธ์ด๋ก ์๊ฐํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ADT๋ฅผ ์ํํ๋ ๋ ๊ฐ์ง ๊ธฐ๋ณธ ๋ฐฉ๋ฒ์ ์กด์ฌ๋ก ์ด์ด์ง์ง๋ง ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค.
๊ธฐ๋ฅ, ํนํ ํจํด ์ผ์น์ ๋ํ ์ ์ ์์ ํธํ์ฑ ๋ฐ ์ด์ ์ฝ๋ ๊ธฐ๋ฐ ๊ธฐ๋ฅ์ ์ด์ ์ ํ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ๋ํ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ๋๋ฌด ๊ณผํด๋ณด์ด์ง ์๋์?
๋ํ sum ์ ํ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก nil
๋ฅผ ๊ฐ๋๋ก ํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ๋ชจ๋ ์ค์์น์ nil
์ผ์ด์ค๊ฐ ํ์ํฉ๋๋ค.
ํจํด ๋งค์นญ์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
-- ์ ์ธ
type U enum{
A(int64),
B(string),
}
-- ๋งค์นญ
...
var a U
...
switch a {
case A{b}:
//process b here
case B{b}:
//...
case nil:
//...
}
...
ํจํด ์ผ์น๊ฐ ๋ง์์ ๋ค์ง ์์ผ๋ฉด ์์ Sirkon ์ ์์ ์ฐธ์กฐํ์ญ์์ค.
๋ํ sum ์ ํ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก
nil
๋ฅผ ๊ฐ๋๋ก ํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ๋ชจ๋ ์ค์์น์nil
์ผ์ด์ค๊ฐ ํ์ํฉ๋๋ค.
์ปดํ์ผ ํ์์ ์ด๊ธฐํ๋์ง ์์ ๊ฐ์ ํ์ฉํ์ง ์๋ ๊ฒ์ด ๋ ์ฝ์ง ์์๊น์? ์ด๊ธฐํ๋ ๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ ํฉ๊ณ ์ ํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฆ
type U enum {
None
A(string)
B(uint64)
}
...
var a U.None
...
switch a {
case U.None: ...
case U.A(str): ...
case U.B(i): ...
}
๋ํ sum ์ ํ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก
nil
๋ฅผ ๊ฐ๋๋ก ํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ๋ชจ๋ ์ค์์น์nil
์ผ์ด์ค๊ฐ ํ์ํฉ๋๋ค.์ปดํ์ผ ํ์์ ์ด๊ธฐํ๋์ง ์์ ๊ฐ์ ํ์ฉํ์ง ์๋ ๊ฒ์ด ๋ ์ฝ์ง ์์๊น์? ์ด๊ธฐํ๋ ๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ ํฉ๊ณ ์ ํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฆ
๊ธฐ์กด ์ฝ๋๋ฅผ ๋์ต๋๋ค.
๋ํ sum ์ ํ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก
nil
๋ฅผ ๊ฐ๋๋ก ํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ๋ชจ๋ ์ค์์น์nil
์ผ์ด์ค๊ฐ ํ์ํฉ๋๋ค.์ปดํ์ผ ํ์์ ์ด๊ธฐํ๋์ง ์์ ๊ฐ์ ํ์ฉํ์ง ์๋ ๊ฒ์ด ๋ ์ฝ์ง ์์๊น์? ์ด๊ธฐํ๋ ๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ ํฉ๊ณ ์ ํ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฆ
๊ธฐ์กด ์ฝ๋๋ฅผ ๋์ต๋๋ค.
ํฉ๊ณ ์ ํ์ด ์๋ ๊ธฐ์กด ์ฝ๋๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ์ ํ ์์ฒด์ ์ ์๋ ๊ฐ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ํญ๋ชฉ, ์ฒซ ๋ฒ์งธ ์ํ๋ฒณ ๋๋ ๊ธฐํ.
ํฉ๊ณ ์ ํ์ด ์๋ ๊ธฐ์กด ์ฝ๋๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ์ ํ ์์ฒด์ ์ ์๋ ๊ฐ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ํญ๋ชฉ, ์ฒซ ๋ฒ์งธ ์ํ๋ฒณ ๋๋ ๊ธฐํ.
๋๋ ์ฒ์์ ๋น์ ์ ์๊ฐ์ ๋์ํ์ง๋ง, ์ฝ๊ฐ์ ์๊ณ ํ์, Union์ ๋ํ ์๋ก์ด ์์ฝ ์ด๋ฆ์ โโ์ด์ ์ ์ผ๋ถ ์ฝ๋๋ฒ ์ด์ค(union, enum ๋ฑ)์์ ์ฌ์ฉ๋ ์ ์์์ต๋๋ค.
nil์ ํ์ธํด์ผ ํ๋ ์๋ฌด๋ ์ฌ์ฉํ๊ธฐ์ ์๋นํ ๊ณ ํต์ค๋ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Go2.0์์๋ง ํด๊ฒฐํ ์ ์๋ ํ์ ํธํ์ฑ์ ์ํ ๋ธ๋ ์ดํน ์ฒด์ธ์ง ๊ฐ์ต๋๋ค.
ํฉ๊ณ ์ ํ์ด ์๋ ๊ธฐ์กด ์ฝ๋๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ์ ํ ์์ฒด์ ์ ์๋ ๊ฐ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ํญ๋ชฉ, ์ฒซ ๋ฒ์งธ ์ํ๋ฒณ ๋๋ ๊ธฐํ.
๊ทธ๋ฌ๋ ๋ชจ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ๊ธฐ์กด go ์ฝ๋๊ฐ ๋ง์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ํ์คํ ๋ณํ๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค. ์ค์๊ฐ์์ผ๋ก, gofix ๋ฐ ์ ์ฌํ ๋๊ตฌ๋ ๋ณ์ ์ ํ์ ์ต์ (๋์ผํ ์ ํ)์ผ๋ก๋ง ๋ณ๊ฒฝํ์ฌ ์ต์ํ ๋ชป์๊ธด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ์๋ ๋จ์ํ ์ธ์์ ๋ชจ๋ ๊ฒ์ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค.
๋ค๋ฅธ ๊ฒ์ด ์๋ค๋ฉด, Reflect.Zero ๋ ๋ฌด์ธ๊ฐ ๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ๋ค์ ๋ชจ๋ ํด๊ฒฐํ ์ ์๋ ๊ธฐ์ ์ ์ฅ์ ๋ฌผ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ด ์ฅ์ ๋ฌผ์ ํฉ๊ณ ์ ํ์ 0 ๊ฐ์ด ์ ์ ์๋์ด ์๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ "ํจ๋"์ด ๋ ๊ฒฝ์ฐ ๋งค์ฐ ๋ถ๋ช ํฉ๋๋ค. ๋ ํฐ ๋ฌธ์ ๋ ์ด๋ค ์ ํ์ด ์ฌ๋ฐ๋ฅธ ์ฌ๋์ด ์ ์์ง๋ ์ฌ๋ถ ๋ฐ ๋ฐฉ๋ฒ ๋ํ์ ์ธ์ด๋ก ์ด๋ค ์ ํ ๋ง์ต๋๋ค. IMO, ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ํฉ๊ณ ์ ํ์ด ํน์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฑฐ๋ ๋ถ์กฑํ๊ฒ ์์ฑ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ตฌ์ฒด์ ์ธ ์ฌ๋ก์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ ๋๋ค. ๊ฒฝํ ๋ณด๊ณ ์ ์
ํนํ "0 ๊ฐ์ด ์์ด์ผ ํ๋ฉฐ ์ด๊ธฐํ๋์ง ์์ ๊ฐ์ ์์ฑํ ์ ์์ด์ผ ํจ"๊ณผ "๊ธฐ๋ณธ๊ฐ์ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ด์ด์ผ ํจ"์ด ์์์ ์ฌ๋ฌ ๋ฒ ์ธ๊ธ๋์์์ ์ ์ํ์ญ์์ค. ๋ฐ๋ผ์ ์ด๋ ๊ฒ ํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค์ ๋ก ์๋ก์ด ์ ๋ณด๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ด๋ฏธ ๋ฐฉ๋ํ ์ค๋ ๋๋ฅผ ๋ฏธ๋๊ฐ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ฐพ๊ธฐ ์ํด ํจ์ฌ ๋ ๊ธธ๊ณ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
Reflect.Kind๋ฅผ ๊ณ ๋ คํด๋ณด์. ๊ธฐ๋ณธ int ๊ฐ์ด 0์ธ Invalid Kind๊ฐ ์์ต๋๋ค. Reflect.Kind๋ฅผ ์๋ฝํ๋ ํจ์๊ฐ ์๊ณ ํด๋น ์ ํ์ ์ด๊ธฐํ๋์ง ์์ ๋ณ์๋ฅผ ์ ๋ฌํ๋ฉด Invalid๊ฐ ๋ฉ๋๋ค. Reflect.Kind๊ฐ ๊ฐ์์ ์ผ๋ก ํฉ๊ณ ์ ํ์ผ๋ก ๋ณ๊ฒฝ๋ ์ ์๋ ๊ฒฝ์ฐ nil ๊ฐ์ ์์กดํ๊ธฐ๋ณด๋ค๋ ์ด๋ฆ์ด ์๋ชป๋ ํญ๋ชฉ์ ๊ธฐ๋ณธ ํญ๋ชฉ์ผ๋ก ๊ฐ๋ ๋์์ ์ ์งํด์ผ ํฉ๋๋ค.
์ด์ html/template.contentType์ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค. Plain ์ ํ์ ๊ธฐ๋ณธ๊ฐ์ด๋ฉฐ ์ค์ ๋ก๋ ๋์ฒด์ด๋ฏ๋ก stringify ํจ์์ ์ํด ์ด์ ๊ฐ์ด ์ฒ๋ฆฌ๋ฉ๋๋ค. ๊ฐ์์ ๋ฏธ๋์๋ ๊ทธ ํ๋์ด ์ฌ์ ํ ํ์ํ ๋ฟ๋ง ์๋๋ผ nil ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. nil์ ์ด ์ ํ์ ์ฌ์ฉ์์๊ฒ ์๋ฌด ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฌ๊ธฐ์์ ํญ์ ๋ช ๋ช ๋ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ ๊ฑฐ์ ํ์์ด๋ฉฐ ํด๋น ๊ฐ์ด ๋ฌด์์ธ์ง์ ๋ํ ๋ช ํํ ๊ธฐ๋ณธ๊ฐ์ด ์์ต๋๋ค.
๋์/๊ฐ๋ณ/ํฉ/๋ฌด์์ด๋ ๋ฐ์ดํฐ ์ ํ์ด ์ ์๋ํ๋ ๋ ๋ค๋ฅธ ์์ ๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ํธ๋์ญ์ ์์ด noSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง(๋ถ์ฐ ์์คํ , ํธ๋์ญ์ ์ ์ฐ๋ฆฌ์๊ฒ ์ ํฉํ์ง ์์) ๋ถ๋ช ํ ์ด์ ๋ก ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ผ๊ด์ฑ์ ์ข์ํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๋จ์ผ์ ๋ํ ์ฝ๊ฐ ๋ณต์กํ ์กฐ๊ฑด๋ถ ์ ๋ฐ์ดํธ ์ฟผ๋ฆฌ๋ก ๋์ ์ก์ธ์ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค. ๋ ์ฝ๋(๋จ์ผ ๋ ์ฝ๋ ์ฐ๊ธฐ๋ ์์์ ์).
์ฝ์ , ์ถ๊ฐ ๋๋ ์ญ์ ํ ์ ์๋ ํญ๋ชฉ ์งํฉ์ ์์ฑํ๋ ์ ์์ ์ด ์์ต๋๋ค(์ด ์์ ์ค ํ๋๋ง).
์ฐ๋ฆฌ๊ฐ ๊ฐ์ ๊ฒ์ ๊ฐ์ง ์ ์๋ค๋ฉด
type EntityOp oneof {
Insert Reference
NewState string
Delete struct{}
}
๋ฐฉ๋ฒ์ ๊ทธ๋ฅ
type DB interface {
โฆ
Capture(ctx context.Context, processID string, ops map[string]EntityOp) (bool, error)
}
ํฉ๊ณ ์๊ฐ์ ํ ๊ฐ์ง ํ์์ ์ธ ์ฉ๋๋ AST์์ ๋
ธ๋๋ฅผ ๋ํ๋ด๋ ๊ฒ์
๋๋ค. ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ nil
๋ฅผ ์ปดํ์ผ ํ์์ ํ์ธ๋๋ option
๋ก ๋ฐ๊พธ๋ ๊ฒ์
๋๋ค.
@DemiMarie ํ์ง๋ง ์ค๋์ Go์์๋ ์ด ํฉ๊ณ๋ 0์ด ๋ ์ ์์ต๋๋ค. ์์์ ์ ์ํ ๊ฒ์ฒ๋ผ nil์ ๊ฐ ์ด๊ฑฐํ์ ๋ณํ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ๊ฐ ์ค์์น์๋ case nil์ด ์์ง๋ง ์ด ์๋ฌด๋ ๊ทธ๋ฆฌ ๋์์ง ์์ต๋๋ค. ๊ธฐ์กด์ ๋ชจ๋ go ์ฝ๋๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์๊ณ ์ด ๊ธฐ๋ฅ์ ์ํจ(ํ์ฌ ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ ๋ฌดํจํํ ์ ์์)
๊ทธ๊ฒ์ด ์ฌ๊ธฐ์ ์ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ด ๋ชจ๋ ๊ฒ์ "๋ฌธ์์ด ๋ฆฌํฐ๋ด ์ ํ"์ด๋ผ๋ ๋งค์ฐ ๋ฉ์ง ๊ธฐ๋ฅ์ด ์กด์ฌํ๋ Typescript๋ก ๋จ์ ์์ผ๋ฉฐ ์ฐ๋ฆฌ๋ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค.
var name: "Peter" | "Consuela"; // string type with compile-time constraint
์ ์๊ฐ์๋ ๊ธฐ์กด์ ์ซ์ ์ด๊ฑฐํ๋ณด๋ค ํจ์ฌ ๋์ ๋ฌธ์์ด ์ด๊ฑฐํ๊ณผ ๊ฐ์ต๋๋ค.
@๋ฉ๋ก๋น์ฐ์ค
๊ตฌ์ฒด์ ์ธ ์๋ ์์์ JSON์ผ๋ก ์์
ํ๋ ๊ฒ์
๋๋ค.
Rust์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ผ ์ ์์ต๋๋ค.
์ด๊ฑฐํ ๊ฐ {
์๋,
๋ถ์ธ(bool),
๋ฒํธ(๋ฒํธ),
๋ฌธ์์ด(๋ฌธ์์ด),
๋ฐฐ์ด(Vec
๊ฐ์ฒด(์ง๋
}
๋ ๊ฐ์ง ์ฅ์ ์ผ๋ก ๊ฒฐํฉ ์ ํ:
go vet
๊ฐ ๊ณต์ฉ์ฒด ์ ํ์ ์๋ชป๋ ์ฌ์ฉ์ ํ์ธํ๋๋ก ํ์ฉ๊ตฌ๋ฌธ์ ๊ฒฝ์ฐ ๋ค์์ alias ์ ํ ๊ณผ ๊ฐ์ด Go1 ๊ณผ ํธํ๋์ด์ผ ํฉ๋๋ค.
type Token = int | float64 | string
๊ณต์ฉ์ฒด ์ ํ์ ๋ด๋ถ์ ์ผ๋ก ์ธํฐํ์ด์ค๋ก ๊ตฌํ๋ ์ ์์ต๋๋ค. ์ค์ํ ๊ฒ์ ๊ณต์ฉ์ฒด ์ ํ์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ํ๊ณ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
var tok Token
switch t := tok.(type) {
case int:
// do something
}
๋ชจ๋ Token
์ ํ์ด ์ค์์น์์ ์ฌ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ๋ ์ค๋ฅ๋ฅผ ๋ฐ์์์ผ์ผ ํฉ๋๋ค.
์ด๊ฒ์ ๋ฌธ์ ๋ (๋ด๊ฐ ์๋ ํ) ํฌ์ธํฐ ์ ํ(๋๋ string
์ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ํฌํจํ๋ ์ ํ)๊ณผ ํฌ์ธํฐ๊ฐ ์๋ ์ ํ์ ํจ๊ป ์ ์ฅํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์
๋๋ค. ๋ ์ด์์์ด ๋ค๋ฅธ ์ ํ๋ ์๋ํ์ง ์์ต๋๋ค. ์์ ๋กญ๊ฒ ์์ ํด ์ฃผ์ธ์. ๊ทธ๋ฌ๋ ๋ฌธ์ ๋ ์ ํํ GC๊ฐ ํฌ์ธํฐ์ ๋จ์ ๋ณ์๋ฅผ ๋์์ ์ฌ์ฉํ ์ ์๋ ๋ณ์์ ์ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค.
interface{}
ํ์ฌ ํ๋ ๊ฒ์ฒ๋ผ ์์์ ๊ถํฌ์ ๊ธธ์ ๊ฐ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ถฉ๋ถํ ์ด์ ์ ์ ๊ณตํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฌ์ ํ ์๊ด์ค๋ฌ์ด ์ธํฐํ์ด์ค ์ ํ์ฒ๋ผ ๋ณด์
๋๋ค. ๋์ ์ผ์ข
์ vet
์ํ๋ฅผ ๊ฐ๋ฐํ ์ ์์ต๋๊น?
๊ฐ๋น์ง ์์ง๊ธฐ๋ ๋ ์ด์์์ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ ๋์จ์์ ํ๊ทธ ๋นํธ๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋์ง๋ง gc๋ฅผ ๋๋ฆฌ๊ฒ ํ ์ ์๋ ๋ฐํ์์ ๋ํ ํฐ ๋ณ๊ฒฝ์ด ๋ ๊ฒ์ ๋๋ค.
๋์ ์ด๋ค ์ข ๋ฅ์ ์์์ฌ ๊ฒ์ฌ๋ฅผ ๊ฐ๋ฐํ ์ ์์ต๋๊น?
๊ฐ๋น์ง ์์ง๊ธฐ๋ ๋ ์ด์์์ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ ๋์จ์์ ํ๊ทธ ๋นํธ๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค.
์ธํฐํ์ด์ค๊ฐ ํฌ์ธํฐ๊ฐ ์๋ ๊ฒ์ ํฌํจํ ์ ์์ ๋ ์ธํฐํ์ด์ค์ ์กด์ฌํ๋ ๊ฒ๊ณผ ์ ํํ ๋์ผํ ์ธ์ข ์ ๋๋ค. ๊ทธ ๋์์ธ์ ๋ช ์ ์ ์ผ๋ก ๋ฉ๋ฆฌ ์ด๋๋์์ต๋๋ค.
go-sumtype
์ฌ๋ฏธ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์ผํ ํจํค์ง๊ฐ ๋ ๊ฐ์ ๊ณต์ฉ์ฒด ์ ํ์ ์ ์ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์ปดํ์ผ๋ฌ๋ ๋ด๋ถ์ ์ผ๋ก ๊ณต์ฉ์ฒด ์ ํ์ ์ธํฐํ์ด์ค๋ก ๊ตฌํํ ์ ์์ง๋ง ๊ท ์ผํ ๊ตฌ๋ฌธ๊ณผ ํ์ค ์ ํ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ ๋์จ ์ ํ์ ์ฌ์ฉํ๋ N๊ฐ์ ํ๋ก์ ํธ๊ฐ ์๊ณ ๊ฐ๊ฐ์ด ๋ค๋ฅด๊ณ N์ด ์ถฉ๋ถํ ํฐ ๊ฒฝ์ฐ ์ด๋ฅผ ์ํํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ ์ ๋์ ํ๋ ๊ฒ์ด ์ต์์ ์๋ฃจ์ ์ผ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋์ผํ ํจํค์ง๊ฐ ๋ ๊ฐ์ ๊ณต์ฉ์ฒด ์ ํ์ ์ ์ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๋ณ๋ก? ๋ก์ง์ ์ ํ๋ณ๋ก ๋ค๋ฅด๋ฉฐ ๋๋ฏธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ์๋ฅผ ์ธ์ํฉ๋๋ค. ๋๋ฏธ ๋ฉ์๋์ ๋ค๋ฅธ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์ ํ ๋ ์ด์์์ ์ง์ ํ๋ @skybrian IIRC ํ์ฌ ๋นํธ๋งต์ ํ์ฌ ํ ๊ณณ์ ์ ์ฅ๋์ด ์์ต๋๋ค. ๊ฐ์ฒด๋น ์ด๋ฌํ ํญ๋ชฉ์ ์ถ๊ฐํ๋ฉด ๋ง์ ์ ํ๊ฐ ์ถ๊ฐ๋๊ณ ๋ชจ๋ ์ ํ์ ๊ฐ์ฒด๊ฐ GC ๋ฃจํธ๊ฐ ๋ฉ๋๋ค.
์ด๊ฒ์ ๋ฌธ์ ๋ (๋ด ์ง์์ผ๋ก๋) ํฌ์ธํฐ ์ ํ(๋๋ ๋ฌธ์์ด๊ณผ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ํฌํจํ๋ ์ ํ)๊ณผ ํฌ์ธํฐ๊ฐ ์๋ ์ ํ์ ํจ๊ป ์ ์ฅํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ด ํ์ํ๋ค๊ณ ์๊ฐํ์ง ์๋๋ค. ์ปดํ์ผ๋ฌ๋ ํฌ์ธํฐ ๋งต์ด ์ผ์นํ ๋ ์ ํ์ ๋ํ ๋ ์ด์์์ ๊ฒน์น ์ ์๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ๋ ์ง ์์ ์ ์์ต๋๋ค. ์ผ์นํ์ง ์์ผ๋ฉด ์ฐ์์ ์ผ๋ก ๋ฐฐ์นํ๊ฑฐ๋ ํ์ฌ ์ธํฐํ์ด์ค์ ์ฌ์ฉ๋๋ ํฌ์ธํฐ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ์ ๋ํด ์ธ์ ํ์ง ์์ ๋ ์ด์์์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ถฉ๋ถํ ์ด์ ์ ์ ๊ณตํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฌ์ ํ ์๊ด์ค๋ฌ์ด ์ธํฐํ์ด์ค ์ ํ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋ด ์ ์ ์์ ๊ณต์ฉ์ฒด ์ ํ์ _์ ํํ_ ์๊ด์ค๋ฌ์ด ์ธํฐํ์ด์ค ์ ํ์ ๋๋ค. ๊ณต์ฉ์ฒด ์ ํ์ ์ด๊ฑฐ๋ ์ ํ ์งํฉ๋ง ์ ์ฅํ ์ ์๋ ์ธํฐํ์ด์ค์ ํ์ ์งํฉ์ผ ๋ฟ์ ๋๋ค. ์ด๊ฒ์ ์ ์ฌ์ ์ผ๋ก ์ปดํ์ผ๋ฌ๊ฐ ํน์ ์ ํ ์ธํธ์ ๋ํด ๋ณด๋ค ํจ์จ์ ์ธ ์ ์ฅ ๋ฐฉ๋ฒ์ ์ ํํ ์ ์๋ ์์ ๋ฅผ ์ ๊ณตํ์ง๋ง, ์ด๋ ์ฃผ์ ๋๊ธฐ๊ฐ ์๋๋ผ ๊ตฌํ ์ธ๋ถ์ฌํญ์ ๋๋ค.
@rogpeppe - ํธ๊ธฐ์ฌ์ sum ์ ํ์ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๊น? ์๋๋ฉด ์๋ ค์ง ์ ํ์ผ๋ก ๋ช ์์ ์ผ๋ก ์บ์คํธํด์ผ ํฉ๋๊น? ์๋ ค์ง ์ ํ์ผ๋ก ์ง์์ ์ผ๋ก ์บ์คํธํด์ผ ํ๋ ๊ฒฝ์ฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ด๋ฏธ ์ ๊ณต๋ ๊ฒ๋ณด๋ค ์ด๊ฒ์ด ์ ๊ณตํ๋ ์ด์ ์ด ๋ฌด์์ธ์ง ์ ๋ง๋ก ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ด๊ฐ ๋ณผ ์์๋ ์ฃผ์ ์ด์ ์ ์ผ์ข ์ ์ปดํ์ผ ํ์ ์ค๋ฅ ๊ฒ์ฌ์ ๋๋ค. ๋น์ ๋ ฌํ๋ ๋ฐํ์์ ๊ณ์ ๋ฐ์ํ๋ฏ๋ก ์๋ชป๋ ์ ํ์ด ์ ๋ฌ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋ ํฝ๋๋ค. ๋ค๋ฅธ ์ด์ ์ ๋ ์ ํ์ ์ธ ์ธํฐํ์ด์ค๋ก, ์ธ์ด ๋ณ๊ฒฝ์ ๋ณด์ฆํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด๊ฐ ํ ์
type FooType int | float64
func AddOne(foo FooType) FooType {
return foo + 1
}
// if this can be done, what happens here?
type FooType nil | int
func AddOne(foo FooType) FooType {
return foo + 1
}
์ด ์์ ์ ์ํํ ์ ์์ผ๋ฉด ๋ค์๊ณผ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
type FooType interface{}
func AddOne(foo FooType) (FooType, error) {
switch v := foo.(type) {
case int:
return v + 1, nil
case float64:
return v + 1.0, nil
}
return nil, fmt.Errorf("invalid type %T", foo)
}
// versus
type FooType int | float64
func AddOne(foo FooType) FooType {
switch v := foo.(type) {
case int:
return v + 1
case float64:
return v + 1.0
}
// assumes the compiler knows that there is no other type is
// valid and thus this should always returns a value
// Would the compiler error out on incomplete switch types?
}
@xibz
๊ถ๊ธํด์ sum ์ ํ์ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๊น? ์๋๋ฉด ์๋ ค์ง ์ ํ์ผ๋ก ๋ช ์์ ์ผ๋ก ์บ์คํธํด์ผ ํฉ๋๊น? ์๋ ค์ง ์ ํ์ผ๋ก ์ง์์ ์ผ๋ก ์บ์คํธํด์ผ ํ๋ ๊ฒฝ์ฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ด๋ฏธ ์ ๊ณต๋ ๊ฒ๋ณด๋ค ์ด๊ฒ์ด ์ ๊ณตํ๋ ์ด์ ์ด ๋ฌด์์ธ์ง ์ ๋ง๋ก ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค.
@rogpeppe ํ๋ฆฌ๋ฉด ์ง์ ํด์ฃผ์ธ์๐
ํญ์ ํจํด ์ผ์น๋ฅผ ์ํํด์ผ ํ๋ ๊ฒ(ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ํฉ๊ณ ์ ํ์ผ๋ก ์์
ํ ๋ "์บ์คํ
"์ด ํธ์ถ๋๋ ๋ฐฉ์)์ ์ค์ ๋ก ํฉ๊ณ ์ ํ์ ์ฌ์ฉํ ๋์ ๊ฐ์ฅ ํฐ ์ด์ ์ค ํ๋์
๋๋ค. ๊ฐ๋ฐ์๊ฐ ํฉ๊ณ ์ ํ์ ๊ฐ๋ฅํ ๋ชจ๋ ๋ชจ์์ ๋ช
์์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ํ๋ ๊ฒ์ ๊ฐ๋ฐ์๊ฐ ์ค์ ๋ก๋ ๋ค๋ฅธ ์ ํ์ด์ง๋ง ์ฃผ์ด์ง ์ ํ์ด๋ผ๊ณ ์๊ฐํ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ๊ณผ์ฅ๋ ์๋ JavaScript์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const a = "1" // string "1"
const b = a + 5 // string "15" and not number 6
์ด ์์ ์ ์ํํ ์ ์์ผ๋ฉด ๋ค์๊ณผ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋๋ ๋น์ ์ด ๋ช ๊ฐ์ง ์ฅ์ ์ ์ค์ค๋ก ๋งํ ๊ฒ ๊ฐ์์. ๊ทธ๋ ์ง ์์ต๋๊น?
โ
๋ด๊ฐ ๋ณผ ์์๋ ์ฃผ์ ์ด์ ์ ์ผ์ข ์ ์ปดํ์ผ ํ์ ์ค๋ฅ ๊ฒ์ฌ์ ๋๋ค. ๋น์ ๋ ฌํ๋ ๋ฐํ์์ ๊ณ์ ๋ฐ์ํ๋ฏ๋ก ์๋ชป๋ ์ ํ์ด ์ ๋ฌ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋ ํฝ๋๋ค. ๋ค๋ฅธ ์ด์ ์ ๋ ์ ํ์ ์ธ ์ธํฐํ์ด์ค๋ก, ์ธ์ด ๋ณ๊ฒฝ์ ๋ณด์ฆํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
// Would the compiler error out on incomplete switch types?
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ํ๋ ์ผ์ ๋ฐ๋ผ ์ด๊ฒ์ด ๊ฐ๋ฅํ๊ณ ๊ตฌ์ฑ ๊ฐ๋ฅํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค ๐
@xibz ๋ ์ปดํ์ผ ํ์ ๋ ๋ฐํ์์ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ๋ ์์ง๋ง, ์ ๋ค๋ฆญ์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ด๊ฐ ์ฃฝ๊ธฐ ํ๋ฃจ ์ ์ ๋๋ค.
@xibz
๊ถ๊ธํด์ sum ์ ํ์ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๊น? ์๋๋ฉด ์๋ ค์ง ์ ํ์ผ๋ก ๋ช ์์ ์ผ๋ก ์บ์คํธํด์ผ ํฉ๋๊น?
ํ์์ ๋ชจ๋ ๋ฉค๋ฒ๊ฐ ํด๋น ๋ฉ์๋๋ฅผ ๊ณต์ ํ๋ ๊ฒฝ์ฐ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
int | float64
๋ฅผ ์๋ก ๋ค๋ฉด ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
var x int|float64 = int(2)
var y int|float64 = float64(0.5)
fmt.Println(x * y)
int
์์ float64
๋ก ์์์ ๋ณํ์ ์ํํฉ๋๊น? ๋๋ float64
์์ int
. ์๋๋ฉด ํจ๋์ ๋น ์ง๊น์?
๊ฑฐ์ ๋ง์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ฌ์ฉํ๊ธฐ ์ ์ ์ ํ ํ์ธ์ ํด์ผ ํฉ๋๋ค. ๋จ์ ์ด ์๋๋ผ ์ฅ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฐํ์ ์ด์ ์ด ์ค์ํ ์ ์์ต๋๋ค. ์์ ์ ํ์ ๊ณ์ํ๋ ค๋ฉด [](int|float64)
์ ํ์ ์ฌ๋ผ์ด์ค๋ ํฌ์ธํฐ๋ฅผ ํฌํจํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ์ ํ์ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ ๋ช ๋ฐ์ดํธ(์ ๋ ฌ ์ ํ์ผ๋ก ์ธํด 16๋ฐ์ดํธ)๋ก ๋ํ๋ผ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ฌ์ฉํ๊ธฐ ์ ์ ์ ํ ํ์ธ์ ํด์ผ ํฉ๋๋ค. ๋จ์ ์ด ์๋๋ผ ์ฅ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋จ์ ์ด ์๋๋ผ๋ ์ ์๋ ๋์ํฉ๋๋ค. ์ธํฐํ์ด์ค์ ๋ฌ๋ฆฌ ์ด๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ์ด๋ค ์ด์ ์ ์ ๊ณตํ๋์ง ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
ํ์์ ์ฌ๋ผ์ด์ค๋ ๋ช ๋ฐ์ดํธ(์ ๋ ฌ ์ ํ์ผ๋ก ์ธํด 16๋ฐ์ดํธ)๋ก ํ์์ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ ๋ํ๋ผ ์ ์๊ธฐ ๋๋ฌธ์ ํฌ์ธํฐ๋ฅผ ํฌํจํ ํ์๊ฐ ์์ผ๋ฉฐ, ์ด๋ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์๋นํ ์ฑ๋ฅ ํฅ์์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
ํ , ๋๋ ๋ด๊ฐ ์ด๊ฒ์ ์ค์ํ ๋ถ๋ถ์ ์ฌ๋์ง ๋๋ฌด ํ์ ํ์ง ๋ชปํฉ๋๋ค. ์์ฃผ ๋๋ฌธ ๊ฒฝ์ฐ์ง๋ง ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋ค ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ์ฆ, ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ธ์ด ๋ณ๊ฒฝ์ ์ถฉ๋ถํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํญ์ ํจํด ์ผ์น๋ฅผ ์ํํด์ผ ํ๋ ๊ฒ(ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ํฉ๊ณ ์ ํ์ผ๋ก ์์ ํ ๋ "์บ์คํ "์ด ํธ์ถ๋๋ ๋ฐฉ์)์ ์ค์ ๋ก ํฉ๊ณ ์ ํ ์ฌ์ฉ์ ๊ฐ์ฅ ํฐ ์ด์ ์ค ํ๋์ ๋๋ค.
๊ทธ๋ฌ๋ ์์ง ์ธํฐํ์ด์ค๋ก ์ฒ๋ฆฌ๋์ง ์์ ์ธ์ด์ ์ด๋ค ์ด์ ์ด ์์ต๋๊น? ์๋ ๋๋ ํํ๋ฅผ ์ข์ํ๋๋ฐ, ์๊ฐํ๊ธฐ ์์ํ๋ฉด์ ๊ทธ๊ฒ์ด ๊ฐ์ ธ๋ค์ค ํํ์ ์์ด๋ฒ๋ ธ์ต๋๋ค.
๊ทธ๋ ๊ธด ํด๋ sum ์ ํ์ ์ฌ์ฉํ์ฌ ๋ ๊น๋ํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์ ๊ณตํ ์ ์๋ค๋ฉด 100% ์ฐฌ์ฑํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ฒ์ผ๋ก ๋ณด๊ธฐ์๋ ์ธํฐํ์ด์ค ์ฝ๋์ ๊ฑฐ์ ๋์ผํ๊ฒ ๋ณด์ ๋๋ค.
@xibz ํจํด ์ผ์น๋ ํธ๋ฆฌ์์ ํ ์์ค ์ด์์ ๋ณด๋ ค๋ ํธ๋ฆฌ ์ํน ์ฝ๋์์ ์ ์ฉํฉ๋๋ค. ์ ํ ์ค์์น๋ฅผ ์ฌ์ฉํ๋ฉด ํ ๋ฒ์ ํ ์์ค ๊น์ด๋ง ๋ณผ ์ ์์ผ๋ฏ๋ก ์ค์ฒฉํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ์ฝ๊ฐ ์ธ์์ ์ด์ง๋ง ์๋ฅผ ๋ค์ด ํํ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด์ฐจ ๋ฐฉ์ ์์ ์ผ์น์ํค๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
match Add(Add(Mult(Const(a), Power(Var(x), 2)), Mult(Const(b), Var(x))), Const(c)) {
// here a, b, c are bound to the constants and x is bound to the variable name.
// x must have been the same in both var expressions or it wouldn't match.
}
ํ ๋จ๊ณ ๊น์ด๋ง ์งํํ๋ ๊ฐ๋จํ ์๋ ํฐ ์ฐจ์ด๋ฅผ ๋ณด์ด์ง ์์ง๋ง ์ฌ๊ธฐ์๋ ์ค์ฒฉ ์ ํ ์ค์์น๋ก ์ํํ๊ธฐ ๋งค์ฐ ๋ณต์กํ ์ต๋ 5๋จ๊ณ ๊น์ด๋ก ์งํํฉ๋๋ค. ํจํด ์ผ์น ๊ธฐ๋ฅ์ด ์๋ ์ธ์ด๋ ์ฌ๋ฌ ์์ค์ผ๋ก ๋ฐ์ ํ๋ฉด์ ์ด๋ค ๊ฒฝ์ฐ๋ ๋์น์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ปดํ์ผ๋ฌ ์ธ๋ถ์์ ์ผ๋ง๋ ๋ง์ด ๋์ค๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@xibz
ํฉ๊ณ ์ ํ์ ์ด์ ์ ์ฌ์ฉ์์ ์ปดํ์ผ๋ฌ๊ฐ ๋ชจ๋ ํฉ๊ณ ๋ด์ ์กด์ฌํ ์ ์๋ ์ ํ์ ์ ํํ ์๊ณ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ด ๋ณธ์ง์ ์ผ๋ก ์ฐจ์ด์ ์
๋๋ค. ๋น ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ์์์น ๋ชปํ ์ ํ์ ์ ๊ณตํ ๋ ๋ณต๊ตฌํ๋ ๊ฒ์ด ์ ์ผํ ๋ชฉ์ ์ธ ๋ถ๊ธฐ๋ฅผ ํญ์ ๊ฐ์ง๋ฏ๋ก API์ ์ค์ฉ์ ๋ํด ํญ์ ๊ฑฑ์ ํ๊ณ ๋ณดํธํด์ผ ํฉ๋๋ค.
ํฉ๊ณ ์ ํ์ ๋ํ ์์ ํฌ๋ง์ด ์ปดํ์ผ๋ฌ์์ ๊ตฌํ ๋ ์์์ ๊ฒ ๊ฐ์ต๋๋ค ๋๋ฌธ์, ๋ด๊ฐ ์ข์ํ๋, ํ์ค ์ฃผ์ ์ง์นจ ์ ์ด๋ ํฌ๋ง //go:union A | B | C
์ ์ํ๊ณ ์ง์ go vet
.
ํฉ๊ณ ์ ํ์ ์ ์ธํ๋ ํ์ค ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด N๋ ํ์ ์ด๋ฅผ ์ฌ์ฉํ๋ ํจํค์ง ์๋ฅผ ์ ์ ์์ต๋๋ค.
๊ฐ์ธ ๋ฉ์๋ ๋ฐ ๊ฐ ๊ตฌํ๊ณผ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ํฉ๊ณ ์ ํ ์๋ฎฌ๋ ์ด์ ์ ์์ฑํ๋ ์์ ์ ํธ๋ฆฌํฐ๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ผ๋ถ ์ฌ์ฉ์์๊ฒ๋ ๋์์ด ๋ ์ ์์ต๋๋ค: https://github.com/sirkon/go-oneof
์ ๋ค๋ฆญ์ ๋ํ ์ต๊ทผ ๋์์ธ ์ด์์์๋ ํฉ๊ณ ์ ํ์ด ์ด์ ์ฐ๊ฒฐ๋ ์ ์์ต๋๋ค.
์ด์์์ ๊ณ์ฝ ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์์ด๋์ด๊ฐ ๋ ์ฌ๋๊ณ ์ธํฐํ์ด์ค๋ ์ ํ ๋ชฉ๋ก์ ์ง์ํด์ผ ํฉ๋๋ค.
type Foo interface {
int64, int32, int, uint, uint32, uint64
}
๊ทธ ์์ฒด๋ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ฐ๋ ์ฐฌ ๊ณต์ฉ์ฒด๋ฅผ ์์ฑํ์ง ์์ง๋ง ์ ๋ค๋ฆญ ํจ์ ๋๋ ๊ตฌ์กฐ์ฒด์์ ์ฌ์ฉํ ๋ ๋ฐ์ฑ๋์ง ์๊ณ ์ ํ ์ ํ ๋ชฉ๋ก์ ์ฒ๋ฆฌํ ๋ ์ต์ํ ์ ํ ์์ ์ฑ์ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ ํ ์ค์์น ๋ด์์ ์ด๋ฌํ ํน์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ทธ๋ฌํ ์ค์์น๊ฐ ์ฒ ์ ํด์ผ ํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ์ด์์ ์ธ ์งง์ ๊ตฌ๋ฌธ(์: Foo | int32 | []Bar
)์ ์๋์ง๋ง, ๋ญ๊ฐ ์์ต๋๋ค.
์ ๋ค๋ฆญ์ ๋ํ ์ต๊ทผ ๋์์ธ ์ด์์์๋ ํฉ๊ณ ์ ํ์ด ์ด์ ์ฐ๊ฒฐ๋ ์ ์์ต๋๋ค.
์ด์์์ ๊ณ์ฝ ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์์ด๋์ด๊ฐ ๋ ์ฌ๋๊ณ ์ธํฐํ์ด์ค๋ ์ ํ ๋ชฉ๋ก์ ์ง์ํด์ผ ํฉ๋๋ค.
type Foo interface { int64, int32, int, uint, uint32, uint64 }
๊ทธ ์์ฒด๋ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ฐ๋ ์ฐฌ ๊ณต์ฉ์ฒด๋ฅผ ์์ฑํ์ง ์์ง๋ง ์ ๋ค๋ฆญ ํจ์ ๋๋ ๊ตฌ์กฐ์ฒด์์ ์ฌ์ฉํ ๋ ๋ฐ์ฑ๋์ง ์๊ณ ์ ํ ์ ํ ๋ชฉ๋ก์ ์ฒ๋ฆฌํ ๋ ์ต์ํ ์ ํ ์์ ์ฑ์ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ ํ ์ค์์น ๋ด์์ ์ด๋ฌํ ํน์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ทธ๋ฌํ ์ค์์น๊ฐ ์ฒ ์ ํด์ผ ํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ์ด์์ ์ธ ์งง์ ๊ตฌ๋ฌธ(์:
Foo | int32 | []Bar
)์ ์๋์ง๋ง, ๋ญ๊ฐ ์์ต๋๋ค.
๋ด ์ ์๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. https://github.com/golang/go/issues/19412#issuecomment -520306000
type foobar union {
int
float
}
@mathieudevos ์์ฐ, ์ ๋ ์ฌ์ค ๊ทธ๊ฒ ๊ฝค ๋ง์์
๋์๊ฒ ์ต์ ์ ๋ค๋ฆญ ์ ์์์ ๊ฐ์ฅ ์ด์ํ ์ (์ฌ์ค ์ ์ผํ๊ฒ ๋จ์ ์๋ ์ด์ํ ์ )์ ์ธํฐํ์ด์ค์ ์ ํ ๋ชฉ๋ก์ ๋๋ค. ๊ทธ๋ค์ ๋จ์ง ์์ฃผ ์ ํฉ ํ์ง ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ํ ๋งค๊ฐ๋ณ์ ์ ์ฝ ์กฐ๊ฑด์ผ๋ก๋ง ์ฌ์ฉํ ์ ์๋ ์ผ๋ถ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
union
๊ฐ๋
์ "๋ฉ์๋ ๋ฐ ์์ ์ ํ์ ํฌํจํ๋ ์ ์ฝ ์กฐ๊ฑด"์ ๋ฌ์ฑํ๊ธฐ ์ํด interface
์ union
๋ฅผ ํฌํจํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์๊ฐ์๋ ํ๋ฅญํ๊ฒ ์๋ํฉ๋๋ค. ์ธํฐํ์ด์ค๋ ๊ทธ๋๋ก ๊ณ์ ์๋ํ๋ฉฐ ์ ๋์จ์ ์ค์ฌ์ผ๋ก ์ ์๋ ์๋งจํฑ์ผ๋ก ์ผ๋ฐ ์ฝ๋์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ด์ํ ๋๋์ด ์ฌ๋ผ์ง๋๋ค.
// Ordinary interface
type Stringer interface {
String() string
}
// Type union
type Foobar union {
int
float
}
// Equivalent to an interface with a type list
type FoobarStringer interface {
Stringer
Foobar
}
// Unions can intersect
type SuperFoo union {
Foobar
int
}
// Doesn't compile since these unions can't intersect
type Strange interface {
Foobar
union {
int
string
}
}
ํธ์ง - ์ฌ์ค, ๋ฐฉ๊ธ ์ด CL์ ๋ณด์์ต๋๋ค: https://github.com/golang/go/commit/af48c2e84b52f99d30e4787b1b8d527b5cd2ab64
์ด ๋ณ๊ฒฝ์ ์ฃผ์ ์ด์ ์ ์ผ๋ฐ
(๋น์ ์ฝ) ์ ํ ๋ชฉ๋ก์ด ์๋ ์ธํฐํ์ด์ค ์ฌ์ฉ
...์์ฒญ๋! ์ธํฐํ์ด์ค๋ ์ผ๋ฐ ๋ฐ ์ ์ฝ ์กฐ๊ฑด ์ฌ์ฉ ์ ๋ฐ์ ๊ฑธ์ณ ์๋ฏธ ์ฒด๊ณ๋ฅผ ํตํฉํ๋ ํฉ๊ณ ์ ํ์ผ๋ก ์์ ํ ์ฌ์ฉํ ์ ์์ต๋๋ค. (๋ฌผ๋ก ์์ง ์ผ์ง์ง ์์์ง๋ง, ๋๋ ๊ทธ๊ฒ์ด ํฅํ๊ณ ์๋ ํ๋ฅญํ ๋ชฉ์ ์ง๋ผ๊ณ ์๊ฐํ๋ค.)
ํ์ฌ ์ ๋ค๋ฆญ ๋์์ธ ์ด์์์ sum ์ ํ์ ๋ฒ์ ์ด ๋ํ๋๋ ๋ฐฉ์์ ๋ํด ๋ ผ์ํ๊ธฐ ์ํด #41716์ ์ด์์ต๋๋ค.
๋์ ๋ฐ์ดํฐ ์ ํ์ ๋ํ @henryas ์ ์ค๋๋ ์ ์์ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค. ์ ๊ณต๋ ์ฌ์ฉ ์ฌ๋ก๋ก ๋งค์ฐ ์ ์์ฑ๋์์ต๋๋ค.
https://github.com/golang/go/issues/21154
์์ฝ๊ฒ๋ ๋น์ผ @mvdan ์ ์ํด ์ํ ๊ฐ์ ์์ด ๋ง๊ฐ๋์์ต๋๋ค. ๋๋ ๊ทธ ์ฌ๋์ด ์ ๋ง๋ก ๊ทธ๋ ๊ฒ ๋๊ผ์ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๊ณ ๋ฐ๋ผ์ gh ๊ณ์ ์์ ๋ ์ด์ ํ๋์ด ์์ต๋๋ค. ๊ทธ ์ฌ๋์๊ฒ ๋ฏธ์ํฉ๋๋ค.
๋๋ #21154๋ฅผ ์ ๋ง ์ข์ํ๋ค. ๊ทธ๋ฌ๋ (๋ฐ๋ผ์ @mvdan ์) ์ฃผ์์ ์์์๋ก ๋ซ๋
์, ํด๋น ๋ฌธ์ ์์ ์ค๋ช ํ ๊ฒ๊ณผ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ๋ ๋์ ์์ค์ ๋น์ฆ๋์ค ๋ ผ๋ฆฌ๋ฅผ ๋ชจ๋ธ๋งํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๋ง ๊ฐ๊ณ ์ถ์ต๋๋ค. ์ด๊ฑฐํ๊ณผ ๊ฐ์ ์ ํ๋ ์ต์ ์ ๋ํ ํฉ๊ณ ์ ํ ๋ฐ ๋ค๋ฅธ ๋ฌธ์ ์์์ ๊ฐ์ด ์ ์๋ ํ์ฉ ์ ํ์ ๋๊ตฌ ์์์์ ํ๋ฅญํ ๊ฒ์ ๋๋ค. ์ง๊ธ์ Go์ ๋น์ฆ๋์ค/๋๋ฉ์ธ ์ฝ๋๊ฐ ์ฝ๊ฐ ํฌ๋ฐํ๊ฒ ๋๊ปด์ง ๋๊ฐ ์์ต๋๋ค.
๋ด ์ ์ผํ ํผ๋๋ฐฑ์ ์ธํฐํ์ด์ค ๋ด๋ถ์ type foo,bar
๊ฐ ์ฝ๊ฐ ์ด์ํ๊ณ 2๊ธ์ฒ๋ผ ๋ณด์ด๋ฉฐ null ํ์ฉ๊ณผ null ํ์ฉ์ด ์๋(๊ฐ๋ฅํ ๊ฒฝ์ฐ) ์ ํ์ด ์์ด์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
@ProximaB "gh ๊ณ์ ์ ๋ ์ด์ ํ๋์ด ์์ต๋๋ค"๋ผ๊ณ ๋งํ๋ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๊ทธ ์ดํ๋ก ๊ทธ๋ค์ Go ํ๋ก์ ํธ์ ๊ดํ ๋ง์ ๋ค๋ฅธ ๋ฌธ์ ๋ค์ ๋ํด์๋ ์์ฑํ๊ณ ๋๊ธ์ ๋ฌ์์ต๋๋ค. ๋๋ ๊ทธ๋ค์ ํ๋์ด ๊ทธ ๋ฌธ์ ์ ์ํด ์ ํ ์ํฅ์ ๋ฐ์๋ค๋ ์ฆ๊ฑฐ๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค.
๊ฒ๋ค๊ฐ, ๋๋ Daniel์ด ์ด ๋ฌธ์ ์ ์์์๋ก ๊ทธ ๋ฌธ์ ๋ฅผ ๋ซ๋ ๊ฒ์ ๊ฐ๋ ฅํ๊ฒ ๋์ํฉ๋๋ค. @andig ๊ฐ ๋ค๋ฅธ ๊ฒ์ ์ ์ํ๋ค๊ณ ๋งํ๋ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๋ด๊ฐ #21154์ ํ ์คํธ๋ฅผ ์ดํดํ ์ ์๋ ํ, ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋ ผ์ํ๊ณ ์๋ ๊ฒ๊ณผ ์ ํํ ๋์ผํ ๊ฒ์ ์ ์ํ๋ฉฐ, ์ ํํ ๊ตฌ๋ฌธ์กฐ์ฐจ๋ ์ด ๋ฉ๊ฐ์ค๋ ๋์ ์ด๋๊ฐ์์ ์ด๋ฏธ ์ ์๋์ด๋ ์ ํ ๋๋ผ์ง ์์ ๊ฒ์ ๋๋ค(์๋ฏธ๋ก , ์ฌ๋ฌ ๋ฒ). ์ฌ์ค, Daniels ์ข ๊ฒฐ์ด ์ด ๋ฌธ์ ์ ๊ธธ์ด๋งํผ ์ณ์๋ค๋ ๊ฒ์ด ์ ์ฆ๋์๋ค๊ณ ๊น์ง ๋งํ ์ ์์ต๋๋ค. ์ด๋ฏธ #21154์ ๋ํ ๋งค์ฐ ์์ธํ๊ณ ๋ฏธ๋ฌํ ๋ ผ์๊ฐ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒ์ ๋ฐ๋ณตํ๋ ๊ฒ์ ํ๋ค๊ณ ์ค๋ณต๋์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ ์ ์์ ์์์๋ก ๋ง๊ฐํ๋ ๊ฒ์ด ์ค๋ง์ค๋ฌ์ธ ์ ์๋ค๋ ์ ์ ๋์ํ๊ณ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ ํผํ๋ ์ค์ฉ์ ์ธ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ ๋๋ค. ํ ๊ณณ์์ ํ ๋ก ์ ํ๋ ๊ฒ์ ๊ด๋ จ๋ ๋ชจ๋ ์ฌ๋์๊ฒ ์ ์ตํ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ, ๋์ผํ ๋ฌธ์ ์ ๋ํด ํ ๋ก ์์ด ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ์ด์ด ๋๋ ๊ฒ์ ๋ถ๋ช ํ ๋ฌด์๋ฏธํฉ๋๋ค.
๊ฒ๋ค๊ฐ, ๋๋ Daniel์ด ์ด ๋ฌธ์ ์ ์์์๋ก ๊ทธ ๋ฌธ์ ๋ฅผ ๋ซ๋ ๊ฒ์ ๊ฐ๋ ฅํ๊ฒ ๋์ํฉ๋๋ค. @andig ๊ฐ ๋ค๋ฅธ ๊ฒ์ ์ ์ํ๋ค๊ณ ๋งํ๋ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๋ด๊ฐ #21154์ ํ ์คํธ๋ฅผ ์ดํดํ ์ ์๋ ํ, ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋ ผ์ํ๊ณ ์๋ ๊ฒ๊ณผ ์ ํํ ๊ฐ์ ๊ฒ์ ์ ์ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ฝ๊ณ ๋์ํฉ๋๋ค. ์ด ๋ฌธ์ ์ ์ ๋ค๋ฆญ ๊ณ์ฝ์ ํผ๋ํ ๊ฒ ๊ฐ์ต๋๋ค. ํฉ๊ณ ์ ํ์ ๊ฐ๋ ฅํ ์ง์งํฉ๋๋ค. ๊ฐํนํ๊ฒ ๋ค๋ฆด ์๋๋ ์๋์์ผ๋ ๊ทธ๋ฐ ์์ผ๋ก ๋ค๋ฆฌ์ จ๋ค๋ฉด ์ฌ๊ณผ๋ฅผ ๋ฐ์์ฃผ์ธ์.
์ ๋ ์ฌ๋์ด๊ณ ์์ ๋ฌธ์ ๋ ๋๋๋ก ๊น๋ค๋ก์ธ ์ ์์ผ๋ฏ๋ก ์ค์๋ฅผ ํ ๋ ๋ฐ๋์ ์ง์ ํ์ญ์์ค. :) ํ์ง๋ง ์ด ๊ฒฝ์ฐ ํน์ ํฉ๊ณ ์ ํ ์ ์์ด https:/ ์ ๊ฐ์ด ์ด ์ค๋ ๋์์ ๋ถ๊ธฐ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค
์ ๋ ์ฌ๋์ด๊ณ ์์ ๋ฌธ์ ๋ ๋๋๋ก ๊น๋ค๋ก์ธ ์ ์์ผ๋ฏ๋ก ์ค์๋ฅผ ํ ๋ ๋ฐ๋์ ์ง์ ํ์ญ์์ค. :) ํ์ง๋ง ์ด ๊ฒฝ์ฐ ํน์ ํฉ๊ณ ์ ํ ์ ์์ด #19412 ์ฒ๋ผ ์ด ์ค๋ ๋์์ ๋ถ๊ธฐ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@mvdan ์ ์ธ๊ฐ์ด ์๋๋๋ค. ๋ ๋ฏฟ์ด. ๋๋ ๊ทธ์ ์ด์์ด๋ค. ๋๋ด์ด์ผ.
๊ด์ฌ์ ๊ฐ์ ธ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๋ด ์ ์์ ๊ทธ๋ ๊ฒ ์ง์ฐฉํ์ง ์์ต๋๋ค. ์์ ๋กญ๊ฒ ์กฐ์ํ๊ณ ์์ ํ๊ณ ์ผ๋ถ๋ฅผ ๊ฒฉ์ถํ์ญ์์ค. ์ ๋ ์ค์ํ์ ๋ฐ๋น ์ ํ ๋ก ์ ์ ๊ทน์ ์ผ๋ก ์ฐธ์ฌํ ๊ธฐํ๊ฐ ์์์ต๋๋ค. ์ฌ๋๋ค์ด ๋ด ์ ์์ ์ฝ๊ณ ์ค์ ๋ก ์ข์ํ๋ค๋ ๊ฒ์ ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
์๋ ์๋๋ ๊ณตํต ๋์์ ๊ณต์ ํ์ง ์์๋ ๋๋ ๋๋ฉ์ธ ๊ด๋ จ์ฑ์ ๊ธฐ์ค์ผ๋ก ์ ํ์ ๊ทธ๋ฃนํํ๊ณ ์ปดํ์ผ๋ฌ์์ ์ด๋ฅผ ์ ์ฉํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ ์๊ฐ์๋ ์ด๊ฒ์ ์ปดํ์ผ ์ค์ ์ํ๋๋ ์ ์ ๊ฒ์ฆ ๋ฌธ์ ์ผ ๋ฟ์ ๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ ํ ๊ฐ์ ๋ณต์กํ ๊ด๊ณ๋ฅผ ์ ์งํ๋ ์ฝ๋๋ฅผ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค. ์์ฑ๋ ์ฝ๋๋ ์ด๋ฌํ ๋๋ฉ์ธ ์ ํ์ ์ผ๋ฐ ์ธํฐํ์ด์ค ์ ํ์ธ ๊ฒ์ฒ๋ผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.{} ์ฐจ์ด์ ์ ์ด์ ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ ์ ์ถ๊ฐ ์ ์ ์ ํ ๊ฒ์ฌ๋ฅผ ์ํํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด ์ ์ #21154์ ํต์ฌ์ ๋๋ค.
@henryas ๋ฐ๊ฐ์์ ! ๐
Golang์ด ์ค๋ฆฌ ํ์ดํ์ ์ฌ์ฉํ์ง ์์๋๋ผ๋ฉด ์ ํ ๊ฐ์ ๊ด๊ณ๊ฐ ํจ์ฌ ๋ ์๊ฒฉํด์ง๊ณ ์ ์์์์ ์ค๋ช
ํ ๋๋ก ๋๋ฉ์ธ ๊ด๋ จ์ฑ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฃนํํ ์ ์์์์ง ๊ถ๊ธํฉ๋๋ค.
@henryas ๋ฐ๊ฐ์์ ! ๐
Golang์ด ์ค๋ฆฌ ํ์ดํ์ ์ฌ์ฉํ์ง ์์๋๋ผ๋ฉด ์ ํ ๊ฐ์ ๊ด๊ณ๊ฐ ํจ์ฌ ๋ ์๊ฒฉํด์ง๊ณ ์ ์์์์ ์ค๋ช ํ ๋๋ก ๋๋ฉ์ธ ๊ด๋ จ์ฑ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฃนํํ ์ ์์์์ง ๊ถ๊ธํฉ๋๋ค.
๊ทธ๋ด ์๋ ์์ง๋ง Go 1๊ณผ์ ํธํ์ฑ ์ฝ์์ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค. ๋ช ์์ ์ธํฐํ์ด์ค๊ฐ ์๋ ๊ฒฝ์ฐ ํฉ๊ณ ์ ํ์ด ํ์ํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ฆฌ ํ์ดํ์ด ๋ฐ๋์ ๋์ ๊ฒ์ ์๋๋๋ค. ๊ทธ๊ฒ์ ์ด๋ค ๊ฒ๋ค์ ๋ ๊ฐ๋ณ๊ณ ํธ๋ฆฌํ๊ฒ ๋ง๋ญ๋๋ค. ๋๋ ์ค๋ฆฌ ํ์ดํ์ ์ฆ๊ธด๋ค. ์์ ์ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
@henryas ๋์ํฉ๋๋ค. ๊ฐ์ค์ ์ธ ์ง๋ฌธ์ด์์ต๋๋ค. ๋ฐ๋ ์ ์์๋ ๋ชจ๋ ๊ธฐ๋ณต์ ํ์คํ ๊น์ด ์๊ฐํ์ต๋๋ค.
๋ฐ๋ฉด์ ์ธํฐํ์ด์ค ์ค์ ํ์ธ๊ณผ ๊ฐ์ ์ฝ๋ฉ ๊ฐ์ด๋๋ ์ ๋ ๋ํ๋์ง ์์ต๋๋ค.
https://github.com/uber-go/guide/blob/master/style.md#verify -interface-compliance
์ด ์ฃผ์ ๋ฅผ ๋ฒ์ด๋ ํ ๋ก ์ ๋ค๋ฅธ ๊ณณ์์ ํ ์ ์์ต๋๊น? ์ด ๋ฌธ์ ์ ๋ง์ ์ฌ๋๋ค์ด ๊ตฌ๋
ํ๊ณ ์์ต๋๋ค.
์คํ ์ธํฐํ์ด์ค ๋ง์กฑ์ Go์ ์์ ์ดํ๋ถํฐ ๊ณ์๋์ด ์์ผ๋ฉฐ ์์ผ๋ก๋ ๋ณํ์ง ์์ ๊ฒ์
๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ์ ์์ ๋ง๋ค์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ ๋ ์ด ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ 1๋ ์ ๋ ๊ณ ๋ฏผํด ์์ต๋๋ค.
๋ค์์ ๋ด๊ฐ ๊ตฌ์ฒด์ ์ธ ์ ์์ ๊ฐ์ง๊ณ ์๋ ํ์ ๋๋ค. ์ ์๊ฐ์๋
"์ ํ ์ ํ"์ ์ค์ ๋ก "ํฉ ์ ํ"๋ณด๋ค ๋ ๋์ ์ด๋ฆ์ผ ์ ์์ง๋ง YMMV์ ๋๋ค.
Go์ ํฉ๊ณ ์ ํ
ํฉ๊ณ ์ ํ์ "|"๊ฐ ๊ฒฐํฉ๋ ๋ ์ด์์ ์ ํ์ผ๋ก ํ์๋ฉ๋๋ค.
์ด์์.
๊ฒฐ๊ณผ ์ ํ์ ๊ฐ์ ์ง์ ๋ ์ ํ ์ค ํ๋๋ง ๋ณด์ ํ ์ ์์ต๋๋ค. NS
์ ํ์ ์ธํฐํ์ด์ค ์ ํ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋์ ์ ํ์
ํ ๋น๋ ๊ฐ์ ๋๋ค.
ํน๋ณํ ๊ฒฝ์ฐ๋ก "nil"์ ๊ฐ์ ์ฌ์ฉํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
0์ด ๋๋ค.
์๋ฅผ ๋ค์ด:
ํฉ๊ณ ์ ํ์ ๋ฉ์๋ ์ธํธ๋ ๋ฉ์๋ ์ธํธ์ ๊ต์งํฉ์ ๋ณด์ ํฉ๋๋ค.
๋์ผํ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ ์ธํ ๋ชจ๋ ๊ตฌ์ฑ ์์ ์ ํ
์ด๋ฆ์ด์ง๋ง ์๋ช ์ด ๋ค๋ฆ ๋๋ค.
๋ค๋ฅธ ์ธํฐํ์ด์ค ์ ํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก sum ์ ํ์ ๋์
์ ํ ๋ณํ. ์ ํ ์ค์์น์์ ์ค์์น์ ์ฒซ ๋ฒ์งธ ์์
์ ์ฅ๋ ์ ํ๊ณผ ์ผ์นํ๋ ํญ๋ชฉ์ด ์ ํ๋ฉ๋๋ค.
ํฉ๊ณ ์ ํ์ 0 ๊ฐ์ ์ฒซ ๋ฒ์งธ ์ ํ์ 0 ๊ฐ์ ๋๋ค.
ํฉ๊ณ.
ํฉ๊ณ ์ ํ์ ๊ฐ์ ํ ๋นํ ๋ ๊ฐ์ด ๋ ๋ง์ด ๋ค์ด๊ฐ ์ ์๋ ๊ฒฝ์ฐ
๊ฐ๋ฅํ ์ ํ ์ค ํ๋ ์ด์์ธ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ์ ํ์ด ์ ํ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด:
๋์ ์ ํ์ด int์ธ ๊ฐ์ด ์์ฑ๋์ง๋ง
๋์ ์ ํ์ด float64์ธ ๊ฐ์ด ์์ฑ๋ฉ๋๋ค.
๊ตฌํ
์์งํ ๊ตฌํ์ ํฉ๊ณ ์ ํ์ ์ธํฐํ์ด์ค๋ก ์ ํํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
๊ฐ์น. ๋ณด๋ค ์ ๊ตํ ์ ๊ทผ ๋ฐฉ์์ ํํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ๋ฅํ ๊ฐ ์งํฉ์ ์ ํฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด ํฌ์ธํฐ๊ฐ ์๋ ๊ตฌ์ฒด์ ์ธ ์ ํ์ผ๋ก๋ง ๊ตฌ์ฑ๋ ํฉ๊ณ ์ ํ
์ถ๊ฐ ๊ฐ์ ์ฌ์ฉํ์ฌ ํฌ์ธํฐ๊ฐ ์๋ ์ ํ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
์ค์ ์ ํ์ ๊ธฐ์ตํ์ญ์์ค.
sum-of-struct-types์ ๊ฒฝ์ฐ ์ฌ๋ถ์ ํจ๋ฉ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
๊ทธ ๋ชฉ์ ์ ์ํด ๊ตฌ์กฐ์ฒด์ ๊ณตํต๋ ๋ฐ์ดํธ.