Go: ์ œ์•ˆ: ์‚ฌ์–‘: ํ•ฉ๊ณ„ ์œ ํ˜• ์ถ”๊ฐ€/๊ตฌ๋ถ„๋œ ๊ณต์šฉ์ฒด

์— ๋งŒ๋“  2017๋…„ 03์›” 06์ผ  ยท  320์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: golang/go

์ด๊ฒƒ์€ ํŒ๋ณ„ ์กฐํ•ฉ์ด๋ผ๊ณ ๋„ ํ•˜๋Š” ํ•ฉ๊ณ„ ์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ˆ์ž…๋‹ˆ๋‹ค. Go์˜ ํ•ฉ๊ณ„ ์œ ํ˜•์€ ๋‹ค์Œ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์ฒ˜๋Ÿผ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ทธ๋“ค์€ ๊ตฌ์กฐ์ฒด์™€ ๊ฐ™์€ ๊ฐ’ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๊ฒƒ๋“ค์— ํฌํ•จ๋œ ์œ ํ˜•์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค.

ํ•ฉ๊ณ„ ์œ ํ˜•์€ switch ๋ฌธ๊ณผ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ชจ๋“  ๋ณ€ํ˜•์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. switch ๋ฌธ์˜ ์•” ๋‚ด์—์„œ ์ผ์น˜ํ•˜๋Š” ๋ณ€ํ˜•์˜ ๊ฐ’์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Go2 LanguageChange NeedsInvestigation Proposal

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด ์ œ์•ˆ์„ ๋งŒ๋“ค์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ด ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  1๋…„ ์ •๋„ ๊ณ ๋ฏผํ•ด ์™”์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ๋‚ด๊ฐ€ ๊ตฌ์ฒด์ ์ธ ์ œ์•ˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•œ์ž…๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š”
"์„ ํƒ ์œ ํ˜•"์€ ์‹ค์ œ๋กœ "ํ•ฉ ์œ ํ˜•"๋ณด๋‹ค ๋” ๋‚˜์€ ์ด๋ฆ„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ YMMV์ž…๋‹ˆ๋‹ค.

Go์˜ ํ•ฉ๊ณ„ ์œ ํ˜•

ํ•ฉ๊ณ„ ์œ ํ˜•์€ "|"๊ฐ€ ๊ฒฐํ•ฉ๋œ ๋‘˜ ์ด์ƒ์˜ ์œ ํ˜•์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
์šด์˜์ž.

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์˜ ๊ฒฝ์šฐ ์—ฌ๋ถ„์˜ ํŒจ๋”ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ๋ชฉ์ ์„ ์œ„ํ•ด ๊ตฌ์กฐ์ฒด์— ๊ณตํ†ต๋œ ๋ฐ”์ดํŠธ.

๋ชจ๋“  320 ๋Œ“๊ธ€

์ด๊ฒƒ์€ ์˜คํ”ˆ ์†Œ์Šค ๋ฆด๋ฆฌ์Šค ์ด์ „๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ณผ๊ฑฐ์— ์—ฌ๋Ÿฌ ๋ฒˆ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์˜ ํ•ฉ์˜๋Š” 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์ž…๋‹ˆ๋‹ค.

Go์˜ ํ•ฉ๊ณ„ ์œ ํ˜•

ํ•ฉ๊ณ„ ์œ ํ˜•์€ "|"๊ฐ€ ๊ฒฐํ•ฉ๋œ ๋‘˜ ์ด์ƒ์˜ ์œ ํ˜•์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
์šด์˜์ž.

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 ๋‹ค์Œ์€ ์ด ๊ธฐ๋Šฅ์ด ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

  1. ์ผ๋ถ€ ํŒจํ‚ค์ง€(์˜ˆ go/ast )์˜ ํ•ต์‹ฌ์—๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ํฐ ๊ธˆ์•ก ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์„ ์ดํ•ดํ•˜์ง€ ์•Š๊ณ ๋Š” ์ด๋Ÿฌํ•œ ํŒจํ‚ค์ง€๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋” ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ๋„ sum ์œ ํ˜•์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค(์˜ˆ: go/ast.Node )๋กœ ํ‘œ์‹œ๋˜๊ณ  ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค(์˜ˆ: go/ast.Object.Decl )๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  2. protobuf oneof ๊ธฐ๋Šฅ์„ Go๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด oneof ํ•„๋“œ์— ๋Œ€ํ•œ ํ• ๋‹น์ด ์œ ํ˜•์ด ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ๋ชฉ์ ์ธ ๋‚ด๋ณด๋‚ด๊ธฐ๋˜์ง€ ์•Š์€ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ฐจ๋ก€๋กœ oneof์˜ ๊ฐ ๋ถ„๊ธฐ์— ๋Œ€ํ•œ ์œ ํ˜•์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข… ์ œํ’ˆ์— ๋Œ€ํ•œ ์œ ํ˜• ๋ฆฌํ„ฐ๋Ÿด์€ ์ฝ๊ณ  ์“ฐ๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

    &sppb.Mutation{
               Operation: &sppb.Mutation_Delete_{
                   Delete: &sppb.Mutation_Delete{
                       Table:  m.table,
                       KeySet: keySetProto,
                   },
               },
    }
    

    ์ผ๋ถ€(์ „๋ถ€๋Š” ์•„๋‹ˆ์ง€๋งŒ) ์ค‘ ํ•˜๋‚˜๋Š” ํ•ฉ๊ณ„ ์œ ํ˜•์œผ๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ๋•Œ๋•Œ๋กœ "์•„๋งˆ๋„" ์œ ํ˜•์ด ์ •ํ™•ํžˆ ํ•„์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋งŽ์€ 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
       ...
    }
    
  4. ๋งŽ์€ ํ•จ์ˆ˜๋Š” 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๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ฝ”๋“œ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ด๋™ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.
    1.1. ๊ธฐ๋ณธ ๋ฌธ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    1.2. ํŒจ๋‹‰์ด ์žˆ๋Š” ๊ธฐ๋ณธ ๋ฌธ์ด ์žˆ๊ณ  ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋Œ€์‹  ๋Ÿฐํƒ€์ž„์— ์ฝ”๋“œ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค(ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์กด์žฌํ–ˆ๋˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ์•Œ๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).
  2. ์ฝ”๋“œ๋Š” ๋…ธ๋“œ ์œ ํ˜•์˜ ํ•˜์œ„ ์ง‘ํ•ฉ๋งŒ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
    2.1. ์ด ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ๋…ธ๋“œ๋Š” ์–ด์จŒ๋“  ํ•˜์œ„ ์ง‘ํ•ฉ์— ์—†์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    2.1.1. ์ด ์ƒˆ ๋…ธ๋“œ๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ๋ฉ๋‹ˆ๋‹ค.
    2.1.2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๊ฑธ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์— ์ฒ˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    2.2. ์ด ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ๋…ธ๋“œ๋Š” ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด ๊ด€์‹ฌ ์žˆ๋Š” ํ•˜์œ„ ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ 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"
  • ๋” ๋ณต์žกํ•œ ํ•ฉ๊ณ„๋ฅผ ์œ„ํ•ด ๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ ํƒœ๊ทธ ๋ฉ”์„œ๋“œ์™€ ์ธํ„ฐํŽ˜์ด์Šค(์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Œ)
  • ๋˜๋Š” ์—ด๊ฑฐํ˜• ๊ฐ’์— ๋”ฐ๋ผ ์„ค์ •๋˜๋Š” ํ•„๋“œ์— ๋Œ€ํ•œ iota ์—ด๊ฑฐํ˜• ๋ฐ ์–ธ์–ด ์™ธ ๊ทœ์น™์ด ์žˆ๋Š” ๊ตฌ์กฐ์ฒด

์— ๊ด€๊ณ„์—†์ด

  • ๋” ๋‚˜์€ ํˆด๋ง, ํ•ญ์ƒ ๋” ๋‚˜์€ ํˆด๋ง

์ ์ง„์ ์ธ ์ˆ˜๋ฆฌ์˜ ๊ฒฝ์šฐ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ํฐ ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ, ์œ ์ผํ•œ ์˜ต์…˜์€ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๊ฐ€ ์™„์ „์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์˜ตํŠธ์•„์›ƒํ•˜๋Š” ๊ฒƒ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๊ณผ ์ผ์น˜ํ•˜๋”๋ผ๋„ ๋ฏธ๋ž˜์˜ ๊ต์ •์—๋งŒ ๊ด€๋ จ๋œ "๋ถˆํ•„์š”ํ•œ" ๊ธฐ๋ณธ ์‚ฌ๋ก€๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ํ•ฉ๋ฒ•์ ์ด์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ง€๊ธˆ ์•”๋ฌต์ ์œผ๋กœ ์‚ฌ์‹ค์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€์ •ํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค๋ฉด ๋ง์ž…๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ "๋‹ค์Œ ๋ฒ„์ „์—์„œ ์ด ํ•ฉ๊ณ„ ์œ ํ˜•์— ์ƒˆ ๋ฉค๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•  ์˜ˆ์ •์ด๋‹ˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค"๋ผ๊ณ  ๋ฐœํ‘œํ•˜๋ฉด 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

ํ”„๋กœ

  • ๋‹ซํžŒ ์œ ํ˜• ์ง‘ํ•ฉ์œผ๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ •ํ™•ํ•œ ์™„์ „์„ฑ ๊ฒ€์‚ฌ๊ธฐ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • "๊ณ„์•ฝ์„ ์ถฉ์กฑํ•˜๋Š” ๊ฐ’์„ ์ด ์†์„ฑ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ์†์„ฑ์„ ์–ป์Šต๋‹ˆ๋‹ค. (๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

๋‹จ์ 

  • ๊ทธ๊ฒƒ๋“ค์€ ๋‹จ์ง€ ์ด์ ์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ผ ๋ฟ ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์œ ํ˜•์€ ์•„๋‹™๋‹ˆ๋‹ค(์ข‹์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค!)
  • ์—ฌ์ „ํžˆ nil์ด ์žˆ์œผ๋ฏ€๋กœ ์œ ํ˜• ์ด๋ก ์ ์ธ ์˜๋ฏธ์—์„œ ์‹ค์ œ๋กœ ํ•ฉ ์œ ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค. ์–ด๋–ค A + B + C ๋ฅผ ์ง€์ •ํ•˜๋“  ์‹ค์ œ๋กœ๋Š” ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†๋Š” 1 + A + B + C ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ด ์ž‘์—…์„ ํ•˜๋Š” ๋™์•ˆ @stevenblenkinsop์ด ์ง€์ ํ–ˆ๋“ฏ์ด.
  • ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ์•”์‹œ์  ํฌ์ธํ„ฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ๊ฐ„์ ‘ ์ฐธ์กฐ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ ํƒ ์ œ์•ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด p ๋˜๋Š” *p ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๋ฅผ ๋” ์ž˜ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ ํ™”๋กœ ๊ตฌ๋ณ„๋œ ๊ณต์šฉ์ฒด(C ์˜๋ฏธ์—์„œ)๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • 0 ๊ฐ’์„ ์„ ํƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ Go์—์„œ ๊ฐ€๋Šฅํ•œ ํ•œ ์œ ์šฉํ•œ 0 ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ง ์ข‹์€ ์†์„ฑ์ž…๋‹ˆ๋‹ค.
  • ์•„๋งˆ๋„ T ์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. type T restrict {string, error}
  • ํ•„๋“œ/summands/what-have-you์— ๋Œ€ํ•œ ๋ ˆ์ด๋ธ”์„ ์žƒ์œผ๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•  ๋•Œ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง‘๋‹ˆ๋‹ค. ํ•ฉ๊ณ„ ์œ ํ˜•์˜ ๊ฐ•๋ ฅํ•œ "์ •ํ™•ํžˆ ์ด๊ฒƒ ๋˜๋Š” ์ •ํ™•ํžˆ ์ €๊ฒƒ" ์†์„ฑ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 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 ๊ฐ’์€ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ดœ์ฐฎ์Œ).

    • ์ด๊ฒƒ์€ ์ถ”๊ฐ€ ํ• ๋‹น์œผ๋กœ ์ธํ•ด ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค(๋น„๋ก ๊ตฌํ˜„์— ๋”ฐ๋ผ ์กฐํ•ฉ์ด ๋™์ผํ•œ ์šด๋ช…์„ ๊ฒช์„ ์ˆ˜ ์žˆ์ง€๋งŒ).
    • ํฌ์ธํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ํ™•์ธํ•ด์•ผ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณ ํ†ต์Šค๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค(protos์—์„œ 0์ด ์•„๋‹Œ ๊ธฐ๋ณธ๊ฐ’์€ ํ™•์ธ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ...).
  • proto ์–ธ์–ด๋Š” proto ๋ฒ„์ „์˜ sum ์œ ํ˜•์ธ "one of"๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ทจํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค( ์ „์ฒด ์˜ˆ ).

    • ์ˆจ๊ฒจ์ง„ ๋ฉ”์†Œ๋“œ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜• ์ •์˜(์˜ˆ: type Communique_Union interface { isCommunique_Union() } )
    • Union์—์„œ ํ—ˆ์šฉ๋˜๋Š” ๊ฐ๊ฐ์˜ ๊ฐ€๋Šฅํ•œ Go ์œ ํ˜•์— ๋Œ€ํ•ด ๋ž˜ํผ ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ž˜ํผ ๊ตฌ์กฐ์ฒด๋Š” ๊ฐ ์œ ํ˜•์— isCommunique_Union ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ํ—ˆ์šฉ๋œ ๊ฐ ์œ ํ˜•(์˜ˆ: type Communique_Number struct { Number int32 } )์„ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.
    • ๋ž˜ํผ๊ฐ€ ํ• ๋‹น์„ ์œ ๋ฐœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋˜ํ•œ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ๊ฐ’(์Šฌ๋ผ์ด์Šค)์ด 24B๋ฅผ ๋„˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— sum ์œ ํ˜•์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@henryas ์ €๋Š” ๋” ์œ ์šฉํ•œ ๋น„๊ต๊ฐ€ ํ˜„์žฌ ๊ถŒ์žฅ๋˜๋Š” (๊ฐœ๋ฐฉํ˜•) ํ•ฉ๊ณ„ ์œ ํ˜•์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์ธํ„ฐํŽ˜์ด์Šค(๋‚ด
๋‚˜๋Š” ๋‹น์‹ ์˜ ์ฃผ์žฅ์ด ์ค‘์š”ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ทธ๊ฒƒ์— ์ ์šฉ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ์ฒด๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚ด๋ณด๋‚ด๊ธฐ๋˜์ง€ ์•Š์€ ๋”๋ฏธ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐœ์ฒด์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

type MyInterface interface {
   belongToMyInterface() //dummy method definition
}

type MyObject struct{}
func (MyObject) belongToMyInterface(){} //dummy method

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ „ํ˜€ ๊ถŒ์žฅ๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋นˆ ๋ฉ”์†Œ๋“œ์™€ ๋ถˆํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ ์ •์˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ์ •์  ์œ ํ˜• ๊ฒ€์ฆ์„ ํฌ๊ธฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ _dummy method_ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

  • ๊ฐœ์ฒด์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์–ด์ง€๋Ÿฝํžˆ๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ๋ฐ ๋ฉ”์„œ๋“œ ์ •์˜.
  • ์ƒˆ๋กœ์šด _group_์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ๊ฐœ์ฒด์˜ ๊ตฌํ˜„์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋”๋ฏธ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€). ์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋‹ค์Œ ์š”์  ์ฐธ์กฐ).
  • ๋Œ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•(๋˜๋Š” ๋™์ž‘์ด ์•„๋‹Œ _domain_์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ทธ๋ฃนํ™”)์€ ๋„๋ฉ”์ธ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค . ๋„๋ฉ”์ธ์— ๋”ฐ๋ผ ๊ฐœ์ฒด ๊ด€๊ณ„๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํšŒ๊ณ„์‚ฌ๋Š” ์ฐฝ๊ณ  ๊ด€๋ฆฌ์ž์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฌธ์„œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ทธ๋ฃนํ™”๋Š” ๊ฐœ์ฒด ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐœ์ฒด์˜ ์†Œ๋น„์ž์™€ ๊ด€๋ จ๋ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด๋Š” ์†Œ๋น„์ž์˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์•Œ ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์•Œ ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. ์†ก์žฅ์ด ํšŒ๊ณ„์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•  ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ํšŒ๊ณ„ ๊ทœ์น™์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค _(์˜ˆ: ์ƒˆ ๋ฌธ์„œ ๊ทธ๋ฃนํ™” ์ ์šฉ)_ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? _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 ์ด ํƒœ๊ทธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ๋ฏธ๊ฒฐ ํ•ฉ๊ณ„๊ฐ€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ๋‚ด์„ฑ์ด

๋ฌธ์ œ๋Š” ๋ˆ„๊ตฐ๊ฐ€ ์ปดํŒŒ์ผํ•˜๊ณ  ํŒจํ‚ค์ง€์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•ฉ๊ณ„์— ์—†๋Š” ํ˜•์‹์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ธ์–ด์— ์ ์ ˆํ•œ ํ•ฉ๊ณ„ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ƒํ™ฉ์„ ๋ฌด์‹œํ•˜๋‹ค
  2. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ํŒจ๋‹‰/์˜ค๋ฅ˜ ๋ฐ˜ํ™˜
  3. ๋‚ด์žฌ๋œ ๊ฐ’์„ ์•”๋ฌต์ ์œผ๋กœ ์ถ”์ถœํ•˜๊ณ  ์‚ฌ์šฉํ•˜์—ฌ "๋‹น์‹ ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ˆ˜ํ–‰"์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

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์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์˜์‚ฌํ•ฉ ๊ณ„์—ด์„ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. (๋Œ€๋žต ๋ฐœ์ƒ ์ˆœ์„œ๋Œ€๋กœ)

  • const/iota ์—ด๊ฑฐํ˜•.
  • ๋™์ผํ•œ ํŒจํ‚ค์ง€์— ์ •์˜๋œ ์œ ํ˜•์— ๋Œ€ํ•œ ํ•ฉ๊ณ„์— ๋Œ€ํ•œ ํƒœ๊ทธ ๋ฉ”์†Œ๋“œ์™€์˜ ์ธํ„ฐํŽ˜์ด์Šค.
  • *T ์˜ต์…˜์˜ ๊ฒฝ์šฐ T
  • ๊ฐ’์ด ์„ค์ •๋  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์—ด๊ฑฐํ˜•์ด ์žˆ๋Š” ๊ตฌ์กฐ์ฒด(์—ด๊ฑฐํ˜•์ด bool์ด๊ณ  ๋‹ค๋ฅธ ํ•„๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์„ ํƒ์  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 (ํ•˜์ง€๋งŒ ์ฃผ์„์„ ์„ค๋ช…ํ•˜๋ ค๋ฉด ์—ฌ์ „ํžˆ ๊ธฐ๊ณ„๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค). ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์žฅ์ 

  • ์ฝ”๋“œ์— ๋ช…์‹œ์ : ๊ทธ๋ ‡๊ฒŒ ํ‘œ์‹œ๋˜๋ฉด 100% ํ•ฉ๊ณ„ ์œ ํ˜•์ด๋ฉฐ ์˜คํƒ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ •์˜์—๋Š” ์˜๋ฏธ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํŒจํ‚ค์ง€ ๋ฌธ์„œ๋Š” ์ด๋Ÿฌํ•œ ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ถ€๋Š” ๋ฐ˜์‚ฌ์— ์•ฝ๊ฐ„์˜ ๊ฐ€์‹œ์„ฑ์„ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    ๋‹จ์ 
  • ์˜ค๋ž˜๋œ ์ฝ”๋“œ์™€ stdlib(์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ)์—์„œ ๋งŽ์€ ๊ฑฐ์ง“ ๋ถ€์ •.
  • ๊ทธ๊ฒƒ๋“ค์€ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ฑ„ํƒ ์†๋„๊ฐ€ ๋Š๋ฆฌ๊ณ  100%์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฉฐ ์ด ํŠน์ˆ˜ ํŒจํ‚ค์ง€๋ฅผ ์ธ์‹ํ•œ ๋„๊ตฌ์˜ ํšจ์œจ์„ฑ์€ ์ฑ„ํƒ์˜ ํ•จ์ˆ˜๊ฐ€ ๋  ๊ฒƒ์ด๋ฏ€๋กœ ์‹คํ—˜์ ์ด๊ธด ํ•˜์ง€๋งŒ ๋งค์šฐ ํฅ๋ฏธ๋กญ์ง€๋งŒ ๋น„ํ˜„์‹ค์ ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•ฉ๊ณ„ ์œ ํ˜•์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€๊ณ„์—†์ด ํ•ด๋‹น ์œ ํ˜•์ด ์ธ์‹๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ํ•ด๋‹น ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์˜ ์ข…๋ฅ˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ํˆด๋ง์„ ์ƒ์„ฑ(์ŠคํŠธ๋ง๊ฑฐ์™€ ๊ฐ™์€) ๋ฐ ๋‚ด์„ฑ(๊ณจ๋ฆฐํŠธ์™€ ๊ฐ™์€)์œผ๋กœ ๋Œ€๋žต ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ƒ์„ฑ ์ฝ”๋“œ๋Š” ๋ˆ„๋ฝ๋œ ์ผ€์ด์Šค๋กœ switch ๋ฌธ์„ ์ฑ„์šฐ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŽธ์ง‘์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ฉ๊ณ„ ์œ ํ˜•์ด ํ•ฉ๊ณ„ ์œ ํ˜•์œผ๋กœ ์‹๋ณ„๋˜๋ฉด ์ด๊ฒƒ์€ ์‚ฌ์†Œํ•ฉ๋‹ˆ๋‹ค(์กฐ๊ธˆ ์ง€๋ฃจํ•˜์ง€๋งŒ ์‹ค์ œ ์ƒ์„ฑ ๋…ผ๋ฆฌ๋Š” ์–ธ์–ด ์ง€์› ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๋™์ผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๋ชจ๋“  ๊ฒฝ์šฐ์— "ํ•˜๋‚˜์˜" ๋ถˆ๋ณ€์„ฑ์„ ๊ฒ€์ฆํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์˜ ๊ฒฝ์šฐ ์ŠคํŠธ๋ง๊ฑฐ์™€ ๊ฐ™์€ ๋” ๋งŽ์€ ๋„๊ตฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/golang/go/issues/19814#issuecomment -291002852์—์„œ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ํฐ ์ƒ์„ฑ ๋„๊ตฌ๋Š” ์ด ์ •๋ณด๋กœ ๋” ๋‚˜์€ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ˜„์žฌ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€์˜ ์œ„์‹œ๋ฆฌ์ŠคํŠธ์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด์„ฑ์˜ ๊ฒฝ์šฐ ๋ช…๋ฐฑํ•œ ํ›„๋ณด๋Š” ์ฒ ์ €ํ•œ ๋ฆฐํŠธ์ž…๋‹ˆ๋‹ค. ์–ธ์–ด ์ง€์›์ด ์—†์œผ๋ฉด ์‹ค์ œ๋กœ ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋ฆฐํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ƒํƒœ๊ฐ€ ์ฒ˜๋ฆฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
  2. ์ž˜๋ชป๋œ ์ƒํƒœ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ(1์ด ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์„ ๋ฌดํšจํ™”ํ•จ)

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๋…„ ํ›„์˜ ๋Š๋‚Œ์„ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ ๋‚˜๋ˆ„๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์ค‘ ๊ฐ€์น˜ ๋ฐ˜ํ™˜์€ ํฐ ์‹ค์ˆ˜์˜€์Šต๋‹ˆ๋‹ค.
  • Nil-able ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์‹ค์ˆ˜์˜€์Šต๋‹ˆ๋‹ค.
  • ํฌ์ธํ„ฐ๋Š” "์„ ํƒ ์‚ฌํ•ญ"์˜ ๋™์˜์–ด๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๊ตฌ๋ณ„๋œ ๊ณต์šฉ์ฒด๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • JSON ๋ฌธ์„œ์— ํ•„์ˆ˜ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ JSON ์–ธ๋งˆ์ƒฌ๋Ÿฌ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ง€๋‚œ 4๋…„ ๋™์•ˆ ๋‚˜๋Š” ์ด์™€ ๊ด€๋ จ๋œ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ฐ€๋น„์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ๋ฌธ ํ˜ผ๋ž€(์˜ค๋ฅ˜์˜ ๊ฒฝ์šฐ 0 ๊ฐ’ ๋ฐ˜ํ™˜).
  • ๋‹ค์ค‘ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜(ํ˜ผ๋™ API, ์ œ๋ฐœ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ๋งˆ์„ธ์š”!).
  • nil ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” nil์ด ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค("Go๋Š” ์‰ฌ์šด ์–ธ์–ด์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ๋ง์„ ๋‚˜์œ ๋†๋‹ด์ฒ˜๋Ÿผ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ๋“ค์„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค).
  • ์„ ํƒ๋˜์ง€ ์•Š์€ JSON ํ•„๋“œ๋Š” ์„œ๋ฒ„๋ฅผ ์ถฉ๋Œ์‹œํ‚ต๋‹ˆ๋‹ค(์˜ˆ!).
  • ํ™•์ธ๋˜์ง€ ์•Š์€ ๋ฐ˜ํ™˜๋œ ํฌ์ธํ„ฐ๋Š” ์„œ๋ฒ„๋ฅผ ํฌ๋ž˜์‹œํ•˜์ง€๋งŒ ๋ฐ˜ํ™˜๋œ ํฌ์ธํ„ฐ๋Š” ์„ ํƒ ์‚ฌํ•ญ(์•„๋งˆ๋„ ์œ ํ˜•)์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋”ฐ๋ผ์„œ 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 ์™€ ๊ด€๋ จ์ด ์žˆ์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ฃผ์š” ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค(๊ฑฐ์˜ ๋ชจ๋“  ์•„์ด๋””์–ด๊ฐ€ ์ด๋ฏธ ์ฃผ์„์—์„œ ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค).

  1. ํ—ˆ์šฉ | "discriminated unions"์˜
    <any pointer type> | nil
    ํฌ์ธํ„ฐ ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ, ํ•จ์ˆ˜, ์ฑ„๋„, ์Šฌ๋ผ์ด์Šค ๋ฐ ๋งต(Go ํฌ์ธํ„ฐ ์œ ํ˜•)
  2. ๋ฒ ์–ด ํฌ์ธํ„ฐ ์œ ํ˜•์— 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.

์ด๊ฒƒ์ด ์ฃผ์š” ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ฃผ์š” ์•„์ด๋””์–ด์—์„œ ํŒŒ์ƒ๋œ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

  1. ๋ฒ ์–ด ํฌ์ธํ„ฐ ์œ ํ˜•์˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘˜ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด | nil ํŒ๋ณ„ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
var maybeAString *string       // Wrong: invalid initial value
var maybeAString *string | nil // Good
  1. ๋ฒ ์–ด ํฌ์ธํ„ฐ ์œ ํ˜•์„ "nilable" ํฌ์ธํ„ฐ ์œ ํ˜•์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ ๋ฐ˜๋Œ€๋Š” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
var value int = 42
var barePointer *int = &value          // Valid
var nilablePointer *int | nil = &value // Valid

nilablePointer = barePointer // Valid
barePointer = nilablePointer // Invalid: Incompatible types
  1. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ง€์ ํ–ˆ๋“ฏ์ด "nilable" ํฌ์ธํ„ฐ ์œ ํ˜•์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์œ ํ˜• ์Šค์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ์˜ˆ์™€ ๋‹ค์Œ, ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง ๊ฐ’ ์ง€์ •ํ•˜๋ ค๋ฉด 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
}

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ๋‹ค์•ผ. ๋‚˜๋Š” ์ฐจ๋ณ„๋œ ๊ณต์šฉ์ฒด๋ฅผ ํ›จ์”ฌ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ(ํŠนํžˆ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ), ์œ„์—์„œ ์ž‘์„ฑํ•œ ๊ฒƒ์„ ๊ณ ์ˆ˜ํ•˜๋ฉด ๋” ์ ์€ ๋…ธ๋ ฅ์œผ๋กœ ์–ธ์–ด์— ์—„์ฒญ๋‚œ ๊ฐ€์น˜๋ฅผ ๊ฐ€์ ธ๋‹ค์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•„์š” ์ด์ƒ์œผ๋กœ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ฐ„๋‹จํ•œ ์ œ์•ˆ์„ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ :

  • a) nil ํฌ์ธํ„ฐ ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค . ์ข‹์•„์š”, 4๋‹จ์–ด๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํฐ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ์ ์€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ด€์ ์—์„œ ๋งํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. No Go ํ”„๋กœ๊ทธ๋žจ์€ _EVER_ nil pointer dereference ์˜ค๋ฅ˜๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ’ฅ
  • b) "์„ฑ๋Šฅ ๋Œ€ ์˜๋„"๋ฅผ ๊ฑฐ๋ž˜ํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ตฌ์กฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ nullity์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜๊ณ  ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. . ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณต์‚ฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํฌ์ธํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • c) ๋” ์ด์ƒ nil ๋งต์ด ์—†์Šต๋‹ˆ๋‹ค! ์‘! ์šฐ๋ฆฌ๋Š” "safe nil-slice"์™€ "unsafe nil-maps"์— ๋Œ€ํ•œ ๋ถˆ์ผ์น˜๋กœ ๋๋‚ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๋„๋Š” ์ดˆ๊ธฐํ™”๋˜๊ฑฐ๋‚˜ 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 ๋ฐ ๊ธฐํƒ€์—์„œ์™€ ๊ฐ™์ด ์„ ํƒ์ /๋น„์„ ํƒ์  ์ข…๋ฅ˜์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋ฉ‹์ง€์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๊ทธ๊ฒƒ์€ ๊ฑฐ์˜ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์„ ๊นจ๋œจ๋ฆด ๊ฒƒ์ด๊ณ  ์ˆ˜์ •์€ gofix์— ์‚ฌ์†Œํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ œ์•ˆ์— ๋”ฐ๋ผ ๊ฐ’์„ ํ’€๊ธฐ ์œ„ํ•ด ์œ ํ˜• ์ „ํ™˜์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ชจ๋“  ๊ฒƒ์„ <pointer type> | nil ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  2. ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  ๊ฒฌ๋”œ ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ์ด๋Ÿฌํ•œ ์„ ํƒ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ตฌ๋ฌธ ์„คํƒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์Šค์œ„ํ”„ํŠธ๋ฅผ ๋ณด์ž. ์–ธ์–ด์—๋Š” ํŠนํžˆ ์˜ต์…”๋„๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋“œ, ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ, ์˜ต์…”๋„ ์ฒด์ธ, nil ๋ณ‘ํ•ฉ ๋“ฑ. ์ €๋Š” Go๊ฐ€ ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ ์˜ต์…”๋„์ด ์—†์œผ๋ฉด ์ž‘์—…์ด ๊ท€์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์œ ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ 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 ๊ฐ’ ๋ชฉ๋ก์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ 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๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค :

  • ์šฐ๋ฆฌ๊ฐ€ ์–ป๋Š” ์ด์ ์— ๋Œ€ํ•œ ์ข‹์€ ์ ˆ์ถฉ์•ˆ์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด/์Šฌ๋ผ์ด์Šค ์•ก์„ธ์Šค์˜ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ์—์„œ๋„ ๋™์ผํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉฐ ์šฐ๋ฆฌ๋Š” ์•ˆ์ „์„ ์œ„ํ•ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ง€๋ถˆํ•˜๋Š” ๊ฒƒ์„ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค.
  • nil-checks๋Š” ๋ฐฐ์—ด ๋ฐ”์šด๋“œ ๊ฒ€์‚ฌ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ ์œ ํ˜•์ด ํ˜„์žฌ ๋ฒ”์œ„์—์„œ ์ดˆ๊ธฐํ™”๋œ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ฅผ ์•Œ๊ณ  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
}

๋”ฐ๋ผ์„œ ๋‹ค์Œ ์ค‘์—์„œ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • A) ์ถฉ๋Œ๋กœ ์ธํ•œ ์‹คํŒจ
  • B) ํฌ์ธํ„ฐ๊ฐ€ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋  ๋•Œ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜.

๋‘ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— 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: ๋””์ž์ธ ๋ฌธ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ์•ฝ๊ฐ„ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‚ด์žฅ ํ•ฉ๊ณ„ ์œ ํ˜•์ด ํ•„์š”ํ•œ ๋‘ ๊ฐ€์ง€ ์ตœ๊ทผ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์˜ˆ์ƒ๋Œ€๋กœ AST ํŠธ๋ฆฌ ํ‘œํ˜„. ์ฒ˜์Œ์—๋Š” ์ฒซ๋ˆˆ์— ์†”๋ฃจ์…˜์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•˜์ง€๋งŒ, ์ ‘๊ทผ ๋ฐฉ์‹์€ nilable ํ•„๋“œ๊ฐ€ ๋งŽ์€ ๋Œ€ํ˜• ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ์„ธ๊ณ„์˜ ์ตœ์•… IMO. ๋ฌผ๋ก  ์œ ํ˜• ์•ˆ์ „์„ฑ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์šฐ๋ฆฌ ์ž์‹ ์„ ์ผ์Šต๋‹ˆ๋‹ค.
  2. ๋ฏธ๋ฆฌ ์ •์˜๋œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ๋Œ€๊ธฐ์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ฐœ๋ฐœ ์ค‘์ธ ๊ฒ€์ƒ‰ ์„œ๋น„์Šค๊ฐ€ ์žˆ๊ณ  ๊ฒ€์ƒ‰ ์ž‘์—…์ด ๋„ˆ๋ฌด ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค ์ž‘์—… ์ž‘์—…์„ ์ฑ„๋„๋กœ ์ „์†กํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋””์ŠคํŒจ์ฒ˜๊ฐ€ ์ถ”๊ฐ€๋กœ ์ฒ˜๋ฆฌํ•  ์ž‘์—…์„ ๊ฒฐ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐฉ๋ฌธ์ž ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๊ฐ„๋‹จํ•œ gRPC ์š”์ฒญ์— ๋Œ€ํ•œ ๊ณผ์ž‰์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ํŒŒ๊ฒฌ์ž์™€ ๋ฐฉ๋ฌธ์ž ์‚ฌ์ด์˜ ์œ ๋Œ€๋ฅผ ์†Œ๊ฐœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ์–ด๋„ ๋งํ•˜๊ธฐ๋Š” ํŠนํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค(๋‘ ๋ฒˆ์งธ ์ž‘์—…์˜ ์˜ˆ์—์„œ).

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 ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์ด ๊ณ„์•ฝ์„ ์ง์ ‘ ๋Œ€์ฒดํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
    ์™€ ๊ฐ™์€ ์œ ํ˜•์œผ๋กœ

    type C2(type T C1) interface { ... }
    

    ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ T ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด ์™ธ๋ถ€์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. T ๋กœ ์ „๋‹ฌ๋œ ๋ชจ๋“  ์œ ํ˜• ์ธ์ˆ˜๋Š” C1 ๊ณ„์•ฝ์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฏธ ์•Œ๋ ค์ ธ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ณธ๋ฌธ์€ T ๋” ์ด์ƒ ์ œํ•œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ „๋‹ฌ๋œ ๊ฒฐ๊ณผ๋กœ ๊ณ„์•ฝ ๋ณธ๋ฌธ์— ์˜ํ•ด ์ œ์•ฝ์„ ๋ฐ›๋Š” ๊ณ„์•ฝ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ฐ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ œ์•ฝ ์กฐ๊ฑด์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋˜๊ธฐ ์ „์— ๋…๋ฆฝ์ ์œผ๋กœ ์ œ์•ฝ๋˜์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  2. ์ธํ„ฐํŽ˜์ด์Šค ๋ณธ๋ฌธ์— ์ˆ˜์‹ ๊ธฐ ์œ ํ˜•์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
    ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    type C3(type U C1) interface(T) {
        Add(T) T
    }
    

    ์—ฌ๊ธฐ์„œ T ๋Š” ์ˆ˜์‹ ๊ธฐ ์œ ํ˜•์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

  3. ์ผ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์€ ์ œ๋„ค๋ฆญ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    ์ˆ˜์‹ ๊ธฐ ์œ ํ˜•์˜ ์—ฌ๋Ÿฌ ๊ฐ’์— ์˜์กดํ•˜๋Š” ์ž‘์—…์€ ๋™์  ๋””์ŠคํŒจ์น˜์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ž์ฒด๋ฅผ ๋งŒ์กฑํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œํ•œ๋˜๋Š” ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์œ ํ˜• ์ธ์ˆ˜๋กœ). ์ด๊ฒƒ์€ ๋†€๋ผ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์€ ๊ทธ๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’ ์ƒ์„ฑ์„ ์ „ํ˜€ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์ง€๋งŒ, ์ด๋Š” ์–ด์จŒ๋“  ์—ฌ๊ธฐ์—์„œ ๊ตฌ์ƒ ์ค‘์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด๊ณผ ์œ ํ˜• ID ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ •์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.

contract (T) indenticalTo(U) {
    *T *U
}

(์—ฌ๊ธฐ์„œ ์ €๋Š” ๋ฐœ๋ช…๋œ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ์œ ํ˜•์„ "์ˆ˜์‹ ์ž"๋กœ ์ง€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹ ์ž๊ฐ€ ์žˆ๋Š” func๊ฐ€ "๋ฉ”์†Œ๋“œ"๋กœ ๋ฐœ์Œ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ช…์‹œ์  ์ˆ˜์‹ ์ž ์œ ํ˜•์ด ์žˆ๋Š” ๊ณ„์•ฝ์„ "์ œ์•ฝ์กฐ๊ฑด"์œผ๋กœ ๋ฐœ์Œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ปจํŠธ๋ž™ํŠธ ์ด๋ฆ„ ๋’ค์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ผ๋ฐ˜ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ, ์ œ์•ฝ ๋ณธ๋ฌธ์—์„œ ์ œ์•ฝ ์กฐ๊ฑด ์ ˆ์˜ ์™ผ์ชฝ์— ๋‚˜ํƒ€๋‚  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)

๋ฆฌํ„ฐ๋Ÿด ํฌ์ธํ„ฐ ์œ ํ˜•์˜ ๊ธฐ๋ณธ ์œ ํ˜•์ด ์ž์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ œ์•ฝ ์กฐ๊ฑด์€ T ๊ฐ€ U ๋™์ผํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— (identicalTo(int)), (identicalTo(uint)), ... ๋ฅผ ์ œ์•ฝ ์กฐ๊ฑด ๋ถ„๋ฆฌ๋กœ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ„์•ฝ์€ ์ผ์ข…์˜ ํ•ฉ๊ณ„ ์œ ํ˜•์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ํ•ฉ๊ณ„ ์œ ํ˜•์„ ํ‘œํ˜„ํ•  ์ˆ˜๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ดˆ์•ˆ์—์„œ ๋ณธ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์„ ๋‚˜์—ดํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

contract Foo(T, U) {
    T U, int64
}

์•Œ๋ ค์ง€์ง€ ์•Š์€ ์œ ํ˜•๊ณผ ํ•˜๋‚˜ ์ด์ƒ์˜ ์•Œ๋ ค์ง„ ์œ ํ˜•์˜ ์ผ๋ฐ˜ ํ•ฉ๊ณ„ ์œ ํ˜•์„ ํ‘œํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋””์ž์ธ์ด ๊ทธ๋Ÿฌํ•œ ๊ตฌ์„ฑ์„ ํ—ˆ์šฉํ•˜๋”๋ผ๋„ ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์‹ค์ƒ ๊ฐ™์€ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๋ฉด ์ด์ƒํ•˜๊ฒŒ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์„ ํฌํ•จํ•˜๋„๋ก ํ™•์žฅ๋œ ๋‹ค์Œ ๋””์ž์ธ์—์„œ ๊ณ„์•ฝ์„ ๋Œ€์ฒดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์ดˆ์•ˆ ์ œ๋„ค๋ฆญ ๋””์ž์ธ์ด ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋ ์ง€์— ๋Œ€ํ•ด ์ข€ ๋” ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ˆ˜์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜๋ฉด ์ƒํ™ฉ์„ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์Œ

๋ณ€๊ฒฝ ์—†์Œ :)

ํ•˜๋‚˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜

์—ฌ๊ธฐ์—๋Š” ์‹ค์ œ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค(์ผ๋ฐ˜์ด ์•„๋‹Œ ๊ฒƒ๊ณผ ๋Œ€์กฐ์ ์œผ๋กœ)๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ฐธ์กฐ๋˜๋Š” ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ/๋˜๋Š” ๋‹ค๋ฅธ ๋…๋ฆฝ์ ์ธ ๊ณ ์ • ์œ ํ˜•์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฐœ ์ด์ƒ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜

์ด์ „์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊ฐ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ œ์•ฝ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ž์‹ ์„ ์ฐธ์กฐํ•˜๋Š” ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

  2. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ์„น์…˜์—์„œ _์ด๋ฏธ ์„ ์–ธ๋œ_ ๋‹ค๋ฅธ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ–ˆ์Šต๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ ์—ญ์ถ”์ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

  3. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋…๋ฆฝ์ ์ธ ๊ณ ์ • ์œ ํ˜•์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ค‘ (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),
๊ฐœ์ฒด(์ง€๋„),
}

๋‘ ๊ฐ€์ง€ ์žฅ์ ์œผ๋กœ ๊ฒฐํ•ฉ ์œ ํ˜•:

  1. ์ฝ”๋“œ ์ž์ฒด ๋ฌธ์„œํ™”
  2. ์ปดํŒŒ์ผ๋Ÿฌ ๋˜๋Š” 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๋ฅผ ๋Š๋ฆฌ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„์— ๋Œ€ํ•œ ํฐ ๋ณ€๊ฒฝ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€์‹  ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ˆ˜์˜์‚ฌ ๊ฒ€์‚ฌ๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/BurntSushi/go-sumtype

๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋Š” ๋ ˆ์ด์•„์›ƒ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์œ ๋‹ˆ์˜จ์—์„œ ํƒœ๊ทธ ๋น„ํŠธ๋ฅผ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค์— ์กด์žฌํ–ˆ๋˜ ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ธ์ข…์ž…๋‹ˆ๋‹ค. ๊ทธ ๋””์ž์ธ์€ ๋ช…์‹œ ์ ์œผ๋กœ ๋ฉ€๋ฆฌ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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๋ฐ”์ดํŠธ)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

@rogpeppe

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์œ ํ˜• ํ™•์ธ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ ์ด ์•„๋‹ˆ๋ผ ์žฅ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์—๋Š” ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋‹ฌ๋ฆฌ ์ด๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ์–ด๋–ค ์ด์ ์„ ์ œ๊ณตํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํ˜•์‹์˜ ์Šฌ๋ผ์ด์Šค๋Š” ๋ช‡ ๋ฐ”์ดํŠธ(์ •๋ ฌ ์ œํ•œ์œผ๋กœ ์ธํ•ด 16๋ฐ”์ดํŠธ)๋กœ ํ˜•์‹์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํฌ์ธํ„ฐ๋ฅผ ํฌํ•จํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ์ด๋Š” ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ , ๋‚˜๋Š” ๋‚ด๊ฐ€ ์ด๊ฒƒ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ์‚ฌ๋Š”์ง€ ๋„ˆ๋ฌด ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์•„์ฃผ ๋“œ๋ฌธ ๊ฒฝ์šฐ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ค ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ธ์–ด ๋ณ€๊ฒฝ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@stouf

ํ•ญ์ƒ ํŒจํ„ด ์ผ์น˜๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ(ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ํ•ฉ๊ณ„ ์œ ํ˜•์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ "์บ์ŠคํŒ…"์ด ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹)์€ ์‹ค์ œ๋กœ ํ•ฉ๊ณ„ ์œ ํ˜• ์‚ฌ์šฉ์˜ ๊ฐ€์žฅ ํฐ ์ด์  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•„์ง ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์–ธ์–ด์— ์–ด๋–ค ์ด์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์›๋ž˜ ๋‚˜๋Š” ํ™”ํ๋ฅผ ์ข‹์•„ํ–ˆ๋Š”๋ฐ, ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ ๊ทธ๊ฒƒ์ด ๊ฐ€์ ธ๋‹ค์ค„ ํ˜œํƒ์„ ์žƒ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค.


๊ทธ๋ ‡๊ธด ํ•ด๋„ 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๋…„ ํ›„์— ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€ ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ตœ๊ทผ ๋””์ž์ธ ์ดˆ์•ˆ์—์„œ๋Š” ํ•ฉ๊ณ„ ์œ ํ˜•์ด ์ด์— ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ดˆ์•ˆ์—์„œ ๊ณ„์•ฝ ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ฌ๋ž๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ ํ˜• ๋ชฉ๋ก์„ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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์˜ ์‹œ์ž‘ ์ดํ›„๋ถ€ํ„ฐ ๊ณ„์†๋˜์–ด ์™”์œผ๋ฉฐ ์•ž์œผ๋กœ๋„ ๋ณ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰