Go: ์ œ์•ˆ: ์‚ฌ์–‘: ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ

์— ๋งŒ๋“  2016๋…„ 04์›” 14์ผ  ยท  816์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: golang/go

์ด ๋ฌธ์ œ๋Š” Go๊ฐ€ ์–ด๋–ค ํ˜•ํƒœ์˜ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.
Go1.x์˜ ๊ฒฝ์šฐ ์–ธ์–ด๊ฐ€ ๊ฑฐ์˜ ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฏ€๋กœ Go2 ๋ ˆ์ด๋ธ”์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์™€ ํ•จ๊ป˜ @ianlancetaylor ์˜ ์ผ๋ฐ˜ ์ œ๋„ค๋ฆญ ์ œ์•ˆ ์ด ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—๋Š” Go์šฉ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•œ 4๊ฐ€์ง€ ๊ฒฐํ•จ์ด ์žˆ๋Š” ํŠน์ • ์ œ์•ˆ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์˜๋„๋Š” ํ˜„์žฌ Go์— ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์™„์ „ํ•œ ์ œ์•ˆ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ–ฅํ›„ ์œ ์‚ฌํ•œ ์–ธ์–ด ๋ณ€๊ฒฝ์„ ์ œ์•ˆํ•˜๋Š” ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Go2 LanguageChange NeedsInvestigation Proposal generics

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

์šฐ๋ฆฌ์˜ https://golang.org/wiki/NoMeToo ์ •์ฑ…์„ ๋ชจ๋‘์—๊ฒŒ ๋ฏธ๋ฆฌ ์ƒ๊ธฐ์‹œ์ผœ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ชจํ‹ฐ์ฝ˜ ํŒŒํ‹ฐ๋Š” ์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

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

CL https://golang.org/cl/22057 ์— ์ด ๋ฌธ์ œ๊ฐ€ ์–ธ๊ธ‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ https://golang.org/wiki/NoMeToo ์ •์ฑ…์„ ๋ชจ๋‘์—๊ฒŒ ๋ฏธ๋ฆฌ ์ƒ๊ธฐ์‹œ์ผœ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ชจํ‹ฐ์ฝ˜ ํŒŒํ‹ฐ๋Š” ์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ณณ์—์„œ ์˜จ ํ† ๋ก ์˜ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•˜๋ ค๊ณ  ํ•˜๋Š” Summary of Go Generics Discussions ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ๋œ ์ œ์•ˆ์„œ์—๋Š” ๊ตฌํ˜„์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ํ˜•์‹ ์•ˆ์ „์„ฑ์„ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ "์š”๊ตฌ ์‚ฌํ•ญ"์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ๊นŒ์ง€ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์œ ํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ œ๋„ค๋ฆญ ์œ ํ˜•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ œ๋„ค๋ฆญ ํ˜•์‹์ด๋‚˜ ํ•จ์ˆ˜์˜ ์ •์˜์™€ ๊ทธ ์‚ฌ์šฉ ์‚ฌ์ด์— ๋ช…์‹œ์ ์ธ ๊ด€๊ณ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์€ ์œ ํ˜• T๊ฐ€ ์ผ๋ฐ˜ G๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ๋งํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ฐ˜ ์œ ํ˜•์ด ํŠน์„ฑ ๊ฒฝ๊ณ„์— ์˜ํ•ด ์ œํ•œ๋˜๋Š” Rust์˜ ํŠน์„ฑ ์‹œ์Šคํ…œ๊ณผ ์œ ์‚ฌํ•œ ์‹œ์Šคํ…œ์„ ์ œ์™ธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์™œ ์ด๊ฒƒ๋“ค์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

C++ std::basic_string์—์„œ์™€ ๊ฐ™์ด ๋งค์šฐ ๋‚ฎ์€ ์ˆ˜์ค€์—์„œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ œ๋„ค๋ฆญ์„ ๋นŒ๋“œํ•˜๊ณ  ์‹ถ์€ ์œ ํ˜น์ด ์ƒ๊น๋‹ˆ๋‹ค., ํ‘œ์ค€::ํ• ๋‹น์ž>. ์ด๊ฒƒ์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด๋„ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” C++ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์—์„œ์™€ ๊ฐ™์ด ๊ด‘๋ฒ”์œ„ํ•˜๊ณ  ๋•Œ๋กœ๋Š” ๋†€๋ผ์šด ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ œ๋„ค๋ฆญ ์ฝ”๋“œ๋Š” ์ œ๋„ค๋ฆญ ํ˜•์‹์˜ ์‚ฌ์–‘์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

@tamird ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ์œ ํ˜• T๋ฅผ ์ •์˜ํ•˜๊ณ  ๋‚˜์ค‘์— T๊ฐ€ I๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜• I์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ Go ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์˜ ํ•„์ˆ˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. https://golang.org/doc/faq#implements_interface ์ฐธ์กฐ . Go๊ฐ€ "G๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."๋ผ๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ๋งํ•œ T ์œ ํ˜•๊ณผ๋งŒ ์ œ๋„ค๋ฆญ ์œ ํ˜• G๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ œ๋„ค๋ฆญ ํ˜•์‹์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด ์ผ๊ด€์„ฑ์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@ianlancetaylor https://doc.rust-lang.org/book/traits.html ์€ Rust์˜ ํŠน์„ฑ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ข‹์€ ๋ชจ๋ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์˜ค๋Š˜๋‚  ์กด์žฌํ•˜๋Š” ๋ฐ”๋‘‘์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@sbunc ์ €๋„ ์ปจ์…‰์ด ๋‹ต์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์ง€๋‚œ๋ฒˆ ์ œ์•ˆ์— ์•ž์„œ ๋‹ค์–‘ํ•œ ์ œ์•ˆ์— ํฉ์–ด์ ธ ์žˆ๋Š” ์•„์ด๋””์–ด๋ฅผ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋…์ด ์›๋ž˜ C++11์ด ๋œ ๊ฒƒ์„ ์œ„ํ•ด ๊ณ„ํš๋˜์—ˆ๊ณ  ์ง€๊ธˆ์€ 2016๋…„์ด๊ณ  ์—ฌ์ „ํžˆ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๊ณ  C++ ์–ธ์–ด์— ํฌํ•จ๋˜๊ธฐ์— ํŠนํžˆ ๊ฐ€๊น์ง€ ์•Š๋‹ค๋Š” ์ ์€ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์ ‘๊ทผ ๋ฐฉ์‹ ํ‰๊ฐ€์— ๋Œ€ํ•œ ์ง€์นจ์œผ๋กœ ํ•™์ˆ  ๋ฌธํ—Œ์— ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ฃผ์ œ์— ๋Œ€ํ•ด ์ฝ์€ ์œ ์ผํ•œ ๋ฌธ์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ œ๋„ค๋ฆญ ์œ ํ˜•์˜ ์ด์ ์„ ์–ป๋Š”๊ฐ€?์ž…๋‹ˆ๋‹ค. (ํŽ˜์ด์›” ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. pdf ๋‹ค์šด๋กœ๋“œ๋กœ ๊ฐ€๋Š” ๊ธธ์„ ๊ตฌ๊ธ€๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

๋˜ํ•œ https://github.com/golang/go/issues/15295 ๋„ ์ฐธ์กฐ ํ•˜๋Š” ๊ฒฝ๋Ÿ‰์˜ ์œ ์—ฐํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ์ œ๋„ค๋ฆญ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

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

Barbara Liskov์˜ http://dl.acm.org/citation.cfm?id=2738008 :

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

๋‚˜๋Š” ๊ทธ๋“ค์ด ๊ฑฐ๊ธฐ์—์„œ ํ•œ ๊ฒƒ์ด ๊ฝค ๋ฉ‹์ง€๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฉˆ์ถœ ๊ณณ์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์ฃ„์†กํ•˜์ง€๋งŒ /proposals์—์„œ ์˜๊ฒฌ์„ ๋งํ•  ๊ณณ์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๊ณ  ์—ฌ๊ธฐ์—์„œ ์ ์ ˆํ•œ ๋ฌธ์ œ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

Go 1.xy ์†Œ์Šค ์ฝ”๋“œ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ Go ์ œ๋„ค๋ฆญ ์†Œ์Šค ์ฝ”๋“œ์ธ ํ•˜๋‚˜ ์ด์ƒ์˜ ์‹คํ—˜์  ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ์˜๊ฒฌ์— ๋Œ€ํ•œ ๋„ˆ๋ฌด ๋งŽ์€ ์ด์•ผ๊ธฐ/์ธ์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ์•„๋ฌด๋„ Go์— ๋Œ€ํ•œ _์ผ์ข…์˜ ์ œ๋„ค๋ฆญ ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด _์‹œ๋„ํ•˜๋Š”_ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Go ๋ฐ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ง€์‹๊ณผ ๊ฒฝํ—˜์„ ์–ป์œผ๋ ค๋ฉด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
๋ชจ๋“  Go ์ œ๋„ค๋ฆญ ์†”๋ฃจ์…˜์ด ์‹ค์ œ๋กœ ์ข‹์ง€ ์•Š๋‹ค๋ฉด; Go์— ๋Œ€ํ•œ ์ œ๋„ค๋ฆญ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ์„œ์— ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋Œ€ํ•œ ์˜ํ–ฅ๋„ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ๊ฐ ๊ตฌ์ฒด์ ์ธ ๊ฐ’ ์œ ํ˜•์— ๋Œ€ํ•ด ์ฝ”๋“œ ์ค‘๋ณต์ด ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ํฌ์ธํ„ฐ ์œ ํ˜•์— ๋Œ€ํ•œ ์ฝ”๋“œ ์ค‘๋ณต์ด ์—†๋‹ค๋Š” ๋ณด์žฅ์„ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ €๋Š” Pugh Decision ๋งคํŠธ๋ฆญ์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๊ธฐ์ค€์—๋Š” ๋ช…๋ฃŒ์„ฑ ์˜ํ–ฅ(์†Œ์Šค ๋ณต์žก์„ฑ, ํฌ๊ธฐ)์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ์ค€์— ๋Œ€ํ•œ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์ค€์— ์ˆœ์œ„๋ฅผ ๋งค๊ฒผ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ž์‹ ์˜ ๊ฒƒ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” "์ธํ„ฐํŽ˜์ด์Šค"๋ฅผ ๊ธฐ๋ณธ ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ด๊ฒƒ์„ "๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ" ์ œ๋„ค๋ฆญ, ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฐ˜ ์ œ๋„ค๋ฆญ(D ์–ธ์–ด ์ž‘๋™ ๋ฐฉ์‹๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์—ผ๋‘์— ๋‘ ) ๋ฐ ๋Ÿฐํƒ€์ž„ ์ธ์Šคํ„ด์Šคํ™” ์Šคํƒ€์ผ ์ œ๋„ค๋ฆญ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ง€๋‚˜์นœ ๋‹จ์ˆœํ™”๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์„ ํƒ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋ฅผ ์ด‰๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... ์ด๊ฒƒ์€ ๋‚ด Google ์‹œํŠธ์— ๋Œ€ํ•œ ๊ณต๊ฐœ ๋งํฌ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ

@yizhouzhang ๋ฐ @andrewcmyers ์— ํ•‘์„ ๋ณด๋‚ด Go์˜ ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ™์€ ์†(genus)์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ํ‘œ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ๊ถํ•ฉ์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :)

Genus์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ๋‚ธ ์ œ๋„ค๋ฆญ ๋””์ž์ธ์€ ์ •์ , ๋ชจ๋“ˆ์‹ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ์žˆ์œผ๋ฉฐ ์œ ํ˜•์ด ์ผ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ์‚ฌ์ „ ์„ ์–ธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•ฉ๋ฆฌ์ ์ธ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Go์˜ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํ™•์‹คํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Go์— ๋Œ€ํ•œ ๋‚˜์˜ ์ดํ•ด๋กœ ๋ณผ ๋•Œ ๊ทธ๊ฒƒ์€ ์ž˜ ๋งž๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ACM ๋””์ง€ํ„ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋…ผ๋ฌธ์— ๋Œ€ํ•œ ๋งํฌ์ž…๋‹ˆ๋‹ค.
http://www.cs.cornell.edu/andru/papers/genus/

Genus ํ™ˆํŽ˜์ด์ง€๋Š” http://www.cs.cornell.edu/projects/genus/ ์ž…๋‹ˆ๋‹ค.

์•„์ง ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ์ถœ์‹œํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ณง ์ถœ์‹œํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์งˆ๋ฌธ์— ๊ธฐ๊บผ์ด ๋‹ต๋ณ€ํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@mandolyte ์˜ ๊ฒฐ์ • ๋งคํŠธ๋ฆญ์Šค ์ธก๋ฉด์—์„œ Genus๋Š” 17์ ์œผ๋กœ ๊ณต๋™ 1์œ„์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ ์ˆ˜๋ฅผ ๋งค๊ธฐ๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์ค€์„ ๋” ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์—์„œ ๊ด€์ฐฐํ•œ @sbunc ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์ฒ˜๋Ÿผ ๋ชจ๋“ˆ์‹ ์œ ํ˜• ๊ฒ€์‚ฌ๋Š” ์ค‘์š”ํ•˜์ง€๋งŒ ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฐ˜ ์ฒด๊ณ„์—๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. Genus ๋…ผ๋ฌธ์— ๋Œ€ํ•œ ๊ธฐ์ˆ  ๋ณด๊ณ ์„œ ์—๋Š” ๋‹ค์–‘ํ•œ ์ œ๋„ค๋ฆญ ๋””์ž์ธ์„ ๋น„๊ตํ•˜๋Š” ํ›จ์”ฌ ๋” ํฐ ํ‘œ๊ฐ€ 34ํŽ˜์ด์ง€์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์ด์ „ ํ† ๋ก ์˜ ์œ ์šฉํ•œ ์š”์•ฝ ์ธ Go Generics ๋ฌธ์„œ ์ „์ฒด๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— Genus์˜ ์ œ๋„ค๋ฆญ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ C++, Java ๋˜๋Š” C#์— ๋Œ€ํ•ด ์‹๋ณ„๋œ ๋ฌธ์ œ๋ฅผ ๊ฒช์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Genus ์ œ๋„ค๋ฆญ์€ Java์™€ ๋‹ฌ๋ฆฌ ๊ตฌ์ฒดํ™”๋˜์–ด ๋Ÿฐํƒ€์ž„์— ์œ ํ˜•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ๋ณธ ์œ ํ˜•์—์„œ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ ์›ํ•˜์ง€ ์•Š๋Š” ์œ„์น˜์—์„œ ์•”์‹œ์  ๋ณต์‹ฑ์„ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. T๋Š” ๊ธฐ๋ณธ ํ˜•์‹์ธ T ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ์€ Haskell ๋ฐ Rust์— ๊ฐ€์žฅ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์กฐ๊ธˆ ๋” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์ง๊ด€์ ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ „๋ฌธํ™” ala C#์€ ํ˜„์žฌ Genus์—์„œ ์ง€์›๋˜์ง€ ์•Š์ง€๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํŠน์ˆ˜ํ™”๋Š” ๋งํฌ ์‹œ๊ฐ„์— ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ ์ƒ์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

CL https://golang.org/cl/22163 ์— ์ด ๋ฌธ์ œ๊ฐ€ ์–ธ๊ธ‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์–ธ์–ด ๊ฐœ๋…์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ผ๋ฐ˜ ์œ ํ˜•์„ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•: https://docs.google.com/document/d/1rX4huWffJ0y1ZjqEpPrDy-kk-m9zWfatgCluGRBQveQ/edit?usp=sharing.

์†์€ ์ •๋ง ๋ฉ‹์ ธ ๋ณด์ด๊ณ  ์˜ˆ์ˆ ์˜ ์ค‘์š”ํ•œ ๋ฐœ์ „์ž„์ด ๋ถ„๋ช…ํ•˜์ง€๋งŒ ๋ฐ”๋‘‘์— ์–ด๋–ป๊ฒŒ ์ ์šฉ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Go ์œ ํ˜• ์‹œ์Šคํ…œ/์ฒ ํ•™๊ณผ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์Šค์ผ€์น˜๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌธ์ œ๋Š” ๋ฐ”๋‘‘ ํŒ€์ด ๋ฒฝ์„ ๋ง‰์œผ๋ ค๋Š” ์‹œ๋„๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๋ชฉ์€ ๋ฐ”๋‘‘ ํŒ€์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋ชจ๋“  ์ˆ˜์šฉ์ž๋ฅผ ์ œ์ง€ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋ฉด ian์ด ์ œ์•ˆํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ์˜์—ญ์—์„œ ์š”๊ตฌ๋˜๋Š” ๊ธฐ๋Šฅ์€ ๋‹น์‹ ์ด ์ œ๋„ค๋ฆญ์„ ์›ํ•˜๋ฉด ๊ทธ๋“ค์ด ๋‹น์‹ ์„ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋‘‘ํŒ€๊ณผ ๋Œ€ํ™”๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ ๋ฌด์˜๋ฏธํ•˜๋‹ค. ์ด๋™ ์ค‘์— ์ œ๋„ค๋ฆญ์„ ์ฐพ๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋‚˜๋Š” ์–ธ์–ด๋ฅผ ๊ณจ์ ˆ(fracture)์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์—ฌ์ •์„ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋”ฐ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ํฌํฌ์—์„œ ์ˆ˜ํ–‰๋œ ๋ช‡ ๊ฐ€์ง€ ํ›Œ๋ฅญํ•œ ์ž‘์—…์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ž์‹ ์„ ์กฐ์งํ•˜๊ณ  ๋Œ€์˜๋ฅผ ์œ„ํ•ด ๊ฒฐ์ง‘ํ•˜์‹ญ์‹œ์˜ค.

Genus ๋””์ž์ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Go์— ๋Œ€ํ•œ ์ œ๋„ค๋ฆญ ํ™•์žฅ์„ ์ž‘์—…ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์–ธ์–ด์™€ ์กฐํ™”๋ฅผ ์ด๋ฃจ๋Š” ๋””์ž์ธ์„ ์ œ์ž‘ํ•  ๋งŒํผ ๋ฐ”๋‘‘์„ ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ์—ฐ์Šต๋œ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ๋ฐ€์งš๋งจ ๋””์ž์ธ ์ œ์•ˆ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@andrewcmyers ๋Š” @ianlancetaylor ๊ฐ€ ๋‹น์‹ ๊ณผ ํ•จ๊ป˜ ์ผํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” Genus ๋…ผ๋ฌธ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ Java์—๋Š” ์ข‹์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ Go์—๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Go์˜ ์ฃผ์š” ์ธก๋ฉด ์ค‘ ํ•˜๋‚˜๋Š” Go ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ ์ž‘์„ฑํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์ด ์ฝ”๋“œ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์˜ ํ›จ์”ฌ ๋” ๋งŽ์€ ๋ถ€๋ถ„์ด ์œ ํ˜•์ธ C++ ๋ฐ Java์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์†์€ ๋Œ€๋ถ€๋ถ„ ์œ ํ˜•์— ๊ด€ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ณด๋‹ค๋Š” ์ œ์•ฝ ์กฐ๊ฑด๊ณผ ๋ชจ๋ธ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. Go์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Genus์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์€ ํ›จ์”ฌ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

์†Œ๊ธ‰ ๋ชจ๋ธ๋ง์˜ ์•„์ด๋””์–ด๋Š” Java์— ๋ถ„๋ช…ํžˆ ์œ ์šฉํ•˜์ง€๋งŒ Go์—๋Š” ์ „ํ˜€ ๋งž์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์ด๋ฏธ ์–ด๋Œ‘ํ„ฐ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด ์œ ํ˜•์„ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ €๋Š” Go ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์œ ํ˜• ์‹œ์Šคํ…œ์ด ์ œ๋„ค๋ฆญ ์ด์ „ Java๋ณด๋‹ค ๊ฐ„๋‹จํ•ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๊ตฌ๋ฌธ์€ ์ข‹์€ ๋ฐฉ์‹์œผ๋กœ ์•ฝ๊ฐ„ ๋” ๊ฐ€๋ณ์ง€๋งŒ ๊ทผ๋ณธ์ ์ธ ๋ณต์žก์„ฑ์€ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•˜๋”๋ผ๋„ ์œ ํ˜• ์ด๋ก ์ ์ธ ์˜๋ฏธ์—์„œ Java(์ œ๋„ค๋ฆญ ์ด์ „)๋ณด๋‹ค ๋ณต์žกํ•˜๋”๋ผ๋„ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ƒ๋Œ€์ ์ธ ๋ณต์žก์„ฑ์„ ์ œ์™ธํ•˜๊ณ ๋Š” Genus๊ฐ€ 1:1๋กœ ๋งคํ•‘ํ•  ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ•˜์œ„ ์œ ํ˜•์ด ํฐ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒฝ์šฐ:

๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ด€๋ จ ์ฒ ํ•™/๋””์ž์ธ ์ฐจ์ด์ ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์š”์•ฝ์€ ๋‹ค์Œ FAQ ํ•ญ๋ชฉ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ Go ์‚ฌ์–‘์€ https://golang.org/ref/spec#Constants ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๊ด€๋ จ ์†์„ฑ์— ๋Œ€ํ•ด ๋งค์šฐ ์งง๊ณ  ๋ช…ํ™•ํ•˜๋ฉฐ "๋ธ”๋ก"(๋ชจ๋‘ 11ํŽ˜์ด์ง€ ๋ฏธ๋งŒ ์ธ์‡„).

Java ๋ฐ C# ์ œ๋„ค๋ฆญ๊ณผ ๋‹ฌ๋ฆฌ Genus ์ œ๋„ค๋ฆญ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— Go์—๋Š” ํ•˜์œ„ ์œ ํ˜•์ด ์žˆ์ง€๋งŒ ๊ตฌ์กฐ์  ํ•˜์œ„ ์œ ํ˜•์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋˜ํ•œ ๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ๊ด€๊ณ„์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๊ตฌ์กฐ์  ํŠน์ง•์ด ์žˆ๋Š” Genus ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ๋„ ์ž˜ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

Go์— ๊ตฌ์กฐ์  ํ•˜์œ„ ์œ ํ˜•์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์œ ํ˜•์ด ๋™์ผํ•œ ๋‘ ์œ ํ˜•์€ ๋”ฐ๋ผ์„œ ๋™์ผํ•˜์ง€๋งŒ
์„œ๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ, https://play.golang.org/p/cT15aQ-PFr

์ด๊ฒƒ์€ ํ•„๋“œ์˜ ๊ณตํ†ต ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๊ณต์œ ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ํ™•์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
https://play.golang.org/p/KrC9_BDXuh.

2016๋…„ 4์›” 28์ผ ๋ชฉ์š”์ผ ์˜คํ›„ 1:09, Andrew Myers [email protected]
์ผ๋‹ค:

Java ๋ฐ C# ์ œ๋„ค๋ฆญ๊ณผ ๋‹ฌ๋ฆฌ Genus ์ œ๋„ค๋ฆญ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€
์„œ๋ธŒํƒ€์ดํ•‘. ๋ฐ˜๋ฉด์— Go์—๋Š” ํ•˜์œ„ ์œ ํ˜•์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ์กฐ์  ํ•˜์œ„ ์œ ํ˜•. ๊ทธ๊ฒƒ์€ ๋˜ํ•œ Genus ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ๋„ ์ž˜ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ๊ฒƒ์— ์˜์กดํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ๊ตฌ์กฐ์  ํ’๋ฏธ๊ฐ€ ์žˆ๋Š”
๊ด€๊ณ„.

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/15292#issuecomment -215298127

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‹œ๊ธฐ์— ๋Œ€ํ•ด ์ผ๋ถ€ ์–ธ์–ด๋ฅผ ์ž˜๋ชป ํ•ด์„ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ ๋‹นํ•œ ํ™•์žฅ์„ ๊ฐ€์ง„ Go ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ Genus ์Šคํƒ€์ผ ์ œ์•ฝ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ๋‚ด๊ฐ€ ๋‹น์‹ ์—๊ฒŒ ํ•‘์„ ๋ณด๋‚ธ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์†์€ ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ™์€ Java/C#๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์„ ์ „๋ฌธํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด _ํŒจํ‚ค์ง€ ํ…œํ”Œ๋ฆฟ_ ์ ‘๊ทผ ๋ฐฉ์‹ "์ œ์•ˆ" 1 2 ์ด ๊ทธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

ํ—; ๋ฐ•์‚ฌ; ์ธํ„ฐํŽ˜์ด์Šค ์ „๋ฌธํ™”๊ฐ€ ์žˆ๋Š” ์ผ๋ฐ˜ ํŒจํ‚ค์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

package set
type E interface { Equal(other E) bool }
type Set struct { items []E }
func (s *Set) Add(item E) { ... }

๋ฒ„์ „ 1. ํŒจํ‚ค์ง€ ๋ฒ”์œ„ ์ „๋ฌธํ™” ํฌํ•จ:

package main
import items set[[E: *Item]]

type Item struct { ... }
func (a *Item) Equal(b *Item) bool { ... }

var xs items.Set
xs.Add(&Item{})

๋ฒ„์ „ 2. ์„ ์–ธ ๋ฒ”์œ„ ์ „๋ฌธํ™”:

package main
import set

type Item struct { ... }
func (a *Item) Equal(b *Item) bool { ... }

var xs set.Set[[E: *Item]]
xs.Add(&Item{})

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

์„ ์–ธ ๋ฒ”์œ„ ์ „๋ฌธํ™”๋Š” ๋น„์šฉ์œผ๋กœ ๋” ๋งŽ์€ ๊ฐ€๋Šฅ์„ฑ์„ ๊ฐ€์ง€๋ฉฐ ๋‚จ์šฉ๋˜๊ธฐ ์‰ฝ๊ณ  ๋” ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋Šฅ ์ฝ”๋“œ๋Š” ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

type E interface{}
func Reduce(zero E, items []E, fn func(a, b E) E) E { ... }

Reduce[[E: int]](0, []int{1,2,3,4}, func(a, b int)int { return a + b } )
// there are probably ways to have some aliases (or similar) to make it less verbose
alias ReduceInt Reduce[[E: int]]
func ReduceInt Reduce[[E: int]]

์ธํ„ฐํŽ˜์ด์Šค ์ „๋ฌธํ™” ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํฅ๋ฏธ๋กœ์šด ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ํŒจํ‚ค์ง€๋Š” ํŠน์ˆ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด sort.Sort[[Interface:MyItems]](...) ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ  ์ธํ„ฐํŽ˜์ด์Šค ๋Œ€์‹  ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์— ๋Œ€ํ•œ ์ •๋ ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ธ๋ผ์ด๋‹์œผ๋กœ ์ธํ•œ ์ž ์žฌ์ ์ธ ์ด์  ํฌํ•จ).
  • ํ…Œ์ŠคํŠธ๊ฐ€ ๋‹จ์ˆœํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ์ฝ”๋“œ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ์ž‘๋™ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ฆ‰, [[E: int]] ๊ฐ€ E int $ ๋กœ ๋Œ€์ฒดํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

๊ทธ๋Ÿฌ๋‚˜ ํŒจํ‚ค์ง€ ๊ฐ„์— ์ž‘์—…ํ•  ๋•Œ ์ž์„ธํ•œ ์ •๋ณด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

type op
import "set"

type E interface{}
func Union(a, b set.Set[[set.E: E]]) set.Set[[set.E: E]] {
    result := set.New[[set.E: E]]()
    ...
}

_๋ฌผ๋ก , ๋ชจ๋“  ๊ฒƒ์€ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ง„์ˆ ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์•„๋งˆ๋„ ์ˆ˜๋งŽ์€ ๋ฌธ์ œ์™€ ์ž‘๋™ ๋ฐฉ์‹์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค._

_PS, ๋Š๋ฆฐ ์ œ๋„ค๋ฆญ ์ง„ํ–‰์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ €๋Š” ์ปดํŒŒ์ผ๋Ÿฌ/๋Ÿฐํƒ€์ž„ ๋ฒ„๊ทธ, SSA, GC, http2์™€ ๊ฐ™์ด ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋” ํฐ ์ด์ ์ด ์žˆ๋Š” ๋ฌธ์ œ์— ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•œ Go Team์— ๋ฐ•์ˆ˜๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค._

@egonelbre ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ์ œ๋„ค๋ฆญ์ด "๋‚จ์šฉ"์„ ๋ฐฉ์ง€ํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ท€ํ•˜์˜ ์š”์ง€๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ๊ฐ„๊ณผํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ •๋ง ์ค‘์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋”ํ•˜์—ฌ ์ƒ๋Œ€์  ์˜๋ฏธ๋ก ์  ๋ฐ ๊ตฌ๋ฌธ๋ก ์  ๋‹จ์ˆœ์„ฑ(ํŒจํ‚ค์ง€ ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ตฌ์กฐ๋งŒ ์˜ํ–ฅ์„ ๋ฐ›์Œ)์œผ๋กœ ์ธํ•ด Go์—์„œ ๋งค์šฐ ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค.

@andrewcymyers ํฅ๋ฏธ๋กญ๊ฒŒ๋„ Go ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ Genus ์Šคํƒ€์ผ ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ๋‹น์‹ ์ด ๊ทธ๋“ค๊ณผ ํ•จ๊ป˜ ๋‹ค์ค‘ ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๋ฐฉ๊ธˆ ๊นจ๋‹ฌ์€ ํ•œ ๊ฐ€์ง€๋Š” Go์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ธ๋ผ์ธ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฒ”์œ„์— ๋„ฃ๊ณ  ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type [V, E] ๊ทธ๋ž˜ํ”„ [V interface { Edges() E }, E interface { Endpoints() (V, V) }] ...

์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ์„œ์˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋” ํฐ ๋ฌธ์ œ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ Java์—์„œ์ฒ˜๋Ÿผ Go์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ œ๊ณต ํ˜•์‹์—๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. java.lang.Object์™€ ๊ฐ™์€ ๋ฒ”์šฉ ๋ฉ”์†Œ๋“œ ์„ธํŠธ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ํŠน๋ณ„ํžˆ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ํ˜•์— ๋Œ€ํ•ด Equals ๋˜๋Š” HashCode์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋Š” ์œ ํ˜•์„ ๋งต ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋™๋“ฑ์„ฑ์ด ํ•„์š”ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๊ฒฉ์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

(Go์˜ ํ‰๋“ฑ์€ ํฅ๋ฏธ๋กœ์šด ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค. ์–ธ์–ด๋Š” ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๊ฒฝ์šฐ ์œ ํ˜• "=="๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(https://golang.org/ref/spec#Logical_operators ์ฐธ์กฐ, "comparable" ๊ฒ€์ƒ‰). " =="๋Š” ๋งต ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ "=="์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ์œ ํ˜•์ด๋ผ๋ฉด ๋งต ํ‚ค๋กœ ์ž‘๋™ํ•˜๋„๋ก ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.)

๋ฉ”์„œ๋“œ๊ฐ€ ๋„๋ฆฌ ํผ์ ธ ์žˆ์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ์ œ๊ณต ํ˜•์‹์˜ ์†์„ฑ์„ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—(์˜ˆ: ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ž) ์ฝ”๋“œ ์ž์ฒด๋ฅผ ์ผ๋ฐ˜ ์ œ์•ฝ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์œ„์˜ 4์›” 18์ผ ๋‚ด ๋Œ“๊ธ€์— ์žˆ๋Š” ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ์ด ์ œ์•ˆ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์ข‹์€ ๊ธฐ๋Šฅ์€ ์ผ๋ฐ˜ ์ˆซ์ž ์ฝ”๋“œ๊ฐ€ ๋ฒˆ๊ฑฐ๋กœ์šด ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋Œ€์‹  ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ž๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†๋Š” ์œ ํ˜•์— ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ์–ธ์–ด์—์„œ Java๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ€๋ฒผ์šด ๋ฐฉ๋ฒ•์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ํ˜• ์ •์ˆ˜ ์ •์ˆ˜
func (i Int) Less(j Int) bool { return i < j }

Int ์œ ํ˜•์€ int์˜ ๋ชจ๋“  ์—ฐ์‚ฐ์ž ๋ฐ ๊ธฐํƒ€ ์†์„ฑ์„ "์ƒ์†"ํ•ฉ๋‹ˆ๋‹ค. Int์™€ int๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‘˜ ์‚ฌ์ด๋ฅผ ์บ์ŠคํŒ…ํ•ด์•ผ ํ•˜์ง€๋งŒ ๊ณ ํ†ต์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์† ๋ชจ๋ธ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์€ ๋งค์šฐ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” @ianlancetaylor ๊ฐ€ ๋” ๋งŽ์€ ์ฝ”๋“œ, ๋” ์ ์€ ์œ ํ˜•์„ ์ž‘์„ฑํ•˜๋ฉด์„œ Go์˜ ํŠน์„ฑ์„ ๋„ˆ๋ฌด ์ข๊ฒŒ ์ •์˜ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์›์น™์€ Go๊ฐ€ ๋ณต์žก์„ฑ์„ ์‹ซ์–ดํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Java์™€ C++๋ฅผ ๋ณด๊ณ  ์ ˆ๋Œ€ ๊ฑฐ๊ธฐ์— ๊ฐ€์ง€ ์•Š๊ฒ ๋‹ค๊ณ  ๊ฒฐ์‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. (์ฃ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.)

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

@jba ์šฐ๋ฆฌ๋Š” ๋ณต์žก์„ฑ์„ ํ”ผํ•œ๋‹ค๋Š” ์›์น™์— ํ™•์‹คํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. "๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋” ์ด์ƒ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค." ์ ์–ด๋„ ์ฒ˜์Œ์—๋Š” ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ผ๋ถ€ Genus ๊ธฐ๋Šฅ์„ Go์—์„œ ์ œ์™ธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Genus ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์ข‹์€ ์  ์ค‘ ํ•˜๋‚˜๋Š” ๋‚ด์žฅ ์œ ํ˜•์„ ์›ํ™œํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Java์˜ ๊ธฐ๋ณธ ์œ ํ˜•์—๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†์œผ๋ฉฐ Genus๋Š” ์ด ๋™์ž‘์„ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹ , Genus๋Š” ๊ธฐ๋ณธ ์œ ํ˜•์„ _๋งˆ์น˜_ ๋งˆ์น˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์ƒ๋‹นํžˆ ๋งŽ์€ ๋ฐฉ๋ฒ• ๋ชจ์Œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ํ‚ค๋ฅผ ํ•ด์‹œํ•˜๊ณ  ๋น„๊ตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ธฐ๋ณธ ์œ ํ˜•์ด ์ด ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Map[int, boolean] ๊ณผ ๊ฐ™์€ ์œ ํ˜• ์ธ์Šคํ„ด์Šคํ™”๋Š” ๋” ์ด์ƒ ์†Œ๋ž€์„ ํ”ผ์šฐ์ง€ ์•Š๊ณ ๋„ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ฉ๋ฒ•์ ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ •์ˆ˜์˜ ๋‘ ๊ฐ€์ง€ ํŠน์ง•(int ๋Œ€ Int)์„ ๊ตฌ๋ณ„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ int ๊ฐ€ ์ผ๋ถ€ ์šฉ๋„๋ฅผ ์œ„ํ•œ ์ถฉ๋ถ„ํ•œ ์—ฐ์‚ฐ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์œ„์˜ Int ์‚ฌ์šฉ๊ณผ ๊ฑฐ์˜ ๋˜‘๊ฐ™์€ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์€ ์†(Genus)์—์„œ "์ž์—ฐ ๋ชจ๋ธ"์ด๋ผ๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ๋„ค๋ฆญ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋ธ์„ ์„ ์–ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ˜•์‹ ์ธ์ˆ˜๊ฐ€ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋ฉด ์ž์—ฐ ๋ชจ๋ธ์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝํ—˜์€ ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช…์‹œ์  ๋ช…๋ช…๋œ ๋ชจ๋ธ์„ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋ธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ(์˜ˆ: ๋น„ํ‘œ์ค€ ๋ฐฉ์‹์œผ๋กœ int๋ฅผ ํ•ด์‹œํ•˜๋ ค๋Š” ๊ฒฝ์šฐ) ๊ตฌ๋ฌธ์€ ์ œ์•ˆํ•œ Map[int with fancyHash, boolean] ๊ณผ ์œ ์‚ฌ ํ•ฉ๋‹ˆ๋‹ค. Genus๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ๊ตฌ๋ฌธ์ ์œผ๋กœ ๊ฐ€๋ณ์ง€๋งŒ ํ•„์š”ํ•  ๋•Œ ์˜ˆ๋น„ ์ „๋ ฅ์ด ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

@egonelbre ์—ฌ๊ธฐ์„œ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ Scala์—์„œ ์ง€์›ํ•˜๋Š” ๊ฐ€์ƒ ์œ ํ˜•์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. Kresten Krab Thorup์˜ ECOOP'97 ๋…ผ๋ฌธ "๊ฐ€์ƒ ์œ ํ˜•์ด ์žˆ๋Š” Java์˜ Genericity"๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด ๋ฐฉํ–ฅ์„ ํƒ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์šฐ๋ฆฌ ์ž‘์—…์—์„œ ๊ฐ€์ƒ ์œ ํ˜• ๋ฐ ๊ฐ€์ƒ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค("J&: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ์„ ์œ„ํ•œ ์ค‘์ฒฉ ๊ต์ฐจ", OOPSLA'06).

๋ฆฌํ„ฐ๋Ÿด ์ดˆ๊ธฐํ™”๋Š” Go์— ๋„๋ฆฌ ํผ์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๊ถ๊ธˆํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ Go ์ƒ์„ฑ, ์ˆ˜์ • ๋ฐ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ์— ์ฃผ๋กœ ์กด์žฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์˜๊ฐ์„ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค :-)

// (์ผ๋ฐ˜) func ์œ ํ˜• ์ •์˜
์œ ํ˜• Sum64 func (X, Y) float64 {
float64(X) + float64(Y) ๋ฐ˜ํ™˜
}

// ์œ„์น˜์ ์œผ๋กœ ํ•˜๋‚˜๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” := 42
๋ณ€์ˆ˜ ํ•ฉ = 86
ํ•ฉ๊ณ„ := &Sum64{i, j}

// ๋ช…๋ช…๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”
ํ•ฉ๊ณ„ := &Sum64{ X: ์ •์ˆ˜, Y: ์ •์ˆ˜}

// ์ด์ œ ์‚ฌ์šฉ...
result := sum(i, j) // ๊ฒฐ๊ณผ๋Š” 128

Ian์˜ ์ œ์•ˆ์€ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ•œ ๋ฒˆ์— ๊ฐœ๋ฐœํ•  ์ˆ˜๋Š” ์—†์œผ๋ฉฐ ๋ช‡ ๋‹ฌ ๋™์•ˆ ๋ฏธ์™„์„ฑ ์ƒํƒœ๋กœ ์กด์žฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋™์•ˆ ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ํ”„๋กœ์ ํŠธ๋Š” ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ณต์‹ Go ์–ธ์–ด๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๊ณ„๊ฐ€ ํŒŒํŽธํ™”๋  ์œ„ํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์„ ๊ณ„ํšํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ํ”„๋กœ์ ํŠธ์˜ ํฐ ๋ถ€๋ถ„์€ ์ฐธ์กฐ ๋ง๋ญ‰์น˜๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด go 2.0 ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๊ด€์šฉ์ ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‹ค์ œ ์ผ๋ฐ˜ ์ปฌ๋ ‰์…˜, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ ๊ธฐํƒ€ ํ•ญ๋ชฉ์„ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๊ตฌ๋ฌธ?

// Module defining generic type
module list(type t)

type node struct {
    next *node
    data t
}
// Module using generic type:
import (
    intlist "module/path/to/list" (int)
    funclist "module/path/to/list" (func (int) int)
)

l := intlist.New()
l.Insert(5)

@md2perpe , ๊ตฌ๋ฌธ์€ ์ด ๋ฌธ์ œ์˜ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ์•„๋‹™๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๊ฐ€์žฅ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ํ† ๋ก  ๋ฐ ๋งํฌ๋œ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

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

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

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

๋‚˜๋Š” ๊ฐ€๊นŒ์šด๊ฐ€? :-)

@๋งŒ๋Œ๋ผ์ดํŠธ ๋„ค! ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์ด๋ฉ”์ผ์„ ๊ตํ™˜ํ•ฉ์‹œ๋‹ค. "me at thwd dot me"์—์„œ ์ €์—๊ฒŒ ์—ฐ๋ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์ด ์žˆ๋Š” ์ด ๊ธ€์„ ์ฝ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ; ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ์‹œ๋ฉด ์Šค๋ ˆ๋“œ์— ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

type system ๋ฐ collection library ์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
์ž ์žฌ์ ์ธ ๊ตฌ๋ฌธ:

type Element<T> struct {
    prev, next *Element<T>
    list *List<T>
    value T
}
type List<E> struct {
    root Element<E>
    len int
}

interface

type Collection<E> interface {
    Size() int
    Add(e E) bool
}

super type ๋˜๋Š” type implement :

func contain(l List<parent E>, e E) bool
<V> func (c Collection<child E>)Map(fn func(e E) V) Collection

์œ„์˜ ์ผ๋ช… ์ž๋ฐ”:

boolean contain(List<? super E>, E e)
<V> Collection Map(Function<? extend E, V> mapFunc);

@leaxoy ์•ž์—์„œ ๋งํ–ˆ๋“ฏ์ด ๊ตฌ๋ฌธ์€ ์—ฌ๊ธฐ์„œ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ์•„๋‹™๋‹ˆ๋‹ค. ์œ„์˜ ๋…ผ์˜๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ธํ„ฐํŽ˜์ด์Šค ๋น„์šฉ์ด ๋ฏฟ์„ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ํฌ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

์ธํ„ฐํŽ˜์ด์Šค ๋น„์šฉ์ด "๋ฏฟ์„ ์ˆ˜ ์—†์„ ์ •๋„๋กœ"๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.
ํฌ๊ธฐ๊ฐ€ ํฐ.
C++์˜ ์ „๋ฌธํ™”๋˜์ง€ ์•Š์€ ๊ฐ€์ƒ ํ˜ธ์ถœ๋ณด๋‹ค ๋‚˜๋น ์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

@minux ์„ฑ๋Šฅ ๋น„์šฉ์— ๋Œ€ํ•ด์„œ๋Š” ๋งํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. interface{} ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ™•์ธํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ œ๋„ค๋ฆญ์€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์— ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ interface{} ์‚ฌ์šฉ์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ณด๋‹ค ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

@xoviat

์ด๊ฒƒ์— ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์— ์‹ค์ œ๋กœ ๋ถˆ๋ฆฌํ•œ ์ ์€ ์—†์Šต๋‹ˆ๋‹ค.

(์ ์–ด๋„) ๋‘ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํŒจํ‚ค์ง€๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ๋ฐฉ๋ฒ•๋ณด๋‹ค ํ‘œํ˜„๋ ฅ์ด ๋–จ์–ด์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฒซ ๋ฒˆ์งธ ์˜๊ฒฌ์—์„œ ๋งํฌ๋œ ์ œ์•ˆ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.)

ํ•˜์ดํผ ์œ ํ˜•์ด ์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๊นŒ?

func getAddFunc (aType type) func(aType, aType) aType {
    return func(a, b aType) aType {
        return a+b
    }
}

ํ•˜์ดํผ ์œ ํ˜•์ด ์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์—์„œ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ C++๋กœ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”(์ฆ‰, ํ…œํ”Œ๋ฆฟ)์ž…๋‹ˆ๋‹ค. aType ์œ ํ˜•์— ์ฃผ์–ด์ง„ ์ •๋ณด์—์„œ + ์—ฐ์‚ฐ์ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆ์‹ ๋ฐฉ์‹์œผ๋กœ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CLU, Haskell, Java, Genus์—์„œ์™€ ๊ฐ™์€ ์ œ์•ฝ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๊ฐ€ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

@golang101 ๋‚˜๋Š” ๊ทธ์™€ ๊ด€๋ จ๋œ ์ƒ์„ธํ•œ ์ œ์•ˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด CL์„ ๋ณด๋‚ด๊ฒ ์ง€๋งŒ ์ฑ„ํƒ๋  ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

CL https://golang.org/cl/38731 ์— ์ด ๋ฌธ์ œ๊ฐ€ ์–ธ๊ธ‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

@andrewcmyers

aType ์œ ํ˜•์— ์ฃผ์–ด์ง„ ์ •๋ณด์—์„œ + ์—ฐ์‚ฐ์ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆ์‹ ๋ฐฉ์‹์œผ๋กœ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ œ์•ฝ ์กฐ๊ฑด์€ ํ•จ์ˆ˜ ์ •์˜์— ์•”์‹œ์ ์ด๋ฉฐ ํ•ด๋‹น ํ˜•์‹์˜ ์ œ์•ฝ ์กฐ๊ฑด์€ getAddFunc ์˜ ๋ชจ๋“  (์ „์ด) ์ปดํŒŒ์ผ ํƒ€์ž„ ํ˜ธ์ถœ์ž์—๊ฒŒ ์ „ํŒŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์•ฝ ์กฐ๊ฑด์€ Go _type_์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฆ‰, ์–ธ์–ด์˜ ๋Ÿฐํƒ€์ž„ ๋ถ€๋ถ„์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋ชจ๋“ˆ ๋ฐฉ์‹์œผ๋กœ ํ‰๊ฐ€๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ์ œ์•ˆ์„ 2016-09-compile-time-functions.md ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

@bcmills ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๊ณ ๋ ค๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํ•จ์ˆ˜๋Š” ๊ฐ•๋ ฅํ•œ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚˜๋Š” popcount๊ฐ€ ํ•„์š”ํ•œ ์Šค๋„์ฟ  ์†”๋ฒ„๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ๋‹ค์–‘ํ•œ ๊ฐ’์— ๋Œ€ํ•œ ํŒ์นด์šดํŠธ๋ฅผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜๊ณ  Go ์†Œ์Šค ๋กœ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ go:generate ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์กฐํšŒ ํ…Œ์ด๋ธ”์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๊ณ„์‚ฐ๋˜์–ด ๊ธฐ๊ณ„ ์ƒ์„ฑ ์ฝ”๋“œ๊ฐ€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ปค๋ฐ‹๋˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜ํ•™ ํ•จ์ˆ˜๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ์กฐํšŒ ํ…Œ์ด๋ธ”์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋” ์ถ”์ธก์ ์œผ๋กœ ๋งํ•˜๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด ํ‘œ์ค€ ์†Œ์Šค์—์„œ protobuf ์ •์˜๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์œ ํ˜•์„ ๋นŒ๋“œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ—ˆ์šฉํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์ž‘์—…์ด ์•„๋‹๊นŒ?

์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํ•จ์ˆ˜๋Š” ๋„ˆ๋ฌด ๊ฐ•๋ ฅํ•˜๋ฉด์„œ๋„ ๋™์‹œ์— ๋„ˆ๋ฌด ์•ฝํ•˜๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์œ ์—ฐํ•˜๊ณ  ์ด์ƒํ•œ ๋ฐฉ์‹์œผ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. / C++ ํ…œํ”Œ๋ฆฟ์ด ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผ ์†๋„๊ฐ€ ๋Š๋ ค์ง€์ง€๋งŒ ๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ๋Š” ๋„ˆ๋ฌด ์ •์ ์ด๊ณ  ์ผ๋ฅ˜ ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ๊ฒƒ์— ์ ์‘ํ•˜์‹ญ์‹œ์˜ค.

๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์—์„œ๋Š” "ํŠน์ • ์œ ํ˜•์˜ ์กฐ๊ฐ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์กฐ๊ฐ"์ด๋‚˜ ์ž„์‹œ ๊ตฌ๋ฌธ []func<T>([]T) T ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ๋ชจ๋“  ์ •์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋œ ๊ธฐ๋Šฅ ์–ธ์–ด์—์„œ ์ˆ˜ํ–‰ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์€ ์ผ๋ถ€ ์†Œ์Šค ์ฝ”๋“œ ์ˆ˜์ค€ ์ฝ”๋“œ ์ƒ์„ฑ์ด ์•„๋‹ˆ๋ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์„ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’ ์ž…๋‹ˆ๋‹ค.

@๋ถ„์‹ฌ

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

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

const func SliceOfSelectors(T gotype) gotype { return []func([]T)T (type) }

์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๊ฐ’ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ˜ผํ•ฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ œ ์ œ์•ˆ์€ ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํ•จ์ˆ˜์˜ ์ผ๋ถ€๋Š” unboxed ๊ฐ’๊ณผ ๋Ÿฐํƒ€์ž„ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ข…๋ฅ˜์— ๋Œ€ํ•ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ’์˜ ๊ถŒํˆฌ๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ํ•˜์ง€๋งŒ ์ œ ์ƒ๊ฐ์—๋Š” "boxedness"๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน์ˆ˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ type-safety๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ boxing์ด ํ•„์š”ํ•œ ์ข…๋ฅ˜์˜ ๊ฒƒ์„ ํ—ˆ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. "์ œ๋„ค๋ฆญ" ์ถ”๊ฐ€์˜ ํฐ ๋ถ€๋ถ„์€ interface{} ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ interface{} ์˜ ์œ ํ˜•-๋ถˆ์•ˆ์ „์„ฑ์„ ์‹ค์ œ๋กœ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์•„๋งˆ๋„ "์ด๋ฏธ" ๋ฐ•์‹ฑ๋œ ํฌ์ธํ„ฐ ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์ด ์žˆ๋Š” ํŠน์ • ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜• ๊ตฌ์„ฑ๋งŒ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Java์˜ Integer ๋“ฑ boxed ๊ฐ์ฒด๋Š” ๊ฐ’ ์œ ํ˜• ์กฐ๊ฐ์ด ๊นŒ๋‹ค๋กญ์ง€๋งŒ ์™„์ „ํžˆ ๋‚˜์œ ์ƒ๊ฐ์€ ์•„๋‹™๋‹ˆ๋‹ค.)

์ปดํŒŒ์ผ ํƒ€์ž„ ํ•จ์ˆ˜๊ฐ€ C++๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜๋ฉฐ Go2๊ฐ€ ์ž‘์„ฑ๋œ ์†Œ์Šค ์ฝ”๋“œ ์กฐ์ž‘์— ๊ธฐ๋ฐ˜ํ•œ ํ•ดํ‚น๋ณด๋‹ค๋Š” ์‚ฌ์šด๋“œ ์œ ํ˜• ์ด๋ก ์— ๊ธฐ๋ฐ˜์„ ๋‘” ์ตœ์‹  ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๊ฐ–๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ๋‚˜ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋งค์šฐ ์‹ค๋ง์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์ด ์—†๋Š” ์–ธ์–ด๋กœ.

@bcmills
๋‹น์‹ ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋“ˆํ™”๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“ˆ A๊ฐ€ ๋ชจ๋“ˆ D๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ C๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ B๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, A์˜ ๊ตฌํ˜„์ž๊ฐ€ D๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋”๋ผ๋„ D์—์„œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ A๋กœ ๋‹ค์‹œ ์ „ํŒŒํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ์ œ๊ณตํ•˜๋Š” ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์€ ์•ฝํ•ด์ง€๊ณ  ์†Œํ”„ํŠธ์›จ์–ด๋Š” ๋” ๋ถ€์„œ์ง€๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ C++ ํ…œํ”Œ๋ฆฟ์˜ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— CLU, ML, Haskell ๋˜๋Š” Genus์™€ ๊ฐ™์€ ์–ธ์–ด์—์„œ์™€ ๊ฐ™์ด ์œ ํ˜• ์„œ๋ช…์ด ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์บก์ฒ˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ข…์†๋œ ๋ชจ๋“ˆ์˜ ๋‚ด๋ถ€์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š๊ณ ๋„ ๋ชจ๋“ˆ์„ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@๋ถ„์‹ฌ

"์ œ๋„ค๋ฆญ" ์ถ”๊ฐ€์˜ ํฐ ๋ถ€๋ถ„์€ ์‹ค์ œ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋„{}์ธํ„ฐํŽ˜์ด์Šค์˜ ์œ ํ˜• ์•ˆ์ „ํ•˜์ง€ ์•Š์Œ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"ํ”ผํ•  ์ˆ˜ ์—†๋Š”"์€ ์ƒ๋Œ€์ ์ž…๋‹ˆ๋‹ค. ๊ถŒํˆฌ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋Š” 2009๋…„ Russ์˜ ๊ฒŒ์‹œ๋ฌผ(https://research.swtch.com/generic)์—์„œ 3๋ฒˆ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

Go2๊ฐ€ ์†Œ์Šค ์ฝ”๋“œ ์กฐ์ž‘์— ๊ธฐ๋ฐ˜ํ•œ ํ•ดํ‚น๋ณด๋‹ค๋Š” ์‚ฌ์šด๋“œ ์œ ํ˜• ์ด๋ก ์— ๊ธฐ๋ฐ˜์„ ๋‘” ํ˜„๋Œ€์ ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๊ฐ–๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ "์†Œ๋ฆฌ ์œ ํ˜• ์ด๋ก "์€ ๊ทœ๋ฒ”์ ์ด์ง€ ์•Š๊ณ  ์„œ์ˆ ์ ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์€ ํŠนํžˆ gotype ๊ฐ€ type ์ข…๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์ „์ฒด 1์ฐจ ์œ ํ˜• ์‹œ์Šคํ…œ์ด ๋‘ ๋ฒˆ์งธ ์‹œ์Šคํ…œ์œผ๋กœ ํ˜ธ์ด์ŠคํŒ…๋˜๋Š” 2์ฐจ ๋žŒ๋‹ค ๋ฏธ์ ๋ถ„ํ•™(์‹œ์Šคํ…œ F ๋ผ์ธ์„ ๋”ฐ๋ผ)์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. -order("์ปดํŒŒ์ผ ํƒ€์ž„") ์œ ํ˜•.

๋˜ํ•œ CMU์˜ Davies, Pfenning ๋“ฑ์˜ ๋ชจ๋‹ฌ ์œ ํ˜• ์ด๋ก  ์ž‘์—…๊ณผ๋„ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋ฐฐ๊ฒฝ ์ง€์‹ ์„ ์œ„ํ•ด ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์œ„ํ•œ ์Šคํ…Œ์ด์ง• ์‚ฌ์–‘์œผ๋กœ ์Šคํ…Œ์ด์ง• ๋œ ๊ณ„์‚ฐ ๋ฐ ๋ชจ๋‹ฌ ์œ ํ˜•์˜ ๋ชจ๋‹ฌ ๋ถ„์„์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ œ์•ˆ์˜ ๊ธฐ๋ณธ ์œ ํ˜• ์ด๋ก ์ด ํ•™์ˆ  ๋ฌธํ—Œ๋ณด๋‹ค ๋œ ํ˜•์‹์ ์œผ๋กœ ์ง€์ •๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ด์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

@andrewcmyers

๋ชจ๋“ˆ A๊ฐ€ ๋ชจ๋“ˆ D๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ C๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ B๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ A์˜ ๊ตฌํ˜„์ž๊ฐ€ D๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋”๋ผ๋„ D์—์„œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ A๋กœ ๋‹ค์‹œ ์ „ํŒŒํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์˜ค๋Š˜๋‚  Go์—์„œ ์ด๋ฏธ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ดํŽด๋ณด๋ฉด ์ฃผ์–ด์ง„ Go ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐœ์ฒด ํŒŒ์ผ์— ๋‚ด๋ณด๋‚ธ API์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ „์ด์  ์ข…์†์„ฑ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ์ œ๊ณตํ•˜๋Š” ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์€ ์•ฝํ•ด์ง€๊ณ  ์†Œํ”„ํŠธ์›จ์–ด๋Š” ๋” ๋ถ€์„œ์ง€๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

Go API์—์„œ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์ด ์•„๋‹Œ interface ์œ ํ˜•์„ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์˜นํ˜ธํ•˜๋Š” ๋ฐ ๋™์ผํ•œ ์ฃผ์žฅ์ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค๊ณ  ๋“ค์—ˆ๊ณ  ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๊ฐ€ ๋” ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ์กฐ๊ธฐ ์ถ”์ƒํ™”๋Š” ์œ ํ˜•์„ ๊ณผ๋„ํ•˜๊ฒŒ ์ œํ•œํ•˜๊ณ  API์˜ ํ™•์žฅ์„ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค. (์ด๋Ÿฌํ•œ ์˜ˆ ์ค‘ ํ•˜๋‚˜๋Š” #19584๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.) ์ด ์ฃผ์žฅ์— ์˜์กดํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ C++ ํ…œํ”Œ๋ฆฟ์˜ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณด๊ธฐ์— C++ ํ…œํ”Œ๋ฆฟ์˜ ์ฃผ์š” ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(ํŠน์ • ์ˆœ์„œ ์—†์Œ).

  • ๊ณผ๋„ํ•œ ๊ตฌ๋ฌธ ๋ชจํ˜ธ์„ฑ.
    ใ…. ์œ ํ˜• ์ด๋ฆ„๊ณผ ๊ฐ’ ์ด๋ฆ„ ์‚ฌ์ด์˜ ๋ชจํ˜ธ์„ฑ.
    ๋น„. ์—ฐ์‚ฐ์ž ๊ณผ๋ถ€ํ•˜์— ๋Œ€ํ•œ ์ง€๋‚˜์น˜๊ฒŒ ๊ด‘๋ฒ”์œ„ํ•œ ์ง€์›์œผ๋กœ ์ธํ•ด ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ์—์„œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๋ก ํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์•ฝํ™”๋ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๊ณผ๋ถ€ํ•˜ ํ•ด๊ฒฐ์— ๋Œ€ํ•œ ๊ณผ๋„ํ•œ ์˜์กด(๋˜๋Š” ๋™๋“ฑํ•˜๊ฒŒ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์›์˜ ์ž„์‹œ ์ง„ํ™”).
    ใ…. ํŠนํžˆ wrt ์ฐธ์กฐ ์ถ•์†Œ ๊ทœ์น™.
  • SFINAE ์›์น™์„ ์ง€๋‚˜์น˜๊ฒŒ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ ์šฉํ•˜์—ฌ ์ „ํŒŒํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์šด ์ œ์•ฝ ์กฐ๊ฑด๊ณผ ์œ ํ˜• ์ •์˜์— ๋„ˆ๋ฌด ๋งŽ์€ ์•”์‹œ์  ์กฐ๊ฑด์ด ๋ฐœ์ƒํ•˜์—ฌ ์˜ค๋ฅ˜ ๋ณด๊ณ ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  • AST ๋Œ€์ฒด ๋ฐ ๊ณ ์ฐจ ์ปดํŒŒ์ผ ์•„ํ‹ฐํŒฉํŠธ ๋Œ€์‹  ํ† ํฐ ๋ถ™์—ฌ๋„ฃ๊ธฐ ๋ฐ ํ…์ŠคํŠธ ํฌํ•จ(C ์ „์ฒ˜๋ฆฌ๊ธฐ)์„ ๋‚จ์šฉํ•ฉ๋‹ˆ๋‹ค(๋‹คํ–‰ํžˆ๋„ ๋ชจ๋“ˆ๋กœ ์ ์–ด๋„ ๋ถ€๋ถ„์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค).
  • C++ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์œ„ํ•œ ์ข‹์€ ๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํ•‘ ์–ธ์–ด๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ์ˆ˜๋ช…์ด ๊ธด ์ปดํŒŒ์ผ๋Ÿฌ ๊ณ„๋ณด(์˜ˆ: GCC ๋„๊ตฌ ์ฒด์ธ)์—์„œ ์ž˜๋ชป๋œ ์˜ค๋ฅ˜ ๋ณด๊ณ ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฐ์‚ฐ์ž ์ง‘ํ•ฉ์„ ๋‹ค๋ฅธ ์ด๋ฆ„์˜ "๊ฐœ๋…"์— ๋งคํ•‘ํ•˜์—ฌ ์ด๋ฆ„์ด ๋‘ ๋ฐฐ๋กœ(๋•Œ๋กœ๋Š” ๊ณฑํ•˜๊ธฐ) (์—ฐ์‚ฐ์ž ์ž์ฒด๋ฅผ ๊ธฐ๋ณธ ์ œ์•ฝ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๋Œ€์‹ ) ์ด๋ฆ„์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ €๋Š” 10๋…„ ๋™์•ˆ ๊ณ„์†ํ•ด์„œ C++๋กœ ์ฝ”๋”ฉํ•ด ์™”์œผ๋ฉฐ C++์˜ ๊ฒฐํ•จ์— ๋Œ€ํ•ด ๊ธธ๊ฒŒ ๋…ผ์˜ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ๋ชจ๋“ˆ A์˜ ์œ ํ˜•์— ๋‹จ์ผ ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ชจ๋“ˆ D์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก O(N) ์ข…์†์„ฑ ์ฒด์ธ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์ •๊ธฐ์ ์œผ๋กœ ๋‚˜๋ฅผ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ์ข…๋ฅ˜์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์ด ์ถฉ๋Œํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ธ์ œ๋“ ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

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

"์‹ค์ œ" ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹คํ˜•์„ฑ ์€ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์„ ๋•๊ณ  ์ถฉ๋Œํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚˜๋จธ์ง€ ์œ ํ˜• ์‹œ์Šคํ…œ๊ณผ ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค ์‹œ์Šคํ…œ์— ํ†ตํ•ฉ๋˜์–ด์•ผ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์˜ ๋งŽ์€ ์šฉ๋„๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func <T io.Reader> ReadAll(in T)

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

๋” ์ข‹์€ ์˜ˆ๋Š” sort ํŒจํ‚ค์ง€์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func <T Comparable> Sort(slice []T)

์—ฌ๊ธฐ์„œ Comparable ๋Š” ๋‹จ์ˆœํžˆ ์œ ํ˜•์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ž˜๋œ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Comparable ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ’ ์œ ํ˜• ์กฐ๊ฐ์—์„œ $#$ Sort $#$ ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์œผ๋กœ ๋ฌถ์ง€ ์•Š๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@bcmills ์œ ํ˜• ์‹œ์Šคํ…œ์— ์˜ํ•ด ์ œํ•œ๋˜์ง€ ์•Š๋Š” ์ „์ด์  ์ข…์†์„ฑ์€ C++์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ๋ถˆ๋งŒ ์ค‘ ์ผ๋ถ€๊ฐ€ ํ•ต์‹ฌ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ A, B, C ๋ฐ D๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒฝ์šฐ ์ „์ด ์ข…์†์„ฑ์€ ๊ทธ๋‹ค์ง€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“ˆ A๋ฅผ ๊ฐœ๋ฐœ ์ค‘์ด๋ฉฐ ๋ชจ๋“ˆ D๊ฐ€ ์•„๋ž˜์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•ฝํ•˜๊ฒŒ๋งŒ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฐ˜๋Œ€๋กœ D์˜ ๊ฐœ๋ฐœ์ž๋Š” ์ด์ œ ๋ชจ๋“ˆ D๊ฐ€ D์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์„ ์–ธ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์ผ๋ถ€ ์ƒˆ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ณ ์œ ํ•œ ์ƒˆ ๋ชจ๋“ˆ E์— ๋Œ€ํ•œ ์œ ํ˜• ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์•”์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด - ์ด๋Ÿฌํ•œ ์ œ์•ฝ ์กฐ๊ฑด์€ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ํ˜•์‹ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์— ์นจํˆฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด ๊ฒƒ๋„ ๊ฐœ๋ฐœ์ž D์—๊ฒŒ ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ๋‚ ๋ฆฌ๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค์ƒ, ๋””๋ฒ„๊น…์˜ ๋ชจ๋“  ์–ด๋ ค์›€๊ณผ ํ•จ๊ป˜ ์ผ์ข…์˜ ์ „์—ญ ์œ ํ˜• ์œ ์ถ”๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์†[ PLDI'15 ]์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ทจํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ›จ์”ฌ ๋” ๋‚ซ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ๋ช…์‹œ์ ์ด์ง€๋งŒ ๊ฐ€๋ฒผ์šด ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ์Šต๋‹ˆ๋‹ค(์ž‘๋™ ์ œ์•ฝ ์กฐ๊ฑด ์ง€์›์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์š”์ ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. CLU๋Š” 1977๋…„์— ์ด๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค). ์† ์œ ํ˜• ๊ฒ€์‚ฌ๋Š” ์™„์ „ ๋ชจ๋“ˆ์‹์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์ฝ”๋“œ๋Š” ์ฝ”๋“œ ๊ณต๊ฐ„์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ๋งŒ ์ปดํŒŒ์ผ๋˜๊ฑฐ๋‚˜ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ํŠน์ • ์œ ํ˜• ์ธ์ˆ˜์— ํŠนํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@andrewcmyers

์ด์ œ ๋ชจ๋“ˆ D๊ฐ€ D์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์„ ์–ธ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜ [โ€ฆ]์— ๋Œ€ํ•ด ์ผ๋ถ€ ์ƒˆ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด [ํด๋ผ์ด์–ธํŠธ]๊ฐ€ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ํ˜•์‹ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด ๊ฒƒ๋„ ๊ฐœ๋ฐœ์ž D์—๊ฒŒ ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ๋‚ ๋ฆฌ๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , ํ•˜์ง€๋งŒ ์ด๋Š” ์ด๋ฏธ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๋…๋ฆฝ์ ์ธ Go์˜ ๋งŽ์€ ์•”์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•ด ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

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

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์˜ค๋Š˜๋‚  Go ์œ ํ˜• ์‹œ์Šคํ…œ์€ ๋ณ€์ˆ˜ ์ˆ˜๋ช…์— ๋Œ€ํ•œ ์ œ์•ฝ์„ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. io.Writer ์˜ ์ผ๋ถ€ ๊ตฌํ˜„์€ ์ „๋‹ฌ๋œ ์Šฌ๋ผ์ด์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋‚˜์ค‘์— ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ž˜๋ชป ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ์‹ค์ œ ์“ฐ๊ธฐ๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๊ณ ๋ฃจํ‹ด์—์„œ) ๊ทธ๋Ÿฌ๋‚˜ Write ํ˜ธ์ถœ์ž๊ฐ€ ํ›„์† Write ์— ๋Œ€ํ•ด ๋™์ผํ•œ ๋ฐฑ์—… ์Šฌ๋ผ์ด์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๊ฒฝ์Ÿ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ์œ ํ˜• ์Šค์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์Šค์œ„์น˜์˜ ์œ ํ˜• ์ค‘ ํ•˜๋‚˜์— ์ถ”๊ฐ€๋œ ๋ฉ”์†Œ๋“œ์˜ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํ•ด๋‹น ์กฐ๊ฑด์„ ๋ณด๊ณ ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๋ฉด ํŠน์ • ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด https://github.com/golang/go/issues/19647์„ ์ฐธ์กฐํ•˜์„ธ์š”.)

๋˜๋Š” ์˜ค๋ฅ˜ ์ฃผ๋ณ€์˜ ๋ž˜ํผ๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋˜๋ฉด ํŠน์ • ์˜ค๋ฅ˜ ์œ ํ˜•์„ ํ™•์ธํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(Go 1.5์˜ ํ‘œ์ค€ net ํŒจํ‚ค์ง€์—์„œ ๋ฐœ์ƒํ•œ ๊ฒƒ์ฒ˜๋Ÿผ).

๋˜๋Š” API์— ๋…ธ์ถœ๋œ ์ฑ„๋„์˜ ๋ฒ„ํผ๋ง์ด ๋ณ€๊ฒฝ๋˜์–ด ๊ต์ฐฉ ์ƒํƒœ ๋ฐ/๋˜๋Š” ๊ฒฝํ•ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

...๋“ฑ๋“ฑ.

Go๋Š” ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๋“œ๋ฌธ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์•”์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด์€ ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋„์ฒ˜์— ์žˆ์Šต๋‹ˆ๋‹ค.


๋ช…์‹œ์  ์ฃผ์„์—์„œ ๋ชจ๋“  ๊ด€๋ จ ์ œ์•ฝ ์กฐ๊ฑด์„ ์บก์ฒ˜ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๊ฒฐ๊ตญ ๋‘ ๊ฐ€์ง€ ๋ฐฉํ–ฅ ์ค‘ ํ•˜๋‚˜๋กœ ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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

๋‹ค๋ฅธ ๋ฐฉํ–ฅ์—์„œ ๋ช…์‹œ์  ์ฃผ์„์€ ์ฃผ์–ด์ง„ API์— ๋Œ€ํ•œ ๊ด€๋ จ ์ œ์•ฝ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ๋งŒ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์ฃผ์„์€ ์ž˜๋ชป๋œ ๋ณด์•ˆ ๊ฐ๊ฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•”์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ๊ฐ€ ์—ฌ์ „ํžˆ ์†์ƒ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ช…์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ์œผ๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ "์œ ํ˜• ์•ˆ์ „" ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋„๋ก ์˜ค๋„ํ•ฉ๋‹ˆ๋‹ค.


๋ช…์‹œ์  ์†Œ์Šค ์ฝ”๋“œ ์ฃผ์„์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ API ์•ˆ์ •์„ฑ์„ ๋‹ฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋‚˜์—๊ฒŒ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค๋ช…ํ•˜๋Š” API ์•ˆ์ •์„ฑ์€ ์†Œ์Šค ์ฝ”๋“œ ๋ถ„์„์„ ํ†ตํ•ด (์ฝ”๋“œ์˜ ์ค‘๋ณต์„ฑ์„ ์ค„์ด๋ฉด์„œ) ๋‹ฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, api ๋„๊ตฌ ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์–ธ์–ด์˜ ํ˜•์‹ ์‹œ์Šคํ…œ์—์„œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ํ’๋ถ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด ์ง‘ํ•ฉ์„ ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜๊ณ  guru ๋„๊ตฌ ์— ๋‹ค์Œ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ API ํ•จ์ˆ˜, ๋ฉ”์„œ๋“œ ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๊ณ„์‚ฐ๋œ ์ œ์•ฝ ์กฐ๊ฑด ์ง‘ํ•ฉ์„ ์ฟผ๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ.

@bcmills ์™„๋ฒฝ์„ ์„ ์˜ ์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์˜ˆ, ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ์บก์ฒ˜ํ•˜๊ธฐ ์–ด๋ ค์šด ์•”์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ์ข‹์€ ๋ชจ๋“ˆ์‹ ์„ค๊ณ„๋Š” ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ทธ๋Ÿฌํ•œ ์•”์‹œ์  ์ œ์•ฝ์„ ๋„์ž…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) ํ™•์ธํ•˜๋ ค๋Š” ๋ชจ๋“  ์†์„ฑ์„ ์ •์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๊ด„์ ์ธ ๋ถ„์„์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ˆ˜๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ์ตœ๊ทผ ์ž๋™ ์˜ค๋ฅ˜ ์ง„๋‹จ ๋ฐ ํ˜„์ง€ํ™” ์ง„ํ–‰ ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ˆจ์ด ๊ฐ€์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ์„  ๋ถ„์„ ๋„๊ตฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ์ฝ”๋“œ๋งŒ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ž์‹ ๊ณผ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ฝ”๋“œ์— ํ•ญ์ƒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ์‰ฝ๊ฒŒ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ๋Š” ๊ณณ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ด๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์ •์ ์œผ๋กœ ์ œํ•œ๋œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ 40๋…„์˜ ๊ฒฝํ—˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ •์  ์ฃผ์„์ž…๋‹ˆ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋“ˆ์„ ๊ณ„์ธตํ™”ํ•˜๋Š” ๋” ํฐ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์–ด์จŒ๋“  ๊ทธ๋Ÿฌํ•œ ์•”์‹œ์  ์ œ์•ฝ์„ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„์„ ์ž‘์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•˜๊ณ  ํ™•์ธ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋†๋‹ด์„ ํ•˜๋„๋ก ํ•˜์—ฌ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‹ค๋ฅธ ์•”์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด์˜ ์ผ๋ถ€ ์˜ˆ์—๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ์— ๋Œ€ํ•œ ๊ฒฝ๋Ÿ‰ ์ •์  ๊ฒ€์‚ฌ[ PLDI 2016 ]๊ฐ€ ์ด๋Ÿฌํ•œ ์˜ˆ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@andrewcmyers

์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ์‰ฝ๊ฒŒ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ๋Š” ๊ณณ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ด๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
[โ€ฆ]
์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋“ˆ์„ ๊ณ„์ธตํ™”ํ•˜๋Š” ๋” ํฐ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์–ด์จŒ๋“  ๊ทธ๋Ÿฌํ•œ ์•”์‹œ์  ์ œ์•ฝ์„ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„์„ ์ž‘์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•˜๊ณ  ํ™•์ธ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋†๋‹ด์„ ํ•˜๋„๋ก ํ•˜์—ฌ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?

์‚ฌ์‹ค ์ด ์ ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์™€ ๊ด€๋ จํ•˜์—ฌ ์ข…์ข… ๋น„์Šทํ•œ ์ฃผ์žฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (์–ด์จŒ๋“  ๋ฐ์ดํ„ฐ์˜ ์•จ๋ฆฌ์–ด์‹ฑ ๋ฐ ๋ณด์กด์— ๋Œ€ํ•œ ๋ถˆ๋ณ€์„ฑ์„ ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ด๋Ÿฌํ•œ ๋ถˆ๋ณ€์„ฑ์„ ์ ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?)

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ ์ฃผ์žฅ์„ ํ•œ ๋‹จ๊ณ„ ๋” ๋ฐœ์ „์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋ฐ˜๋Œ€๋„ ์„ฑ๋ฆฝํ•ฉ๋‹ˆ๋‹ค! ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ์ฃผ์„์„ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ _์—†๋‹ค_๋ฉด(์ฝ”๋“œ๋กœ ์ž‘์—…ํ•˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ปจํ…์ŠคํŠธ์—์„œ ๋ช…๋ฐฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—) ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•ด ํ•ด๋‹น ์ฃผ์„์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚ด ๊ฐœ์ธ์ ์ธ ์ทจํ–ฅ์— ๊ด€๊ณ„์—†์ด Go์˜ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘ ๋ฐ 0 ๊ฐ’ ์‚ฌ์šฉ์€ "ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ๋ช…๋ฐฑํ•œ ๋ถˆ๋ณ€์„ฑ์„ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ๋จ"์— ๋Œ€ํ•œ ํŽธ๊ฒฌ์„ ๋ถ„๋ช…ํžˆ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Genus ์Šคํƒ€์ผ ๋ชจ๋ธ๋ง์ด ์ฃผ์„์œผ๋กœ ํ‘œํ˜„๋  ๋งŽ์€ ์ œ์•ฝ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ฃผ์„์—์„œ๋„ ์ƒ๋žต๋  ์ œ์•ฝ์„ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ์ธก๋ฉด์—์„œ ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

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

๋˜ํ•œ Go์˜ ๋›ฐ์–ด๋‚œ ์†์„ฑ ์ค‘ ํ•˜๋‚˜๋Š” ์‚ฌ์–‘์„ ์˜คํ›„์— ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Œ). Genus ์Šคํƒ€์ผ์˜ ์ œ์•ฝ ์กฐ๊ฑด ์‹œ์Šคํ…œ์ด Go ์–ธ์–ด๋ฅผ ํฌ๊ฒŒ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์–‘ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์ œ์•ˆ์ด ๊ถ๊ธˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ "๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ"์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. sync ๋ฐ atomic ํŒจํ‚ค์ง€์˜ ํŠน์ • ์œ ํ˜•(์ฆ‰, atomic.Value ๋ฐ sync.Map )์—์„œ CompareAndSwap ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์€ ์šฐ์—ฐํžˆ ๋น„๊ต๋  ์ˆ˜ โ€‹โ€‹์žˆ๋Š” ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ atomic.Value ๋ฐ sync.Map API๋Š” ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ ์—†์ด๋„ ์œ ์šฉํ•˜๋ฏ€๋กœ ํ•ด๋‹น ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ SFINAE(๋˜๋Š” ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์กฐ๊ฑด๋ถ€ ์ •์˜ API)์™€ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋” ๋ณต์žกํ•œ ์œ ํ˜•์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

๋‚˜๋Š” ์›์ฃผ๋ฏผ ์Œ์ ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด ์ฐฝ์˜์ ์ธ ๊ตฌ๋ฌธ ์•„์ด๋””์–ด ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@bcmills ์ด ์„ธ ๊ฐ€์ง€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

  1. ์œ ํ˜• ์ด๋ฆ„๊ณผ ๊ฐ’ ์ด๋ฆ„ ์‚ฌ์ด์˜ ๋ชจํ˜ธ์„ฑ.
  2. ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์— ๋Œ€ํ•œ ์ง€๋‚˜์น˜๊ฒŒ ๊ด‘๋ฒ”์œ„ํ•œ ์ง€์›
    3.๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๊ณผ๋ถ€ํ•˜ ํ•ด๊ฒฐ์— ๋Œ€ํ•œ ๊ณผ๋„ํ•œ ์˜์กด

@mahdix ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค.

  1. ์œ ํ˜• ์ด๋ฆ„๊ณผ ๊ฐ’ ์ด๋ฆ„ ์‚ฌ์ด์˜ ๋ชจํ˜ธ์„ฑ.

์ด ๊ธฐ์‚ฌ ๋Š” ์ข‹์€ ์†Œ๊ฐœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. C++ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋ ค๋ฉด ์–ด๋–ค ์ด๋ฆ„์ด ์œ ํ˜•์ด๊ณ  ์–ด๋–ค ์ด๋ฆ„์ด ๊ฐ’์ธ์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ C++ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ๋•Œ ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๊ตฌ์„ฑ์›์— ๋Œ€ํ•ด ํ•ด๋‹น ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Go์—์„œ ํ•ฉ์„ฑ ๋ฆฌํ„ฐ๋Ÿด์— ๋Œ€ํ•ด ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ๋ชจํ˜ธ์„ฑ์€ ๊ฐ’๊ณผ ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ ๊ฐ’๊ณผ ํ•„๋“œ ์ด๋ฆ„ ์‚ฌ์ด์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด Go ์ฝ”๋“œ์—์„œ:

const a = someValue
x := T{a: b}

a ์€ ๋ฆฌํ„ฐ๋Ÿด ํ•„๋“œ ์ด๋ฆ„์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋งต ํ‚ค ๋˜๋Š” ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ƒ์ˆ˜ a ์ž…๋‹ˆ๊นŒ?

  1. ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์— ๋Œ€ํ•œ ์ง€๋‚˜์น˜๊ฒŒ ๊ด‘๋ฒ”์œ„ํ•œ ์ง€์›

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

์ด๋Ÿฌํ•œ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ํ˜„์žฌ Go์—์„œ์™€ ๊ฐ™์ด ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์™„์ „ํžˆ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๊ณผ๋ถ€ํ•˜ ํ•ด๊ฒฐ์— ๋Œ€ํ•œ ๊ณผ๋„ํ•œ ์˜์กด

<type_traits> ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‹œ์ž‘ํ•˜๊ธฐ์— ์ข‹์€ ๊ณณ์ž…๋‹ˆ๋‹ค. ๊ณผ๋ถ€ํ•˜ ํ•ด๊ฒฐ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณด๋ ค๋ฉด ์นœ์ˆ™ํ•œ ์ด์›ƒ libc++ ์˜ ๊ตฌํ˜„์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

Go๊ฐ€ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•œ๋‹ค๋ฉด(์‹ฌ์ง€์–ด ๊ทธ๊ฒƒ์ด ๋งค์šฐ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค), ์กฐ๊ฑด๋ถ€ ์ •์˜๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ์ž‘์—…์œผ๋กœ ๊ณผ๋ถ€ํ•˜ ํ•ด๊ฒฐ์„ ํฌํ•จํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@bcmills
C++๋ฅผ ์‚ฌ์šฉํ•œ ์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ „ ์ •์˜๋œ '์ธํ„ฐํŽ˜์ด์Šค' ๊ตฌํ˜„์„ ํ†ตํ•œ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์ด ๋ณต์žก์„ฑ ์ธก๋ฉด์—์„œ ์–ด๋Š ์ •๋„ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? Python๊ณผ Kotlin์ด ๊ทธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

ADL ์ž์ฒด๋Š” ๋Œ€๋ถ€๋ถ„ ์–ธ๊ธ‰๋˜์ง€ ์•Š์€ C++ ํ…œํ”Œ๋ฆฟ์˜ ํฐ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ์‹œ๊ฐ„๊นŒ์ง€ ๋ชจ๋“  ์ด๋ฆ„์˜ ํ™•์ธ์„ ์ง€์—ฐ์‹œํ‚ค๊ณ  ๋ถ€๋ถ„์ ์œผ๋กœ "์ด์ƒ์ ์ธ" ๋ฐ " ๊ฒŒ์œผ๋ฅธ" ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ฌ๊ธฐ์—์„œ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋ฉฐ ํ‘œ์ค€์ด ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์ง€์›ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์ง€๊ธˆ๊นŒ์ง€ ๊ฐ€์žฅ ๋‚˜์œ ๋ถ€๋ถ„์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์€ ํ…œํ”Œ๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ ๋งคํฌ๋กœ ํ™•์žฅ์„ ์œ„ํ•œ ์‹œ์Šคํ…œ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? go generate ๋‚˜ gotemplate๊ณผ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋” ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

macro MacroFoo(stmt ast.Statement) {
    ....
}

๋งคํฌ๋กœ๋Š” ์ƒ์šฉ๊ตฌ์™€ ๋ฆฌํ”Œ๋ ‰์…˜ ์‚ฌ์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

C++๋Š” ์ œ๋„ค๋ฆญ์ด ํ…œํ”Œ๋ฆฟ์ด๋‚˜ ๋งคํฌ๋กœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ์ข‹์€ ์˜ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Go๊ฐ€ ์ตœ์ ํ™”๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ปดํŒŒ์ผ ํƒ€์ž„์— "์ธ์Šคํ„ด์Šคํ™”"๋  ์ˆ˜ ์—†๋Š” ์ต๋ช… ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๋ฉด.

@samadadi ๋‹น์‹ ์€ "๋‹น์‹ ๋“ค์—๊ฒŒ ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ๊ฐ€"๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š๊ณ  ๋‹น์‹ ์˜ ์š”์ ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณต์žก์„ฑ์— ๋Œ€ํ•œ ์ฃผ์žฅ์€ ์ด๋ฏธ ์—ฌ๋Ÿฌ ๋ฒˆ ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

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

https://blog.golang.org/toward-go2 ์— ์–ธ๊ธ‰๋œ ๋Œ€๋กœ "๊ฒฝํ—˜ ๋ณด๊ณ ์„œ"๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•„์š”์„ฑ๊ณผ ์„ค๊ณ„ ๋ชฉํ‘œ๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž ์‹œ ์‹œ๊ฐ„์„ ๋‚ด์–ด ๊ด€์ฐฐํ•œ ๊ฑฐ์‹œ์  ์‚ฌ๋ก€๋ฅผ ๊ธฐ๋กํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด ๋ฒ„๊ทธ๋ฅผ ์ฃผ์ œ ๋ฐ ์‹œ๋ฏผ์œผ๋กœ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ, https://golang.org/wiki/NoMeToo. ์ถ”๊ฐ€ํ•  ๋…ํŠนํ•˜๊ณ  ๊ฑด์„ค์ ์ธ ์ •๋ณด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์˜๊ฒฌ์„ ๋งํ•˜์‹ญ์‹œ์˜ค.

@mandolyte ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ (๋ถ€๋ถ„) ๋Œ€์ฒด๋ฌผ๋กœ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์˜นํ˜ธํ•˜๋Š” ์›น์—์„œ ์ž์„ธํ•œ ์„ค๋ช…์„ ์ฐพ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
https://appliedgo.net/generics/
https://www.calhoun.io/using-code-generation-to-survive-without-generics-in-go/
http://blog.ralch.com/tutorial/golang-code-generation-and-generics/

๋ถ„๋ช…ํžˆ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@andrewcmyers , ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ๊ณผ ํŽธ์˜์ƒ ์ฃผ์˜ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ - ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ์ตœ๊ณ /์ถฉ๋ถ„ํžˆ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด go ๋„๊ตฌ ์ฒด์ธ ๋‚ด์—์„œ ๋‹ค์†Œ ์œ ์‚ฌํ•œ ์ƒ์„ฑ์„ ํ—ˆ์šฉํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์ด ์ถ•๋ณต์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๋‹จ์  - go ๋„๊ตฌ ์ฒด์ธ ๋‚ด์—์„œ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ „๋ก€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

IMHO: ์ €๋ ดํ•œ ๊ฐ€๊ฒฉ์œผ๋กœ ์‰ฝ๊ฒŒ ํƒ€ํ˜‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด, gen, cpp, gofmt -r ๋˜๋Š” ๊ธฐํƒ€ ๋งคํฌ๋กœ/ํ…œํ”Œ๋ฆฟ ๋„๊ตฌ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๋งคํฌ๋กœ ์Šคํƒ€์ผ ์ฝ”๋“œ ์ƒ์„ฑ์ด ํ‘œ์ค€ํ™”๋˜๋”๋ผ๋„ ์ œ๋„ค๋ฆญ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C++ ํ…œํ”Œ๋ฆฟ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: ์ฝ”๋“œ ํŒฝ์ฐฝ, ๋ชจ๋“ˆ์‹ ์œ ํ˜• ๊ฒ€์‚ฌ ๋ถ€์กฑ, ๋””๋ฒ„๊น… ์–ด๋ ค์›€. ๋‹ค๋ฅธ ์ œ๋„ค๋ฆญ ์ฝ”๋“œ์˜ ๊ด€์ ์—์„œ ์ œ๋„ค๋ฆญ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์€ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฒƒ์ฒ˜๋Ÿผ ์‹œ์ž‘ํ• ์ˆ˜๋ก ์•…ํ™”๋ฉ๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— ์žฅ์ ์€ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. Go ์ปดํŒŒ์ผ๋Ÿฌ ์ž‘์„ฑ์ž์˜ ์‚ถ์„ ๋น„๊ต์  ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ์บ์‹œ ์••๋ ฅ์ด ์—†๋Š” ํ•œ ์ตœ์‹  ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค!

์š”์ ์€ ์ฝ”๋“œ ์ƒ์„ฑ์ด
๋”ฐ๋ผ์„œ ์ œ๋„ค๋ฆญ์€ ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๋Œ€๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2017๋…„ 7์›” 26์ผ ์ˆ˜์š”์ผ 22:41 Andrew Myers, ์•Œ๋ฆผ @github.com ์ž‘์„ฑ:

๋ถ„๋ช…ํžˆ ๋งํ•ด์„œ, ๋‚˜๋Š” ๋งคํฌ๋กœ ์Šคํƒ€์ผ ์ฝ”๋“œ ์ƒ์„ฑ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
gen, cpp, gofmt -r ๋˜๋Š” ๊ธฐํƒ€ ๋งคํฌ๋กœ/ํ…œํ”Œ๋ฆฟ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ
ํ‘œ์ค€ํ™”๋œ ๊ฒฝ์šฐ์—๋„ ์ œ๋„ค๋ฆญ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ฐ™์€
C++ ํ…œํ”Œ๋ฆฟ์œผ๋กœ์„œ์˜ ๋ฌธ์ œ: ์ฝ”๋“œ ํŒฝ์ฐฝ, ๋ชจ๋“ˆ์‹ ์œ ํ˜• ๊ฒ€์‚ฌ ๋ถ€์กฑ,
๋””๋ฒ„๊น… ์–ด๋ ค์›€. ๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ํ• ์ˆ˜๋ก ์•…ํ™”๋ฉ๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์ œ๋„ค๋ฆญ ์ฝ”๋“œ์˜ ๊ด€์ ์—์„œ ์ œ๋„ค๋ฆญ ์ฝ”๋“œ. ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์žฅ์ ์€
์ œํ•œ์ : Go ์ปดํŒŒ์ผ๋Ÿฌ ์ž‘์„ฑ์ž์˜ ์‚ถ์„ ๋น„๊ต์  ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
๋ช…๋ น์–ด ์บ์‹œ๊ฐ€ ์—†๋Š” ํ•œ ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์••๋ ฅ, ํ˜„๋Œ€ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋นˆ๋ฒˆํ•œ ์ƒํ™ฉ!

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/15292#issuecomment-318242016 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AT4HVb2SPMpe5dlEDUQeadIRKPaB74zoks5sR_jSgaJpZM4IG-xv
.

์˜์‹ฌํ•  ์—ฌ์ง€ ์—†์ด ์ฝ”๋“œ ์ƒ์„ฑ์€ "์–ธ์–ด์˜ ์ผ๋ถ€"๋กœ ๋ชจ์–‘๊ณผ ๋Š๋‚Œ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ์–ธ์–ด ์ง€์›์œผ๋กœ ๋งˆ๋ฌด๋ฆฌ๋˜๋”๋ผ๋„ ์‹ค์ œ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ œ ์š”์ ์€ ๋งค์šฐ ๋น„์šฉ ํšจ์œจ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Btw, ์ฝ”๋“œ ์ƒ์„ฑ ๋Œ€์ฒดํ’ˆ ์ค‘ ์ผ๋ถ€๋ฅผ ๋ณด๋ฉด ์–ธ์–ด๊ฐ€ ๋” ๋‚˜์€ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ–ˆ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ๋น ๋ฅด๋ฉฐ ์ž˜๋ชป๋œ ๊ฐœ๋…(์˜ˆ: ํฌ์ธํ„ฐ ๋ฐฐ์—ด ๋Œ€ ๊ฐ’ ๋ฐ˜๋ณต)์ด ์—†์—ˆ์„ ์ˆ˜ ์žˆ์Œ์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์œ„ํ•ด.

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

@bcmills ๋ฐ @ianlancetaylor ์˜ ์ œ๋„ค๋ฆญ ์ œ์•ˆ์„ ์ฝ์€ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ด€์ฐฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ ํƒ€์ž„ ํ•จ์ˆ˜์™€ ํผ์ŠคํŠธ ํด๋ž˜์Šค ํƒ€์ž…

๋‚˜๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„ ํ‰๊ฐ€๋ผ๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ์˜ ์ด์ ์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์€ ๋‚ด์žฅ gotype ๋ฅผ ๋„์ž…ํ•˜์ง€๋งŒ const ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ์ •์˜๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž์˜ ๊ด€์ ์—์„œ ์ธ์Šคํ„ด์Šคํ™”๋Š” "New"์™€ ๊ฐ™์€ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ œํ•œ๋˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜ ์„œ๋ช…์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

const func New(K, V gotype, hashfn Hashfn(K), eqfn Eqfn(K)) func()*Hashmap(K, V, hashfn, eqfn)

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

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

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

"์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ" ์„น์…˜์—์„œ ์ œ์•ˆ์€ "์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅ", "๋น„๊ต ๊ฐ€๋Šฅ", "ํ˜ธ์ถœ ๊ฐ€๋Šฅ", "๋ณตํ•ฉ" ๋“ฑ๊ณผ ๊ฐ™์ด ํ”„๋กœ์„ธ์Šค ์†๋„๋ฅผ ๋†’์ด๋Š” ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ์œ ํ˜• ์ œํ•œ์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์œ ํ˜• ์ œํ•œ์„ ์ง€์ •ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ œ์•ˆ์„œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํ•จ์ˆ˜์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‹๋ณ„์ž์— ๋” ๋งŽ์€ ์ œ์•ฝ ์กฐ๊ฑด์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ง€์›ํ•˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์ง€ ์•Š์„๊นŒ์š”? ๊ณ ๋ คํ•˜๋‹ค:

HashMap[Anything,Anything] // Compiler must always compare the implementation and usages to make sure this is valid.

๋Œ€

HashMap[Comparable,Anything] // Compiler can first filter out instantiations for incomparable types before running an exhaustive check.

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

@smasher164

๋‚˜๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„ ํ‰๊ฐ€๋ผ๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ์˜ ์ด์ ์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ด์ ์€ ๋ณ„๋„์˜ ์ปดํŒŒ์ผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„ ํ•จ์ˆ˜๊ฐ€ ์ „์—ญ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๋ง์ปค๊ฐ€ ๋งํฌ ํƒ€์ž„์— ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ํŽธ์ง‘ ๋‚ด์šฉ์„ ์ €๋„๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„ ํ•จ์ˆ˜๊ฐ€ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์–ด๋–ค ์ƒํƒœ๊ฐ€ ๋กœ์ปฌ์ธ์ง€ ์ „์—ญ์ธ์ง€ ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์–ด๋Š ์ชฝ์ด ์ด๋ฅผ ์ƒ์‡„ํ•  ๋งŒํผ ์ถฉ๋ถ„ํ•œ ์ด์ ์„ ์ œ๊ณตํ• ์ง€๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@smasher164

๋‚ด๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์œ ํ˜• ์ œํ•œ์„ ์ง€์ •ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ œ์•ˆ์˜ ์œ ํ˜• ์ œํ•œ์€ ์–ธ์–ด ๊ตฌ๋ฌธ์˜ ์ž‘์—…์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์˜ ํ‘œ๋ฉด์ ์„ ์ค„์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ตฌ๋ฌธ์  ์ œ์•ฝ์ด ์‚ฌ์šฉ๋ฒ•์—์„œ ์œ ์ถ”๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ํ˜•์„ ์ œ์•ฝํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๊ตฌ๋ฌธ์„ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์‹๋ณ„์ž์— ๋” ๋งŽ์€ ์ œ์•ฝ ์กฐ๊ฑด์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ง€์›ํ•˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์ง€ ์•Š์„๊นŒ์š”?

์–ธ์–ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ž‘์„ฑ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ตฌ๋ฌธ ์ œ์•ฝ์ด ์‚ฌ์šฉ๋ฒ•์—์„œ ์ถ”๋ก ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ์•ฝ ์œ ํ˜•์„ ์œ„ํ•œ ์ถ”๊ฐ€ ๊ตฌ๋ฌธ์„ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ C++์ด ๋‚ด๋ ค๊ฐ„ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ๊ด€๋ จ ์šฉ๋„๋ฅผ ์‹๋ณ„ํ•˜๋ ค๋ฉด ๊ธ€๋กœ๋ฒŒ ํ”„๋กœ๊ทธ๋žจ ๋ถ„์„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๋ชจ๋“ˆ์‹ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ถ”๋ก ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ์žฅํ™ฉํ•˜๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์ž‘์—…์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด CLU(1977)๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@andrewcmyers

๊ด€๋ จ ์šฉ๋„๋ฅผ ์‹๋ณ„ํ•˜๋ ค๋ฉด ๊ธ€๋กœ๋ฒŒ ํ”„๋กœ๊ทธ๋žจ ๋ถ„์„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ชจ๋“ˆ ๋ฐฉ์‹์œผ๋กœ ์ถ”๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

guru ๋˜๋Š” ์œ ์‚ฌํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๋ก ๋œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‚ด๋ณด๋‚ธ ํŒจํ‚ค์ง€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ๋กœ์ปฌ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ฟผ๋ฆฌ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ์žฅํ™ฉํ•˜๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ˆœ์ง„ํ•˜๊ฒŒ ์ƒ์„ฑ๋œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ(GCC ๋ฐ MSVC)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•”์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ๋‚˜์˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๋˜ํ•œ ๊ฐœ์ธ์ ์œผ๋กœ ๋ช…์‹œ์  ์ œ์•ฝ์ด ๊ธฐ์กด Go ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ช…์‹œ์  ๋Ÿฐํƒ€์ž„ ์œ ํ˜• ์ œ์•ฝ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ˆœ์ง„ํ•˜๊ฒŒ ์ƒ์„ฑ๋œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ(GCC ๋ฐ MSVC)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•”์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ๋‚˜์˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์€ ๋ฌด๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋น„-๋กœ์ปฌ ์œ ํ˜• ์ถ”๋ก (๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒƒ)์ด ์ž˜๋ชป๋œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ชฉ๋ก์€ ๊ทธ๋ณด๋‹ค ํ›จ์”ฌ ๊น๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” SML, OCaml ๋ฐ GHC๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ์ด๋ฏธ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์œผ๋ฉฐ ์ตœ์†Œํ•œ ์ผ๋ถ€ ๋ช…์‹œ์  ๋ชจ๋“ˆ ๊ตฌ์กฐ๊ฐ€ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋” ์ž˜ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๊ณ  ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ์ฒด๊ณ„๋กœ ์ข‹์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ƒ๊ฐํ•ด๋‚ธ๋‹ค๋ฉด ๋‹น์‹ ์€ ์ข‹์€ ์ถœํŒ๋ฌผ์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ์ž‘์ ์œผ๋กœ ์˜ค๋ฅ˜ ์ง€์—ญํ™”์— ๋Œ€ํ•œ POPL 2014 ๋ฐ PLDI 2015 ๋ฌธ์„œ๊ฐ€ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์–ด๋Š ์ •๋„ ์ตœ์ฒจ๋‹จ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ตฌ๋ฌธ์  ์ œ์•ฝ์ด ์‚ฌ์šฉ๋ฒ•์—์„œ ์ถ”๋ก ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์œ ํ˜• ๊ฒ€์‚ฌ ๊ฐ€๋Šฅํ•œ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋žจ์˜ ํญ์„ ์ œํ•œํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด type-params ์ œ์•ˆ์€ "๋ฐ˜๋ณต ๊ฐ€๋Šฅ" ์ œ์•ฝ ์กฐ๊ฑด์„ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์–ธ์–ด์—์„œ ์ด๊ฒƒ์€ ์Šฌ๋ผ์ด์Šค ๋˜๋Š” ์ฑ„๋„์— ํ•ด๋‹นํ•˜์ง€๋งŒ ๋ณตํ•ฉ ์œ ํ˜•(์˜ˆ: ์—ฐ๊ฒฐ ๋ชฉ๋ก)์€ ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋ฐ˜๋“œ์‹œ ์ถฉ์กฑํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜

type Iterable[T] interface {
    Next() T
}

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

"๋‚˜๋Š” Iterables, slices, ๋˜๋Š” channel์ธ ๋ชจ๋“  ์œ ํ˜•์˜ ์ง‘ํ•ฉ์„ ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ์ œ์•ฝ ์กฐ๊ฑด์€ ์‚ฌ์šฉ์ž, ํŒจํ‚ค์ง€ ์ž‘์„ฑ์ž ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ ๊ตฌํ˜„์ž์—๊ฒŒ ์œˆ-์œˆ-์œˆ ์ƒํ™ฉ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•˜๋ ค๋Š” ์š”์ ์€ ์ œ์•ฝ ์กฐ๊ฑด์ด ๊ตฌ๋ฌธ์ ์œผ๋กœ ์œ ํšจํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ด๋ฉฐ ์ผ๋ถ€๋Š” ์–ธ์–ด ๊ด€์ ์—์„œ ์ดํ•ด๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ API ๊ด€์ ์—์„œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ธ์–ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ž‘์„ฑ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๋Œ€์‹ ์— ์–ด๋–กํ•ด

type Iterable[T] interface {
    Next() T
}

์šฐ๋ฆฌ๋Š” "์ œ์•ฝ์กฐ๊ฑด"์—์„œ "์ธํ„ฐํŽ˜์ด์Šค"์˜ ๊ฐœ๋…์„ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์šฐ๋ฆฌ๋Š”

type T generic

type Iterable class {
    Next() T
}

์—ฌ๊ธฐ์„œ "class"๋Š” Java ์Šคํƒ€์ผ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ Haskell ์Šคํƒ€์ผ ์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

"์œ ํ˜• ํด๋ž˜์Šค"๋ฅผ "์ธํ„ฐํŽ˜์ด์Šค"์™€ ๋ถ„๋ฆฌํ•˜๋ฉด ๋‘ ์•„์ด๋””์–ด์˜ ๋น„์ง๊ต์„ฑ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Sortable (sort.Interface ๋ฌด์‹œ)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type T generic

type Comparable class {
    Less(a, b T) bool
}

type Sortable class {
    Next() Comparable
}

๋‹ค์Œ์€ @andrewcmyers ์˜ Genus ์˜ "์œ ํ˜• ํด๋ž˜์Šค ๋ฐ ๊ฐœ๋…" ์„น์…˜๊ณผ Go์— ๋Œ€ํ•œ ์ ์šฉ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ”ผ๋“œ๋ฐฑ์ž…๋‹ˆ๋‹ค.

์ด ์„น์…˜์—์„œ๋Š” ์œ ํ˜• ํด๋ž˜์Šค ๋ฐ ๊ฐœ๋…์˜ ์ œํ•œ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ์งธ, ์ œ์•ฝ ์กฐ๊ฑด ๋งŒ์กฑ์ด ๊ณ ์œ ํ•˜๊ฒŒ ๋ชฉ๊ฒฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ œํ•œ ์‚ฌํ•ญ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ฆฌ๋œ ์‹๋ณ„์ž์— ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ฌถ์œผ๋ฉด ์ฃผ์–ด์ง„ ์œ ํ˜•์— ๊ณ ์œ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? Genus์˜ "where" ์ ˆ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ฃผ์–ด์ง„ ์ œ์•ฝ ์กฐ๊ฑด์—์„œ ์œ ํ˜•/์ œ์•ฝ ์กฐ๊ฑด์„ ๊ตฌ์„ฑํ•˜์ง€๋งŒ ์ด๋Š” ์ฃผ์–ด์ง„ ์œ ํ˜•์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์˜ ์ œ์•ฝ ์กฐ๊ฑด์€ ์ข…๋ฅ˜ ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Go์— ์ ์šฉ๋œ ์ œ์•ฝ ์กฐ๊ฑด ์ •์˜์˜ ๊ทน์ ์ธ ๋‹จ์ˆœํ™”์ž…๋‹ˆ๋‹ค.

kind Any interface{} // accepts any type that satisfies interface{}.
type T Any // Declare a type of Any kind. Also binds it to an identifier.
kind Eq T == T // accepts any type for which equality is defined.

๋”ฐ๋ผ์„œ ์ง€๋„ ์„ ์–ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

type Map[K Eq, V Any] struct {
}

Genus์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type Map[K, V] where Eq[K], Any[V] struct {
}

๊ธฐ์กด Type-Params ์ œ์•ˆ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

type Map[K,V] struct {
}

์ œ์•ฝ ์กฐ๊ฑด์ด ๊ธฐ์กด ์œ ํ˜• ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋ฉด ์–ธ์–ด ๊ธฐ๋Šฅ ๊ฐ„์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋ชจ๋‘ ๋™์˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‘˜์งธ, ๊ทธ๋“ค์˜ ๋ชจ๋ธ์€ ๋‹จ์ผ ์œ ํ˜•์„ ์ ์‘์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜๋Š” ๋ฐ˜๋ฉด ํ•˜์œ„ ์œ ํ˜•์ด ์žˆ๋Š” ์–ธ์–ด์—์„œ๋Š” ๊ฐ ์ ์‘ ์œ ํ˜•์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“  ํ•˜์œ„ ์œ ํ˜•์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ด ์ œํ•œ์€ ์–ธ์–ด๊ฐ€ ์ด๋ฏธ ๋ช…๋ช…๋œ/๋ฌด๋ช… ์œ ํ˜•๊ณผ ๊ฒน์น˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ„์— ์ข‹์€ ๋ณ€ํ™˜ ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Go์— ๋œ ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ์˜ˆ์ œ๋Š” ๋ชจ๋ธ์„ ์†”๋ฃจ์…˜์œผ๋กœ ์ œ์•ˆํ•˜๋Š”๋ฐ, ์ด๋Š” Go์— ์œ ์šฉํ•˜์ง€๋งŒ ํ•„์ˆ˜ ๊ธฐ๋Šฅ์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ http.Handler๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์„ ์˜ˆ์ƒํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋™์ž‘์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

type handleFunc func(http.ResponseWriter, *http.Request)
func (f handlerFunc) ServeHTTP(w http.ResponseWriter, r *http.Request) { f(w,r) }

์‚ฌ์‹ค ์ด๊ฒƒ์ด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ€ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

@smasher164

์ฒซ์งธ, ์ œ์•ฝ ์กฐ๊ฑด ๋งŒ์กฑ์ด ๊ณ ์œ ํ•˜๊ฒŒ ๋ชฉ๊ฒฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด ์ œํ•œ ์‚ฌํ•ญ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ฆฌ๋œ ์‹๋ณ„์ž์— ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ฌถ์œผ๋ฉด >๊ทธ๊ฒƒ์ด ์ฃผ์–ด์ง„ ์œ ํ˜•์— ๊ณ ์œ ํ•˜์ง€ ์•Š๊ฒŒ ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์•„์ด๋””์–ด๋Š” Haskell๊ณผ ๋‹ฌ๋ฆฌ Genus์—์„œ ๋™์ผํ•œ ์œ ํ˜•์˜ ๋™์ผํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด HashSet[T] ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ž์—ด์„ ํ•ด์‹œํ•˜๋ ค๋ฉด HashSet[String] ์„ ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ $#$ CaseInsens ์™€ ๋ฌธ์ž์—ด์„ ํ•ด์‹œํ•˜๊ณ  ๋น„๊ตํ•˜๋ ค๋ฉด HashSet[String with CaseInsens] ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์†์€ ์‹ค์ œ๋กœ ์ด ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์„ ๊ตฌ๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Go์—๊ฒŒ ๊ณผ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ์ด ์ด๋ฅผ ์ถ”์ ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์œ ํ˜•์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์ž‘์—…์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ข…๋ฅ˜ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค{} // ์ธํ„ฐํŽ˜์ด์Šค{}๋ฅผ ์ถฉ์กฑํ•˜๋Š” ๋ชจ๋“  ์œ ํ˜•์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
type T Any // Any ์ข…๋ฅ˜์˜ ์œ ํ˜•์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹๋ณ„์ž์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
์ข…๋ฅ˜ Eq T == T // ๋™๋“ฑ์„ฑ์ด ์ •์˜๋œ ๋ชจ๋“  ์œ ํ˜•์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
์œ ํ˜• ๋งต[K Eq, V Any] ๊ตฌ์กฐ์ฒด { ...
}

Genus์—์„œ ์ด์— ๋Œ€ํ•œ ๋„๋•์  ๋“ฑ๊ฐ€๋ฌผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

constraint Any[T] {}
// Just use Any as if it were a type
constraint Eq[K] {
   boolean equals(K);
}
class Map[K, V] where Eq[K] { ... }

Familia์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

interface Eq {
    boolean equals(This);
}
class Map[K where Eq, V] { ... }

ํŽธ์ง‘: #4146์— ์„ค๋ช…๋œ ๋Œ€๋กœ ๋ฐ˜์‚ฌ ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์„ ์„ ํ˜ธํ•˜์—ฌ ์ด๋ฅผ ์ฒ ํšŒํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์— ์„ค๋ช…๋œ ์ œ๋„ค๋ฆญ ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์€ ์ปดํฌ์ง€์…˜ ์ˆ˜์—์„œ ์„ ํ˜•์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํ”Œ๋ ‰ํŠธ ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์—๋Š” ํ•ญ์ƒ ์„ฑ๋Šฅ ํ•ธ๋””์บก์ด ์žˆ์ง€๋งŒ ๋Ÿฐํƒ€์ž„์— ์ž์ฒด ์ตœ์ ํ™”ํ•˜์—ฌ ์ปดํฌ์ง€์…˜ ์ˆ˜์— ๊ด€๊ณ„์—†์ด ํ•ธ๋””์บก์ด ์ผ์ •ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ œ์•ˆ์ด ์•„๋‹ˆ๋ผ ์ œ์•ˆ์„ ๋””์ž์ธํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ž ์žฌ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  Go ์ฝ”๋“œ์—๋Š” ๋‘ ๊ฐ€์ง€ ๊ณตํ†ต์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’ ๋ž˜ํ•‘(ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด http.ResponseWriter ๋ž˜ํ•‘)
  • ๋•Œ๋•Œ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’์ด ๊ฐ–๋Š” ์„ ํƒ์  ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์Œ(์˜ˆ Temporary() bool net.Error )

์ด๊ฒƒ๋“ค์€ ์ข‹๊ณ  ์œ ์šฉํ•˜์ง€๋งŒ ์„ž์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ž˜ํ•‘ํ•˜๋ฉด ๋ž˜ํ•‘ ์œ ํ˜•์— ์ •์˜๋˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ฃผ์–ด์ง„

type MyError struct {
  error
  extraContext extraContextType
}
func (m MyError) Error() string {
  return fmt.Sprintf("%s: %s", m.extraContext, m.error)
}

ํ•ด๋‹น ๊ตฌ์กฐ์ฒด์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•˜๋ฉด ์›๋ž˜ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ฒด์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•˜์ง€ ์•Š์œผ๋ฉด ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ—ˆ์šฉ๋œ ์ผ๋ฐ˜ ์ œ์•ˆ์„ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(์•„๋ฌด๋„ ์ง‘์ค‘ํ•˜์ง€ ์•Š๋„๋ก ์˜๋„์ ์œผ๋กœ ์ถ”ํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ๋˜ ์ž„์˜์˜ ๊ตฌ๋ฌธ).

type MyError generic_over[E which_is_a_type_satisfying error] struct {
  E
  extraContext extraContextType
}
func (m MyError) Error() string {
  return fmt.Sprintf("%s: %s", m.extraContext, m.E)
}

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

์—ฌ๊ธฐ์„œ ์ •๋ง ํ•„์š”ํ•œ ๊ฒƒ์€ ์˜ค๋ฅ˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ž„์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ๋™์  ์œ ํ˜•์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ฆ‰์‹œ ๋‘ ๊ฐ€์ง€ ์šฐ๋ ค ์‚ฌํ•ญ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

  • ์œ ํ˜•์€ ๋Ÿฐํƒ€์ž„์— ์ƒ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์–ด์จŒ๋“  ๋ฆฌํ”Œ๋ ‰์…˜์— ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ)
  • ์˜ค๋ฅ˜ ๊ฐ’์ด nil์ด๋ฉด ์œ ํ˜• ์ƒ์„ฑ์ด ํŒจ๋‹‰ ์ƒํƒœ๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๊ฒƒ ์—†์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋™์  ์œ ํ˜•์ด ์•„๋‹Œ ์˜ค๋ฅ˜ ์œ ํ˜• ์ž์ฒด์—์„œ MyError ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ณ  (์–ด๋–ป๊ฒŒ๋“ ) ์ ์šฉํ•  ๋งˆ๋ฒ•์˜ unbox ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

func wrap(ec extraContext, err error) error {
  if err == nil {
    return nil
  }
  return MyError{
    E: unbox(err),
    extraContext: ec,
  }
}

์ด์ œ ๋™์  ์œ ํ˜•์ด *net.DNSError ์ธ nil์ด ์•„๋‹Œ ์˜ค๋ฅ˜ err ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด

wrapped := wrap(getExtraContext(), err)
//wrapped 's dynamic type is a MyStruct embedding E=*net.DNSError
_, ok := wrapped.(net.Error)
fmt.Println(ok)

true ๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ err ์˜ ๋™์  ์œ ํ˜•์ด *os.PathError ์˜€๋‹ค๋ฉด false๋กœ ์ธ์‡„๋˜์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ๋ชจ์—์„œ ์‚ฌ์šฉ๋œ ๋‘”ํ•œ ๊ตฌ๋ฌธ์„ ๊ณ ๋ คํ•  ๋•Œ ์ œ์•ˆ๋œ ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ๋” ์ ์€ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ์˜์‹์œผ๋กœ ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๊ธฐ๋ฅผ ํฌ๋งํ•˜์ง€๋งŒ ์œ„์˜ ๋ฐฉ๋ฒ•์ด ํšจ๊ณผ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@jimmyfrasche ์›ํ•˜๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋ž˜ํผ๊ฐ€ ์—†๋Š” ์ ์‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์›๋ณธ์„ ์ˆจ๊ธฐ๋Š” ๋‹ค๋ฅธ ๊ฐœ์ฒด๋กœ ๋ž˜ํ•‘ํ•˜์ง€ ์•Š๊ณ  ์œ ํ˜•์ด ์ œ๊ณตํ•˜๋Š” ์ž‘์—… ์ง‘ํ•ฉ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. Genus๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

@andrewcmyers ์•„๋‹ˆ์š”.

Go์˜ ๊ตฌ์กฐ์ฒด๋Š” ์ž„๋ฒ ๋”ฉ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ์—†์ง€๋งŒ ์œ ํ˜•์ด ์žˆ๋Š” ํ•„๋“œ๋ฅผ ๊ตฌ์กฐ์ฒด์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•๊ณผ ์ด๋ฆ„์ด ๊ฐ™์€ ํ•„๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ์œ ํ˜•์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— ํˆฌ๋ช…ํ•˜๊ฒŒ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ƒ์†์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Foo() ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ์œ ํ˜• T๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

type S struct {
  T
}

๊ทธ๋ฆฌ๊ณ 

type S struct {
  T T
}
func (s S) Foo() {
  s.T.Foo()
}

(Foo๊ฐ€ "this"๋ผ๊ณ  ํ•˜๋ฉด ํ•ญ์ƒ T ์œ ํ˜•์ž…๋‹ˆ๋‹ค.)

๊ตฌ์กฐ์ฒด์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํฌํ•จํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌ์กฐ์ฒด์— ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ณ„์•ฝ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(์•”์‹œ์  ํ•„๋“œ์— ์ผ๋ถ€ ๋™์  ๊ฐ’์„ ํ• ๋‹นํ•ด์•ผ ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null ํฌ์ธํ„ฐ ์˜ˆ์™ธ์™€ ๋™์ผํ•œ ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•จ)

Go์—๋Š” ํ˜•์‹์˜ ๋ฉ”์„œ๋“œ ์ธก๋ฉด์—์„œ ๊ณ„์•ฝ์„ ์ •์˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์•ฝ์„ ์ถฉ์กฑํ•˜๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ๊ฐ’์€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฐ’์— ๋ฐ•์‹ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’์€ ๋‚ด๋ถ€ ์œ ํ˜• ๋งค๋‹ˆํŽ˜์ŠคํŠธ(๋™์  ์œ ํ˜•)์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์™€ ํ•ด๋‹น ๋™์  ์œ ํ˜•์˜ ๊ฐ’(๋™์  ๊ฐ’)์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’์— ๋Œ€ํ•œ ์œ ํ˜• ์ฃผ์žฅ ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ (a) ๋น„์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์— ๋Œ€ํ•ด ์ฃผ์žฅํ•˜๋Š” ๊ฒฝ์šฐ ๋™์  ๊ฐ’์„ ์–ป๊ฑฐ๋‚˜ (b) ๋™์  ๊ฐ’๋„ ์ถฉ์กฑํ•˜๋Š” ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค์— ์ฃผ์žฅํ•˜๋Š” ๊ฒฝ์šฐ ์ƒˆ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด๊ฐ€ ์„ ํƒ์  ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด๋ฅผ "๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ"ํ•˜๊ธฐ ์œ„ํ•ด ํ›„์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ์ด์ „ ์˜ˆ์ œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ์˜ค๋ฅ˜์—๋Š” "Temporary() bool" ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์‹œ์ ์ธ ์˜ค๋ฅ˜์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func isTemp(err error) bool {
  if t, ok := err.(interface{ Temporary() bool}); ok {
    return t.Temporary()
  }
  return false
}

์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜•์„ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ๋„ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋น„์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ž˜ํ•‘ํ•  ๋•Œ ์ด์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋„ ์ˆจ๊ธฐ๊ณ  "๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ" ์œ ํ˜• ์ฃผ์žฅ์œผ๋กœ ๋ณต๊ตฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ž˜ํ•‘๋œ ์œ ํ˜•์€ ์„ ํƒ์  ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋”๋ผ๋„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ•„์ˆ˜ ๋ฉ”์†Œ๋“œ๋งŒ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. . ๊ณ ๋ คํ•˜๋‹ค:

type A struct {}
func (A) Foo()
func (A) Bar()

type I interface {
  Foo()
}

type B struct {
  I
}

var i I = B{A{}}

i Bar ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ i์˜ ๋™์  ์œ ํ˜•์ด B๋ผ๋Š” ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ•˜๋Š” ํ•œ ๊ทธ๊ฒƒ์ด ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. .

์ด๋กœ ์ธํ•ด ํŠนํžˆ ์˜ค๋ฅ˜ ๋˜๋Š” Reader์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹ค์ œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋™์  ์œ ํ˜•๊ณผ ๊ฐ’์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด(์ผ๋ถ€ ์•ˆ์ „ํ•˜๊ณ  ์ œ์–ด๋œ ๋ฐฉ์‹์œผ๋กœ) ์ƒˆ ์œ ํ˜•์„ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•˜๊ณ  ํฌํ•จ๋œ ํ•„๋“œ๋ฅผ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์ƒˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์›๋ž˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’์„ ์–ป๊ณ  ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ํ–ฅ์ƒ๋œ ๊ธฐ๋Šฅ์ด ์žˆ์ง€๋งŒ ์›๋ž˜ ๋™์  ์œ ํ˜•์˜ ๋‚˜๋จธ์ง€ ๋ฉ”์„œ๋“œ๋Š” ์—ฌ์ „ํžˆ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

@jimmyfrasche ๊ณผ์—ฐ. Genus๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ•œ ๊ฐ€์ง€ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ boxing ํ•˜์ง€ ์•Š๊ณ  "์ธํ„ฐํŽ˜์ด์Šค" ๊ณ„์•ฝ์„ ์ถฉ์กฑ์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ’์—๋Š” ์—ฌ์ „ํžˆ ์›๋ž˜ ์œ ํ˜•๊ณผ ์›๋ž˜ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”„๋กœ๊ทธ๋žจ์€ ํ˜•์‹์ด ๊ณ„์•ฝ์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜•์‹์ด ์ œ๊ณตํ•˜๋Š” ์ž‘์—…์ด์ง€๋งŒ ํ˜•์‹์— ํ•„์š”ํ•œ ์ž‘์—…์ด ์—†๋Š” ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ƒˆ ์ž‘์—…์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์œ ํ˜•์ด ์‚ฌ์šฉํ•  ์ž‘์—…์„ ๋Œ€์ฒดํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@jimmyfrasche @andrewcmyers ํ•ด๋‹น ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” https://github.com/golang/go/issues/4146#issuecomment -318200547๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

@jimmyfrasche ๋‚˜์—๊ฒŒ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋Š” ๋ณ€์ˆ˜์˜ ๋™์  ์œ ํ˜•/๊ฐ’์„ ์–ป๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ž„๋ฒ ๋”ฉ์„ ์ œ์ณ๋‘๊ณ  ๋‹จ์ˆœํ™” ๋œ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type MyError generic_over[E which_is_a_type_satisfying error] struct {
  e E
  extraContext extraContextType
}
func (m MyError) Error() string {
  return fmt.Sprintf("%s: %s", m.extraContext, m.e)
}

e ์— ํ• ๋‹น๋œ ๊ฐ’์€ error ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” *net.DNSError ์™€ ๊ฐ™์€ ๋™์ (๋˜๋Š” ๊ตฌ์ฒด์ ์ธ) ์œ ํ˜•์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ฏธ๋ž˜์˜ ์–ธ์–ด ๋ณ€๊ฒฝ์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  1. ๋ณ€์ˆ˜์˜ ๋™์  ๊ฐ’์„ ์•Œ์•„๋‚ด๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ unbox ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ตฌ์ฒด์ ์ด์ง€ ์•Š์€ ๋ชจ๋“  ์œ ํ˜•(์˜ˆ: ๊ณต์šฉ์ฒด)์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. ์–ธ์–ด ๋ณ€๊ฒฝ์ด ์œ ํ˜• ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ€์ˆ˜์˜ ๋™์  ์œ ํ˜•์„ ๊ฐ€์ ธ์˜ค๋Š” ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ์œ ํ˜• ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ unbox ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,
func unbox(v T1) T2 {
    t := dynTypeOf(v)
    return v.(t)
}

wrap ๋Š” ์ด์ „๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func wrap(ec extraContext, err error) error {
  if err == nil {
    return nil
  }
  t := dynTypeOf(err)
  return MyError{
    e: v.(t),
    extraContext: ec,
  }
}
  1. ์–ธ์–ด ๋ณ€๊ฒฝ์ด ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
type E1 which_is_a_type_satisfying error
type E2 which_is_a_type_satisfying error

func wrap(ec extraContext, err E1) E2 {
  if err == nil {
    return nil
  }
  return MyError{
    e: err,
    extraContext: ec,
  }
}

์ด ์˜ˆ์—์„œ๋Š” ์˜ค๋ฅ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ๊ฐ’์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. error wrap ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” ํ•˜๋‚˜๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‹จ, MyError e ํƒ€์ž…์€ ์ „๋‹ฌ๋ฐ›์€ err ์™€ ๋™์ผํ•˜๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์— ํ•œ์ •๋˜์ง€ ์•Š๋Š”๋‹ค. 2์™€ ๊ฐ™์€ ๋™์ž‘์„ ์›ํ•˜๋ฉด

var iface error = ...
wrap(getExtraContext(), unbox(iface))

์•„๋ฌด๋„ ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— https://blog.golang.org/toward-go2์—์„œ ์š”๊ตฌํ•˜๋Š” ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๋งค์šฐ ๋ช…๋ฐฑํ•œ "๊ฒฝํ—˜ ๋ณด๊ณ ์„œ"๋ฅผ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋Š” ๋‚ด์žฅ map ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

m := make(map[string]string)

๋‹ค์Œ์€ ๋‚ด์žฅ chan ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

c := make(chan bool)

๋งˆ์ง€๋ง‰์œผ๋กœ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์ œ๋„ค๋ฆญ์ด ๋” ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” interface{} ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • heap.Interface (https://golang.org/pkg/container/heap/#Interface)
  • list.Element (https://golang.org/pkg/container/list/#Element)
  • ring.Ring (https://golang.org/pkg/container/ring/#Ring)
  • sync.Pool (https://golang.org/pkg/sync/#ํ’€)
  • ์˜ˆ์ •๋œ sync.Map (https://tip.golang.org/pkg/sync/#Map)
  • atomic.Value (https://golang.org/pkg/sync/atomic/#Value)

๋‚ด๊ฐ€ ๋†“์นœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ ์€ ์œ„์˜ ๊ฐ ํ•ญ๋ชฉ์—์„œ ์ œ๋„ค๋ฆญ์ด ์œ ์šฉํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(์ฐธ๊ณ : ์—ฌ๊ธฐ์— sort.Sort ๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ์˜ˆ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)

http://www.yinwang.org/blog-cn/2014/04/18/golang
์ œ๋„ค๋ฆญ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์œ ์‚ฌํ•œ ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ๊ณผ ์œ ํ˜• ์‹œ์Šคํ…œ์€ Go์˜ ์ค‘์š”ํ•œ ์žฅ์ ์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ธ์–ด๊ฐ€ Scala๋‚˜ Haskell์ฒ˜๋Ÿผ ์—‰๋ง์ด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๊ธฐ๋Šฅ์€ "์ด๊ฒƒ์„ ๋๋‚ด์ž"์—์„œ "CS ์ด๋ก ๊ณผ ์ˆ˜ํ•™์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ฉ์‹œ๋‹ค"๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฐ€์น˜๋ฅผ ๊ถ๊ทน์ ์œผ๋กœ ๋ณ€ํ™”์‹œํ‚ฌ ์˜์‚ฌ ํ•™๊ณ„ ํŒฌ๋ณด์ด๋ฅผ ๋Œ์–ด๋“ค์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ํ”ผํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๊ฒƒ์€ ์‹ฌ์—ฐ์œผ๋กœ ๊ฐ€๋Š” ๊ธธ์ž…๋‹ˆ๋‹ค.

@bxqgit ์ด ์‹œ๋ฏผ์„ ์ง€์ผœ์ฃผ์„ธ์š”. ๋ˆ„๊ตฌ๋ฅผ ์š•ํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ž˜์— ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ์ง€์— ๋Œ€ํ•ด์„œ๋Š” ๋‘๊ณ  ๋ณผ ๊ฒƒ์ด์ง€๋งŒ ์ œ ์‹œ๊ฐ„์˜ 98% ๋™์•ˆ ์ œ๋„ค๋ฆญ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ vs ์–ด๋–ป๊ฒŒ ์ž˜๋ชป ์‚ฌ์šฉ๋˜๋Š”์ง€๋Š” ๋‹ค๋ฅธ ๋…ผ์˜์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ต์œก์€ ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@bxqgit
์ œ๋„ค๋ฆญ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(ํŠธ๋ฆฌ, ์Šคํƒ, ํ, ...) ๋˜๋Š” ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜(Map, Filter, Reduce, ...)์™€ ๊ฐ™์€ ์ œ๋„ค๋ฆญ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์ด ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์€ ์ œ๋„ค๋ฆญ ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆ๊ฐ€ํ”ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์€ ์ฝ”๋“œ ์ž‘์„ฑ์ž์™€ ์ฝ”๋“œ ๋ฆฌ๋” ๋ชจ๋‘์—๊ฒŒ ์—„์ฒญ๋‚œ ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์‹œ ์ฝ”๋“œ ํšจ์œจ์„ฑ์— ๋‚˜์œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ณต์žกํ•œ ์ž‘์„ฑ์„ ๋ฐ˜์˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์–ธ์–ด ์ œ๋„ค๋ฆญ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํ•ฉ๋ฆฌ์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋น„ํšจ์œจ์ ์ธ ์ฝ”๋“œ.

@bxqgit ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ˜๋“œ์‹œ ์–ธ์–ด์— ๋ณต์žก์„ฑ์ด ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ์œผ๋กœ๋„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด @riwogo ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋งค์šฐ ์œ ์šฉํ•œ ๊ฐ€๋ณ€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

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

๋˜ํ•œ ๋’ค์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์€ "CS ์ด๋ก ๊ณผ ์ˆ˜ํ•™"์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ธ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  "์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”" ์‚ฌ๋žŒ๋“ค์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋’ค์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์€ "CS ์ด๋ก ๊ณผ ์ˆ˜ํ•™"์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ธ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  "์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”" ์‚ฌ๋žŒ๋“ค์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” Go ์–ธ์–ด ๋””์ž์ธ์—์„œ CS ์ด๋ก ๊ณผ ์ˆ˜ํ•™์„ ๋งŽ์ด ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ƒ๋‹นํžˆ ์›์‹œ์ ์ธ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹น์‹ ์ด ์ด์•ผ๊ธฐํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ œ๋„ค๋ฆญ์„ ํ”ผํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ์ผ์„ ๋๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ์ž‘๋™ํ•œ๋‹ค๋ฉด ์™œ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๊นŒ? ์ผ๋ฐ˜์ ์œผ๋กœ ์–ธ์–ด์˜ ๊ตฌ๋ฌธ์„ ์ง€์†์ ์œผ๋กœ ๋ฐœ์ „์‹œํ‚ค๊ณ  ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์œ ์Šต๊ด€์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ Haskell๊ณผ Scala์˜ ํ˜ผ๋ž€์œผ๋กœ ์ด์–ด์ง€๋Š” ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ์€ ๋ณต์žกํ•˜์ง€๋งŒ Generics๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

์ •๋ ฌ ํŒจํ‚ค์ง€์˜ SortInts, SortFloats, SortStrings ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ๋˜๋Š” SearchInts, SearchFloats, SearchStrings. ๋˜๋Š” io/ioutil ํŒจํ‚ค์ง€์— ์žˆ๋Š” byName์˜ Len, Less ๋ฐ Swap ๋ฉ”์„œ๋“œ. ์ˆœ์ˆ˜ํ•œ ์ƒ์šฉ๊ตฌ ๋ณต์‚ฌ.

๋ณต์‚ฌ ๋ฐ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์€ ์Šฌ๋ผ์ด์Šค๋ฅผ ํ›จ์”ฌ ๋” ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ƒ์„ฑ ๋ฐ์ดํ„ฐ ์œ ํ˜•์€ ๋งํ•  ๊ฒƒ๋„ ์—†๊ณ  ๋งต ๋ฐ ์ฑ„๋„์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์Šฌ๋ผ์ด์Šค๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ณตํ•ฉ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด๋ฉฐ ์ด๊ฒƒ์ด ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ์ด์œ ์ด์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์œ ํ˜•์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ํˆฌํ‘œ๋Š” ์ผ๋ฐ˜ํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ œ๋„ค๋ฆญ์— ๋ฐ˜๋Œ€ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ธฐ๋ณธ ์œ ํ˜•์—์„œ ์ž‘๋™ํ•˜๋Š” append ๋ฐ copy $์™€ ๊ฐ™์€ ๋” ๋งŽ์€ ๊ธฐ๋ณธ ์ œ๊ณต ์ œ๋„ค๋ฆญ ๊ธฐ๋Šฅ์— ์ฐฌ์„ฑ์ž…๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜ ์œ ํ˜•์— sort ๋ฐ search ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ๋ˆ„๋ฝ๋œ ์œ ์ผํ•œ ์œ ํ˜•์€ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค(https://github.com/golang/go/issues/7088). slice ์™€ ๊ฐ™์€ ์ผ๋ฐ˜ ์œ ํ˜•์„ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ์ด๊ฒƒ์„ ๊ธฐ๋ณธ ์ œ๊ณต ์œ ํ˜•์œผ๋กœ ์›ํ•ฉ๋‹ˆ๋‹ค. map . ์ž‘์—…์„ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋„ฃ๊ณ (๊ฐ ๊ธฐ๋ณธ ์œ ํ˜• ๋ฐ ์„ ํƒํ•œ struct ์œ ํ˜• ์„ธํŠธ์— ๋Œ€ํ•œ ๋ฒค์น˜๋งˆํ‚น ํ›„ ์ตœ์ƒ์˜ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์กฐ์ •) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์—์„œ ์ถ”๊ฐ€ ์ฃผ์„์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

$#$ sync.Map ๋Œ€์‹  smap ๋‚ด์žฅ๋„ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ๋Ÿฐํƒ€์ž„ ์œ ํ˜• ์•ˆ์ „์„ ์œ„ํ•ด interface{} ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์„ค๊ณ„์ƒ์˜ ๊ฒฐํ•จ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„ ์œ ํ˜• ๊ฒ€์‚ฌ๋Š” Go๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

@pciet

๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด{} ๋Ÿฐํƒ€์ž„ ์œ ํ˜• ์•ˆ์ „์„ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์€ ์„ค๊ณ„ ๊ฒฐํ•จ์ž…๋‹ˆ๋‹ค.

์ž‘์€(์œ ํ˜• ์•ˆ์ „) ๋ž˜ํผ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
https://play.golang.org/p/tG6hd-j5yx

@pierrre ๊ทธ ๋ž˜ํผ๋Š” reflect.TypeOf(item).AssignableTo(type) ์ˆ˜ํ‘œ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ map + sync.Mutex ๋˜๋Š” sync.RWMutex ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ์˜ ์œ ํ˜•์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ sync.Map ์— ํ•„์š”ํ•œ ์œ ํ˜• ์ฃผ์žฅ ์—†์ด ๋™์ผํ•œ ๋ณต์žก์„ฑ์ž…๋‹ˆ๋‹ค.

๋‚ด ๋™๊ธฐํ™”๋œ ๋งต์€ ์œ ํ˜•์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ์˜†์— var myMapLock = sync.RWMutex{} ๊ฐ€ ์žˆ๋Š” ๋ฎคํ…์Šค์˜ ์ „์—ญ ๋งต์— ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋” ๊นจ๋—ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ๋‚ด์žฅ ์œ ํ˜•์€ ๋‚˜์—๊ฒŒ ๋งž๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์—†๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋ฉฐ ์œ ํ˜• ์–ด์„ค์…˜ ๋Œ€์‹  ๋‚ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ฃผ์š” ๋…ธ์ถœ์ด C++ ํ…œํ”Œ๋ฆฟ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ Go ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๋ถ€์ •์ ์ธ ๋ณธ๋Šฅ์  ๋ฐ˜์‘์ด ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ C++๊ฐ€ ์ฒซ๋‚ ๋ถ€ํ„ฐ ๋น„๊ทน์ ์œผ๋กœ ์ž˜๋ชป๋œ ์ œ๋„ค๋ฆญ์„ ์–ป์—ˆ๊ณ  ๊ทธ ์ดํ›„๋กœ ๊ทธ ์‹ค์ˆ˜๋ฅผ ๋”์šฑ ์•…ํ™”์‹œ์ผฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ–‰ํ•œ ์ผ์ž…๋‹ˆ๋‹ค. Generics for Go๋Š” ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

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

@andrewcmyers "Generics for Go๋Š” ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค." --- C#์˜ ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด์žฅ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜์—ฌ Go๊ฐ€ ์ ์  ๋” ๋ณต์žกํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

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

๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์˜ ๋ณต์žก์„ฑ ์ธก์ •์— ๋Œ€ํ•œ ์ง€์ˆ˜๋Š” ๋ถ„์‚ฐ์ž…๋‹ˆ๋‹ค.
Go์˜ ์œ ํ˜•(์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ์™ธํ•˜๊ณ )์€ ๋ถˆ๋ณ€์ด๋ฉฐ ์ด๊ฒƒ์€ ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทœ์น™์„ ์ง€์ผฐ๋‹ค.

๊ธฐ๊ณ„์  ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์› "์œ ํ˜• ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ" ์ œ๋„ค๋ฆญ ๊ตฌํ˜„
Go์˜ ๊ธฐ๋ณธ์— ์ถฉ์‹คํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ์˜ 99%๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์–•์Œ๊ณผ ๋†€๋ผ์›€์˜ ์›์น™.

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

2017๋…„ 11์›” 28์ผ 23์‹œ 54๋ถ„์— "Andrew Myers" [email protected] ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๋ถ€์ •์ ์ธ ๋ณธ๋Šฅ์  ๋ฐ˜์‘์ด
ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ฃผ์š” ๋…ธ์ถœ์ด
C++ ํ…œํ”Œ๋ฆฟ์„ ํ†ตํ•ด. C++๊ฐ€ ๋น„๊ทน์ ์œผ๋กœ ์ œ๋„ค๋ฆญ์„ ์–ป์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋ถˆํ–‰ํ•œ ์ผ์ž…๋‹ˆ๋‹ค.
์ฒซ๋‚ ๋ถ€ํ„ฐ ์ž˜๋ชป๋˜์—ˆ๊ณ  ๊ทธ ์ดํ›„๋กœ ์‹ค์ˆ˜๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ
Go๋Š” ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ Go๊ฐ€ ์ ์  ๋” ๋ณต์žกํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.
๋‚ด์žฅ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•. ์–ธ์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž์‹ ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ
ํŠน์ˆ˜ ์œ ํ˜•์€ ๋ณต์žกํ•˜์ง€ ์•Š๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ œ๊ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•ต์‹ฌ ์–ธ์–ด.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/15292#issuecomment-347691444 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AJZ_jPsQd2qBbn9NI1wZeT-O2JpyraTMks5s7I81gaJpZM4IG-xv
.

์˜ˆ, ํ…œํ”Œ๋ฆฟ ์—†์ด ์ œ๋„ค๋ฆญ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์€ ์ฃผ๋กœ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๊ณ ๊ธ‰ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹คํ˜•์„ฑ์˜ ํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

@ianlancetaylor Rust๋Š” ํ”„๋กœ๊ทธ๋žจ์ด Q ๊ธฐ์กด ์œ ํ˜•์— T ํŠน์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ํ•ด๋‹น ํฌ๋ ˆ์ดํŠธ๊ฐ€ T ๋˜๋Š” Q ๋ฅผ ์ •์˜ํ•œ๋‹ค๋ฉด

๊ทธ๋ƒฅ ์ƒ๊ฐ: Simon Peyton Jones(์˜ˆ, Haskell๋กœ ์œ ๋ช…ํ•จ) ๋ฐ/๋˜๋Š” Rust ๊ฐœ๋ฐœ์ž๊ฐ€ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. Rust์™€ Haskell์€ ์•„๋งˆ๋„ ๋ชจ๋“  ํ”„๋กœ๋•์…˜ ์–ธ์–ด ์ค‘ ๊ฐ€์žฅ ๋ฐœ์ „๋œ ๋‘ ๊ฐ€์ง€ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ์ด๋ฉฐ Go๋Š” ๊ทธ๋“ค๋กœ๋ถ€ํ„ฐ ๋ฐฐ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Generic Java ์ž‘์—…์„ ํ•œ Phillip Wadler ๋„ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๊ฒฐ๊ตญ Java๊ฐ€ ํ˜„์žฌ ๊ตฌํ˜„ํ•œ ์ œ๋„ค๋ฆญ ๊ตฌํ˜„์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

@tarcieri ๋‚˜๋Š” Java์˜ ์ œ๋„ค๋ฆญ์ด ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ „ํˆฌ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค.

@DemiMarie ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ Andrew Myers๊ฐ€ ์—ฌ๊ธฐ์— ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

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

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

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

  1. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ชจ๋“  ์ž‘์—…์ด ๋ฉ”์„œ๋“œ๋กœ ํ‘œํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฑ„๋„ ์œ ํ˜•๊ณผ ๊ฐ™์€ ๋‚ด์žฅ ์œ ํ˜•์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฑ„๋„ ์œ ํ˜•์€ ๋ณด๋‚ด๊ธฐ ๋ฐ ๋ฐ›๊ธฐ ์ž‘์—…์— ๋Œ€ํ•ด <- ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์›ํ•˜๋ฉฐ Send ๋ฐ Receive ๋ฉ”์„œ๋“œ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€๋งŒ ์ฑ„๋„ ๊ฐ’์„ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋Š” ์ƒ์šฉ๊ตฌ ํ”Œ๋ ˆ์ดํŠธ Send ๋ฐ Receive ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒ์šฉ๊ตฌ ๋ฐฉ๋ฒ•์€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ฑ„๋„ ์œ ํ˜•์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ๋™์ผํ•˜๊ฒŒ ๋ณด์ผ ๊ฒƒ์ด๋ฏ€๋กœ ์ง€๋ฃจํ•ฉ๋‹ˆ๋‹ค.

  2. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋™์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋˜๋ฏ€๋กœ ์ •์ ์œผ๋กœ ์œ ํ˜•์ด ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฒฐํ•ฉํ•˜๋Š” ์˜ค๋ฅ˜๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€์ž„์—๋งŒ ํฌ์ฐฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Send ๋ฐ Receive ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ์ฑ„๋„์„ ๋‹จ์ผ ์ฑ„๋„๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” Merge ํ•จ์ˆ˜๋Š” ๋‘ ์ฑ„๋„์— ๋™์ผํ•œ ์œ ํ˜•์˜ ์š”์†Œ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ํ™•์ธ์€ ๋Ÿฐํƒ€์ž„์—๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

http://www.cs.cornell.edu/andru/papers/familia/ (Zhang & Myers, OOPSLA'17)
http://io.livecode.ch/learn/namin/unsound (Amin & Tate, OOPSLA'16)
http://www.cs.cornell.edu/projects/genus/ (Zhang et al., PLDI '15)
https://www.cs.cornell.edu/~ross/publications/shapes/shapes-pldi14.pdf (Greenman, Muehlboeck & Tate, PLDI '14)

์ •๋ ฌ๋˜์ง€ ์•Š์€ ์„ธํŠธ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ฒค์น˜๋งˆํ‚น ๋งต ๋Œ€ ์Šฌ๋ผ์ด์Šค์—์„œ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋‘ ํ…Œ์ŠคํŠธ ๋ชฉ๋ก์„ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type Item interface {
    Equal(Item) bool
}

type Set interface {
    Add(Item) Set
    Remove(Item) Set
    Combine(...Set) Set
    Reduce() Set
    Has(Item) bool
    Equal(Set) bool
    Diff(Set) Set
}

ํ•ญ๋ชฉ ์ œ๊ฑฐ ํ…Œ์ŠคํŠธ:

type RemoveCase struct {
    Set
    Item
    Out Set
}

func TestRemove(t *testing.T) {
    for i, c := range RemoveCases {
        if c.Out.Equal(c.Set.Remove(c.Item)) == false {
            t.Fatalf("%v failed", i)
        }
    }
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด์ „์— ๋ถ„๋ฆฌ๋œ ์ผ€์ด์Šค๋ฅผ ๋ฌธ์ œ ์—†์ด ํ•˜๋‚˜์˜ ์ผ€์ด์Šค ์กฐ๊ฐ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var RemoveCases = []RemoveCase{
    {
        Set: MapPathSet{
            &Path{{0, 0}}:         {},
            &Path{{0, 1}, {1, 1}}: {},
        },
        Item: Path{{0, 0}},
        Out: MapPathSet{
            &Path{{0, 1}, {1, 1}}: {},
        },
    },
    {
        Set: SlicePathSet{
            {{0, 0}},
            {{0, 1}, {1, 1}},
        },
        Item: Path{{0, 0}},
        Out: SlicePathSet{
            {{0, 1}, {1, 1}},
        },
    },
}

๊ฐ๊ฐ์˜ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์— ๋Œ€ํ•ด ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

func (the MapPathSet) Remove(an Item) Set {
    return MapDelete(the, an.(Path))
}
func (the SlicePathSet) Remove(an Item) Set {
    return SliceDelete(the, an.(Path))
}

์ด๋Ÿฌํ•œ ์ผ๋ฐ˜ ํ…Œ์ŠคํŠธ๋Š” ์ œ์•ˆ๋œ ์ปดํŒŒ์ผ ํƒ€์ž„ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type Item generic {
    Equal(Item) bool
}
func (the SlicePathSet) Remove(an Item) Set {
    return SliceDelete(the, an)
}

์ถœ์ฒ˜: https://github.com/pciet/pathsetbenchmark

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋” ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์œ ํ˜•์ด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌ๋˜์—ˆ๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ ํƒ€์ž„ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ  ๊ตฌ์ฒด์ ์œผ๋กœ ์‚ฌ์šฉ๋  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ถ”๊ฐ€๋œ ๋ณด์ด์ง€ ์•Š๋Š” ์œ ํ˜• ์ฃผ์žฅ์ด ์žˆ๋Š” "์ผ๋ฐ˜" ์œ ํ˜•์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

@andrewcmyers "Familia" ๋…ผ๋ฌธ์€ ํฅ๋ฏธ๋กœ์› ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ ๊ฐœ๋…์€ ์ƒ์†์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒ์† ๋Œ€์‹  ๊ตฌ์„ฑ์— ์˜์กดํ•˜๋Š” Go์™€ ๊ฐ™์€ ์–ธ์–ด์˜ ๊ฒฝ์šฐ ๊ฐœ๋…์ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ• ๊นŒ์š”?

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

@andrewcmyers Go์—์„œ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

Go์™€ ๊ด€๋ จ๋œ ์ด ๋ฌธ์„œ์˜ ์ฃผ์š” ๋‚ด์šฉ์€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ˜„์žฌ Go์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹๊ณผ ์ผ๋ฐ˜ ์ถ”์ƒํ™”์˜ ์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด ๋ชจ๋‘์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋‚ด ์ดํ•ด๋Š” Go ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ •์˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” Haskell์— ์ต์ˆ™ํ•˜์ง€ ์•Š์ง€๋งŒ ๋น ๋ฅธ ๊ฐœ์š”๋ฅผ ์ฝ์œผ๋ฉด Go ์ธํ„ฐํŽ˜์ด์Šค์— ๋งž๋Š” ์œ ํ˜•์ด ํ•ด๋‹น ์œ ํ˜• ํด๋ž˜์Šค์— ์ ํ•ฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ถ”์ธกํ•ฉ๋‹ˆ๋‹ค. Haskell ์œ ํ˜• ํด๋ž˜์Šค์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Familia์™€ Go์˜ ๊ตฌ์ฒด์ ์ธ ๋น„๊ต๋Š” ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋…ผ๋ฌธ์„ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Go ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌ์กฐ์  ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์„ ํ†ตํ•ด ์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ํ˜•์‹ ์ œ์•ฝ ์กฐ๊ฑด์€ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ์›ํ•˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ์บก์ฒ˜ํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ํ‘œํ˜„์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Familia ๋…ผ๋ฌธ์—์„œ๋Š” Eq ๋ผ๋Š” ํ˜•์‹ ์ œ์•ฝ ์กฐ๊ฑด์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Go์—์„œ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋™๊ธฐ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ:

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

๊ทธ๋Ÿฌ๋‚˜ sync.Map์€ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ๋งต๊ณผ ๋ฎคํ…์Šค๊ฐ€ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ๋„˜์–ด ์„ฑ์ˆ™ํ•œ ์ผ๋ฐ˜ ๋™๊ธฐํ™” ๋งต ๊ตฌํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋น„์ธํ„ฐํŽ˜์ด์Šค{} ์œ ํ˜•์„ ์„ค์ •ํ•˜๊ณ  ์œ ํ˜• ์–ด์„ค์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ์ด๋ฅผ ๋ž˜ํ•‘ํ•˜๊ฑฐ๋‚˜, ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ ๋‹ค์Œ์— ์˜ค๋Š” ํ•ญ๋ชฉ์ด ๋™์ผํ•œ ์œ ํ˜•๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•˜๋„๋ก ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ˜์˜ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๊ฐ€ ์žˆ๊ณ  ๋ž˜ํ•‘์€ ๊ฐ ์‚ฌ์šฉ ์œ ํ˜•์— ๋Œ€ํ•ด ๊ฐ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•˜์ง€๋งŒ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ถœ๋ ฅ ์œ ํ˜• ์ฃผ์žฅ์„ ์ˆจ๊น๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ์–ด์จŒ๋“  ์ถœ๋ ฅ ์œ ํ˜• ์ฃผ์žฅ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“  ์‹ค์ œ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. interface{}๋Š” ์–ธ์–ด์˜ ํ•ต์ด๋ฉฐ ์ƒˆ๋กœ์šด Go ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ๋ช…ํ™•ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์˜๊ฒฌ์œผ๋กœ๋Š” json.Marshal์ด ์ข‹์€ ๋””์ž์ธ์ด์ง€๋งŒ(์ถ”์•…ํ•˜์ง€๋งŒ ํ•ฉ๋ฆฌ์ ์ธ ๊ตฌ์กฐ์ฒด ํƒœ๊ทธ ํฌํ•จ).

๋‚˜๋Š” sync.Map์ด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ƒ์ ์œผ๋กœ๋Š” ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ์ฒด๊ฐ€ ๋” ์„ฑ๋Šฅ์ด ์ข‹์€ ์ธก์ •๋œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ๊ต์ฒดํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ง๋ถ™์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋งต์€ Go ๋™์‹œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ผ๋ฐ˜์ ์ธ ์ดˆ๊ธฐ ํ•จ์ •์ด๋ฉฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ˆ˜์ •์ด ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ๋งต์—๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„ ์œ ํ˜• ๊ฒ€์‚ฌ๋งŒ ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์Šค์บํด๋”ฉ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” sync.Map์ด ๋™์ผํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ Go 2์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‚ด์žฅ ์œ ํ˜• ๋ชฉ๋ก์— sync.Map์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ–ฅํ›„ ์œ ์‚ฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ์ดํ•ด๋Š” Go ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ž‘์—…ํ•˜์ง€ ์•Š๊ณ  ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ณ  ์˜คํ”ˆ ์†Œ์Šค ์Šน์ธ ๋ฌธ์ œ๊ฐ€ ์ด ํ† ๋ก ์˜ ๋ฐฐ๊ฒฝ์ด ๋˜๋Š” ์•„์ด๋””์–ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋ณด๊ธฐ์— sync.Map ์ˆ˜์ •์€ ์ด ์ œ๋„ค๋ฆญ ์ œ์•ˆ์ด ๋ฌด์—‡์ด์–ด์•ผ ํ•˜๋Š”์ง€ ๋ถ€๋ถ„์ ์œผ๋กœ ์ •์˜ํ•˜๋Š” ์‹ค์ œ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

sync.Map์„ ๋‚ด์žฅ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ด๋””๊นŒ์ง€ ๊ฐˆ๊นŒ์š”? ๋‹น์‹ ์€ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํŠน์ˆ˜ ์ผ€์ด์Šคํ•ฉ๋‹ˆ๊นŒ?
sync.Map์ด ์œ ์ผํ•œ ์ปจํ…Œ์ด๋„ˆ๋Š” ์•„๋‹ˆ๋ฉฐ ์ผ๋ถ€๋Š” ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

@Azareal : @chowey ๋Š” 8์›”์— ๋‹ค์Œ์„ ๋‚˜์—ดํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ œ๋„ค๋ฆญ์ด ๋” ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š”{}๋Œ€์ฒด ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ฐ€๋“ํ•ฉ๋‹ˆ๋‹ค.

โ€ข heap.Interface(https://golang.org/pkg/container/heap/#Interface)
โ€ข list.Element(https://golang.org/pkg/container/list/#Element)
โ€ข ring.Ring (https://golang.org/pkg/container/ring/#Ring)
โ€ข sync.Pool(https://golang.org/pkg/sync/#Pool)
โ€ข ์˜ˆ์ •๋œ sync.Map (https://tip.golang.org/pkg/sync/#Map)
โ€ข atomic.Value(https://golang.org/pkg/sync/atomic/#Value)

๋‚ด๊ฐ€ ๋†“์นœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ ์€ ์œ„์˜ ๊ฐ ํ•ญ๋ชฉ์—์„œ ์ œ๋„ค๋ฆญ์ด ์œ ์šฉํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ‰๋“ฑ์„ ์œ„ํ•ด ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜•์— ๋Œ€ํ•ด ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ง‘ํ•ฉ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ์ตœ์ƒ์˜ ๊ตฌํ˜„์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋„๋ก ๋ฒค์น˜๋งˆํ‚น์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ ์œ ํ˜•์— ๋Œ€ํ•œ ๋Ÿฐํƒ€์ž„์˜ ๋ณ€์ˆ˜ ๊ตฌํ˜„์— ๋งŽ์€ ์ž‘์—…์„ ํˆฌ์ž…ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†๊ณ {} ์ œ๋„ค๋ฆญ์ด ์—†๋Š” ์ด๋Ÿฌํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ํ˜•์— ๋Œ€ํ•ด ๋™์ผํ•œ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” Go 1์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ฉ๋ฆฌ์ ์ธ ๋Œ€์•ˆ ๊ตฌํ˜„์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

golang ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•˜์Šค์ผˆ ์œ ํ˜• ํด๋ž˜์Šค๋Š” ๋‘ ๊ฐ€์ง€๋ฅผ ๊ทน๋ณตํ•ฉ๋‹ˆ๋‹ค(๋งค์šฐ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค!).

1.) (Type Constraint) ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„ ํ•˜๋‚˜์˜ ํƒœ๊ทธ๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ์œ ํ˜•์„ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค.
2.) (๋””์ŠคํŒจ์น˜) ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์„ ํ†ตํ•ด ์ฃผ์–ด์ง„ ๊ธฐ๋Šฅ ์„ธํŠธ์— ๋Œ€ํ•ด ๊ฐ ์œ ํ˜•์— ๋Œ€ํ•ด ๋‹ค๋ฅด๊ฒŒ ๋””์ŠคํŒจ์น˜ํ•˜๋„๋ก ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ,

1.) ๋•Œ๋•Œ๋กœ int, float64 ๋ฐ string ๊ทธ๋ฃน๊ณผ ๊ฐ™์€ ์ต๋ช… ๊ทธ๋ฃน๋งŒ ์›ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด๋ฆ„์„ NumericandString์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

2.) ๋งค์šฐ ์ž์ฃผ, ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฐ ์œ ํ˜•์— ๋Œ€ํ•ด ๋‹ค๋ฅด๊ฒŒ ๋””์ŠคํŒจ์น˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ณ  ๋‚˜์—ด๋œ ๋ชจ๋“  ์œ ํ˜•์˜ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋งŒ ์ œ๊ณตํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค(์ธํ„ฐํŽ˜์ด์Šค ์˜ ๊ธฐ๋ณธ ๋ฉ”์†Œ๋“œ๋กœ ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ์Œ)

3.) ๋งค์šฐ ์ž์ฃผ ๊ทธ๋ฃน์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์œ ํ˜•์„ ์—ด๊ฑฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‹น์‹ ์€ ๊ฒŒ์œผ๋ฅธ ๊ธธ์„ ๊ฐ€๊ณ  ์ผ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค A๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ์œ ํ˜• T๋ฅผ ์›ํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํŽธ์ง‘ํ•˜๋Š” ๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ๊ณผ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ ์ ˆํ•œ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋ชจ๋“  ์œ ํ˜•์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ์š”์ ์€ ์ธํ„ฐํŽ˜์ด์Šค ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์บ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ๋‹คํ˜•์„ฑ์ด๋ผ๋Š” ๋‹จ์ ์ด ์žˆ์œผ๋ฉฐ ๋‘˜ ์ด์ƒ์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์„ ํฌํ•จํ•˜๋„๋ก ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ž…๋ ฅ์„ ์–ด๋–ป๊ฒŒ ์ œํ•œํ•ฉ๋‹ˆ๊นŒ? ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค(์ธํ„ฐํŽ˜์ด์Šค ์ค‘์ฒฉ์„ ํ†ตํ•ด)๋ฅผ ๋„์ž…ํ•˜์—ฌ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ชจ๋ฒ” ์‚ฌ๋ก€๊ฐ€ ์•„๋‹Œ ๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ.
๋‚˜๋Š” go๊ฐ€ ์ด๋ฏธ ๋‹คํ˜•์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ •ํ™•ํžˆ go๋Š” ๋” ์ด์ƒ C์™€ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ๋งํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋†’์€ ์ˆ˜์ค€์˜ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹คํ˜•์„ฑ์„ ํ™•์žฅํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ์ผ๋ฐ˜์ ์ธ ์ˆœ์„œ ์—†๋Š” ์ง‘ํ•ฉ ์œ ํ˜•์„ ์œ„ํ•ด ์˜ค๋Š˜ ์‹œ์ž‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. https://github.com/pciet/unordered

์ด๊ฒƒ์€ ๋ฌธ์„œํ™” ๋ฐ ํ…Œ์ŠคํŠธ ์˜ˆ์ œ์—์„œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ์œ„ํ•ด ๋ž˜ํผ ํŒจํ„ด(@pierrre์—๊ฒŒ ๊ฐ์‚ฌ)์„ ์ž…๋ ฅํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์œ ํ˜• ์•ˆ์ „์„ฑ์— ๋Œ€ํ•œ ๋ฐ˜์˜ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์—๋Š” ์–ด๋–ค ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด์ „์— ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ์„ ์ค‘์‹ฌ์œผ๋กœ ํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ๋„ค๋ฆญ ์œ ํ˜•์— ๋Œ€ํ•œ ์ €์˜ ๋ถ€์ •์ ์ธ ํƒœ๋„{}; ๋‚ด ๋ถˆ๋งŒ์€ ์˜๋„๋œ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ฌธ์„œํ™”ํ•˜๋Š”{} ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ํŒจํ‚ค์ง€๋ณ„ ์œ ํ˜•(์˜ˆ: pciet/unordered์˜ type Item interface{} )์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ๋ฌธ์„œ๋งŒ์œผ๋กœ๋„ ์šฐ๋ฆฌ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์„ ๋•Œ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์ด๋ฏธ ๋งŽ์€ ์–‘์˜ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(https://github.com/golang/go/issues/23077 ์ฐธ์กฐ).

๊ท€ํ•˜์˜ ์ฝ”๋“œ๋Š” ๋Ÿฐํƒ€์ž„์— ์œ ํ˜•์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ๋” ๋‚˜์˜์ง€๋Š” ์•Š์€ ๊ฒฝ์šฐ interface{} ๋ณด๋‹ค ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค). ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„ ์œ ํ˜• ๊ฒ€์‚ฌ์™€ ํ•จ๊ป˜ ์ปฌ๋ ‰์…˜ ์œ ํ˜•์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@zerkms ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋Š” asserting = false๋กœ ์„ค์ •ํ•˜์—ฌ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ๋“ค์–ด๊ฐ€์ง€ ์•Š์Œ). ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ฒ€์‚ฌ์— ๋Œ€ํ•œ ์‚ฌ์šฉ ํŒจํ„ด์ด ์žˆ์œผ๋ฉฐ ์–ด์จŒ๋“  ์œ ํ˜• ๊ฒ€์‚ฌ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์กฐ์ฒด(์‚ฌ์šฉ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ๋ณด๋‹ค ๋” ๋งŽ์€ ๋น„์šฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ณ ์œ ํ•œ ์œ ํ˜•์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ตœ๋Œ€ ์„ฑ๋Šฅ์˜ ์ผ๋ฐ˜ ์ฝ”๋“œ๊ฐ€ ํ•ต์‹ฌ ์š”๊ตฌ ์‚ฌํ•ญ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋Š” ์—†์—ˆ์ง€๋งŒ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋” ๋นจ๋ผ์งˆ ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋Ÿฐ ๊ฒƒ์„ ํ•„์š”๋กœ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

asserting = false๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ •ํ™•์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค

์ตœ๋Œ€ ์„ฑ๋Šฅ์˜ ์ผ๋ฐ˜ ์ฝ”๋“œ๊ฐ€ ํ•ต์‹ฌ ์š”๊ตฌ ์‚ฌํ•ญ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋Ÿฐ ๋ง์„ํ•˜์ง€ ์•Š์•˜๋‹ค. ์œ ํ˜• ์•ˆ์ „์„ฑ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์€ ์—ฌ์ „ํžˆ interface{} ๊ฐ์—ผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•„๋งˆ๋„ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋” ๋นจ๋ผ์งˆ ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋Ÿฐ ๊ฒƒ์„ ํ•„์š”๋กœ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ฐœ๋ฐœ ํŒ€์ด ๋‚ด๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์‹ ์†ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋งŒ์กฑํ•œ๋‹ค๋ฉด ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@pciet

์ง€๊ธˆ์€ ๋ฌธ์„œ๋งŒ์œผ๋กœ๋„ ์šฐ๋ฆฌ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์„ ๋•Œ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋งํ•˜์ง€๋งŒ ์Šฌ๋ผ์ด์Šค ํ˜•ํƒœ์˜ ์ผ๋ฐ˜ ์–ธ์–ด ๊ธฐ๋Šฅ๊ณผ make ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ๋ฌธ์„œ๋งŒ์œผ๋กœ๋„ ์šฐ๋ฆฌ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์„ ๋•Œ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์ •์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ท€์ฐฎ๊ฒŒ ํ• ๊นŒ์š”? Python๊ณผ ๊ฐ™์€ ๋™์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ฌธ์„œ์— ์˜์กดํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด API๋กœ ์ „์†ก๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด๋ ‡๊ฒŒ ๋งํ•˜์ง€๋งŒ ์Šฌ๋ผ์ด์Šค ํ˜•ํƒœ์˜ ์ผ๋ฐ˜ ์–ธ์–ด ๊ธฐ๋Šฅ๊ณผ make ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์†”๋ฃจ์…˜์ด ์žˆ๊ณ  Go 1 ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์‹ค์ œ ์ด์œ ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ท ํ˜• ์žกํžŒ ์ง€์ ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์ด ์–ธ์–ด๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ fmt ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€์—์„œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋งŽ์€ ๋Ÿฐํƒ€์ž„ ์œ ํ˜• ์ „ํ™˜์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ํ˜„์žฌ ์‚ฌ๋žŒ๋“ค์ด ์ง๋ฉดํ•˜๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋Š” ์ˆ˜์ •๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.{}

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์ •์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ท€์ฐฎ๊ฒŒ ํ• ๊นŒ์š”? Python๊ณผ ๊ฐ™์€ ๋™์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ฌธ์„œ์— ์˜์กดํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด API๋กœ ์ „์†ก๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋œ ์–ธ์–ด์™€ ์กฐ์ง ๋Œ€์‹  Python์œผ๋กœ ์‹œ์Šคํ…œ์„ ์ž‘์„ฑํ•˜๋ผ๋Š” ์ œ์•ˆ์„ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

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

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

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ทจํ•˜๋Š” ํ•จ์ˆ˜/๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ ์ผ€์ด์Šค๊ฐ€ ์—†๊ณ  ์œ ํ˜•์— ๋Œ€ํ•œ ์ผ€์ด์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ ์‹œ ์ผ๋ถ€ ์œ ํ˜•์„ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋Š” ํ•ฉ๋ฆฌ์ ์ธ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ถ”๊ฐ€์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

Go ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ตฌํ˜„์ž์˜ ์œ ํ˜•์„ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ˜„์žฌ Go ๊ตฌ๋ฌธ๊ณผ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋Š” ์ œ๋„ค๋ฆญ ํ˜•์‹์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ˜•์‹์˜ ์ œ๋„ค๋ฆญ( ๋ฐ๋ชจ )์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์„ ์œ„ํ•œ @dc0d ๋‚˜๋Š” ์ด ๊ธฐ๋Šฅ์ด ๋ž˜ํผ ์œ ํ˜•์„ ์š”๊ตฌํ•˜์ง€ ์•Š๊ณ  ์ปดํŒŒ์ผ ํƒ€์ž„ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค: https://gist.github.com/pciet/36a9dcbe99f6fb71f5fc2d3c455971e5

@pciet ๋งž์Šต๋‹ˆ๋‹ค. ์ œ๊ณต๋œ ์ฝ”๋“œ 4๋ฒˆ์—์„œ ์ƒ˜ํ”Œ์€ ์Šฌ๋ผ์ด์Šค ๋ฐ ์ฑ„๋„(๋ฐ ๋ฐฐ์—ด)์— ๋Œ€ํ•ด ์œ ํ˜•์ด ์บก์ฒ˜๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งต์˜ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ตฌํ˜„์ž๋ผ๋Š” ํ•˜๋‚˜์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งต์€ 2๊ฐ€์ง€ ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ž˜ํผ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

BTW ๋‚˜๋Š” ๊ทธ ์ฝ”๋“œ์˜ ์‹œ์—ฐ ๋ชฉ์ ์„ ์ƒ๊ฐ์˜ ์ค„๋กœ ๊ฐ•์กฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์–ธ์–ด ๋””์ž์ด๋„ˆ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Go์—์„œ ์ œ๋„ค๋ฆญ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์„ค์ ์ธ ๋ฐฉ๋ฒ•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

  • ํ˜„์žฌ Go์™€ ํ˜ธํ™˜ ๊ฐ€๋Šฅ
  • ๋‹จ์ˆœ(ํ˜„์žฌ ๊ตฌํ˜„์ž๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ OO์—์„œ _๋Š๋‚Œ_ _ ๋น„์Šทํ•œ ๋‹จ์ผ ์ผ๋ฐ˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜)

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

@adg ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์™€ ํ•จ๊ป˜ @ianlancetaylor ์˜ ์ผ๋ฐ˜ ์ œ๋„ค๋ฆญ ์ œ์•ˆ ์ด ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—๋Š” Go์šฉ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•œ 4๊ฐ€์ง€ ๊ฒฐํ•จ์ด ์žˆ๋Š” ํŠน์ • ์ œ์•ˆ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

Afaics, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐœ์ทŒํ•œ ๋งํฌ๋œ ์„น์…˜์€ ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค์— ์ผ๋ฐ˜์„ฑ์ด ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ๋ฅผ ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. _"์–ด๋–ค T์— ๋Œ€ํ•ด ํ˜ธ์ถœ์ž ์ œ๊ณต ์œ ํ˜• T์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ทจํ•˜๊ณ  ๊ฐ™์€ ํƒ€์ž… T.โ€_.

์ž„์˜์˜ T์— ๋Œ€ํ•ด ์œ ํ˜• T์˜ ์ธ์ˆ˜๋ฅผ ์ทจํ•˜๊ณ  ๋™์ผํ•œ ์œ ํ˜•์˜ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

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

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹จ์ˆœํ•œ ์œ ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๋˜ํ•œ ๊ฐ€์น˜์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์œผ๋ฉฐ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’์ด ํ•ญ์ƒ ํšจ์œจ์ ์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜์„œ typeclass bounds๋Š” type T๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  type T์— ํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” where ๋˜๋Š” requires ์ ˆ์„ ๊ฐ–๋Š” ํ•จ์ˆ˜ ์ •์˜ ์‚ฌ์ดํŠธ์—์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์ƒํ™ฉ์—์„œ ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์ „์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ๋‹จ์ผํ™”๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์ „ ํฌ์ธํ„ฐ(์ธํ„ฐํŽ˜์ด์Šค์šฉ)๊ฐ€ ๋Ÿฐํƒ€์ž„์— ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํ˜„์žฌ Go ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ์ ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๋‹จ์ผํ™”?). ์œ„ ์ธ์šฉ๋ฌธ์—์„œ '๊ฐ’'์€ ์ž…๋ ฅ ์œ ํ˜• T๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ์œ ํ˜• T์— ์˜ํ•ด ๊ตฌํ˜„๋œ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ ์‚ฌ์ „์„ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐ์ดํ„ฐ ์œ ํ˜•(์˜ˆ: struct )์— ๋Œ€ํ•œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ์œ„์˜ ์œ ํ˜• T ์ž์ฒด๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ T<U> ์œ ํ˜•์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. U ์— ๋Œ€ํ•œ ์ง€์‹์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์ด๋Ÿฌํ•œ ์œ ํ˜•์„ ์œ„ํ•œ ํŒฉํ† ๋ฆฌ๋ฅผ ๊ณ ๊ธ‰ ์œ ํ˜•(HKT) ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์€ ์œ ํ˜•์ด ์•ˆ์ „ํ•œ ๋‹คํ˜•์„ฑ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์•„๋ž˜์—์„œ ๋…ผ์˜๋˜๋Š” _์ด๊ธฐ์ข…_ ์ปจํ…Œ์ด๋„ˆ ๋ฌธ์ œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋”ฐ๋ผ์„œ ๋‹คํ˜•์„ฑ์ด๋ž€ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฐ’ ์œ ํ˜•(์˜ˆ: ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ ์œ ํ˜•)์˜ ์ผ๋ฐ˜์„ฑ์„ ์˜๋ฏธํ•˜์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ์— ๋‘˜ ์ด์ƒ์˜ ๊ฐ’ ์œ ํ˜•์„ ๋™์‹œ์— ๋„ฃ์–ด ์ด์งˆ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


@tamird ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ฐ˜ ์œ ํ˜•์ด ํŠน์„ฑ ๊ฒฝ๊ณ„์— ์˜ํ•ด ์ œํ•œ๋˜๋Š” Rust์˜ ํŠน์„ฑ ์‹œ์Šคํ…œ๊ณผ ์œ ์‚ฌํ•œ ์‹œ์Šคํ…œ์„ ์ œ์™ธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Rust์˜ ํŠน์„ฑ ๊ฒฝ๊ณ„๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์œ ํ˜• ํด๋ž˜์Šค ๊ฒฝ๊ณ„์ž…๋‹ˆ๋‹ค.

@alex ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋Ÿฌ์ŠคํŠธ์˜ ํŠน์ง•. ๋‚˜๋Š” ๊ทธ๋“ค์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ข‹์€ ๋ชจ๋ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์˜ค๋Š˜๋‚  ์กด์žฌํ•˜๋Š” ๋ฐ”๋‘‘์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์™œ ๊ทธ๋“ค์ด ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ๋‹น์‹ ์€ ๋Ÿฐํƒ€์ž„ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์‚ฌ์šฉํ•˜๋Š” ํŠน์„ฑ ๊ฐ์ฒด๊ฐ€ ๋‹จํ˜•์„ฑ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์€ typeclass bounds genericity ์›์น™๊ณผ ๋ณ„๋„๋กœ ๊ณ ๋ ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์•„๋ž˜์˜ ์ด๊ธฐ์ข… ์ปจํ…Œ์ด๋„ˆ/์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ๋‚˜์˜ ๋…ผ์˜ ์ฐธ์กฐ). Afaics, Go์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋ฏธ ํŠน์„ฑ๊ณผ ์œ ์‚ฌํ•œ ๊ฒฝ๊ณ„์ด๋ฉฐ ์ดˆ๊ธฐ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” OOP์˜ ์•ˆํ‹ฐ ํŒจํ„ด(์•„์ง ์ปดํŒŒ์ผ ๋‹จ๊ณ„์— ์žˆ๋”๋ผ๋„ ์‚ฌ์ „์„ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋Šฆ๊ฒŒ ๋ฐ”์ธ๋”ฉํ•˜๋Š” typeclasses์˜ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„) ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋Œ€ํ•œ ์‚ฌ์ „(์ธ์Šคํ„ด์Šคํ™”/๊ตฌ์„ฑ ์‹œ). Typeclasses๋Š” (์ ์–ด๋„ ์ž์œ ๋„์˜ ๋ถ€๋ถ„์ ์ธ ๊ฐœ์„ ) OOP๊ฐ€ ํ•  ์ˆ˜ ์—†๋Š” ํ‘œํ˜„ ๋ฌธ์ œ ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jimmyfrasche ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

  • https://golang.org/doc/faq#covariant_types

๋‚˜๋Š” typeclasses๊ฐ€ ์‹ค์ œ๋กœ ํ•˜์œ„ ์œ ํ˜•์ด ์•„๋‹ˆ๋ฉฐ ์ƒ์† ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์œ„์˜ ๋งํฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„œ๋ธŒํด๋ž˜์‹ฑ์ด ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ƒ์†๊ณผ "์ผ๋ฐ˜์„ฑ"(๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹คํ˜•์„ฑ๋ณด๋‹ค ์žฌ์‚ฌ์šฉ ๋˜๋Š” ๋ชจ๋“ˆ์„ฑ์— ๋Œ€ํ•œ ๋” ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋…)์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์–ธ์–ด๊ฐ€ ๊ณต์šฉ์ฒด์™€ ๊ต์ฐจ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ƒ์† ๊ณ„์ธต ๊ตฌ์กฐ(์ผ๋ช… ํ•˜์œ„ ์œ ํ˜• ์ง€์ • ) ๊ฐ€ ํ• ๋‹น(ํ•จ์ˆ˜ ์ž…๋ ฅ) ๋ฐ from(ํ•จ์ˆ˜ ์ถœ๋ ฅ)์—์„œ ๋ถˆ๊ฐ€ํ”ผํ•˜๋‹ค๋Š” ์ ๋„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด int ฮฝ string int ๋˜๋Š” string ์—์„œ ํ• ๋‹น์„ ์ˆ˜๋ฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‘˜ ๋‹ค int ฮฝ string ์—์„œ ํ• ๋‹น์„ ์ˆ˜๋ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ณต์šฉ์ฒด ์—†์ด ์ •์ ์œผ๋กœ ์œ ํ˜•์ด ๋‹ค๋ฅธ ์ด์ข… ์ปจํ…Œ์ด๋„ˆ/์ปฌ๋ ‰์…˜์„ ์ œ๊ณตํ•˜๋Š” ์œ ์ผํ•œ ๋Œ€์•ˆ์€ ์„œ๋ธŒํด๋ž˜์‹ฑ ๋˜๋Š” ์‹ค์กด์  ๊ฒฝ๊ณ„ ๋‹คํ˜•์„ฑ(Rust์—์„œ๋Š” ํŠน์„ฑ ๊ฐ์ฒด, Haskell์—์„œ๋Š” ์‹ค์กด์  ์ˆ˜๋Ÿ‰ํ™”๋ผ๊ณ ๋„ ํ•จ)์ž…๋‹ˆ๋‹ค. ์œ„์˜ ๋งํฌ์—๋Š” ์‹ค์กด์ฃผ์˜์™€ ์กฐํ•ฉ ๊ฐ„์˜ ๊ท ํ˜•์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Afaik, ์ด์ œ Go์—์„œ ์ด๊ธฐ์ข… ์ปจํ…Œ์ด๋„ˆ/์ปฌ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ์œ ํ˜•์„ ๋นˆ interface{} ์— ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ •์  ํƒ€์ดํ•‘์˜ ์š”์ ์„ ์ด๊น๋‹ˆ๋‹ค.

ํ”ผํ•ด์•ผ ํ•  "๋ฐ˜ํŒจํ„ด"์€ ๊ฐ€์ƒ ์ƒ์†์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š” ํ•˜์œ„ ๋ถ„๋ฅ˜์ž…๋‹ˆ๋‹ค(์•”์‹œ์  ํฌํ•จ ๋ฐ ํ‰๋“ฑ ๋ฌธ์ œ์— ๋Œ€ํ•œ "EDIT#2" ์ฐธ์กฐ).

1 ๊ตฌ์กฐ์ ์œผ๋กœ ๋˜๋Š” ๋ช…๋ชฉ์ƒ์œผ๋กœ ์ผ์น˜ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ํ•˜์œ„ ์œ ํ˜•์€ ๋น„๊ต ์ง‘ํ•ฉ์— ๊ธฐ๋ฐ˜ํ•œ Liskov ๋Œ€์ฒด ์›๋ฆฌ์™€ ๋ฐ˜ํ™˜ ๊ฐ’๊ณผ ๋ฐ˜๋Œ€๋˜๋Š” ํ•จ์ˆ˜ ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•œ ํ• ๋‹น ๋ฐฉํ–ฅ(์˜ˆ: struct ๋˜๋Š” interface ์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜) ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2 ๋ฌดํ•œํ•œ ๋น„๊ฒฐ์ •๋ก ์˜ ์šฐ์ฃผ๋ฅผ ์œ ํ˜• ๊ฒ€์‚ฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€์ฃผ์˜๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ฐ”์™€ ๊ฐ™์ด ์ด ์Šค๋ ˆ๋“œ๋Š” ์ผ๋ฐ˜์„ฑ ๋ฌธ์ œ์— ๋Œ€ํ•ด wrt๋ฅผ ์ž…๋ ฅํ•˜๋Š” ์ˆ˜์ค€์œผ๋กœ ์ตœ์ ("์Šค์œ„ํŠธ ์ŠคํŒŸ") ์ œํ•œ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@andrewcmyers ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

Java ๋ฐ C# ์ œ๋„ค๋ฆญ๊ณผ ๋‹ฌ๋ฆฌ Genus ์ œ๋„ค๋ฆญ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Java, Scala, Ceylon ๋ฐ C++์—์„œ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ์ตœ์•…์˜ ์•ˆํ‹ฐ ํŒจํ„ด์€ ์ƒ์† ๋ฐ ํ•˜์œ„ ๋ถ„๋ฅ˜( ๊ตฌ์กฐ์  ํ•˜์œ„ ์œ ํ˜• ์ง€์ • ์•„๋‹˜)์ž…๋‹ˆ๋‹ค( C++ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ œ์™€ ๊ด€๋ จ ์—†์Œ).

@thwd ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์˜ ๋ณต์žก์„ฑ ์ธก์ •์— ๋Œ€ํ•œ ์ง€์ˆ˜๋Š” ๋ถ„์‚ฐ์ž…๋‹ˆ๋‹ค. Go์˜ ์œ ํ˜•(์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ์™ธํ•˜๊ณ )์€ ๋ถˆ๋ณ€์ด๋ฉฐ ๊ทœ์น™์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ  ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ถˆ๋ณ€์œผ๋กœ ํ•˜์œ„ ์œ ํ˜•์„ ์ง€์ •ํ•˜๋ฉด ๊ณต๋ถ„์‚ฐ์˜ ๋ณต์žก์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆ๋ณ€์„ฑ์€ ๋˜ํ•œ ํ•˜์œ„ ๋ถ„๋ฅ˜์˜ ์ผ๋ถ€ ๋ฌธ์ œ(์˜ˆ: Rectangle ๋Œ€ Square )๋ฅผ ๊ฐœ์„ ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ฌธ์ œ(์˜ˆ: ์•”์‹œ์  ํฌํ•จ, ํ‰๋“ฑ ๋“ฑ)๋Š” ๊ฐœ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@bxqgit ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ๊ณผ ์œ ํ˜• ์‹œ์Šคํ…œ์€ Go์˜ ์ค‘์š”ํ•œ ์žฅ์ ์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ธ์–ด๊ฐ€ Scala๋‚˜ Haskell์ฒ˜๋Ÿผ ์—‰๋ง์ด ๋ฉ๋‹ˆ๋‹ค.

์Šค์นผ๋ผ๋Š” OOP, ์„œ๋ธŒํด๋ž˜์‹ฑ, FP, ์ผ๋ฐ˜ ๋ชจ๋“ˆ, HKT ๋ฐ ์œ ํ˜• ํด๋ž˜์Šค( implicit ๋ฅผ ํ†ตํ•ด)๋ฅผ ๋ชจ๋‘ ํ•˜๋‚˜์˜ PL๋กœ ๋ณ‘ํ•ฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ typeclasses๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Haskell์€ typeclass ์ œ๋„ค๋ฆญ ๋•Œ๋ฌธ์— ๋‘”๊ฐํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ๋ชจ๋“  ๊ณณ์—์„œ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์‹œํ–‰ํ•˜๊ณ  ์ œ์–ด๋œ ๋ช…๋ น ํšจ๊ณผ๋ฅผ ๋ชจ๋ธ๋งํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋‚˜๋”• ๋ฒ”์ฃผ ์ด๋ก ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

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

Afaics, Go_์˜ _Type ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์˜๋ฏธ๋ก  ์„น์…˜์—์„œ @ianlancetaylor ๊ฐ€ ์ง๋ฉดํ•œ ๋ฌธ์ œ๋Š” ๊ฐœ๋…ํ™” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฐ€ (afaics) ๋ถ„๋ช…ํžˆ ๋ฌด์˜์‹์ ์œผ๋กœ typeclasses ๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

SortableSlice ์™€ PSortableSlice ๋ฅผ ๋ณ‘ํ•ฉํ•˜์—ฌ ๋‘ ์„ธ๊ณ„์˜ ์žฅ์ ์„ ๋ชจ๋‘ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ข€ ๋น ์ง€๋Š”; Less ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š” ์œ ํ˜•์ด๋‚˜ ๋‚ด์žฅ ์œ ํ˜•์„ ์ง€์›ํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” Less ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋Š” ํ˜•์‹์— ๋Œ€ํ•ด SortableSlice.Less ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ผ๋ถ€ ํ˜•์‹์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฉ”์„œ๋“œ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ๋‹ค๋ฅธ ํ˜•์‹์—๋Š” ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

$#$ []T $#$์— ๋Œ€ํ•œ Less ๋ฉ”์„œ๋“œ์˜ typeclass ๋ฐ”์šด๋“œ์— ๋Œ€ํ•œ requires Less[T] ์ ˆ์€ []T T ์— ์žˆ์Šต๋‹ˆ๋‹ค. []T . ๊ฐ T ์— ๋Œ€ํ•œ Less[T] ์œ ํ˜• ํด๋ž˜์Šค( Less ๋ฉ”์†Œ๋“œ ํฌํ•จ) ๊ตฌํ˜„์€ ๋ฉ”์†Œ๋“œ์˜ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์— ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ < ๊ตฌํ˜„์œผ๋กœ Sortable[U] ์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ตฌํ˜„ ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ด๋Š” U ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜(์˜ˆ: []T )๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ HKT U[T] ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Afair @keean ์—๋Š” HKT๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ T ๊ฐ’ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

[]T Sortable[U] typeclass๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ U ๋Š” []T ์ž…๋‹ˆ๋‹ค.

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

ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์— ๋ฐ”์ธ๋”ฉ๋œ ์œ ํ˜• ํด๋ž˜์Šค์˜ ์„ ํƒ์€ ์ •์ ์œผ๋กœ ์•Œ๋ ค์ง„ T ์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์ด๊ธฐ์ข… ๋™์  ๋””์ŠคํŒจ์น˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์„ค๋ช…ํ•œ ์˜ต์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@keean ์ด ์‹œ๊ฐ„์„ ๋‚ด์„œ ์—ฌ๊ธฐ ์™€์„œ typeclass๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๊ฐ€ ๋” ์ „๋ฌธ๊ฐ€์ด๊ณ  ์ œ๊ฐ€ ์ด๋Ÿฌํ•œ ๊ฐœ๋…์„ ๋ฐฐ์šฐ๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ œ ์„ค๋ช…์— ์•ฝ๊ฐ„์˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์„ ์ด๋ฏธ ์ฝ์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ PS ์ฐธ๊ณ  ์‚ฌํ•ญ, ์ด๊ธฐ์ข… ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์š”์ ์„ ๋ณด๋‹ค ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ฒŒ์‹œํ•œ ํ›„ ์•ฝ 10์‹œ๊ฐ„(์ž ์‹œ ํ›„)์— ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ํŽธ์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค.


์ฃผ๊ธฐ ์„น์…˜์ด ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. struct ์˜ S[T]{e} ์ธ์Šคํ„ด์Šค์˜ ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ์€ ํ˜ธ์ถœ๋œ ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ ๊ตฌํ˜„ ์„ ํƒ๊ณผ ์•„๋ฌด ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์•„๋งˆ๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ธ์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ ๊ตฌํ˜„์„ ์ „๋ฌธํ™”ํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์œ ํ˜•์€ ๋ชจ๋‘ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ๋ ค์ ธ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์œ ํ˜• ๊ฒ€์‚ฌ ์„น์…˜ ์‚ฌ์–‘์€ @keean์˜ ํ†ตํ•ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์œ„ํ•œ ๋…ธ๋“œ๋กœ ๊ณ ์œ ํ•œ ์œ ํ˜•์˜ ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„ ๊ฐœ๋…์„ ์—ฐ๊ตฌํ•˜์—ฌ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ์ž๋ฆฌ๋กœ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๊ณ ์œ ํ•œ ์œ ํ˜•์€ ์ผ์น˜ํ•˜๋Š” ์œ ํ˜•์„ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ ํ• ๋‹น์„ ํ†ตํ•ด ๋˜๋Š” ์†Œ์Šค ์ฝ”๋“œ์—์„œ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๋ชจ๋“  ์œ ํ˜•์— ๋Œ€ํ•ด ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•ฉ์ง‘ํ•ฉ๊ณผ ๊ต์ง‘ํ•ฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ(์ด์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ) ํ• ๋‹น ๋ฐฉํ–ฅ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( ์–ด๋–ป๊ฒŒ๋“ ? ). ๊ฐ๊ฐ์˜ ๊ณ ์œ ํ•œ ์•Œ ์ˆ˜ ์—†๋Š” ์œ ํ˜•์€ Top ์˜ LUB(์ตœ์†Œ ์ƒํ•œ) ๋ฐ Bottom ์˜ GLB(์ตœ๋Œ€ ํ•˜ํ•œ)๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์ œ์•ฝ ์กฐ๊ฑด์ด ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ์œ ํ˜•์—๋Š” ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๊ณ„๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ์•ฝ ์กฐ๊ฑด์€ ๋ชจ๋‘ typeclass ๊ฒฝ๊ณ„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„ ์ค‘:

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ ์ธ์Šคํ„ด์Šคํ™”์— ๋Œ€ํ•ด ์ƒˆ ํ•จ์ˆ˜ ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ƒˆ ํ•จ์ˆ˜๋Š” ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์œ ํ˜• ์ธ์ˆ˜๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ •ํ™•ํ•œ ๊ธฐ์ˆ  ์šฉ์–ด๋Š” monomorphization ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

ํ”„๋กœํŒŒ์ผ๋ง์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์–ด๋–ค ๊ธฐ๋Šฅ์ด ๋‹จํ˜•์„ฑ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋งŽ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ Java Hotspot ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ๋Ÿฐํƒ€์ž„์— ๋‹จ์ผํ™” ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ?

@egonelbre ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ณณ์—์„œ ์˜จ ํ† ๋ก ์˜ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•˜๋ ค๊ณ  ํ•˜๋Š” Summary of Go Generics Discussions ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ฌธ์ œ: ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์„น์…˜์—์„œ:

๋‹จ์ 

  • ์ผ๋ฐ˜ ๊ตฌ์กฐ๋Š” ๋ชจ๋“  ์šฉ๋„์—์„œ ๊ธฐ๋Šฅ์„ ์ถ•์ ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฏ€๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ๊ฐ€ ๋ถ€ํ’€์–ด ์˜ค๋ฅด๊ฑฐ๋‚˜ ๋” ๋˜‘๋˜‘ํ•œ ๋ง์ปค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

๋˜ํ•œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๋‹จ์ผ ์ธํ„ฐํŽ˜์ด์Šค์— ๋„ฃ์„ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์„ ์–ธ์— ๋ฐ”์ธ๋”ฉ๋œ ์œ ํ˜• ํด๋ž˜์Šค์˜ requires ์ ˆ(์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์•”์‹œ์ ์œผ๋กœ ์œ ์ถ”ํ•˜๋”๋ผ๋„)์€ ํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ˜ผํ•ฉ ๋ฐ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ผ๋ฐ˜ ๊ตฌ์กฐ์™€ ์ด์— ์ž‘๋™ํ•˜๋Š” API๋Š” ํ˜ธ์ถœ์ž์—๊ฒŒ ์ธ์ง€ ๋ถ€๋‹ด์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ ๋ชฉ์  API๋ณด๋‹ค ๋” ์ถ”์ƒ์ ์ธ ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • ์‹ฌ์ธต ์ตœ์ ํ™”๋Š” ๋งค์šฐ ์ผ๋ฐ˜์ ์ด์ง€ ์•Š๊ณ  ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฏ€๋กœ ์ผ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ตœ์ ํ™”ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์œ ํšจํ•œ ์‚ฌ๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 80/20 ๊ทœ์น™์€ ํ”„๋กœํŒŒ์ผ๋งํ•  ๋•Œ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์— ๋ฌดํ•œํ•œ ๋ณต์žก์„ฑ(์˜ˆ: ์กฐ๊ธฐ ์ตœ์ ํ™”)์„ ์ถ”๊ฐ€ํ•˜์ง€ ๋ง๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” 20%์˜ ๊ฒฝ์šฐ์—์„œ ์ž์œ ๋กญ๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๊ณ  ๋‚˜๋จธ์ง€ 80%๋Š” ์ผ๋ฐ˜ API์˜ ์ œํ•œ๋œ ๋ณต์žก์„ฑ๊ณผ ์ธ์ง€ ๋ถ€ํ•˜์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

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

๋Œ€์ฒด ์†”๋ฃจ์…˜:

  • ๋ณต์žกํ•œ ๊ตฌ์กฐ ๋Œ€์‹  ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ ์‚ฌ์šฉ

    • ์˜ˆ๋ฅผ ๋“ค์–ด Set ๋Œ€์‹  map[int]struct{} ์‚ฌ์šฉ

Rob Pike(๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๊ทธ๊ฐ€ ๋น„๋””์˜ค์—์„œ ๊ทธ ์š”์ ์„ ๋งํ•˜๋Š” ๊ฒƒ๋„ ๋ดค์Šต๋‹ˆ๋‹ค)๋Š” ์ผ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ผ๋ฐ˜ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ์š”์ ์„ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. T in map[T] ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ž…๋ ฅ, ์ถœ๋ ฅ ๋ฐ ์ž์ฒด struct ์— ๋Œ€ํ•œ ํ•จ์ˆ˜์—์„œ ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ œ๋„ค๋ฆญ์€ ์ œ๋„ค๋ฆญ API๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์™„์ „ํžˆ ๋ถ€์กฑํ•˜๊ณ  ์ œ๋„ค๋ฆญ API๋Š” ์ œํ•œ๋œ ๋ณต์žก์„ฑ๊ณผ ์ธ์ง€ ๋ถ€ํ•˜ ๋ฐ ์–ธ์–ด ์ƒํƒœ๊ณ„์—์„œ ๊ทœ์น™์„ฑ์„ ์–ป๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ œ๋„ค๋ฆญ์ด ์•„๋‹Œ ์ฝ”๋“œ์—์„œ ์š”๊ตฌํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง ์ˆ˜์ค€(์‰ฝ๊ฒŒ ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์—†๋Š” ๋ชจ๋“ˆ์˜ ํ•ฉ์„ฑ ๊ฐ€๋Šฅ์„ฑ ๊ฐ์†Œ)์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์–ธ๊ธ‰ํ•œ ํ‘œํ˜„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹ ์„น์…˜์—์„œ:

ํŒจํ‚ค์ง€ ํ…œํ”Œ๋ฆฟ
์ด๊ฒƒ์€ Modula-3, OCaml, SML(์†Œ์œ„ "ํŽ‘ํ„ฐ") ๋ฐ Ada์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ „๋ฌธํ™”๋ฅผ ์œ„ํ•ด ๊ฐœ๋ณ„ ์œ ํ˜•์„ ์ง€์ •ํ•˜๋Š” ๋Œ€์‹  ์ „์ฒด ํŒจํ‚ค์ง€๊ฐ€ ์ œ๋„ค๋ฆญ์ž…๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ฌ ๋•Œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ํŒจํ‚ค์ง€๋ฅผ ์ „๋ฌธํ™”ํ•ฉ๋‹ˆ๋‹ค.

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

์˜คํžˆ๋ ค ๋‚ด ์ดํ•ด ๋Š” ํŒจํ‚ค์ง€(์ผ๋ช… ๋ชจ๋“ˆ) ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋ฅผ ํ†ตํ•ด ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ struct , interface ๋ฐ func ๊ทธ๋ฃนํ™”์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋” ๋ณต์žกํ•œ ์œ ํ˜• ์‹œ์Šคํ…œ
์ด๊ฒƒ์ด Haskell๊ณผ Rust๊ฐ€ ์ทจํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
[โ€ฆ]
๋‹จ์ :

  • ๋” ๊ฐ„๋‹จํ•œ ์–ธ์–ด์— ๋งž์ถ”๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค(https://groups.google.com/d/msg/golang-nuts/smT_0BhHfBs/MWwGlB-n40kJ).

๋งํฌ๋œ ๋ฌธ์„œ์—์„œ @ianlancetaylor ์ธ์šฉ:

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

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

๋˜ํ•œ ํฌ๊ณ  ๋ณต์žกํ•œ Go ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด
์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ƒ๋‹นํ•œ ํ•„์š”์„ฑ์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” ๋” ๊ทธ๋žฌ๋‹ค.
์งœ์ฆ๋‚˜๋Š” ์‚ฌ๋งˆ๊ท€--์— ๋Œ€ํ•œ ์ƒ์šฉ๊ตฌ๋ฅผ ์„ธ ์ค„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์œ ์šฉํ•œ ์“ฐ๊ธฐ์— ๋Œ€ํ•œ ์ฃผ์š” ์žฅ๋ฒฝ์ด ์•„๋‹ˆ๋ผ ์ •๋ ฌํ•  ๊ฐ ์œ ํ˜•
์•”ํ˜ธ.

์˜ˆ, ์ด๊ฒƒ์€ ์™„์ „ํ•œ ์œ ํ˜• ํด๋ž˜์Šค ์‹œ์Šคํ…œ์œผ๋กœ ๊ฐ€๋Š” ๊ฒƒ์ด ์ •๋‹นํ™”๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ๋‚ด ์ƒ๊ฐ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค๋ฉด ๋ถ„๋ช…ํžˆ ์•„๋ฆ„๋‹ค์šด ์กฐํ™”๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์„ฑ์— ๋Œ€ํ•œ ๊ธฐ์กด Go ํ•ต์˜ ๊ด€์„ฑ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์•„๋งˆ๋„ ๋งŽ์€ ํ”„๋กœ์ ํŠธ์—์„œ ์ถ”๊ฐ€๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์‹œ๋„ˆ์ง€๊ฐ€ ๋‚ฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ?

๊ทธ๋Ÿฌ๋‚˜ typeclass ๊ตฌ๋ฌธ์˜ ๋ณ€ํ™˜๊ธฐ๊ฐ€ Go๊ฐ€ ์ œ๋„ค๋ฆญ์„ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์กด ์ˆ˜๋™ ๋ฐฉ์‹์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋ฉด(ํŽธ์ง‘: @andrewcmyers ์ƒํƒœ๊ฐ€ ๊ทธ๋Ÿด๋“ฏ ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฉ๊ธˆ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค), ์ด๊ฒƒ์€ ๋œ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ์œ ์šฉํ•œ ์‹œ๋„ˆ์ง€ ํšจ๊ณผ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠœํ”Œ์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋Š” struct ์— ๊ตฌํ˜„๋œ interface ๋กœ ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ์—๋ฎฌ๋ ˆ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ @jba ๊ฐ€ ์ปจํ…์ŠคํŠธ์—์„œ ์ธ๋ผ์ธ interface ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ์–ธ๊ธ‰ ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค . type ์™€ ํ•จ๊ป˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ถ„๋ช…ํžˆ struct ๋Š” ๋ช…๋ชฉ์ƒ ํ˜•์‹ ๋Œ€์‹  ๊ตฌ์กฐ์ ์œผ๋กœ ์ž…๋ ฅ๋ฉ๋‹ˆ๊นŒ? ๋˜ํ•œ interface ์˜ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅธ interface ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž ์ด ๋œ ๊นฌ ์ƒํƒœ์—์„œ ๋” ์ƒ๊ฐํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ Go ํŒ€์ด C++๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
ํ•˜๋‚˜์˜ Turing ์™„์ „ํ•œ ์–ธ์–ด๊ฐ€ ๊ฒน์ณ์ง„ ํ…œํ”Œ๋ฆฟ
๋‘ ์–ธ์–ด๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ํŠœ๋ง ์™„์ „ ์–ธ์–ด
์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ๊ณผ ๋‘ ์–ธ์–ด์˜ ํ”„๋กœ๊ทธ๋žจ์€
๋งค์šฐ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. C++ ํ…œํ”Œ๋ฆฟ์€ ๊ฒฝ๊ณ  ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
๋ณต์žกํ•œ ๊ตฌํ˜„์ด ์ „์ฒด์— ํผ์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•ด C++ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€
๋†€๋ผ์›€๊ณผ ๋†€๋ผ์›€. ์ด๊ฒƒ์€ Go๊ฐ€ ๋”ฐ๋ผ๊ฐˆ ๊ธธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„๋ฌด๋„ ๋™์˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๋‹จํ˜•์„ฑ์˜ ์ด์ ์€ Turing ์™„์ „ํ•œ ์ œ๋„ค๋ฆญ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—”์ง„์˜ ๋‹จ์ ๊ณผ ์ง๊ตํ•ฉ๋‹ˆ๋‹ค.

Btw, C++ ํ…œํ”Œ๋ฆฟ์˜ ์„ค๊ณ„ ์˜ค๋ฅ˜ ๋Š” ์ƒ์„ฑ์ (์ ์šฉ์ ) ML ํŽ‘ํ„ฐ์˜ ๊ฒฐํ•จ๊ณผ ๋™์ผํ•œ ์ƒ์„ฑ์  ๋ณธ์งˆ ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค . ์ตœ์†Œ ์ „๋ ฅ์˜ ์›์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.


@ianlancetailor ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋‚ด์žฅ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜์—ฌ Go๊ฐ€ ์ ์  ๋” ๋ณต์žกํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ํฌ๋งํ•œ๋‹ค. ๋‚˜๋Š” Go๊ฐ€ ์ผ๊ด€๋œ ์ œ๋„ค๋ฆญ ์‹œ์Šคํ…œ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๋„ค๋ฆญ์ด ์—†์„ ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๋ฐ›์•„๋“ค์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ๊ตณ๊ฒŒ ๋ฏฟ์Šต๋‹ˆ๋‹ค.

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

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

@pciet ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋‚ด ํˆฌํ‘œ๋Š” ์ผ๋ฐ˜ํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ œ๋„ค๋ฆญ์— ๋ฐ˜๋Œ€ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ธฐ๋ณธ ์œ ํ˜•์—์„œ ์ž‘๋™ํ•˜๋Š” append ๋ฐ copy $์™€ ๊ฐ™์€ ๋” ๋งŽ์€ ๊ธฐ๋ณธ ์ œ๊ณต ์ œ๋„ค๋ฆญ ๊ธฐ๋Šฅ์— ์ฐฌ์„ฑ์ž…๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜ ์œ ํ˜•์— sort ๋ฐ search ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๊ด€์„ฑ์„ ํ™•์žฅํ•˜๋ฉด ํฌ๊ด„์ ์ธ ์ œ๋„ค๋ฆญ ๊ธฐ๋Šฅ์ด Go๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋” ํ‘ธ๋ฅธ ๋ชฉ์ดˆ์ง€๋กœ ๋– ๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค. @andrewcmyers๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ˜๋ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด์žฅ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜์—ฌ Go๊ฐ€ ์ ์  ๋” ๋ณต์žกํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ~์ž…๋‹ˆ๋‹ค~ ์‹ค๋ง์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž์‹ ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์–ธ์–ด ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@shelby3

Afaik, ์ด์ œ Go์—์„œ ์ด๊ธฐ์ข… ์ปจํ…Œ์ด๋„ˆ/์ปฌ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ์œ ํ˜•์„ ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค์— ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.{} ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํƒ€์ดํ•‘ ์ •๋ณด๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์žˆ์œผ๋ฉฐ ์บ์ŠคํŠธ ๋ฐ ๋Ÿฐํƒ€์ž„ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ •์  ํƒ€์ดํ•‘.

Go์—์„œ ์ธํ„ฐํŽ˜์ด์Šค ์ปฌ๋ ‰์…˜์˜ ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ์— ๋Œ€ํ•ด์„œ๋Š” ์œ„์˜ ์ฃผ์„์—์„œ ๋ž˜ํผ ํŒจํ„ด์„ ์ฐธ์กฐํ•˜์„ธ์š”.{}

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

์ด๊ฒƒ์„ ๋” ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ปฌ๋ ‰์…˜ ์œ ํ˜•์˜ ๊ฒฝ์šฐ ํฌํ•จ๋œ ํ•ญ๋ชฉ์˜ ํ•„์š”ํ•œ ์ผ๋ฐ˜ ๋™์ž‘์„ ์ •์˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

@pciet ์ด ์ฝ”๋“œ๋Š” ๋ง ๊ทธ๋Œ€๋กœ @shelby3 ๊ฐ€ ์„ค๋ช…ํ•˜๊ณ  ๋ฐ˜ํŒจํ„ด์„ ๊ณ ๋ คํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ์ผ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—์„œ ์ธ์šฉ:

์ด๊ฒƒ์€ ๋ฌธ์„œํ™” ๋ฐ ํ…Œ์ŠคํŠธ ์˜ˆ์ œ์—์„œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ์œ„ํ•ด ๋ž˜ํผ ํŒจํ„ด(@pierrre์—๊ฒŒ ๊ฐ์‚ฌ)์„ ์ž…๋ ฅํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์œ ํ˜• ์•ˆ์ „์„ฑ์— ๋Œ€ํ•œ ๋ฐ˜์˜ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ์ •๋ณด๊ฐ€ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์œ ํ˜•๋ณ„๋กœ ๋ฐ˜์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์ŠคํŠธ ๋ฐ ๋Ÿฐํƒ€์ž„ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ @shelby3 ๊ฐ€ ๋ถˆํ‰ํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ์ ‘๊ทผ๋ฒ•์„ "๋‹จ์ผํ˜•ํ™”(monomorphization-by-hand)"๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฉฐ, ์ปดํŒŒ์ผ๋Ÿฌ์— ๊ฐ€์žฅ ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ง€๋ฃจํ•œ ์žก์ผ์ž…๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์„ ๋” ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ปฌ๋ ‰์…˜ ์œ ํ˜•์˜ ๊ฒฝ์šฐ ํฌํ•จ๋œ ํ•ญ๋ชฉ์˜ ํ•„์š”ํ•œ ์ผ๋ฐ˜ ๋™์ž‘์„ ์ •์˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

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

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

type Foo interface {
    ...
}

type Bar interface {
    ...
}

์ˆœ์ „ํžˆ ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Foo ๋ฐ Bar ๋ชจ๋‘๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์„ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•ฉ๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ์ด๊ฒƒ์€ Go์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(์ •์  ์œ ํ˜• ์•ˆ์ „์„ ํ”ผํ•˜๋ฉด์„œ ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ์— ์˜์กดํ•˜์ง€ ์•Š์Œ).

์œ ํ˜• ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ œ๋„ค๋ฆญ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๊ฒƒ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func baz<T Foo + Bar>(t T) {
    ...
}

@tarcieri

์ˆœ์ˆ˜ํ•œ ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Foo์™€ Bar๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์„ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•ฉ๋‹ˆ๊นŒ?

๋‹จ์ˆœํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด:

type T interface {
    Foo
    Bar
}

func baz(t T) { ... }

@sbinet ๊น”๋”ํ•จ , TIL

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๋Ÿฐํƒ€์ž„ ๋ฆฌํ”Œ๋ ‰์…˜์ด ์ž˜๋ชป๋œ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฑด ๋‚˜์ผ๋ฟ... ๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์ด์œ ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ œ๋„ค๋ฆญ์„ ๊ตฌํ˜„ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋จผ์ € Stepanov์˜ "ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”์†Œ"๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฝ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งŽ์€ Not Invented Here ๋ฌธ์ œ์™€ ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ๋ช…ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ๊ณ  ๋‚˜๋ฉด "C++ ๊ฐœ๋…"๊ณผ "Haskell Typeclasses"๊ฐ€ ์ œ๋„ค๋ฆญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ธ ์ด์œ ๊ฐ€ ๋ถ„๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ํ™œ์„ฑํ™”๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ๋Š” ๋ฐ€์งš๋ชจ์ž ํ”„๋กœํฌ์ฆˆ ๋†€์ดํ„ฐ
https://go-li.github.io/test.html
์—ฌ๊ธฐ์—์„œ ๋ฐ๋ชจ ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
https://github.com/go-li/demo

์ด ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ‰๊ฐ€ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
ํ•จ์ˆ˜ ์ œ๋„ค๋ฆญ.

์šฐ๋ฆฌ๋Š” ํ•ดํ‚น๋œ gccgo๋ฅผ ์œ ์ง€ํ•˜๊ณ 
์ด ํ”„๋กœ์ ํŠธ๋Š” ๋‹น์‹  ์—†์ด๋Š” ๋ถˆ๊ฐ€๋Šฅํ–ˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š”
๋‹ค์‹œ ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ท€ํ•˜๊ฐ€ ์ฑ„ํƒํ•œ ์ œ๋„ค๋ฆญ์ด ๋ฌด์—‡์ด๋“ , ๊ณ„์†ํ•ด์„œ ํ›Œ๋ฅญํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค!

@anlhord ์ด์— ๋Œ€ํ•œ ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด๋Š” ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ? ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์–ด๋””์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌด์—‡์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๊นŒ? ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ๊ตฌํ˜„์˜ ์‚ฌ์–‘์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ๋งํฌ์—๋Š” ์ด์— ๋Œ€ํ•œ ์ตœ์•…์˜ ์˜ˆ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

package main

import "fmt"

func main() {
    fmt.Println("Hello, playground")
}

๊ทธ ์ฝ”๋“œ๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ์•Œ๋ ค์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์ด ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@joho ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ ‘๊ทผ ๋ฐฉ์‹ ํ‰๊ฐ€์— ๋Œ€ํ•œ ์ง€์นจ์œผ๋กœ ํ•™์ˆ  ๋ฌธํ—Œ์— ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ฃผ์ œ์— ๋Œ€ํ•ด ์ฝ์€ ์œ ์ผํ•œ ๋ฌธ์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ œ๋„ค๋ฆญ ์œ ํ˜•์˜ ์ด์ ์„ ์–ป ์Šต๋‹ˆ๊นŒ? (ํŽ˜์ด์›” ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. pdf ๋‹ค์šด๋กœ๋“œ๋กœ ๊ฐ€๋Š” ๊ธธ์„ ๊ตฌ๊ธ€๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์‹คํ—˜์— ๋Œ€ํ•œ ๋ณด์ˆ˜์  ํ•ด์„
์ œ๋„ค๋ฆญ ์œ ํ˜•์€ ์ ˆ์ถฉ์•ˆ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธ์ •์ ์ธ ๋ฌธ์„œํ™” ํŠน์„ฑ๊ณผ
๋ถ€์ •์ ์ธ ํ™•์žฅ์„ฑ ํŠน์„ฑ.

Go๋Š” ์ด๋ฏธ interface (๋ช…์‹œ์ ์ธ T ์ผ๋ฐ˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด) ์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— OOP์™€ ์„œ๋ธŒํด๋ž˜์‹ฑ(์˜ˆ: Java ๋ฐ C++์˜ ํด๋ž˜์Šค)์€ ๋‘˜ ๋‹ค ์‹ฌ๊ฐํ•˜๊ฒŒ ๊ณ ๋ ค๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. Java๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํŒจํ„ด์„ ๋ฐ˜๋Œ€ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌํ•˜์ง€ ๋ง์•„์•ผ ํ•  ํ•ญ๋ชฉ์œผ๋กœ ์ธ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Upthread ๋‚˜๋Š” ๊ทธ ์ฃผ์žฅ์˜ ์ผ๋ถ€์— ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ถ„์„์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„์ง upthread ์— ์–ธ๊ธ‰๋œ Genus system ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์—ฐ๊ตฌ๋ฅผ ๊ณต๋ถ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Scala์— ๋Œ€ํ•œ ๋ถˆ๋งŒ์œผ๋กœ ์ธํ•ด ๋งŽ์€ ํŒจ๋Ÿฌ๋‹ค์ž„(์˜ˆ: ์„œ๋ธŒํด๋ž˜์‹ฑ, ๋‹ค์ค‘ ์ƒ์†, OOP, ํŠน์„ฑ ์„ ํ˜•ํ™”, implicit , typeclasses, ์ถ”์ƒ ์œ ํ˜• ๋“ฑ)์„ ํ˜ผํ•ฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” "์ฃผ๋ฐฉ ์‹ฑํฌ" ์‹œ์Šคํ…œ์„ ๊ฒฝ๊ณ„ํ•ฉ๋‹ˆ๋‹ค. Scala 3(์ผ๋ช… Dotty ๋ฐ DOT ๋ฏธ์ ๋ถ„)์—์„œ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋งŽ์€ ์ฝ”๋„ˆ ์ผ€์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๊ต ํ…Œ์ด๋ธ” ์ด ์‹คํ—˜์šฉ Scala 3 ๋˜๋Š” ํ˜„์žฌ ๋ฒ„์ „์˜ Scala์™€ ๋น„๊ต๋˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ OOP+์„œ๋ธŒํด๋ž˜์‹ฑ์— ๋น„ํ•ด ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜๋Š” ์ž…์ฆ๋œ ์ผ๋ฐ˜์„ฑ ์‹œ์Šคํ…œ ์ธก๋ฉด์—์„œ ML ํŽ‘ํ„ฐ์™€ Haskell ์œ ํ˜• ํด๋ž˜์Šค๊ฐ€ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” @keean ์˜ ๋น„๊ณต๊ฐœ ํ† ๋ก  ์ค‘ ์ผ๋ถ€๋ฅผ ๊ธฐ๋กํ–ˆ๊ณ  ML functor ๋ชจ๋“ˆ๊ณผ typeclasses์— ๋Œ€ํ•ด ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ด๋ผ์ดํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • typeclasses _model algebra_ (๊ทธ๋Ÿฌ๋‚˜ ํ™•์ธ๋œ ๊ณต๋ฆฌ ์—†์ด ) ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ๋‹จ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ๋งŒ ๊ฐ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ ์ฃผ์„ ์—†์ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ตฌํ˜„์„ ์•”์‹œ์ ์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • ML ํŽ‘ํ„ฐ๋Š” ์œ ํ˜• ํด๋ž˜์Šค๋ณด๋‹ค ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ์ฃผ์„๊ณผ ์ž ์žฌ์ ์œผ๋กœ ๋” ๋งŽ์€ ์ฝ”๋„ˆ ์ผ€์ด์Šค ์ƒํ˜ธ ์ž‘์šฉ์„ ํฌ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  @keean ์— ๋”ฐ๋ฅด๋ฉด ๋” ๋ณต์žกํ•œ ์œ ํ˜• ์‹œ์Šคํ…œ์ธ ์ข…์† ์œ ํ˜•( ๊ด€๋ จ ์œ ํ˜• ์˜ ๊ฒฝ์šฐ)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. @keean ์€ Stepanov ์˜ _๋Œ€์ˆ˜ํ•™ ํ”Œ๋Ÿฌ์Šค ์œ ํ˜• ํด๋ž˜์Šค๋กœ์„œ์˜ ์ผ๋ฐ˜์„ฑ์˜ ํ‘œํ˜„์ด ์ถฉ๋ถ„ํžˆ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐ ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์ด ์ตœ์ฒจ๋‹จ์˜ ์ž˜ ์ž…์ฆ๋œ(ํ•˜์Šค์ผˆ์—์„œ ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ๋Š” Rust์—์„œ) ์ผ๋ฐ˜์„ฑ์„ ์œ„ํ•œ ์ตœ์ ์˜ ์ง€์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณต๋ฆฌ๋Š” ์œ ํ˜• ํด๋ž˜์Šค์— ์˜ํ•ด ์‹œํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

  • ํ‘œํ˜„์‹ ๋ฌธ์ œ์˜ ๋‹ค๋ฅธ ์ถ•์„ ๋”ฐ๋ผ ํ™•์žฅํ•˜๋Š” ์œ ํ˜• ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” ์ด๊ธฐ์ข… ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๊ณต์šฉ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์ง€๋งŒ O(log n) ์–ต์ œ๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น์— ๋น„ํ•ด

@larsth ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

Go 1.xy ์†Œ์Šค ์ฝ”๋“œ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•œ Go ์ œ๋„ค๋ฆญ ์†Œ์Šค ์ฝ”๋“œ์ธ ํ•˜๋‚˜ ์ด์ƒ์˜ ์‹คํ—˜์  ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@bcmills ๋Š” ์ผ๋ฐ˜์„ฑ์„ ์œ„ํ•œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ทธ์˜ ์ œ์•ˆ์— ๋Œ€ํ•ด ์ผ์Šต๋‹ˆ๋‹ค.

Go API์—์„œ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์ด ์•„๋‹Œ interface ์œ ํ˜•์„ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์˜นํ˜ธํ•˜๋Š” ๋ฐ ๋™์ผํ•œ ์ฃผ์žฅ์ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค๊ณ  ๋“ค์—ˆ๊ณ  ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๊ฐ€ ๋” ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ์กฐ๊ธฐ ์ถ”์ƒํ™”๋Š” ์œ ํ˜•์„ ๊ณผ๋„ํ•˜๊ฒŒ ์ œํ•œํ•˜๊ณ  API์˜ ํ™•์žฅ์„ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค. (์ด๋Ÿฌํ•œ ์˜ˆ ์ค‘ ํ•˜๋‚˜๋Š” #19584๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.) ์ด ์ฃผ์žฅ์— ์˜์กดํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

์ผ๋ฐ˜์„ฑ์„ ์œ„ํ•œ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•  ๋•Œ, ํŠนํžˆ Go์˜ ํ•ต์‹ฌ ์ฒ ํ•™์ด ๊ณ ๋ ค๋˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ํ‰๊ท ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์šฐ์„ ์ˆœ์œ„) ์ƒํƒœ๊ณ„์˜ ๊ทœ์น™์„ฑ๊ณผ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ์ฃผ์š” ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋กœ ๋Š˜๋ฆฌ๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ตœ์†Œ ์ „๋ ฅ์˜ ์›์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์„ฑ์„ ์œ„ํ•œ "์ˆจ๊ฒจ์ง„" ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํ•จ์ˆ˜์˜ ์œ„๋ ฅ/์œ ์—ฐ์„ฑ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒํƒœ๊ณ„์—์„œ ์†Œ์Šค ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์— ํ•ด๋ฅผ ๋ผ์น  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ๊ณผ ๋น„๊ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ ๋ชจ๋“ˆ์‹ ๋””์ปคํ”Œ๋ง์€ ๋…์ž๊ฐ€ ์ฃผ์–ด์ง„ ๋ชจ๋“ˆ/ํŒจํ‚ค์ง€๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์•”์‹œ์  ์ „์ด ์ข…์†์„ฑ์œผ๋กœ ์ธํ•ด ์ž ์žฌ์ ์œผ๋กœ ๋ฌดํ•œํ•œ ์–‘์˜ ์ฝ”๋“œ๋ฅผ ์ฝ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค!). ์œ ํ˜• ํด๋ž˜์Šค ๊ตฌํ˜„ ์ธ์Šคํ„ด์Šค์˜ ์•”์‹œ์  ํ•ด๊ฒฐ์€ ํ•ด๋‹น ๋Œ€์ˆ˜ํ•™์ด ์ค€์ˆ˜๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , ํ•˜์ง€๋งŒ ์ด๋Š” ์ด๋ฏธ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๋…๋ฆฝ์ ์ธ Go์˜ ๋งŽ์€ ์•”์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•ด ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ afaik Go๋Š” ์ด๋Ÿฌํ•œ ํšจ๊ณผ๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”์ƒํ™”๋ฅผ ์„ค๊ณ„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Rust๋Š” ๊ทธ๋Ÿฐ ์ถ”์ƒํ™”๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (btw ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— ์ผ๋ถ€/๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ๊ณผ๋„ํ•œ pita/tsuris/limiting์ด๋ฉฐ ๋” ์‰ฌ์šด ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ ์ถ”์ƒํ™”๋ฅผ ์ฃผ์žฅํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ Go๋Š” ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ณ ๋ฃจํ‹ด์„ ๋™์ผํ•œ ์Šค๋ ˆ๋“œ๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ) . ๊ทธ๋ฆฌ๊ณ  Haskell์€ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์„ ์œ„ํ•ด ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์‹œํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ๊ณผ์— ๋Œ€ํ•œ ๋ชจ๋‚˜๋”• ์ œ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


@alerca ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

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

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


@andrewcmyers ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด, gen, cpp, gofmt -r ๋˜๋Š” ๊ธฐํƒ€ ๋งคํฌ๋กœ/ํ…œํ”Œ๋ฆฟ ๋„๊ตฌ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๋งคํฌ๋กœ ์Šคํƒ€์ผ ์ฝ”๋“œ ์ƒ์„ฑ์ด ํ‘œ์ค€ํ™”๋˜๋”๋ผ๋„ ์ œ๋„ค๋ฆญ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C++ ํ…œํ”Œ๋ฆฟ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: ์ฝ”๋“œ ํŒฝ์ฐฝ, ๋ชจ๋“ˆ์‹ ์œ ํ˜• ๊ฒ€์‚ฌ ๋ถ€์กฑ, ๋””๋ฒ„๊น… ์–ด๋ ค์›€. ๋‹ค๋ฅธ ์ œ๋„ค๋ฆญ ์ฝ”๋“œ์˜ ๊ด€์ ์—์„œ ์ œ๋„ค๋ฆญ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์€ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฒƒ์ฒ˜๋Ÿผ ์‹œ์ž‘ํ• ์ˆ˜๋ก ์•…ํ™”๋ฉ๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— ์žฅ์ ์€ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. Go ์ปดํŒŒ์ผ๋Ÿฌ ์ž‘์„ฑ์ž์˜ ์‚ถ์„ ๋น„๊ต์  ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ์บ์‹œ ์••๋ ฅ์ด ์—†๋Š” ํ•œ ์ตœ์‹  ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค!

@keean ๋‹˜ ์˜ ์˜๊ฒฌ์— ๋™์˜ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@shelby3 ๋Œ“๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์— ๋ฌธ์„œ ์ž์ฒด์—์„œ ์ง์ ‘ ๋Œ“๊ธ€/ํŽธ์ง‘์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์„ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๊ณ  ๋ชจ๋“  ๋ฉ”๋ชจ๊ฐ€ ์ ์ ˆํ•œ ์‘๋‹ต์„ ๋ฐ›๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

๊ฐœ์š” ์„น์…˜์€ Java์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ boxing ์ฐธ์กฐ์˜ ๋ณดํŽธ์  ์‚ฌ์šฉ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ...

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

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

๊ทธ ์ง„์ˆ ์€ ์žฅ๊ธฐ์ ์œผ๋กœ ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ, ์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ์ข…์ข… ๋‹ค๋ฅธ ๋ชฉ์ ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๊ตฌํ˜„์„ ๊ฐ–๋Š” ๊ฒƒ๋ณด๋‹ค ๋ชจ๋“  ๋‹ค๋ฅธ ์šฉ๋„๋ฅผ ์ˆ˜์ง‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด https://www.scala-lang.org/api/2.12.3/scala/collection/immutable/List.html์„ ๋ณด์‹ญ์‹œ์˜ค.

"๊ธฐ๊ณ„์  ์„ค๊ณ„"์™€ "๋งŽ์€ ์œ ์—ฐ์„ฑ"๋งŒ์œผ๋กœ๋Š” ์ข‹์€ "์ผ๋ฐ˜ ์†”๋ฃจ์…˜"์„ ๋งŒ๋“ค๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ข‹์€ ์ง€์นจ, ๋ฌผ๊ฑด์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€, ๋ฌด์—‡์„ ํ”ผํ•ด์•ผ ํ•˜๋Š”์ง€, ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ๊ตฌ์กฐ์™€ ์ด์— ์ž‘๋™ํ•˜๋Š” API๋Š” ๋ชฉ์ ์— ๋งž๊ฒŒ ์ œ์ž‘๋œ API๋ณด๋‹ค ์ถ”์ƒ์ ์ธ ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค...

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

๋งŽ์€ ์œ ์‚ฌํ•œ API์˜ ์ธ์ง€ ๋ถ€ํ•˜์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์˜ ์žฌ๊ตฌํ˜„์€ ์‹ค์ œ๋กœ ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ณ ์ •๋œ ์ˆ˜์˜ ์ „๋ฌธํ™”๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์œ ํšจํ•œ ์‚ฌ๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ์–ด๋–ค ์ ์— ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ณ , ๋‚˜๋Š” ๊ทธ๋“ค ์ค‘ ์ƒ๋‹น์ˆ˜์— ์–ด๋Š ์ •๋„ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๋“ค์˜ ๊ด€์ ์„ ์ดํ•ดํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๋งค์ผ ์ง๋ฉดํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ์˜ ๋ชฉํ‘œ๋Š” "์–ด๋–ค ๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์–ผ๋งˆ๋‚˜ ์„ฑ๊ฐ€์‹  ์ผ์ธ์ง€"๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ์˜๊ฒฌ์„ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์–ป๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์–ธ์–ด ๋ฐ ์ผ๋ฐ˜ API ๋„์›€๋ง์˜ ๊ทœ์น™์„ฑ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์‹ค์ œ๋กœ๋Š” 1% ๋ฏธ๋งŒ์˜ ๊ฒฝ์šฐ์—๋งŒ ์ด๋Ÿฌํ•œ ์ตœ์ ํ™” ์Šคํƒ€์ผ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์ฒด ์†”๋ฃจ์…˜:

๋Œ€์ฒด ์†”๋ฃจ์…˜์€ ์ œ๋„ค๋ฆญ์„ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜คํžˆ๋ ค ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž ์žฌ์  ์†”๋ฃจ์…˜ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ํ…œํ”Œ๋ฆฟ

๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์ •ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ML ํŽ‘ํ„ฐ(FP ํŽ‘ํ„ฐ์™€ ํ˜ผ๋™ํ•˜์ง€ ๋ง ๊ฒƒ)๋Š” ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ƒํƒœ๋กœ ์ถœ๋ ฅ์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋ช…ํ™•ํ•œ ํ‘œํ˜„์„ ์ œ๊ณตํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@egonelbre ๋˜ํ•œ ์‘๋‹ตํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ค ์ ์—์„œ ๋‚ด ์ƒ๊ฐ์„ ๋” ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์— ๋ฌธ์„œ ์ž์ฒด์—์„œ ์ง์ ‘ ๋Œ“๊ธ€/ํŽธ์ง‘์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์‚ฌ๊ณผ๋ฅผ ๋“œ๋ฆฌ๊ณ  ์‹ถ์ง€๋งŒ Google ๋ฌธ์„œ์˜ ํ† ๋ก  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ ์ ์ด ์—†๊ณ  ๋ฐฐ์šธ ์‹œ๊ฐ„์ด ์—†์œผ๋ฉฐ ๋‚˜์ค‘์— ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก Github์— ์žˆ๋Š” ํ† ๋ก ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด https://www.scala-lang.org/api/2.12.3/scala/collection/immutable/List.html์„ ๋ณด์‹ญ์‹œ์˜ค.

Scala ์ปฌ๋ ‰์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋””์ž์ธ์€ ์ด์ „ ํ•ต์‹ฌ ํŒ€์› ์ค‘ ํ•œ ๋ช…์„ ํฌํ•จํ•˜์—ฌ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋น„ํŒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. LtU์— ๊ฒŒ์‹œ๋œ ๋Œ“๊ธ€ ์ด ๋Œ€ํ‘œ์ ์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ  ์ด ์Šค๋ ˆ๋“œ์˜ ์ด์ „ ๊ฒŒ์‹œ๋ฌผ ์ค‘ ํ•˜๋‚˜์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Scala์— ๋Œ€ํ•œ ๋ถˆ๋งŒ์œผ๋กœ ์ธํ•ด ๋งŽ์€ ํŒจ๋Ÿฌ๋‹ค์ž„(์˜ˆ: ์„œ๋ธŒํด๋ž˜์‹ฑ, ๋‹ค์ค‘ ์ƒ์†, OOP, ํŠน์„ฑ ์„ ํ˜•ํ™”, implicit , typeclasses, ์ถ”์ƒ ์œ ํ˜• ๋“ฑ)์„ ํ˜ผํ•ฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” "์ฃผ๋ฐฉ ์‹ฑํฌ" ์‹œ์Šคํ…œ์„ ๊ฒฝ๊ณ„ํ•ฉ๋‹ˆ๋‹ค. Scala 3(Dotty ๋ฐ DOT ๋ฏธ์ ๋ถ„์ด๋ผ๊ณ ๋„ ํ•จ)์—์„œ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋งŽ์€ ์ฝ”๋„ˆ ์ผ€์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Scala์˜ ์ปฌ๋ ‰์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹คํ˜•์„ฑ์„ ์œ„ํ•œ typeclasses๋งŒ ์žˆ๋Š” PL์šฉ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋Œ€ํ‘œํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šค์นผ๋ผ ์ปฌ๋ ‰์…˜์€ ๋ณต์žกํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์ƒ์† ๋ฐฉ์ง€ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ณ  CanBuildFrom implicit ๋„์šฐ๋ฏธ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ณต์žก์„ฑ ์˜ˆ์‚ฐ์„ ํญ๋ฐœ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Stepanov์˜ _ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์š”์†Œ_ ๊ฐ€ ๋Œ€์ˆ˜๋ผ๋Š” @keean์˜ ์š”์ ์„ ์ค€์ˆ˜ํ•˜๋ฉด ์šฐ์•„ํ•œ ์ปฌ๋ ‰์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ•™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํŽ‘ํ„ฐ(FP) ๊ธฐ๋ฐ˜ ์ปฌ๋ ‰์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: Haskell์„ ๋ณต์‚ฌํ•˜์ง€ ์•Š์Œ )์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ๋Œ€์•ˆ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์‹ค์ œ๋กœ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์ƒˆ๋กœ์šด PL์˜ ๋””์ž์ธ์— ๋Œ€ํ•ด ๊ทธ์™€ ํ˜‘๋ ฅ/ํ† ๋ก ํ•˜๊ณ  ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๋‚˜๋Š” ๊ทธ ์–ธ์–ด๋ฅผ ์ฒ˜์Œ์— Go๋กœ ๋ณ€ํ™˜ํ•  ๊ณ„ํš ์ž…๋‹ˆ๋‹ค . ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด ๊ณง ์‹คํ—˜์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์— ๋ฐ”๋‘‘ ์ปค๋ฎค๋‹ˆํ‹ฐ/์ฒ ํ•™์€ ์‹คํŒจํ•œ ์‹คํ—˜์œผ๋กœ ์–ธ์–ด๋ฅผ ์„œ๋‘๋ฅด๊ณ  ์˜ค์—ผ์‹œํ‚ค๋Š” ๊ฒƒ๋ณด๋‹ค ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•˜๊ณ  ๋‚˜์ค‘์— ์ž…์ฆ๋˜๋ฉด ์ฑ„ํƒํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณตํ•ด์„œ ๋งํ–ˆ๋“ฏ์ด ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ถ”์ƒ์ ์ธ ์ฃผ์žฅ์€ ๊ทธ๋‹ค์ง€ ๊ฑด์„ค์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(PL ๋””์ž์ธ ์ด๋ก ๊ฐ€๋ฅผ ์ œ์™ธํ•˜๊ณ ). ๋˜ํ•œ ์œ„์›ํšŒ์—์„œ ์ผ๊ด€๋œ ์ œ๋„ค๋ฆญ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ ๋ถˆ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ข‹์€ ์ง€์นจ, ๋ฌผ๊ฑด์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€, ๋ฌด์—‡์„ ํ”ผํ•ด์•ผ ํ•˜๋Š”์ง€, ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

๋ฌผ๋ก  ์‹ค์ œ๋กœ๋Š” 1% ๋ฏธ๋งŒ์˜ ๊ฒฝ์šฐ์—๋งŒ ์ด๋Ÿฌํ•œ ์ตœ์ ํ™” ์Šคํƒ€์ผ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Go์—๋Š” ์ด๋ฏธ ์ผ๋ฐ˜์„ฑ์„ ์œ„ํ•œ interface ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด T ์œ ํ˜•์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹คํ˜•์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋””์„ ๊ฐ€ ์ฝ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ, ์‹ค์ œ๋กœ Go์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์—…๋ฐ์ดํŠธ๋œ ๊ด€์šฉ๊ตฌ๋ฅผ ์ตœ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์ผ๊ด€์„ฑ์ด ์—†๋‹ค๋Š” ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง ๋ฐ”๋‘‘์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•˜๊ณ  ์žˆ๋Š” ์š”์ ์€ ์„ ํƒ๋œ ์ œ๋„ค๋ฆญ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ์—ผ์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ, ์ง€๊ธˆ์œผ๋กœ์„œ๋Š” ์ฝ”๋“œ์˜ 1%๋งŒ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ œ๋„ค๋ฆญ์˜ ํ•„์š”์„ฑ์„ ํ”ผํ•˜๋Š” ๊ด€์šฉ๊ตฌ๊ฐ€ ์ด๋ฏธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

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

๋” ๋ช…ํ™•ํ•œ ํ‘œํ˜„์„ ์ œ๊ณตํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” Go์— ์ง€๋‚˜์น˜๊ฒŒ ๋‹จ์ˆœํ•œ ํ…œํ”Œ๋ฆฟ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ๋ง‰๊ณ ์ž ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ œ ๋ชฉ์†Œ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ์ œ๋„ค๋ฆญ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. IOW, ๊ฒฐ๊ตญ ๋‚˜์œ ๊ด€์„ฑ์ด ๋˜์ง€ ์•Š์„ ์ ์ ˆํ•œ ๊ธฐ๋Šฅ์˜ ์ œ๋„ค๋ฆญ ์‹œ์Šคํ…œ์€ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด ์ง€๋‚˜์น˜๊ฒŒ ๋‹จ์ˆœํ•œ ๋””์ž์ธ์„ ๊ฐ–๊ณ ์ž ํ•˜๋Š” ์š•๊ตฌ์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ์–‘๋ฆฝํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ์‹œ์Šคํ…œ์ธ Afaik์€ ์ž˜ ๊ณ ๋ ค๋˜๊ณ  ๊ฒ€์ฆ๋œ ์ „์ฒด๋ก ์  ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. @larsth ๊ฐ€ ์“ด ๊ฒƒ์„ ๋˜์ƒˆ๊ธฐ๋ฉฐ ์ง„์ง€ํ•œ ์ œ์•ˆ์„ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋จผ์ € ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ตฌ์ถ•(๋˜๋Š” gccgo ํ”„๋ก ํŠธ์—”๋“œ์˜ ํฌํฌ์—์„œ ๊ตฌํ˜„)ํ•œ ๋‹ค์Œ ์ œ์•ˆ์„ ์‹คํ—˜ํ•˜์—ฌ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๊ทธ ํ•œ๊ณ„๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. @ianlancetaylor ๊ฐ€ ๋‚˜์œ ๊ด€์„ฑ์˜ ์˜ค์—ผ์ด Go์— ์ถ”๊ฐ€๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ์—…์Šค๋ ˆ๋“œ๋ฅผ ์ฝ๋„๋ก ๊ถŒ์žฅ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ์ œ์•ˆ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋ถˆ๋งŒ ์‚ฌํ•ญ, ์ œ์•ˆํ•œ ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ๋‚ด ์ œ์•ˆ์€ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋งŒ๋“ค์ง€ ์—ฌ๋ถ€๋ฅผ ๊ณ ๋ คํ•œ ๋‹ค์Œ ์šฐ๋ฆฌ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ๊ณผ ์‹ซ์–ดํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์˜ˆ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. t๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ถ”์ƒ์ ์œผ๋กœ ์„ค๋ช…๋œ ์ œ์•ˆ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๊ณผ๊ฑฐ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํŒจํ‚ค์ง€๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์–ด๋–ป๊ฒŒ ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ์•ˆ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. IOW, ํŒจํ‚ค์ง€๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋„ ์ธ์Šคํ„ด์Šคํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ์•ˆ์€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํŒจํ‚ค์ง€๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ๊ธด ์‚ฌ๊ณผ. ๋‚ด๊ฐ€ ์˜คํ•ดํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@shelby3 ์•„, ๊ทธ๋Ÿผ ์ฒ˜์Œ ๋ถˆ๋งŒ์„ ์ž˜๋ชป ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € "Generics Approaches"์˜ ์„น์…˜์ด ๊ตฌ์ฒด์ ์ธ ์ œ์•ˆ์ด ์•„๋‹˜์„ ๋ถ„๋ช…ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์ ‘๊ทผ ๋ฐฉ์‹, ์ฆ‰ ๊ตฌ์ฒด์ ์ธ ์ œ๋„ค๋ฆญ ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๋” ํฐ ๋””์ž์ธ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ฃนํ™”๋Š” ๊ธฐ์กด ๊ตฌํ˜„ ๋˜๋Š” ๊ตฌ์ฒด์ /๋น„๊ณต์‹ ์ œ์•ˆ์— ์˜ํ•ด ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋™๊ธฐ๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋‚˜๋Š” ๊ทธ ๋ชฉ๋ก์—์„œ ์—ฌ์ „ํžˆ ๋ˆ„๋ฝ๋œ ์ ์–ด๋„ 5๊ฐœ์˜ ํฐ ์•„์ด๋””์–ด๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

"ํŒจํ‚ค์ง€ ํ…œํ”Œ๋ฆฟ" ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ๋ณ€ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค(๋ฌธ์„œ์˜ ๋งํฌ๋œ ํ† ๋ก  ์ฐธ์กฐ).

  1. "์ธํ„ฐํŽ˜์ด์Šค" ๊ธฐ๋ฐ˜ ์ผ๋ฐ˜ ํŒจํ‚ค์ง€,
  2. ๋ช…์‹œ์ ์œผ๋กœ ์ผ๋ฐ˜ ํŒจํ‚ค์ง€.

1. ํŠน๋ณ„ํ•œ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜ ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ container/ring ๋Š” ์ „๋ฌธํ™”์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€์— ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์œผ๋กœ ๊ต์ฒดํ•˜๊ณ  ์ˆœํ™˜ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์—ฌ๊ธฐ์—์„œ "ํŠนํ™”"๋ฅผ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ํ•ด๋‹น ํŒจํ‚ค์ง€ ์ž์ฒด๊ฐ€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋ฅผ ์ „๋ฌธํ™”ํ•  ๋•Œ "์ธํ„ฐํŽ˜์ด์Šค"๋ฅผ ์ „๋ฌธํ™”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ์‚ฌ์šฉ๋„ ์ „๋ฌธํ™”๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2. ๋‘ ๊ฐ€์ง€๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๊ฐ ๊ฐ€์ ธ์˜ค๊ธฐ์—์„œ ์žฌ๊ท€์  ๊ตฌ์ฒด์ ์ธ ์ „๋ฌธํ™”์ž…๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ/๋งคํฌ๋กœ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ "๋ถ€๋ถ„์ ์œผ๋กœ ์ ์šฉ๋œ ํŒจํ‚ค์ง€"๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ธฐ๋Šฅ์  ์ธก๋ฉด์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ํŒจํ‚ค์ง€๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๋ถ€๋ถ„์ ์ด๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ์ด๋ฅผ ์ „๋ฌธํ™”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ํ•˜๋‚˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@larsth ๊ฐ€ ์“ด ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•˜๋“ฏ, ์ง„์ง€ํ•œ ์ œ์•ˆ์„ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋จผ์ € ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ตฌ์ถ•(๋˜๋Š” gccgo ํ”„๋ก ํŠธ์—”๋“œ์˜ ํฌํฌ์—์„œ ๊ตฌํ˜„)ํ•œ ๋‹ค์Œ ์ œ์•ˆ์„ ์‹คํ—˜ํ•˜์—ฌ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๊ทธ ํ•œ๊ณ„๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์‹œํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์•„์ด๋””์–ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด 4๊ฐœ์˜ ๋‹ค๋ฅธ ํ”„๋กœํ† ํƒ€์ž…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์™„์ „ํ•œ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, "๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํŒจํ‚ค์ง€ ์‚ฌ์šฉ" ์‚ฌ๋ก€๋ฅผ ๊ตฌํ˜„ํ•œ ์‚ฌ๋žŒ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

์ •ํ™•ํ•œ ์šฉ์–ด๋ฅผ ์•Œ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•„์ด๋””์–ด๋ฅผ ๋ฌธ์„œ์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, C++ ํ…œํ”Œ๋ฆฟ๋ณด๋‹ค ์ƒ์šฉ๊ตฌ๋ฅผ ๋œ ์ƒ์„ฑํ•˜์ง€๋งŒ ์œ ํ˜• ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ๋” ๋งŽ์ด ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” Ada์— ๋Œ€ํ•œ ์ข‹์€ ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ์Šต๋‹ˆ๊นŒ? _(์‹ค์ œ๋กœ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.)_

๋ฌผ๋ก , ๋‚ด Ada go-board๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. https://github.com/keean/Go-Board-Ada/blob/master/go.adb

์ด๊ฒƒ์€ ์ƒ๋‹นํžˆ ๋Š์Šจํ•œ ํ”„๋กœ๋•์…˜ ์ •์˜์ด์ง€๋งŒ ์ฝ”๋“œ๋Š” ์ตœ์ ํ™”๋˜๊ณ  C++ ๋ฒ„์ „๊ณผ ๊ฐ™์€ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•˜๋ฉฐ ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ช‡ ๋…„์— ๊ฑธ์ณ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. C++ ๋ฒ„์ „๋„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/keean/Go-Board/blob/master/go.cpp

์ด๊ฒƒ์€ Ada ์ œ๋„ค๋ฆญ์ด C++ ํ…œํ”Œ๋ฆฟ๋ณด๋‹ค ๊น”๋”ํ•œ ์†”๋ฃจ์…˜์ž„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์–ด๋ ต์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค). ๋ฐ˜๋ฉด์— ์ฐธ์กฐ ๋ฐ˜ํ™˜์— ๋Œ€ํ•œ ์ œํ•œ์œผ๋กœ ์ธํ•ด Ada์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋น ๋ฅด๊ฒŒ ์•ก์„ธ์Šคํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. .

๋ช…๋ นํ˜• ์–ธ์–ด์— ๋Œ€ํ•œ ํŒจํ‚ค์ง€ ์ œ๋„ค๋ฆญ ์‹œ์Šคํ…œ์„ ์‚ดํŽด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด Ada๋ฅผ ๊ฐ€์žฅ ์ž˜ ์‚ดํŽด๋ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๋‹ค์ค‘ ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ๊ฐ€๊ณ  ๋ชจ๋“  OO ํ•ญ๋ชฉ์„ Ada์— ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒƒ์€ ์ˆ˜์น˜์Šค๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค. Ada๋Š” ํ–ฅ์ƒ๋œ Pascal์ด๊ณ  Pascal์€ ์ž‘๊ณ  ์šฐ์•„ํ•œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. Pascal๊ณผ Ada ์ œ๋„ค๋ฆญ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ž‘์€ ์–ธ์–ด์˜€์ง€๋งŒ ์ œ ์ƒ๊ฐ์—๋Š” ํ›จ์”ฌ ๋” ๋‚˜์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Ada์˜ ์ดˆ์ ์ด OO ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์˜ฎ๊ฒจ๊ฐ”๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ๋ฌธ์„œ์™€ ์ œ๋„ค๋ฆญ์œผ๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ์ œ๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.

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

๋Ÿฐํƒ€์ž„ ๋‹คํ˜•์„ฑ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ํŒจํ‚ค์ง€๋ฅผ ์ผ๊ธ‰์œผ๋กœ ๋งŒ๋“ค์–ด ํŒจํ‚ค์ง€ ์„œ๋ช…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•จ์ˆ˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ถˆํ–‰ํžˆ๋„ ์ข…์† ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์Šค์นผ๋ผ์— ๋Œ€ํ•œ ์ข…์† ๊ฐœ์ฒด ์œ ํ˜•์—์„œ ์ˆ˜ํ–‰ํ•œ ์ž‘์—… ์ฐธ์กฐ). ์›๋ž˜ ์œ ํ˜• ์‹œ์Šคํ…œ).

๊ทธ๋ž˜์„œ ํŒจํ‚ค์ง€ ์ œ๋„ค๋ฆญ์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ Ada๊ฐ€ ๋ชจ๋“  ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ˆ˜์‹ญ ๋…„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๋•์…˜ ์ œ๋„ค๋ฆญ ์‹œ์Šคํ…œ์„ ์‚ดํŽด๋ณด๊ณ  ํ”„๋กœ๋•์…˜์—์„œ ์ •์ œ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Ada๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์ผ๊ธ‰์ด ์•„๋‹ˆ๋ฉฐ ๋Ÿฐํƒ€์ž„ ๋‹คํ˜•์„ฑ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๋ถ€์กฑํ•˜๋ฉฐ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@keean ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค .

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๋Ÿฐํƒ€์ž„ ๋ฆฌํ”Œ๋ ‰์…˜์ด ์ž˜๋ชป๋œ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฑด ๋‚˜์ผ๋ฟ... ๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์ด์œ ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๋˜ํ•œ upthread๋ฅผ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

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


@keean ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

[...] ํŒจํ‚ค์ง€๊ฐ€ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋ ค๋ฉด ์ˆœ์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ํŒจํ‚ค์ง€ ์ˆ˜์ค€์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹˜)

๊ทธ๋ฆฌ๊ณ  ๋ถˆ๋ณ€ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆ์ˆœํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@egonelbre ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ํ•˜๋‚˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ถ„๋ช…ํžˆ ์—ผ๋‘์— ๋‘” ๊ฒƒ์€ "์ผ๊ธ‰ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํŒจํ‚ค์ง€"์™€ @keean ์ด ์ดํ›„์— ์–ธ๊ธ‰ํ•œ ์ƒ์‘ํ•˜๋Š” ๋Ÿฐํƒ€์ž„(๋™์ ) ๋‹คํ˜•์„ฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ํ•˜์ง€๋งŒ "์ผ๊ธ‰" ๋ชจ๋“ˆ์—๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Successor ML ๋ฐ MixML ์—์„œ์™€ ๊ฐ™์€ ์ผ๊ธ‰ ๊ฐ’์œผ๋กœ์„œ์˜ ๋ชจ๋“ˆ๊ณผ 1ML์—์„œ์™€ ๊ฐ™์ด ์ผ๊ธ‰ ์œ ํ˜•์ด ์žˆ๋Š” ์ผ๊ธ‰ ๊ฐ’๊ณผ ๊ตฌ๋ณ„๋˜๋Š” ๋ชจ๋“ˆ ๋ฐ ํ•„์š”ํ•œ ์ ˆ์ถฉ์•ˆ ๋ชจ๋“ˆ ์žฌ๊ท€(์ฆ‰ , ํ˜ผํ•ฉ )์—์„œ.

@keean ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„ ๋‹คํ˜•์„ฑ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ํŒจํ‚ค์ง€๋ฅผ ์ผ๊ธ‰์œผ๋กœ ๋งŒ๋“ค์–ด ํŒจํ‚ค์ง€ ์„œ๋ช…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•จ์ˆ˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ถˆํ–‰ํžˆ๋„ ์ข…์† ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์Šค์นผ๋ผ์— ๋Œ€ํ•œ ์ข…์† ๊ฐœ์ฒด ์œ ํ˜•์—์„œ ์ˆ˜ํ–‰ํ•œ ์ž‘์—… ์ฐธ์กฐ). ์›๋ž˜ ์œ ํ˜• ์‹œ์Šคํ…œ).

์ข…์† ์œ ํ˜•์ด๋ž€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? (ํŽธ์ง‘: ๋‚˜๋Š” ์ด์ œ ๊ทธ๊ฐ€ "๊ฐ’์— ์˜์กดํ•˜์ง€ ์•Š๋Š”" ํƒ€์ดํ•‘, ์ฆ‰ " ๊ฒฐ๊ณผ ์œ ํ˜•์ด [๋Ÿฐํƒ€์ž„?] ์ธ์ˆ˜ [์˜ ์œ ํ˜•]์— ์˜์กดํ•˜๋Š” ํ•จ์ˆ˜ "๋ฅผ ์˜๋ฏธํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.) ํ™•์‹คํžˆ ์˜ˆ๋ฅผ ๋“ค์–ด int ์˜ ๊ฐ’์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค F-ing ๋ชจ๋“ˆ ์€ ์‹œ์Šคํ…œ F ฯ‰ ์—์„œ ML ๋ชจ๋“ˆ์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐ "์ข…์†" ์œ ํ˜•์ด ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. @rossberg ๊ฐ€ ๋ชจ๋“  ๋‹จํ˜•์„ฑ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ดํ•‘ ๋ชจ๋ธ์„ ์žฌ๊ตฌ์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋‚ด๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋‹จ์ˆœํ™” ํ–ˆ์Šต๋‹ˆ๊นŒ?

์ƒ์„ฑ ํŒจํ‚ค์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ฌธ์ œ๋Š” ๋งŽ์€ ์ƒ์šฉ๊ตฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [โ€ฆ]
์œ ํ˜• ํด๋ž˜์Šค๋Š” ํ•จ์ˆ˜์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์œ ํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ์•”์‹œ์ ์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์ด ์ƒ์šฉ๊ตฌ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ ์šฉ ๊ฐ€๋Šฅํ•œ ML ํŽ‘ํ„ฐ๊ฐ€ ์žˆ๋Š” ์ƒ์šฉ๊ตฌ๋„ ์—†๋‚˜์š”? typeclass ๊ตฌํ˜„ ์ธ์Šคํ„ด์Šค์˜ ์ „์—ญ ๊ณ ์œ ์„ฑ ๊ธฐ์ค€์˜ ๊ณ ์œ ํ•œ ๋ฐ˜๋ชจ๋“ˆ์„ฑ ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ œํ•œ์„ ๋„์ž… ํ•˜์ง€ ์•Š๊ณ  ๊ฐ„๊ฒฐํ•จ ์„ ์œ ์ง€ํ•˜๋Š” typeclass ๋ฐ ML functor(๋ชจ๋“ˆ)์˜ ์•Œ๋ ค์ง„ ํ†ตํ•ฉ์€ ์—†์Šต๋‹ˆ๋‹ค .

Typeclasses ๋Š” ๊ฐ ์œ ํ˜•์„ ํ•œ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ œํ•œ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด newtype ๋ž˜ํผ ์ƒ์šฉ๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์˜ ๋˜ ๋‹ค๋ฅธ ์˜ˆ ์ž…๋‹ˆ๋‹ค. Afaics, @keean ์€ data ์œ ํ˜•์„ ๋ž˜ํ•‘ํ•˜์—ฌ ๊ฐ’ ์œ ํ˜•์— ๋Œ€ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ด€๊ณ„์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒ๋œ Relation ๋กœ ์•”์‹œ์  ์„ ํƒ์„ ์žฌ์ •์˜ํ•˜์—ฌ ์œ ํ˜• ํด๋ž˜์Šค ์ •๋ ฌ ์˜ˆ์ œ ์—์„œ ์ด ์ œํ•œ์„ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ „์ˆ ์ด ๋ชจ๋“ˆํ™”์˜ ๋ชจ๋“  ๋ณ€ํ˜•์— ์ผ๋ฐ˜์ ์ธ์ง€ ์—ฌ๋ถ€. ๊ทธ๋Ÿฌ๋‚˜ ๋” ์ผ๋ฐ˜ํ™”๋œ ์†”๋ฃจ์…˜(๊ณ ์•„๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ตฌํ˜„์— ๋Œ€ํ•ด ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹Œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์•„ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์ œ์•ˆ๋œ ๋ฒ„์ „ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ๊ฐœ์„ ์œผ๋กœ ๊ณ ์•„ ์ œํ•œ ๊ณผ ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ๋Š” ์ „์—ญ ๊ณ ์œ ์„ฑ์˜ ๋ชจ๋“ˆ์„ฑ ๋ฌธ์ œ๋ฅผ ๊ฐœ์„  ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Œ) ๋ชจ๋“  typeclass interface ์— ์•”์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ , ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผ๋ฐ˜ ์•”์‹œ์  ์ผ์น˜๋กœ ์„ค์ •๋˜์ง€๋งŒ ์ง€์ •๋˜๋ฉด(๋˜๋Š” ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค๋ฅธ 2 ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ) ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ๊ตฌํ˜„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ’ ๋ชฉ๋ก์—์„œ (๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ํŠน์ • implement ์ธ์Šคํ„ด์Šค์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ผ๋ฐ˜ํ™”๋œ ๋ชจ๋“ˆ์‹ ์ผ์น˜์ž…๋‹ˆ๋‹ค). ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก์€ ๊ตฌํ˜„์ด ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ž์œ ๋„์—์„œ ๊ตฌ๋ณ„๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: ๋‘ ๊ฐœ์˜ ์ง๊ต ์ „๋ฌธํ™”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ). ์›ํ•˜๋Š” ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹Œ ํŠน์ˆ˜ํ™”๋Š” ํ•จ์ˆ˜ ์„ ์–ธ์ด๋‚˜ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ, ์˜ˆ: f<non-default>(โ€ฆ) .

๊ทธ๋ ‡๋‹ค๋ฉด ์œ ํ˜• ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ๋ชจ๋“ˆ์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ํŒจํ‚ค์ง€ ๋ชจ๋“ˆ์ด ์—ฌ๋Ÿฌ ํŒŒ์ผ์— ๊ฑธ์ณ ์žˆ๊ณ  ์•”์‹œ์ ์œผ๋กœ ๋‚ด์šฉ์„ ์—ด ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ์ ์—์„œ ํ•ด๋‹น ๋ชฉ์ ์„ ์œ„ํ•ด typeclass๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ ํ•ฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— (โ† ํด๋ฆญํ•  ์ค‘์š”ํ•œ ๋งํฌ) ๋Œ€์ฒด์— ๋Œ€ํ•ด์„œ๋งŒ Afaics ์ถ”๊ฐ€ ์ƒ์šฉ๊ตฌ ์—†์ด ๋ชจ๋“ˆ์„ ๋ฒ”์œ„์— ๋„ฃ์Šต๋‹ˆ๋‹ค . ๋”ฐ๋ผ์„œ ์•„๋งˆ๋„ _syntactical-only_ replacement-only(์ฒซ ๋ฒˆ์งธ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹˜) ํŒจํ‚ค์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋กœ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ•จ์ˆ˜ ์ˆ˜์ค€์— ๋Œ€ํ•ด ๋‚˜์ค‘์— ์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋Šฅ๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋ฐ ๋น„์ค‘์ฒฉ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ชจ๋“ˆ ์ˆ˜์ค€์˜ ์ผ๋ฐ˜์„ฑ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํ•ฉ๋ฆฌ์ ์ธ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์„ฑ. ๋งคํฌ๋กœ ๊ฐ€ ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ํ˜•์ด ์ง€์ •๋˜์—ˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด ๊ตฌ๋ฌธ์ ("์ „์ฒ˜๋ฆฌ๊ธฐ"๋ผ๊ณ ๋„ ํ•จ) ๋Œ€์ฒด์ธ์ง€ โ€‹โ€‹์—ฌ๋ถ€์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์ด ์ง€์ •๋˜๋ฉด ๋ชจ๋“ˆ์€ ์œ ํ˜• ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” PL์˜ ์ค‘๋ณต๋˜๋Š” ํŒจ๋Ÿฌ๋‹ค์ž„/๊ฐœ๋…์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ค‘๋ณต์˜ ์ƒํ˜ธ ์ž‘์šฉ์œผ๋กœ ์ธํ•œ ์ž ์žฌ์ ์ธ ๋ชจ์„œ๋ฆฌ ๊ฒฝ์šฐ(์˜ˆ : ML ํŽ‘ํ„ฐ์™€ ์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ๋•Œ ์˜ ๊ฒฝ์šฐ)์˜ ๊ด€์ ์—์„œ ๋ชจ๋‘ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ). ๋‚ด๋ณด๋‚ธ ์„œ๋ช…์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“ˆ ๋‚ด ์บก์Šํ™”๋œ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์ˆ˜์ •์œผ๋กœ ์ธํ•ด ๋ชจ๋“ˆ ์†Œ๋น„์ž๊ฐ€ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜•์‹ํ™”๋œ ๋ชจ๋“ˆ์€ ๋” ๋ชจ๋“ˆ์ ์ž…๋‹ˆ๋‹ค(์•ž์„œ ์–ธ๊ธ‰ํ•œ ์œ ํ˜• ํด๋ž˜์Šค ์ค‘์ฒฉ ๊ตฌํ˜„ ์ธ์Šคํ„ด์Šค์˜ ๋ชจ๋“ˆํ™” ๋ฐฉ์ง€ ๋ฌธ์ œ ์ œ์™ธ). ์ด์— ๋Œ€ํ•œ @keean์˜ ์ƒ๊ฐ์„ ์ฝ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

[...] ๋‹คํ˜•์„ฑ ์žฌ๊ท€ ๋ฐ ์กด์žฌ ์œ ํ˜•์— ๋Œ€ํ•œ ์˜ˆ์™ธ(์ด๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์บ์ŠคํŒ…ํ•  ์ˆ˜ ์—†๋Š” ๋ณ€ํ˜•์ด๋ฉฐ ๋ณ€ํ˜•์ด ํ™•์ธํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ).

๋‹ค๋ฅธ ๋…์ž๋“ค์„ ๋•๊ธฐ ์œ„ํ•ด. "๋‹คํ˜•์„ฑ ์žฌ๊ท€"๋Š” ์ƒ์œ„ ์œ ํ˜•, ์˜ˆ๋ฅผ ๋“ค์–ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์„ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ผํ™”ํ•  ์ˆ˜ ์—†๋Š” ๋Ÿฐํƒ€์ž„์— ์„ค์ •๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ฝœ๋ฐฑ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์กด์žฌ ์œ ํ˜•์€ ๋‚ด๊ฐ€ ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ Rust์˜ ํŠน์„ฑ ๊ฐ์ฒด์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ€์ƒ ์ƒ์†์„ ์„œ๋ธŒํด๋ž˜์‹ฑํ•˜๋Š” class ๋ณด๋‹ค ํ‘œํ˜„์‹ ๋ฌธ์ œ์—์„œ ๋‚˜์ค‘์— ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ธฐ์ข… ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์–ป๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ํ‘œํ˜„์‹์—์„œ ํ™•์žฅ์— ๊ฐœ๋ฐฉ์ ์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค . ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š” ๊ณต์šฉ์ฒด ๋˜๋Š” O(log n) ์„ฑ๋Šฅ ๋น„์šฉ์ด ์žˆ๋Š” 3 ์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

1 ์œ„์˜ ์˜ˆ์—์„œ HKT๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” SET ๋Š” elem ์œ ํ˜•์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. set<elem> set ์˜ ์ผ๋ฐ˜ ์œ ํ˜•์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. set<elem> .

2 ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ์ด ์•„๋‹Œ ๊ตฌํ˜„์ด ๋‘ ๊ฐœ ์ด์ƒ ์กด์žฌํ•˜๊ณ  ๊ธฐ๋ณธ ๊ตฌํ˜„์ด ์—†๋Š” ๊ฒฝ์šฐ ์„ ํƒ์ด ๋ชจํ˜ธํ•˜๋ฏ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3 ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ชฉ๋ก๊ณผ ๊ฐ™์€ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๋˜‘๋˜‘ํ•œ ๊ฒฝ์šฐ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ์ „์ฒด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ณต์‚ฌํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

func pick(a CollectionOfT, count uint) []T ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์ œ๋„ค๋ฆญ์˜ ์ข‹์€ ์˜ˆ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(https://github.com/golang/go/issues/23717์—์„œ):

// pick returns a slice (len = n) of pseudorandomly chosen elements 
// in unspecified order from c which is an array, slice, or map.
for i, e := range pick(c, n) {

์—ฌ๊ธฐ์„œ ์ธํ„ฐํŽ˜์ด์Šค ์ ‘๊ทผ ๋ฐฉ์‹์€{} ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด C++ ํ…œํ”Œ๋ฆฟ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์ฃผ์š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์˜ค๋ฒ„๋กœ๋“œ ํ•ด๊ฒฐ์— ์˜์กดํ•œ๋‹ค๋Š” ์ ์„ ๋ช‡ ๋ฒˆ ์–ธ๊ธ‰ํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Herb Sutter๋„ ๊ฐ™์€ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ œ C++์—์„œ ์ปดํŒŒ์ผ ํƒ€์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Go reflect ํŒจํ‚ค์ง€์™€ Go์˜ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ด์ „ ์ œ์•ˆ๊ณผ ๊ณตํ†ต๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ธŒ. Chr.

๊ตฌ๋ฌธ ๋ฐ”์ดํฌ์‰๋”ฉ:

constraint[T] Array {
    :[#]T
}

๋  ์ˆ˜์žˆ๋‹ค

type [T] Array constraint {
    _ [...]T
}

Go to me์™€ ๋” ๋น„์Šทํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. :-)

์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€๋Š” : ๋ฅผ _ ๋กœ ๋ฐ”๊พธ๊ณ  # ๋ฅผ ... ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์›ํ•˜์‹ ๋‹ค๋ฉด ํ•˜์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์•„์š”.

๋˜ ๋‹ค๋ฅธ ๊ฒƒ์€ constraint[T] Array ๋ฅผ type[T] Array constraint ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ ์ œ์•ฝ ์กฐ๊ฑด์ด ์œ ํ˜•์ด๋ผ๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ œ๊ฐ€ ์˜ณ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹์ ์œผ๋กœ ์ œ์•ฝ ์กฐ๊ฑด์€ ๋ชจ๋“  ์œ ํ˜• ์ง‘ํ•ฉ์— ๋Œ€ํ•œ _predicate_์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ์ง‘ํ•ฉ์—์„œ { true , false } ์ง‘ํ•ฉ์œผ๋กœ์˜ ๋งคํ•‘.
๋˜๋Š” ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋‹จ์ˆœํžˆ _์œ ํ˜•์˜_ ์ง‘ํ•ฉ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
_a_ ์œ ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ธŒ. Chr.

constraint ๊ฐ€ interface ๊ฐ€ ์•„๋‹Œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

type [T io.Writer] List struct { 
    element T; 
    next *List[T];
}

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ ์ œ์•ˆ๊ณผ ํ•จ๊ป˜ ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ์กฐ๊ธˆ ๋” ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. #23796 ๋˜ํ•œ ์ œ์•ˆ ์ž์ฒด์— ์•ฝ๊ฐ„์˜ ์žฅ์ ์„ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ sum ์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์–ด๋–ค ํ˜•์‹(#19412)์œผ๋กœ ์ˆ˜๋ฝ๋˜๋ฉด ํ•ด๋‹น ์œ ํ˜•์„ ์ œํ•œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” constraint ํ‚ค์›Œ๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํฐ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ณ  ๋ฐฉ์‹ฌ์œผ๋กœ ์ธํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด์™€ ๊ฐ™์€ ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, bikeshedding ๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ณผ๋ฐ€์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ •์˜ ๋์— ์ œ์•ฝ ์กฐ๊ฑด์„ ๋‚˜์—ดํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

// similar to the map[T]... syntax
// also no constraint
type List[T] struct {
    element T
    next *List[T]
}

// with constraint
type List[T] struct {
    element T
    next *List[T]
} where T is io.Writer | encoding.BinaryMarshaler

type BigConstraint constraint {
     io.Writer
     SomeFunc() int
     AnotherFunc()
     AField int64
     StringField string
}


// with predefined constraint
type List[T, U] struct {
    element T
    val U
    next *List[T, U]
} where T is BigConstraint | encoding.BinaryMarshaler,
    U is io.Reader

@urandom : ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ์•”์‹œ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋Œ“๊ธ€ ์˜ @surlykke ์ œ์•ˆ ์€ ๋‹ค๋ฅธ Go ๊ตฌ๋ฌธ์— ํ›จ์”ฌ ๋” ๊ฐ€๊น๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@surlykke ์ œ์•ˆ์„œ์— ์ด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋‹ต์ด ์žˆ์œผ๋ฉด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์˜ ์‚ฌ์šฉ์€ ๋‚ด์žฅ ์Šคํƒ€์ผ ๊ธฐ๋Šฅ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜์ค€์˜ len์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๊นŒ? ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์€ ํ—ˆ์šฉ๋˜๋Š” ๊ฐ ์ž…๋ ฅ๋งˆ๋‹ค ๋‹ค๋ฅด๋ฏ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค ์ด๊ฒƒ์ด ๋” ๋‚˜์€ ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

์ปฌ๋ ‰์…˜์€ ๋˜ ๋‹ค๋ฅธ ์šฉ๋„์ž…๋‹ˆ๋‹ค.

// An unordered collection of comparable items.
type [T Comparable] Set []T

func (a Set) Diff(from Set) Set {
    // the implementation is the same as one with
    //     type Comparable interface { Equal(Comparable) bool }
    //     type Set []Comparable
}

// compile error
d := Set[int]{1, 2}.Diff(Set[string]{โ€œabcโ€, โ€œdefโ€})

// Go 1, easier to read but runtime error
d := Set{1, 2}.Diff(Set{โ€œabcโ€, โ€œdefโ€})

์ปฌ๋ ‰์…˜ ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๊ฐ€๋…์„ฑ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด Go 1 ์ œ๋„ค๋ฆญ๋ณด๋‹ค ํฐ ์Šน๋ฆฌ๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ์–ด๋–ค ํ˜•ํƒœ์˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์šฐ๋ฆฌ๋Š” C++ ํ…œํ”Œ๋ฆฟ์˜ ์‹ค์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด ์–ผ๋งˆ๋‚˜ ํ‘œํ˜„๋ ฅ์ด ์žˆ์–ด์•ผ ํ•˜๋Š๋ƒ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•œ์ชฝ ๋์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€์ ํ–ˆ๋“ฏ์ด ๋งŽ์€ ์œ ์šฉํ•œ ํŒจํ„ด์€ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์บก์ฒ˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

๋‹ค๋ฅธ ๊ทน๋‹จ์—๋Š” ๋‚ด๊ฐ€ ์ด ๋ฌธ์„œ ์—์„œ ์ œ์•ˆํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Go ์ฝ”๋“œ ์ž์ฒด๋ฅผ ์ œ์•ฝ ์–ธ์–ด๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฑฐ์˜ ๋ชจ๋“  ์ œ์•ฝ ์กฐ๊ฑด์„ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@jba
์ข€ ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค. Go์— ๋žŒ๋‹ค ๊ตฌ๋ฌธ์ด ์žˆ๋‹ค๋ฉด ์ข€ ๋” ์ž…๋ง›์— ๋งž์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ์œ ํ˜•์ด ์ผ์ข…์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Go์— ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func equal[T](x, y T) bool
    where T is runtime.Equitable {
    return x == y
}

func copyable[T](x, y []T) int {
    return copy(x, y)
}

๋˜๋Š” ์ด๋Ÿฌํ•œ ๋ผ์ธ์„ ๋”ฐ๋ผ ๋ญ”๊ฐ€.

๋ฌธ์ œ๊ฐ€ ๋‚ด์žฅ ๊ธฐ๋Šฅ ํ™•์žฅ๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์ด๋ผ๋ฉด ๋ฌธ์ œ๋Š” ์–ด๋Œ‘ํ„ฐ ์œ ํ˜•์„ ์ƒ์„ฑํ•˜๋Š” ์–ธ์–ด ๋ฐฉ์‹์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, https://github.com/golang/go/issues/16721 ๋ฐ sort.Slice ๋’ค์— ์žˆ๋Š” ์ „์ฒด ์ด์œ ๋Š” sort.Interface์™€ ๊ด€๋ จ์ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
https://github.com/golang/go/issues/21670#issuecomment -325739411์„ ๋ณด๋ฉด @Sajmani ์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฆฌํ„ฐ๋Ÿด์ด ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด๋Š” ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋นŒํŠธ์ธ๊ณผ ์‰ฝ๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์š”์†Œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Iterator์˜ ๋‹ค์Œ ์ •์˜๋ฅผ ๋ณด์‹ญ์‹œ์˜ค.

type [T] Iterator interface {
    Next() (elem T, done bool)
}

print ๊ฐ€ ๋‹จ์ˆœํžˆ ๋ชฉ๋ก์„ ๋ฐ˜๋ณตํ•˜๊ณ  ๊ทธ ๋‚ด์šฉ์„ ์ธ์‡„ํ•˜๋Š” ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ ๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜์—ฌ print ์— ๋Œ€ํ•œ ๋งŒ์กฑ์Šค๋Ÿฌ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

func SliceIterator(slice []T) Iterator {
    i := 0
    return Iterator{
        Next: func() (elem int, done bool) {
            v := slice[i]
            if i+1 == len(slice) {
                return v, true
            }
            i++
            return v, false
        },
    }
}

func main() {
    arr := []int{1,2,3,4,5}
    // SliceIterator works for an arbitrary slice
    print(SliceIterator(arr))
}

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

type ListNode struct {
    v string
    next *ListNode
}
func (l *ListNode) Iterator() Iterator {
    ptr := l
    return Iterator{
        Next: func() (elem int, done bool) {
            v := ptr.v
            if ptr.next == nil {
                return v, true
            }
            ptr = ptr.next
            return v, false
        },
    }
}

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

@pciet '์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜์ค€'์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Go์—๋Š” ๋ฐฐ์—ด, ๋ฐฐ์—ด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ, ์Šฌ๋ผ์ด์Šค, ๋ฌธ์ž์—ด ๋ฐ ์ฑ„๋„์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์žฅ len ํ•จ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋‚ด ์ œ์•ˆ์—์„œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ธฐ๋ณธ ์œ ํ˜•์œผ๋กœ ์ด๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ–๋„๋ก ์ œํ•œ๋˜๋Š” ๊ฒฝ์šฐ , len ๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@pciet Comparable ์ œ์•ฝ/์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์— ๋Œ€ํ•ด. ๋‹ค์Œ์„ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ(์ธํ„ฐํŽ˜์ด์Šค ๋ณ€ํ˜•):

type Comparable interface { Equal(Comparable) bool }
type Set []Comparable

๊ทธ๋Ÿฐ ๋‹ค์Œ Comparable ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ Set ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค.

constraint [T] Comparable { Equal(t T) bool }
type [T Comparable[T]] Set []T
...
type FooSet Set[Foo] // Where Foo satisfies constraint Comparable

์—ฌ๊ธฐ์„œ Foo ์œ ํ˜•์˜ ๊ฐ’๋งŒ FooSet ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋” ๊ฐ•๋ ฅํ•œ ์œ ํ˜• ์•ˆ์ „์„ฑ์ž…๋‹ˆ๋‹ค.

@urandom ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ €๋Š” ๋‹ค์Œ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

type MyConstraint constraint {....}

๋‚˜๋Š” ์ƒ์ˆ˜๊ฐ€ ์œ ํ˜•์ด๋ผ๊ณ  ๋ฏฟ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์Œ์„ ์ ˆ๋Œ€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

var myVar MyConstraint

๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ œ์•ฝ ์กฐ๊ฑด์ด ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ๋Š” ๋˜ ๋‹ค๋ฅธ ํ‘œ์‹œ์ž…๋‹ˆ๋‹ค.

@urandom Bikeshedding์—์„œ: ์ œ์•ฝ ์กฐ๊ฑด์€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ”๋กœ ์˜†์— ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋œ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

func MyFunc(i) {
     if (i>0) fmt.Println("It's positive")
} with i being an integer

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋จผ์ € func MyFunc(i) ๋ฅผ ์ฝ๊ณ  ์ด๊ฒƒ์ด ํ•จ์ˆ˜ ์ •์˜์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ i ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ๋๊นŒ์ง€ ์ด๋™ํ•œ ๋‹ค์Œ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์œผ๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์ธ ์ •์˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋ถ„๋ช…ํžˆ ์ด ๋…ผ์˜๋Š” Go์— ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์ œ๋„ค๋ฆญ์ด ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋…ผ์˜์™€ ์ง๊ตํ•ฉ๋‹ˆ๋‹ค.

@surlykke
ํƒ€์ž…์ด ์•„๋‹ˆ์–ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์—ฌ๋Ÿฌ ์œ ํ˜•์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด๋ฆ„์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ Rust ๊ตฌ๋ฌธ์„ ๋”ฐ๋ฅด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func MyFunc[I](i I) int64
     where I is being an integer {
   return 42
}

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

ํ›„์„ธ๋ฅผ ์œ„ํ•ด @surlykke , ์ œ์•ˆ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
https://docs.google.com/document/d/1vrAy9gMpMoS3uaVphB32uVXX4pi-HnNjkMEgyAHX4N4

๋ชจ๋“  ์ œ์•ˆ์„ "์ปดํŒŒ์ผ"ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘์—๊ฒŒ ์ œ๊ธฐํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์€ ์ œ๋„ค๋ฆญ ์œ ํ˜•์˜ ๋‹ค์–‘ํ•œ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์ „๋ฌธํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. type-params ์ œ์•ˆ์—์„œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ ์ธ์Šคํ„ด์Šคํ™”๋œ ์œ ํ˜•์— ๋Œ€ํ•ด ๋™์ผํ•œ ํ…œํ”Œ๋ฆฟ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์œ ํ˜• ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๋ ค๋ฉด ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ์œ ํ˜• ์ „ํ™˜์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ์œ ํ˜• ์ „ํ™˜์„ ๋ณผ ๋•Œ ๊ฐ ์–ด์„ค์…˜์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๊ตฌํ˜„์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ฃผ์žฅ๋œ ๊ตฌ์กฐ์ฒด์˜ ์ค‘์ฒฉ๋œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ฝ”๋“œ ์ƒ์„ฑ์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธก๋ฉด์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ํ™”์™€ ๋„ˆ๋ฌด ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

์‹ค์ œ ์‹œ๋‚˜๋ฆฌ์˜ค: math/bits ํŒจํ‚ค์ง€์˜ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜๋ฉด ๊ฐ uintXX $์— ๋Œ€ํ•ด $ OnesCount ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ˜•์‹ ์ฃผ์žฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ธ ๋น„ํŠธ ์กฐ์ž‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ type-assertion์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ™˜๋œ ๊ฒฝ์šฐ

func OnesCount(x T) int {
    switch x.(type) {
    case uint:
        // separate uint functionality...
    case uint8:
        // separate uint8 functionality...
    case uint16:
        // separate uint16 functionality...
    case uint32:
        // separate uint32 functionality...
    case uint64:
        // separate uint64 functionality...
    }
}

์ „ํ™”

var x uint8 = 255
bits.OnesCount(x)

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒ์„ฑ๋œ ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ ์ด๋ฆ„์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ).

func $OnesCount_uint8(x uint8) {
    // separate uint8 functionality...
}

@jba ํฅ๋ฏธ๋กœ์šด ์ œ์•ˆ์ด์ง€๋งŒ ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ์ฃผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜ ์ž์ฒด์˜ ์ •์˜๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ •์˜ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค.

"ํ•จ์ˆ˜์— ์‚ฌ์šฉ๋œ ์—ฐ์‚ฐ์ž"๋ฅผ ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ์— ์‚ฌ์šฉ๋œ ์—ฐ์‚ฐ์ž์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ํฌํ•จํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์–ด๋–ค ์ด์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@bcmills ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ์‚ฌ์–‘์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ์ •์  ์ž…๋ ฅ๊ณผ ๋™์ผํ•œ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ๋” ์ผ์ฐ ์žก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„์ด ์‚ฌ์–‘, ์ฆ‰ C++ ํ…œํ”Œ๋ฆฟ์ธ ๊ฒฝ์šฐ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ž ์žฌ์ ์œผ๋กœ ์ข…์† ํ•ญ๋ชฉ์ด ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜์ค‘์— ์ข…์† ํ•ญ๋ชฉ์ด ๋‹ค์‹œ ์ปดํŒŒ์ผ๋˜๊ณ  ๋ฐœ๊ฒฌ์ž๊ฐ€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ดํ•ดํ•  ์ปจํ…์ŠคํŠธ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ํŒจํ‚ค์ง€์˜ ์‚ฌ์–‘์œผ๋กœ ๋กœ์ปฌ์—์„œ ํŒŒ์†์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mandolyte ์–ด๋””์— ์ถ”๊ฐ€ํ•ด์•ผ ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. '์ œ์•ฝ์ด ์žˆ๋Š” ์ œ๋„ค๋ฆญ'์ด๋ผ๋Š” '์ œ๋„ค๋ฆญ ์ ‘๊ทผ ๋ฐฉ์‹' ์•„๋ž˜์˜ ๋‹จ๋ฝ์ด ์•„๋‹๊นŒ์š”?
์ด ๋ฌธ์„œ์—๋Š” ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋งŽ์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด ์ œ์•ˆ์ด ์–ธ๊ธ‰๋  ๋‹จ๋ฝ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ œํ•œ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹๋„ ๊ฑฐ๊ธฐ์— ๋‚˜์—ด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@egonelbre ์ •๋ง ์ข‹๋„ค์š”. ๊ฐ์‚ฌ ํ•ด์š”!

@jba
๋‹น์‹ ์˜ ์ œ์•ˆ์€ ๋งˆ์Œ์— ๋“ค์ง€๋งŒ golang์—๊ฒŒ๋Š” ๋„ˆ๋ฌด ๋ฌด๊ฑฐ์šด ๊ฒƒ ๊ฐ™์•„์š”. ๊ทธ๊ฒƒ์€ C++์˜ ๋งŽ์€ ํ…œํ”Œ๋ฆฟ์„ ์ƒ๊ฐ๋‚˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์ฃผ์š” ๋ฌธ์ œ๋Š” ๊ทธ๊ฒƒ์œผ๋กœ ์ •๋ง ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ œํ•œ๋œ ์œ ํ˜• ์ง‘ํ•ฉ์ด ๊ฒน์น˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๊ฐœ์˜ ์ผ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฒน์น˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ์–ด๋ ค์šด ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ƒ์„ฑ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์˜ ์•”์‹œ์  ์ œ์•ฝ์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๋ฐ ๊ฐ•๋ ฅํžˆ ๋™์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ C++ ํ…œํ”Œ๋ฆฟ์˜ ๊ฐ€์žฅ ์‹ฌ๊ฐํ•œ ์˜ค์ž‘๋™ ์ค‘ ํ•˜๋‚˜๋กœ ๋„๋ฆฌ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

  • ์ œ์•ฝ ์กฐ๊ฑด์€ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. godoc์€ ์ด๋ก ์ ์œผ๋กœ ๋ชจ๋“  ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ฌธ์„œ์— ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•”์‹œ์ ์œผ๋กœ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์†Œ์Šค ์ฝ”๋“œ์—์„œ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ด ๋•Œ๋ฌธ์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋งŒ ํ‘œ์‹œ๋˜๋Š” ์ถ”๊ฐ€ ์ œ์•ฝ ์กฐ๊ฑด์„ ์‹ค์ˆ˜๋กœ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์•ฝ ์กฐ๊ฑด์˜ ๋ช…์‹œ์  ์ง€์ •์„ ์š”๊ตฌํ•จ์œผ๋กœ์จ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๊ทธ๋“ค์ด ๋„์ž…ํ•˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ์ •ํ™•ํžˆ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ํ›จ์”ฌ ๋” ์ž„์‹œ๋กœ ํ—ˆ์šฉ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์„œ T, U ๋ฐ V์— ๋Œ€ํ•œ ์‹ค์ œ ์ œ์•ฝ ์กฐ๊ฑด์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ ํ—ˆ์šฉํ•˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด ์ข…๋ฅ˜์— ๋Œ€ํ•ด ๋ณด์ˆ˜์ ์ž…๋‹ˆ๋‹ค(์ฒœ์ฒœํžˆ ๊ทธ๋ฆฌ๊ณ  ์˜๋„์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Œ). ์–ด์จŒ๋“  ๋ณด์ˆ˜์ ์œผ๋กœ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์ด์™€ ๊ฐ™์€ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ค„๊นŒ์š”? "์˜ค๋ฅ˜: ์ž˜๋ชป๋œ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ถ€๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์— uv()๋ฅผ T์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"?
func[T, U, V] Foo(u U, v V) {
  var t T = u.v(V) + 1;
}
  • ๋‹ค๋ฅธ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜์—์„œ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์œ„์˜ ์ƒํ™ฉ์ด ๋” ์•…ํ™”๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ฝ๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ํ˜ธ์ถœ ์ˆ˜์‹ ์ž์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ์‚ดํŽด๋ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๋””๋ฒ„๊น…์€ ๋งค์šฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ์ œ์•ฝ ์กฐ๊ฑด์˜ ์†Œ์Šค๋ฅผ ์ฐพ๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋ˆ„์ถœํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด F ์— T ์œ ํ˜•์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ๊ณ  F ์ž‘์„ฑ์ž๊ฐ€ ํ•ด๋‹น ์š”๊ตฌ ์‚ฌํ•ญ์ด ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์•Œ์•„ ๋‚ด๋ ค๊ณ ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ช…๋ น๋ฌธ์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค(ํŠนํžˆ ์ผ๋ฐ˜ ํ˜ธ์ถœ ์ˆ˜์‹ ์ž์—์„œ ์˜จ ๊ฒฝ์šฐ). ๊ทธ๋Ÿฌ๋‚˜ F ์˜ ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ์ •๋ณด๋ฅผ ์›ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‹ค์ œ๋กœ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์‚ฌ์šฉ์ž์˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์—์„œ F ์˜ ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ๋ˆ„์ถœ๋ฉ๋‹ˆ๋‹ค. ๋”์ฐํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ž…๋‹ˆ๋‹ค.

@alerca

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

func[T, U, V] Foo(u U, v V) {
  var t T = u.v(V) + 1;
}

์•„๋‹ˆ์š”. $ V ๋Š” ์œ ํ˜•์ด๊ณ  t ๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— $ u.v(V) ๋Š” ๊ตฌ๋ฌธ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์˜๋„ํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func[T, U, V] Foo(u U, v V) {
    var _ T = u.v(v) + 1;
}

์—ฌ๊ธฐ์„œ T, U ๋ฐ V์— ๋Œ€ํ•œ ์‹ค์ œ ์ œ์•ฝ ์กฐ๊ฑด์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • V ์œ ํ˜•์€ ์ œํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • U ์œ ํ˜•์—๋Š” u.v V ์—์„œ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋˜๋Š” ์ผ๋ถ€ ์œ ํ˜•์˜ varargs๋ฅผ ํ—ˆ์šฉํ•˜๋Š” v ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• V .

    • U.v ๋Š” ํ•จ์ˆ˜ ์œ ํ˜•์˜ ํ•„๋“œ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ํ‹€๋ฆผ์—†์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์˜๋ฏธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. #23796์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • U.v ๋ฐ˜ํ™˜๋œ ์œ ํ˜•์€ 1 ์ƒ์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • U.v T ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. u.v(โ€ฆ) + 1 ๊ฐ€ T ์œ ํ˜•์˜ ๋ณ€์ˆ˜์— ํ• ๋‹น๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • U.v ์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์€ ์ˆซ์ž์ด๊ณ  T ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ T ์œ ํ˜•์€ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋„ค, ๋งž์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ƒ๋žตํ•˜๋ฉด ํ•ด๋‹น ์ œ์•ฝ ์กฐ๊ฑด์ด ์•”์‹œ์ ์ด๋“  ์•„๋‹ˆ๋“  ์‹ฌ๊ฐํ•œ ๊ฒฐํ•จ์ด ๋ฉ๋‹ˆ๋‹ค. IMO์—์„œ ์ œ์•ฝ์˜ ๋” ์ค‘์š”ํ•œ ์—ญํ• ์€ ๋ชจํ˜ธ์„ฑ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ์ œ์•ฝ ์กฐ๊ฑด์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” u.v ๋ฅผ ๋‹จ์ผ ์ธ์ˆ˜ ๋˜๋Š” ๊ฐ€๋ณ€ ๋ฉ”์„œ๋“œ๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๋ชจํ˜ธ์„ฑ์€ ๊ตฌ์กฐ์ฒด ์œ ํ˜•๊ณผ ๋ณตํ•ฉ ์œ ํ˜•์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด์•ผ ํ•˜๋Š” ๋ฆฌํ„ฐ๋Ÿด์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

func[T] Foo() (t T) {
    x := 42;
    t = T{x: "some string"}  // Is x an index, or a field name?
    _ = x
}

์–ด์จŒ๋“  ๋ณด์ˆ˜์ ์œผ๋กœ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์ด์™€ ๊ฐ™์€ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ค„๊นŒ์š”? "์˜ค๋ฅ˜: ์ž˜๋ชป๋œ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ถ€๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์— uv()๋ฅผ T์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"?

์ด ์˜ˆ์ œ์—์„œ ์ถฉ๋Œํ•˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด ๋ณด์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์—‡์„ ์š”๊ตฌํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. "๋ถˆ๋ฒ• ๊ตฌ์†"์ด๋ž€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

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

๋ชจ๋“  ๊ด€๋ จ ์ œ์•ฝ ์กฐ๊ฑด์ด ์œ ํ˜• ์‹œ์Šคํ…œ์œผ๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค(https://github.com/golang/go/issues/22876#issuecomment-347035323 ์ฐธ์กฐ). ๋Ÿฐํƒ€์ž„ ํŒจ๋‹‰์œผ๋กœ ์ธํ•ด ์ผ๋ถ€ ์ œ์•ฝ ์กฐ๊ฑด์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ๊ฒฝํ•ฉ ๊ฐ์ง€๊ธฐ์— ์˜ํ•ด ์‹œํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์œ„ํ—˜ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์€ ๋ฌธ์„œํ™”๋  ๋ฟ ์ „ํ˜€ ๊ฐ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ชจ๋“  "๋‚ด๋ถ€ ์„ธ๋ถ€ ์ •๋ณด ๋ˆ„์ถœ"์€ ์–ด๋Š ์ •๋„์ž…๋‹ˆ๋‹ค. (https://xkcd.com/1172/๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.)

์˜ˆ๋ฅผ ๋“ค์–ด, [โ€ฆ] F์˜ ์ž‘์„ฑ์ž๊ฐ€ ํ•ด๋‹น ์š”๊ตฌ ์‚ฌํ•ญ์ด ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์•Œ์•„๋‚ด๋ ค๊ณ  ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฌธ์žฅ์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€(ํŠนํžˆ ์ผ๋ฐ˜ ํ˜ธ์ถœ ์ˆ˜์‹ ์ž์—์„œ ์˜จ ๊ฒฝ์šฐ) ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฒฝ๊ณ ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ F์˜ ์‚ฌ์šฉ์ž๋Š” ๊ทธ ์ •๋ณด๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค[.]

์•„๋งˆ๋„? ์ด๊ฒƒ์ด API ์ž‘์„ฑ์ž๊ฐ€ Haskell ๋ฐ ML๊ณผ ๊ฐ™์€ ์œ ํ˜• ์œ ์ถ” ์–ธ์–ด์—์„œ ์œ ํ˜• ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ฌ์ธต ๋งค๊ฐœ๋ณ€์ˆ˜("๊ณ ์ฐจ") ์œ ํ˜•์˜ ํ† ๋ผ ๊ตฌ๋ฉ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

func [F, Arg, Result] InvokeAsync(f F, x Arg) (<-chan Result) {
    c := make(chan result, 1)
    go func() { c <- f(x) }()
    return c
}

Arg ์œ ํ˜•์— ๋Œ€ํ•œ ๋ช…์‹œ์  ์ œ์•ฝ์„ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•ฉ๋‹ˆ๊นŒ? F ์˜ ํŠน์ • ์ธ์Šคํ„ด์Šคํ™”์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ข…์†์„ฑ์€ ์ œ์•ฝ์— ๋Œ€ํ•œ ์ตœ๊ทผ ์ œ์•ˆ์˜ ๋งŽ์€ ๋ถ€๋ถ„์—์„œ ๋ˆ„๋ฝ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์˜ค. uv(V)๋Š” V๊ฐ€ ์œ ํ˜•์ด๊ณ  ๋ณ€์ˆ˜ t๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ฌธ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์˜๋„ํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค, ๊ทธ๋Ÿฐ ์˜๋„์˜€์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

T ์œ ํ˜•์€ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. U.v ์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์€ ์ˆซ์ž์ด๊ณ  T ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

๋„ค, ๋งž์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ƒ๋žตํ•˜๋ฉด ํ•ด๋‹น ์ œ์•ฝ ์กฐ๊ฑด์ด ์•”์‹œ์ ์ด๋“  ์•„๋‹ˆ๋“  ์‹ฌ๊ฐํ•œ ๊ฒฐํ•จ์ด ๋ฉ๋‹ˆ๋‹ค. IMO์—์„œ ์ œ์•ฝ์˜ ๋” ์ค‘์š”ํ•œ ์—ญํ• ์€ ๋ชจํ˜ธ์„ฑ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ์ œ์•ฝ ์กฐ๊ฑด์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” uv๋ฅผ ๋‹จ์ผ ์ธ์ˆ˜ ๋˜๋Š” ๊ฐ€๋ณ€ ๋ฉ”์„œ๋“œ๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์–ธ์–ด์—์„œ์™€ ๊ฐ™์ด "์šฐ๋ฆฌ๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด"์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๋ฉด ์ œ์•ฝ ์กฐ๊ฑด์ด "๋ฌด์—‡์ด๋“  ์ปดํŒŒ์ผํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ"์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•  ์ œ์•ฝ ์กฐ๊ฑด์˜ ์ข…๋ฅ˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ์˜ˆ์ œ Foo ๋Š” ์‹ค์ œ๋กœ T , U ๋˜๋Š” V ์™€ ๋ณ„๋„์˜ ์•”์‹œ์  ์ถ”๊ฐ€ ์œ ํ˜•์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. u.v . ์ด ์œ ํ˜•์€ f ์˜ ์„ ์–ธ์—์„œ ์–ด๋–ค ์‹์œผ๋กœ๋“  ๋ช…์‹œ์ ์œผ๋กœ ์ฐธ์กฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ์†์„ฑ์€ ์™„์ „ํžˆ ์•”์‹œ์ ์ž…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋” ๋†’์€ ์ˆœ์œ„( forall ) ์œ ํ˜•์„ ํ—ˆ์šฉํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ๋จธ๋ฆฌ ๊ผญ๋Œ€๊ธฐ์—์„œ ์˜ˆ์ œ๋ฅผ ์ƒ๊ฐํ•ด ๋‚ผ ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋” ๋†’์€ ์ˆœ์œ„์˜ ์œ ํ˜• ๊ฒฝ๊ณ„๋ฅผ ์•”์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์Šค์Šค๋กœ ํ™•์‹ ํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ์˜ค๋ฒ„๋กœ๋“œ๋œ ๊ตฌ๋ฌธ์„ ํ™œ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์•”์‹œ์ ์œผ๋กœ ์ œ์•ฝ๋œ ํ•จ์ˆ˜๊ฐ€ ์ผ๋ฐ˜ ์œ ํ˜• T ์˜ ์ผ๋ถ€ t ์— ๋Œ€ํ•ด for i := range t ํ•˜๋ฉด T ๊ฐ€ ๋ฐฐ์—ด, ์Šฌ๋ผ์ด์Šค, ์ฑ„๋„, ๋˜๋Š” ์ง€๋„. ๊ทธ๋Ÿฌ๋‚˜ ์˜๋ฏธ ์ฒด๊ณ„๋Š” ์ƒ๋‹นํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํŠนํžˆ T ๊ฐ€ ์ฑ„๋„ ์œ ํ˜•์ธ ๊ฒฝ์šฐ์—๋Š” ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด t == nil ( T ๊ฐ€ ๋ฐฐ์—ด์ธ ํ•œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ)์ธ ๊ฒฝ์šฐ ๋ฐ˜๋ณต์€ nil ์Šฌ๋ผ์ด์Šค ๋˜๋Š” ๋งต์— ์š”์†Œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์˜์›ํžˆ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด nil ์ฑ„๋„์—์„œ ๋ฐ›๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ์–ด๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ํฐ ๋ฐœ์ด์ž…๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ m[i] = ... ; m ๊ฐ€ ๋งต์ด ๋˜๋„๋ก ํ•˜๋ ค๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ํ• ๋‹น์—์„œ ํŒจ๋‹‰์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ์Šฌ๋ผ์ด์Šค๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ๋ณดํ˜ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ์ด๊ฒƒ์€ ์•”์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์ฃผ์žฅ์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. API ์ž‘์„ฑ์ž๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ธ์œ„์ ์ธ ๋ช…๋ น๋ฌธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด for _, _ := range t { break } ๋Š” ๋งต, ์Šฌ๋ผ์ด์Šค ๋ฐ ๋ฐฐ์—ด์„ ๊ณ„์† ํ—ˆ์šฉํ•˜๋ฉด์„œ ์ฑ„๋„์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. x = append(x) ๋Š” x ๊ฐ€ ์Šฌ๋ผ์ด์Šค ์œ ํ˜•์„ ๊ฐ–๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. var _ = make(T, 0) ๋Š” ์Šฌ๋ผ์ด์Šค, ๋งต ๋ฐ ์ฑ„๋„์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๋ฐฐ์—ด์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์€ ์œ ํ˜•์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋„๋ก ์ œ์•ฝ ์กฐ๊ฑด์„ ์•”์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ ˆ์‹œํ”ผ ๋ถ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค ์œ ํ˜•๋„ ์•Œ์ง€ ๋ชปํ•˜๋ฉด ์ง€๋„ ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋งŒ ์ปดํŒŒ์ผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ด๊ฒƒ์ด ์ „ํ˜€ ๊ฐ€์„ค์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งต๊ณผ ์Šฌ๋ผ์ด์Šค๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ƒ๋‹นํžˆ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ์—์„œ ์ถฉ๋Œํ•˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด ๋ณด์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์—‡์„ ์š”๊ตฌํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. "๋ถˆ๋ฒ• ๊ตฌ์†"์ด๋ž€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์–ธ์–ด๊ฐ€ ๋” ๋†’์€ ์ˆœ์œ„์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์–ธ์–ด์—์„œ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ด€๋ จ ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ ํ˜• ์‹œ์Šคํ…œ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค(#22876(์ฃผ์„) ์ฐธ์กฐ). ๋Ÿฐํƒ€์ž„ ํŒจ๋‹‰์œผ๋กœ ์ธํ•ด ์ผ๋ถ€ ์ œ์•ฝ ์กฐ๊ฑด์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ๊ฒฝํ•ฉ ๊ฐ์ง€๊ธฐ์— ์˜ํ•ด ์‹œํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์œ„ํ—˜ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์€ ๋ฌธ์„œํ™”๋  ๋ฟ ์ „ํ˜€ ๊ฐ์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ชจ๋“  "๋‚ด๋ถ€ ์„ธ๋ถ€ ์ •๋ณด ๋ˆ„์ถœ"์€ ์–ด๋Š ์ •๋„์ž…๋‹ˆ๋‹ค. (https://xkcd.com/1172/๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.)

#22876์ด ์–ด๋–ป๊ฒŒ ์—ฌ๊ธฐ์— ๋‚˜์˜ค๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜• ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ž„์˜์˜ ๋ณต์žก์„ฑ์„ ๊ฐ€์ง„ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๊ฐ’์ด๋‚˜ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ผ๋ถ€ ์ œ์•ฝ ์กฐ๊ฑด์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ๋Š” ์œ ํ˜• ์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•ด์„œ๋งŒ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” "์ด ์ œ๋„ค๋ฆญ์„ T ์œ ํ˜•์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?"๋ผ๋Š” ์งˆ๋ฌธ์— ๋‹ตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•”์‹œ์ ์ด๋“  ๋ช…์‹œ์ ์ด๋“  ์ œ์•ฝ ์กฐ๊ฑด์„ ์ดํ•ดํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. (C++ ๋ฐ Rust์™€ ๊ฐ™์€ ์ผ๋ถ€ ์–ธ์–ด๋Š” ์ž„์˜์˜ ๊ณ„์‚ฐ์— ์˜์กดํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ์งˆ๋ฌธ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋”ฐ๋ผ์„œ Halting Problem์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์ถฉ์กฑ๋˜์–ด์•ผ ํ•˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.)

๋‚ด ๋ง์€ "๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ์–ด๋–ค ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?"์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

func [U] DirectlyConstrained(U t) {
    t.DoSomething();
}
func [T] IndirectlyConstrained(T t) {
    DirectlyConstrainted(t);
}
func Illegal() {
    IndirectlyConstrained(4);
}

Error: cannot call IndirectlyConstrained with [T = int]; T must have a method with signature func (T t) DoSomething() ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” IndirectlyConstrained ์‚ฌ์šฉ์ž์—๊ฒŒ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ˆ„๋ฝ๋˜์—ˆ๋‹ค๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ IndirectlyConstrained ์— ํ•ด๋‹น ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ๋Š” ์ด์œ ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํฐ ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ ํฐ ์‚ฌ์šฉ์„ฑ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. Note: this constraint exists on T because IndirectlyConstrained calls DirectlyConstrained with [U = T] on line N ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ œ IndirectlyConstrained ์˜ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ๋ˆ„์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ IndirectlyConstrained ์— ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ Note: this constraint exists on U because DirectlyConstrained calls t.DoSomething() on line M ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์•”์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด์ด ํ˜ธ์ถœ ์Šคํƒ์˜ 4๋‹จ๊ณ„ ์•„๋ž˜์— ์žˆ๋Š” ์ผ๋ถ€ ํ˜ธ์ถœ ์ˆ˜์‹ ์ž๋กœ๋ถ€ํ„ฐ ์˜จ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๋˜ํ•œ ๋ช…์‹œ์ ์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋‚˜์—ด๋˜์ง€ ์•Š์€ ์œ ํ˜•์— ๋Œ€ํ•ด ์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ์˜ˆ์—์„œ IndirectlyConstrained ๊ฐ€ DirectlyConstrained(t.U()) $ ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ. ์œ ํ˜•์„ ์–ด๋–ป๊ฒŒ ์ฐธ์กฐํ•ฉ๋‹ˆ๊นŒ? ์ด ๊ฒฝ์šฐ the type of t.U() ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ’์ด ๋ฐ˜๋“œ์‹œ ๋‹จ์ผ ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฌธ์žฅ์„ ํ†ตํ•ด ๊ตฌ์ถ•๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— ๋„ฃ์„ ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์œผ๋กœ ํ‘œํ˜„์‹์„ ํ•ฉ์„ฑํ•ด์•ผ ํ•˜๊ณ , ์ฝ”๋“œ์—๋Š” ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•œ ๋ถˆ์Œํ•œ ํ˜ธ์ถœ์ž.

Arg ์œ ํ˜•์— ๋Œ€ํ•œ ๋ช…์‹œ์  ์ œ์•ฝ์„ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ๋“ค์€ F์˜ ํŠน์ • ์ธ์Šคํ„ด์Šคํ™”์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์˜์กด์„ฑ์€ ์ œ์•ฝ์— ๋Œ€ํ•œ ์ตœ๊ทผ ์ œ์•ˆ์—์„œ ๋ˆ„๋ฝ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

F ๋ฅผ ์‚ญ์ œํ•˜๊ณ  f func (Arg) Result ๊ฐ€ ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ๊ฐ€๋ณ€ ํ•จ์ˆ˜๋ฅผ ๋ฌด์‹œํ•˜์ง€๋งŒ Go์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๋„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. varargs funcs ๋ฅผ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ์„œ๋ช…์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ œ์•ˆ์€ ๋ณ„๋„๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง„์ •์œผ๋กœ ๊ณ ์ฐจ ์œ ํ˜• ๊ฒฝ๊ณ„๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ œ๋„ค๋ฆญ v1์— ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์  ์ œ์•ฝ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ณ ์ฐจ ์œ ํ˜•์„ ์ง€์›ํ• ์ง€ ์—ฌ๋ถ€์™€ ๋ฐฉ๋ฒ•์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ฒฐ์ •ํ•˜๋„๋ก ๊ฐ•์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๊ณ ๋ ค์˜ ๋ถ€์กฑ์€ Go๊ฐ€ ํ˜„์žฌ ๋‚ด์žฅ ์œ ํ˜•์˜ ์†์„ฑ์„ ์ฐธ์กฐํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ์‚ฌ์‹ค์˜ ์ฆ์ƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ์‹œ์Šคํ…œ์ด ๋ชจ๋“  ์ˆซ์ž ์œ ํ˜• ๋˜๋Š” ๋ชจ๋“  ์ •์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•ด ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ณต๊ฐœ ์งˆ๋ฌธ์ด๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ์ œ์•ˆ์€ ์ด์— ๋Œ€ํ•ด ๋งŽ์ด ์ง‘์ค‘ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ ์ œ ์ œ๋„ค๋ฆญ ๊ตฌํ˜„์„ ํ‰๊ฐ€ํ•ด ์ฃผ์„ธ์š”.
http://go-li.github.io/

Error: cannot call IndirectlyConstrained with [T = int]; T must have a method with signature func (T t) DoSomething() ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ [...]๋Š” IndirectlyConstrained ์— ํ•ด๋‹น ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ๋Š” ์ด์œ ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํฐ ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ ํฐ ์‚ฌ์šฉ์„ฑ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์—ฌ๊ธฐ์„œ ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ํฐ ๊ฐ€์ •์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. go build ์˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” _์œ ์ผํ•œ_ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

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

์ฆ‰, ๋Ÿฐํƒ€์ž„ ๋””๋ฒ„๊น…์€ ๋Œ€ํ™”์‹ ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ๋น„๋Œ€ํ™”ํ˜• ๋””๋ฒ„๊น…์„ ๊ฐ€์ •ํ•ด์•ผ ํ•˜๋Š” ์ด์œ โธฎ ํ•œ ๊ฐ€์ง€ ๋Œ€์•ˆ์œผ๋กœ ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•ด guru ๋„๊ตฌ๋ฅผ ๊ฐ€๋ฅด์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

somefile.go:123: Argument `4` to DirectlyConstrained has type `int`,
    but DirectlyConstrained requires a type `T` with method `DoSomething()`.
    (For more detail, run `guru contraints path/to/somefile.go:#1033`.)

์ด๋Š” ์ผ๋ฐ˜ ํŒจํ‚ค์ง€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฆ‰๊ฐ์ ์ธ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ _๋˜ํ•œ_ ํŒจํ‚ค์ง€ ์œ ์ง€ ๊ด€๋ฆฌ์ž(๋ฐ ์ค‘์š”ํ•˜๊ฒŒ๋Š” ํŽธ์ง‘ ํ™˜๊ฒฝ)๊ฐ€ ์ถ”๊ฐ€ ์กฐ์‚ฌ๋ฅผ ์œ„ํ•ด ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Note: this constraint exists on T because IndirectlyConstrained calls DirectlyConstrained with [U = T] on line N ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ œ IndirectlyConstrained ์˜ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ๋ˆ„์ถœ๋ฉ๋‹ˆ๋‹ค.

๋„ค, ์–ด์จŒ๋“  ์ •๋ณด๊ฐ€ ๋ˆ„์ถœ๋œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ guru describe ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ ๋‚ด๋ถ€๋ฅผ ์—ฟ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€๋ฅผ ์—ฟ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์Šคํƒ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž„์˜์˜ ํ•˜์œ„ ์ˆ˜์ค€ ๊ธฐ๋Šฅ์œผ๋กœ ๋‹จ๊ณ„๋ฅผ ๋‚ด๋ ค๊ฐˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ์„ฑ์ด ์—†๋Š” ์ •๋ณด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆจ๊ฒจ์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ์ ˆ๋Œ€์ ์œผ๋กœ ๋™์˜ํ•˜์ง€๋งŒ, ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ์ ˆ๋Œ€์ ์œผ๋กœ ์ˆจ๊ฒจ์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์•”์‹œ์ ์œผ๋กœ ์ œํ•œ๋œ ํ•จ์ˆ˜๊ฐ€ i := range t ์ œ๋„ค๋ฆญ ์œ ํ˜• T ์˜ ์ผ๋ถ€ t ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ T ๊ฐ€ ๋ฐฐ์—ด, ์Šฌ๋ผ์ด์Šค, ์ฑ„๋„์ธ ๊ฒฝ์šฐ ๊ตฌ๋ฌธ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. , ๋˜๋Š” ์ง€๋„. ๊ทธ๋Ÿฌ๋‚˜ ์˜๋ฏธ๋ก ์€ ํŠนํžˆ T ๊ฐ€ ์ฑ„๋„ ์œ ํ˜•์ธ ๊ฒฝ์šฐ ์ƒ๋‹นํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋” ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ๋งŒํผ ์žฅํ™ฉํ•œ ๋ช…์‹œ์  ์ œ์•ฝ ์กฐ๊ฑด์ด ํ•„์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด reflect.Kind ์— ๊ฐ€๊นŒ์šด ๊ฒƒ์œผ๋กœ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ ์ด๋ฏธ ๋ช…ํ™•ํ•œ ์ž‘์—…์„ ์„ค๋ช…ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  " T ๋Š” ์Šฌ๋ผ์ด์Šค ์œ ํ˜•์ž…๋‹ˆ๋‹ค"์™€ ๊ฐ™์€ ๊ฒƒ๋งŒ ๋งํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•œ ์ œ์•ฝ ์กฐ๊ฑด ์„ธํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์ธ๋ฑ์Šค ์ž‘์—…์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ์œ ํ˜•์€ ์„ ํ˜• ๋˜๋Š” ์—ฐ๊ด€์œผ๋กœ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • range ์ž‘์—…์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ์œ ํ˜•์€ nil-empty ๋˜๋Š” nil-blocking์œผ๋กœ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌํ„ฐ๋Ÿด์ด ์žˆ๋Š” ์œ ํ˜•์€ ํ•„๋“œ ๋˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • (์•„๋งˆ๋„) ์ˆซ์ž ์—ฐ์‚ฐ์ด ์žˆ๋Š” ์œ ํ˜•์€ ๊ณ ์ • ๋˜๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์ ์œผ๋กœ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ›จ์”ฌ ๋” ์ข์€ ์ œ์•ฝ ์กฐ๊ฑด ์–ธ์–ด๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

TypeConstraint = "sliceable" | "map" | "chan" | "struct" | "integer" | "float" | "type"

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

func[T:integer, U, V] Foo(u U, v V) {
    var _ T = u.v(v) + 1;
}
func [S:sliceable, T] append(s S, x ...T) S {
    dst := s
    if cap(s) - len(s) < len(x) {
        dst = make(S, len(s), nextSizeClass(cap(s)))
        copy(dst, s)
    }
    copy(dst[len(s):cap(s)], x)
    return dst[:len(s)+len(x)]
}

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

์„ค๋ช…์„ ๋” ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์ฝ”๋“œ ์š”์†Œ genre ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์žฅ๋ฅด์™€ ์œ ํ˜•์˜ ๊ด€๊ณ„๋Š” ์œ ํ˜•๊ณผ ๊ฐ€์น˜์˜ ๊ด€๊ณ„์™€ ๊ฐ™๋‹ค.
์ฆ‰, ์žฅ๋ฅด๋Š” ์œ ํ˜•์˜ ์œ ํ˜•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ฒด ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํ•จ์ˆ˜ ์ข…๋ฅ˜๋ฅผ ์ œ์™ธํ•œ ๊ฐ ์œ ํ˜•์€ ๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ์žฅ๋ฅด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

  • ๋ถ€์šธ
  • ๋ˆ
  • Int8, Uint8, Int16, Uint16, Int32, Uint32, Int64, Uint64, Int, Uint, Uintptr
  • ํ”Œ๋กœํŠธ32, ํ”Œ๋กœํŠธ64
  • Complex64, Complex128
  • ๋ฐฐ์—ด, ์Šฌ๋ผ์ด์Šค, ๋งต, ์ฑ„๋„, ํฌ์ธํ„ฐ, UnsafePointer

Comaprable, Numeric, Interger, Float, Complex, Container ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ๋‹ค๋ฅธ ์žฅ๋ฅด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Type ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” * ๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ์žฅ๋ฅด๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ธฐ๋ณธ ์ œ๊ณต ์žฅ๋ฅด์˜ ์ด๋ฆ„์€ ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๊ตฌ์กฐ์ฒด, ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํ•จ์ˆ˜ ์œ ํ˜•์€ ์žฅ๋ฅด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ง€์ • ์žฅ๋ฅด๋ฅผ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

genre Addable = Numeric | String
genre Orderable = Interger | Float | String
genre Validator = func(int) bool // each parameter and result type must be a specified type.
genre HaveFieldsAndMethods = {
    width  int // we must use a specific type to define the fields.
    height int // we can't use a genre to define the fields.
    Load(v []byte) error // each parameter and result type must be a specified type.
    DoSomthing()
}
genre GenreFromStruct = aStructType // declare a genre from a struct type
genre GenreFromInterface = anInterfaceType // declare a genre from an interface type
genre GenreFromStructInterface = aStructType + anInterfaceType
genre ComparableStruct = HaveFieldsAndMethods & Comprable
genre UncomparableStruct = HaveFieldsAndMethods &^ Comprable

๋‹ค์Œ ์„ค๋ช…์„ ์ผ๊ด€๋˜๊ฒŒ ํ•˜๋ ค๋ฉด ์žฅ๋ฅด ์ˆ˜์‹์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์žฅ๋ฅด ์ˆ˜์ •์ž๋Š” Const ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

  • Const Integer ๋Š” ์žฅ๋ฅด์ด๋ฉฐ( Integer ์™€ ๋‹ค๋ฆ„) ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋Š” ์ •์ˆ˜์—ฌ์•ผ ํ•˜๋Š” ์ƒ์ˆ˜ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์ˆ˜ ๊ฐ’์€ ํŠน์ˆ˜ํ•œ ์œ ํ˜•์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Const func(int) bool ๋Š” ์žฅ๋ฅด( func(int) bool ์™€ ๋‹ค๋ฆ„)์ด๋ฉฐ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋Š” delcared ํ•จ์ˆ˜ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜ ์„ ์–ธ์€ ํŠน์ˆ˜ํ•œ ์œ ํ˜•์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์ˆ˜์ •์ž ์†”๋ฃจ์…˜์€ ์•ฝ๊ฐ„ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋” ๋‚˜์€ ๋””์ž์ธ ์†”๋ฃจ์…˜์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์ข‹์•„, ๊ณ„์†ํ•˜์ž.
๋‹ค๋ฅธ ๊ฐœ๋…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์ด๋ฆ„์„ ์ฐพ๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค.
๊ทธ๋ƒฅ crate ๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ํฌ๋ ˆ์ดํŠธ์™€ ์žฅ๋ฅด์˜ ๊ด€๊ณ„๋Š” ๊ธฐ๋Šฅ๊ณผ ์œ ํ˜•์˜ ๊ด€๊ณ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํฌ๋ ˆ์ดํŠธ๋Š” ์œ ํ˜•์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ทจํ•˜๊ณ  ์œ ํ˜•์„ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํฌ๋ ˆ์ดํŠธ ์„ ์–ธ( lib ํŒจํ‚ค์ง€์— ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •):

crate Example [T Float, S {width, height T}, N Const Integer] [*, *, *] {
    type MyArray [N]T

    func Add(a, b T) T {
        return a+b
    }

    type M struct {
        x T
        y S
    }

    func (m *M) Area() T {
        m.DoSomthing()
        return m.y.width * m.y.height
    }

    func (m *M) Perimeter() T {
        return 2 * Add(m.y.width, m.y.height)
    }

    export M, Add, MyArray
}

์œ„์˜ ์ƒ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

import "lib"

// We can use AddFunc as a normal delcared function.
// Its genre is "Const func (a, b T) T"
type Rect, AddFunc, Array = lib.Example[float32, struct{x, y float32}, 100]

func demo() {
    var r Rect
    a, p = r.Area(), r.Perimeter()
    _ = AddFunc(a, p)
}

๋‚ด ์•„์ด๋””์–ด๋Š” ์œ„์— ํ‘œ์‹œ๋œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ๋งŽ์€ ์•„์ด๋””์–ด๋ฅผ ํก์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋“ค์€ ์ง€๊ธˆ ๋งค์šฐ ์„ฑ์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ์•ฝ๊ฐ„ ํฅ๋ฏธ๋กญ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.
๋” ์ด์ƒ ๊ฐœ์„ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์•„์ด๋””์–ด์— ๊ตฌ๋ฉ์„ ๋šซ์–ด ๋„ˆ๋ฌด ๋งŽ์€ ๋‡Œ์„ธํฌ๊ฐ€ ์ฃฝ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ์•„์ด๋””์–ด๊ฐ€ ๋‹ค๋ฅธ ๊ณ ํผ๋“ค์—๊ฒŒ ์˜๊ฐ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‹น์‹ ์ด "์žฅ๋ฅด"๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ์‹ค์ œ๋กœ๋Š” "์ข…๋ฅ˜"๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ,
ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ. ๋‹น์‹ ์ด ์ƒ์ž๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์€ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค
์ผ์ข…์˜ ML ํŽ‘ํ„ฐ.

2018๋…„ 4์›” 4์ผ ์ˆ˜์š”์ผ ์˜คํ›„ 12์‹œ 41๋ถ„ dotahor [email protected] ์ž‘์„ฑ:

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€
์œ ํ˜• ๋ณ„์นญ.
์œ ํ˜• ๋ณ„์นญ์€ ์ˆ˜ํผ ์œ ํ˜•(์œ ํ˜• ์œ ํ˜•)์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’๊ณผ ๊ฐ™์ด ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค๋ช…์„ ๋” ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์ฝ”๋“œ ์š”์†Œ์ธ ์žฅ๋ฅด๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์žฅ๋ฅด์™€ ์œ ํ˜•์˜ ๊ด€๊ณ„๋Š” ์œ ํ˜• ๊ฐ„์˜ ๊ด€๊ณ„์™€ ๊ฐ™๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ฐ€์น˜.
์ฆ‰, ์žฅ๋ฅด๋Š” ์œ ํ˜•์˜ ์œ ํ˜•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ฒด ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํ•จ์ˆ˜ ์ข…๋ฅ˜๋ฅผ ์ œ์™ธํ•œ ๊ฐ ์œ ํ˜•,
๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ์žฅ๋ฅด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

  • ๋ถ€์šธ
  • ๋ˆ
  • Int8, Uint8, Int16, Uint16, Int32, Uint32, Int64, Uint64, Int, Uint,
    Uintptr
    & Float32, Float64
  • Complex64, Complex128
  • ๋ฐฐ์—ด, ์Šฌ๋ผ์ด์Šค, ๋งต, ์ฑ„๋„, ํฌ์ธํ„ฐ, UnsafePointer

Comaprable, Numeric,
Interger, Float, Complex, Container ๋“ฑ. Type ๋˜๋Š” *๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  ์œ ํ˜•์˜ ์žฅ๋ฅด.

๋ชจ๋“  ๊ธฐ๋ณธ ์ œ๊ณต ์žฅ๋ฅด์˜ ์ด๋ฆ„์€ ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ๊ตฌ์กฐ์ฒด, ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํ•จ์ˆ˜ ์œ ํ˜•์€ ์žฅ๋ฅด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ง€์ • ์žฅ๋ฅด๋ฅผ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ๋ฅด ์ถ”๊ฐ€ ๊ฐ€๋Šฅ = ์ˆซ์ž | ๋ˆ
์žฅ๋ฅด ์ฃผ๋ฌธ ๊ฐ€๋Šฅ = Interger | ํ”Œ๋กœํŠธ | ๋ˆ
์žฅ๋ฅด Validator = func(int) bool // ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๊ฒฐ๊ณผ ์œ ํ˜•์€ ์ง€์ •๋œ ์œ ํ˜•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์žฅ๋ฅด HaveFieldsAndMethods = {
width int // ํ•„๋“œ๋ฅผ ์ •์˜ํ•˜๋ ค๋ฉด ํŠน์ • ์œ ํ˜•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
height int // ์žฅ๋ฅด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
Load(v []byte) error // ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๊ฒฐ๊ณผ ์œ ํ˜•์€ ์ง€์ •๋œ ์œ ํ˜•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋‘์ธ์”ฝ()
}
์žฅ๋ฅด GenreFromStruct = aStructType // ๊ตฌ์กฐ์ฒด ์œ ํ˜•์—์„œ ์žฅ๋ฅด ์„ ์–ธ
์žฅ๋ฅด GenreFromInterface = anInterfaceType // ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์—์„œ ์žฅ๋ฅด ์„ ์–ธ
์žฅ๋ฅด GenreFromStructInterface = aStructType | ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•

๋‹ค์Œ ์„ค๋ช…์„ ์ผ๊ด€๋˜๊ฒŒ ํ•˜๋ ค๋ฉด ์žฅ๋ฅด ์ˆ˜์‹์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์žฅ๋ฅด ์ˆ˜์ •์ž๋Š” Const๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

  • Const Integer๋Š” ์žฅ๋ฅด์ด๋ฉฐ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋Š” ์ƒ์ˆ˜ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ์ •์ˆ˜์—ฌ์•ผ ํ•˜๋Š” ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
    ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์ˆ˜ ๊ฐ’์€ ํŠน์ˆ˜ํ•œ ์œ ํ˜•์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Const func(int) bool์€ ์žฅ๋ฅด์ด๋ฉฐ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋Š” ์„ ์–ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ํ•จ์ˆ˜ ๊ฐ’.
    ๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜ ์„ ์–ธ์€ ํŠน์ˆ˜ํ•œ ์œ ํ˜•์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์ˆ˜์ •์ž ์†”๋ฃจ์…˜์€ ์•ฝ๊ฐ„ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋” ๋‚˜์€ ๋””์ž์ธ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์†”๋ฃจ์…˜.)

์ข‹์•„, ๊ณ„์†ํ•˜์ž.
๋‹ค๋ฅธ ๊ฐœ๋…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์ด๋ฆ„์„ ์ฐพ๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค.
๊ทธ๋ƒฅ ์ƒ์ž๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์ž์™€ ์žฅ๋ฅด์˜ ๊ด€๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํ•จ์ˆ˜์™€ ์œ ํ˜• ์‚ฌ์ด.
ํฌ๋ ˆ์ดํŠธ๋Š” ์œ ํ˜•์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ทจํ•˜๊ณ  ์œ ํ˜•์„ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํฌ๋ ˆ์ดํŠธ ์„ ์–ธ(๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ lib์— ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
ํŒจํ‚ค์ง€):

ํฌ๋ ˆ์ดํŠธ ์˜ˆ [T Float, S {๋„ˆ๋น„, ๋†’์ด T}, N Const Integer] [*, *, *] {
์œ ํ˜• MyArray [N]T

func ๋”ํ•˜๊ธฐ(a, b T) T {
๋ฐ˜ํ™˜ + b
}

// ํฌ๋ ˆ์ดํŠธ ๋ฒ”์œ„ ์žฅ๋ฅด. ์ƒ์ž์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// M์€ ์žฅ๋ฅด G์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
์œ ํ˜• M ๊ตฌ์กฐ์ฒด {
x T
y ์—์Šค
}

func (m *M) ๋ฉด์ () T {
m.DoSomthing()
๋‚ด ๋„ˆ๋น„ * ๋‚ด ๋†’์ด๋ฅผ ๋ฐ˜ํ™˜
}

func (m *M) ๋‘˜๋ ˆ() T {
return 2 * ์ถ”๊ฐ€(mywidth, myheight)
}

๋‚ด๋ณด๋‚ด๊ธฐ M, ์ถ”๊ฐ€, MyArray
}

์œ„์˜ ์ƒ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

"lib" ๊ฐ€์ ธ์˜ค๊ธฐ

// ์šฐ๋ฆฌ๋Š” AddFunc๋ฅผ ์ผ๋ฐ˜์ ์ธ delcared ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์œ ํ˜• Rect, AddFunc, Array = lib.Example(float32, struct{x, y float32})

๊ธฐ๋Šฅ ๋ฐ๋ชจ() {
var r ์‚ฌ๊ฐํ˜•
a, p = r.Area(), r.Perimeter()
_ = AddFunc(a, p)
}

๋‚ด ์•„์ด๋””์–ด๋Š” ์œ„์— ํ‘œ์‹œ๋œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ๋งŽ์€ ์•„์ด๋””์–ด๋ฅผ ํก์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋“ค์€ ์ง€๊ธˆ ๋งค์šฐ ์„ฑ์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ์•ฝ๊ฐ„ ํฅ๋ฏธ๋กญ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.
๋” ์ด์ƒ ๊ฐœ์„ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์•„์ด๋””์–ด์— ๊ตฌ๋ฉ์„ ๋šซ์–ด ๋„ˆ๋ฌด ๋งŽ์€ ๋‡Œ์„ธํฌ๊ฐ€ ์ฃฝ์—ˆ์Šต๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/15292#issuecomment-378665695 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AGGWB78BrjN0BxRfroH-jRNy4mCXgSwCks5tlPfMgaJpZM4IG-xv
.

์ข…๋ฅ˜์™€ ์žฅ๋ฅด ์‚ฌ์ด์— ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ํฌ๋ ˆ์ดํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ์œ ํ˜•๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ˜ธ์ถœ์„ ์œ ํ˜•์œผ๋กœ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package lib

// export a type
crate List [T *] * {
    type List struct {
        ...
    }

    export List
}

๊ทธ๊ฑธ ์จ:

import "lib"

var l lib.List[int]

ํ˜„์žฌ ์‹œ์Šคํ…œ์˜ "์œ ํ˜• ์—ฐ์—ญ"๊ณผ ๊ฐ™์€ ์ผ๋ถ€ "์žฅ๋ฅด ์—ฐ์—ญ" ๊ทœ์น™์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@dotaheor , @DemiMarie ๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ "์žฅ๋ฅด" ๊ฐœ๋…์€ ์œ ํ˜• ์ด๋ก ์˜ "์ข…๋ฅ˜"์™€ ์ •ํ™•ํžˆ ๊ฐ™์Šต๋‹ˆ๋‹ค. (๊ท€ํ•˜์˜ ์ œ์•ˆ์—๋Š” ํ•˜์œ„ ์œ ํ˜• ๊ทœ์น™์ด ํ•„์š”ํ•˜์ง€๋งŒ ๋“œ๋ฌธ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.)

์ œ์•ˆ์„œ์˜ genre ํ‚ค์›Œ๋“œ๋Š” ์ƒˆ๋กœ์šด ์ข…๋ฅ˜๋ฅผ ๊ธฐ์กด ์ข…๋ฅ˜์˜ ์Šˆํผ ์ข…๋ฅ˜๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. crate ํ‚ค์›Œ๋“œ๋Š” Type ์˜ ํ•˜์œ„ ์ข…๋ฅ˜๊ฐ€ ์•„๋‹Œ ์ข…๋ฅ˜์ธ "์ƒ์ž ์„œ๋ช…"์ด ์žˆ๋Š” ๊ฐœ์ฒด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ณต์‹ ์‹œ์Šคํ…œ์œผ๋กœ์„œ ๊ท€ํ•˜์˜ ์ œ์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ƒ์ž ::= ฯ‡ | โ‹ฏ
์œ ํ˜• ::= ฯ„ | ฯ‡ | int | bool | โ‹ฏ | func(ฯ„) | func(ฯ„) ฯ„ | []ฯ„ | ฯ‡[ฯ„โ‚, โ€ฆ]

ํฌ๋ ˆ์ดํŠธ ์‹œ๊ทธ ::= [ฮบโ‚, โ€ฆ] โ‡’ [ฮบโ‚™, โ€ฆ]
์ข…๋ฅ˜ ::= ฮบ | exactly ฯ„ | kindOf ฮบ | Map | Chan | โ‹ฏ | Const ฮบ | Type | ํฌ๋ ˆ์ดํŠธ ์‹œ๊ทธ

์ผ๋ถ€ ์œ ํ˜• ์ด๋ก  ํ‘œ๊ธฐ๋ฒ•์„ ๋‚จ์šฉํ•˜๋ ค๋ฉด:

  • โ€œโŠขโ€๋Š” โ€œ~์„ ์ˆ˜๋ฐ˜ํ•œ๋‹คโ€๋กœ ์ฝ์œผ์‹ญ์‹œ์˜ค.
  • " k1 โŠ‘ k2 "๋ฅผ " k1 ๋Š” k2 ์˜ ํ•˜์œ„ ์ข…๋ฅ˜"๋กœ ์ฝ์Šต๋‹ˆ๋‹ค.
  • ":"๋ฅผ "์ข…์ข…"์œผ๋กœ ์ฝ์œผ์‹ญ์‹œ์˜ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

โŠข ฯ„ : exactly ฯ„
โŠข exactly ฯ„ โŠ‘ kindOf exactly ฯ„
โŠข kindOf exactly ฯ„ โŠ‘ Type

ฯ„ : ฮบโ‚ โˆง ฮบโ‚ โŠ‘ ฮบโ‚‚ โŠข ฯ„ : ฮบโ‚‚

ฯ„โ‚ : Type โˆง ฯ„โ‚‚ : Type โŠข kindOf exactly map[ฯ„โ‚]ฯ„โ‚‚ โŠ‘ Map
โŠข Map โŠ‘ Type

ฮบโ‚ โŠ‘ ฮบโ‚‚ โŠข Const ฮบโ‚ โŠ‘ Const ฮบโ‚‚

[โ€ฆ]
(๋“ฑ, ๋ชจ๋“  ๋‚ด์žฅํ˜•์— ๋Œ€ํ•ด)


์œ ํ˜• ์ •์˜๋Š” ์ข…๋ฅ˜๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ๊ธฐ๋ณธ ์ข…๋ฅ˜๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ์œ ํ˜•์˜ ์ข…๋ฅ˜๋กœ ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค.

type ฯ„โ‚ ฯ„โ‚‚ โˆง ฯ„โ‚‚ : ฮบ โŠข ฯ„โ‚ : kindOf ฮบ

โŠข kindOf kindOf ฮบ โŠ‘ kindOf ฮบ
โŠข kindOf Map โŠ‘ Map
[โ€ฆ]


genre ๋Š” ์ƒˆ ํ•˜์œ„ ์œ ํ˜• ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
genre ฮบ = ฮบโ‚ | ฮบโ‚‚ โŠข ฮบโ‚ โŠ‘ ฮบ
genre ฮบ = ฮบโ‚ | ฮบโ‚‚ โŠข ฮบโ‚‚ โŠ‘ ฮบ

( Numeric ๋“ฑ์„ | ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

genre ฮบ = ฮบโ‚ & ฮบโ‚‚ โˆง ( ฮบโ‚ƒ โŠ‘ ฮบโ‚ ) โˆง ( ฮบโ‚ƒ โŠ‘ ฮบโ‚‚ ) โŠข ฮบโ‚ƒ โŠ‘ ฮบ


์ƒ์ž ํ™•์žฅ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
type ฯ„โ‚™, โ€ฆ = ฯ‡[ฯ„โ‚, โ€ฆ] โˆง ( ฯ‡ : [ฮบโ‚, โ€ฆ] โ‡’ [ฮบโ‚™, โ€ฆ] ) โˆง ( ฯ„โ‚ : ฮบโ‚ ) โˆง โ‹ฏ โŠข ฯ„โ‚™ : ฮบโ‚™

๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋ชจ๋‘ ์ข…๋ฅ˜์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ ํ˜• ์‹œ์Šคํ…œ์œผ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด ์œ ํ˜• ๊ทœ์น™๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ™‚


๊ทธ๋ž˜์„œ ๋‹น์‹ ์ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๊ฝค ์ž˜ ์ดํ•ด๋œ ํ˜•ํƒœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ž˜ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์—์„œ๋Š” ์ข‹์€๋ฐ, ๋ฐ”๋‘‘์ด ๋„์ž…ํ•œ ๊ณ ์œ ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ์•„์‰ฝ๋‹ค.

Go์—์„œ ์†Œ๊ฐœํ•˜๋Š” ์ •๋ง ํฅ๋ฏธ๋กญ๊ณ  ๋‚œํ•ดํ•œ ๋ฌธ์ œ๋Š” ์ฃผ๋กœ ๋™์  ์œ ํ˜• ๊ฒ€์‚ฌ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์œ ํ˜• ์ฃผ์žฅ ๋ฐ ๋ฆฌํ”Œ๋ ‰์…˜๊ณผ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

(์˜ˆ๋ฅผ ๋“ค์–ด, ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์˜ ๋ฉ”์†Œ๋“œ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋Ÿฐํƒ€์ž„์— ์ƒˆ๋กœ์šด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฐ’์„ ์œ ํ˜• ์ฃผ์žฅํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?)

๊ด€๋ จ ๋ฉ”๋ชจ์—์„œ ์ฝ”๋“œ๋ฅผ ๋‚ด์žฅ ๋ฐ ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•๋ณด๋‹ค ์ œ๋„ค๋ฆญ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? bigint ๋ฐ ๊ธฐ๋ณธ ์ •์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€๊ฐ€์š”?

๊ด€๋ จ ๋ฉ”๋ชจ์—์„œ ์ฝ”๋“œ๋ฅผ ๋‚ด์žฅ ๋ฐ ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•๋ณด๋‹ค ์ œ๋„ค๋ฆญ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? bigint ๋ฐ ๊ธฐ๋ณธ ์ •์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€๊ฐ€์š”?

Genus ๋ฐ Familia์™€ ๊ฐ™์€ ์œ ํ˜• ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์ด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ PLDI 2015 ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@DemiMarie
"์žฅ๋ฅด" == "ํŠน์„ฑ ์„ธํŠธ"๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

[ํŽธ์ง‘ํ•˜๋‹ค]
traits ๊ฐ€ ๋” ๋‚˜์€ ํ‚ค์›Œ๋“œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ๊ฐ ์ข…๋ฅ˜๋„ ํŠน์„ฑ ์„ธํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ํŠน์„ฑ์€ ๋‹จ์ผ ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋งŒ ์ •์˜๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋” ๋ณต์žกํ•œ ํŠน์„ฑ์€ ๋‘ ์œ ํ˜• ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[ํŽธ์ง‘ 2]
๋‘ ๊ฐœ์˜ ํŠน์„ฑ ์„ธํŠธ A์™€ B๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

A + B: union set
A - B: difference set
A & B: intersection set

์ธ์ˆ˜ ์œ ํ˜•์˜ ํŠน์„ฑ ์„ธํŠธ๋Š” ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜ ์žฅ๋ฅด(ํŠน์„ฑ ์„ธํŠธ)์˜ ์ƒ์œ„ ์„ธํŠธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฒฐ๊ณผ ์œ ํ˜•์˜ ํŠน์„ฑ ์ง‘ํ•ฉ์€ ํ•ด๋‹น ๊ฒฐ๊ณผ ์žฅ๋ฅด(ํŠน์„ฑ ์ง‘ํ•ฉ)์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(์ž„ํ˜ธ)

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

@dc0d

์œ ํ˜• ๋ณ„์นญ์ด ์ œ๋„ค๋ฆญ์„ ์–ด๋–ป๊ฒŒ ๋Œ€์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@sighoya ๋ฆฌ๋ฐ”์ธ๋”ฉ ์œ ํ˜• ๋ณ„์นญ์€ ์ œ๋„ค๋ฆญ(์œ ํ˜• ๋ณ„์นญ๋ฟ ์•„๋‹ˆ๋ผ)์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ์œ ํ˜• ๋ณ„์นญ์„ ๋„์ž…ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

package likedlist

type T = interface{}

type LinkedList struct {
    // ...
}

Type Alias โ€‹โ€‹Rebinding(๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋Šฅ)์ด ์ œ๊ณต๋˜๋ฉด ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค ๋Œ€์‹  ๋‹ค๋ฅธ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ด ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package main

import (
    "likedlist"
)

type intLL = likedlist.LinkedList(likedlist.T = int)
type stringLL = likedlist.LinkedList(likedlist.T = string)

func main() {}

๋ณ„์นญ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ ๋ฐฉ๋ฒ•์ด ๋” ๊น”๋”ํ•ฉ๋‹ˆ๋‹ค.

// pkg.go
package pkg

type ListNode struct {
    prev, next *ListNode
    element    ?Element
}

func Add(x, y ?T) ?T {
    return x+y
}



// main.go
package main

import "pkg"

type intList = pkg.ListNode[Element=int]
func stringAdd = pkg.Add[T=string]

func main() {
}

@dc0d ์™€ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋‚˜์š”? ์ฝ”๋“œ๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๋‚ด๋ถ€์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์•Œ๋ ค์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ๋„ค๋ฆญ ์ œ์•ˆ์˜ ์—ญ์‚ฌ๋ฅผ ์‚ดํŽด๋ณด๋ฉด Go์˜ ๊ฒฝ์šฐ ๋ชจ์–‘๊ณผ ๋Š๋‚Œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

@dotaheor Go 1.x์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@creker ์ €๋Š” ์ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Type Alias โ€‹โ€‹Rebinding์˜ ๊ฐœ๋…์œผ๋กœ ํƒ„์ƒํ•œ ๋„๊ตฌ( goreuse )๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„๊ตฌ๋ฅผ ์„ค๋ช…ํ•˜๋Š” 15๋ถ„ ๋ถ„๋Ÿ‰์˜ ๋น„๋””์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@dc0d ๋”ฐ๋ผ์„œ ํŠน์ˆ˜ ๊ตฌํ˜„์„ ์ƒ์„ฑํ•˜๋Š” C++ ํ…œํ”Œ๋ฆฟ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด Go ํŒ€์œผ๋กœ ๋ฐ›์•„๋“ค์—ฌ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์†”์งํžˆ ์ €์™€ ์—ฌ๊ธฐ ์žˆ๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๋„) C++ ํ…œํ”Œ๋ฆฟ๊ณผ ์œ ์‚ฌํ•œ ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋Š˜๋ฆฌ๊ณ  ์ปดํŒŒ์ผ ์†๋„๋ฅผ ๋Šฆ์ถ”๋ฉฐ ์˜๋ฏธ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ Go๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ „์šฉ ํŒจํ‚ค์ง€์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด C++๊ฐ€ ํ—ค๋” ํŒŒ์ผ์— ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ์„ ํƒํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

@ํฌ๋ ˆ์ปค

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์œ ํ˜•์— ๋Œ€ํ•ด ํŠน์ˆ˜ ๊ตฌํ˜„์„ ์ƒ์„ฑํ•˜๋Š” C++ ํ…œํ”Œ๋ฆฟ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค(C++๋ฅผ ์ž‘์„ฑํ•œ์ง€ ์•ฝ 16๋…„์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์˜ ์„ค๋ช…์„ ๋ณด๋ฉด ๊ทธ๋Ÿด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๋“ค์ด ๋™์ผํ•œ์ง€ ๋˜๋Š” ์–ด๋–ป๊ฒŒ ๋™์ผํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด Go ํŒ€์œผ๋กœ ๋ฐ›์•„๋“ค์—ฌ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์†”์งํžˆ ์ €์™€ ์—ฌ๊ธฐ ์žˆ๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๋„) C++ ํ…œํ”Œ๋ฆฟ๊ณผ ์œ ์‚ฌํ•œ ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์—ฌ๊ธฐ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€ ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ์„ ํ˜ธํ•˜๋Š” ๋ฐ ์ถฉ๋ถ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ชฉ๋ก์˜ ์ฒซ ๋ฒˆ์งธ๋Š” Go 1.x์™€์˜ ํ˜ธํ™˜์„ฑ์ž…๋‹ˆ๋‹ค.

๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ,

๊ทธ๊ฒƒ์€ ์ˆ˜๋„.

์ปดํŒŒ์ผ ์†๋„๊ฐ€ ๋Š๋ ค์ง€๊ณ ,

( goreuse ๋กœ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ) ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ Go๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ „์šฉ ํŒจํ‚ค์ง€์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์ œ๋„ค๋ฆญ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ?

์˜๋ฏธ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

@dc0d

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์„ค์ •๋˜๋Š” ๊ฒƒ ์™ธ์—๋„ ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ 'T'

type T=interface{}

๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์œ ํ˜• ๋ณ€์ˆ˜๋กœ ์ฒ˜๋ฆฌ๋˜์ง€๋งŒ ํŠน์ • ์œ ํ˜•์— ๋Œ€ํ•œ ๋ณ„์นญ, ์ฆ‰ ์œ ํ˜•์— ๋Œ€ํ•œ const ์ฐธ์กฐ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์›ํ•˜๋Š” ๊ฒƒ์€ T Type์ด์ง€๋งŒ ์ด๊ฒƒ์€ ์ œ๋„ค๋ฆญ์˜ ๋„์ž…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@sighoya ๋ง์”€ํ•˜์‹  ๋‚ด์šฉ์„ ์ดํ•ดํ–ˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

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

type T = int

๊ทธ๋ฆฌ๊ณ  + ์—ฐ์‚ฐ์ž(๋˜๋Š” - ๋˜๋Š” * ; ํ•ด๋‹น ์—ฐ์‚ฐ์ž๊ฐ€ ํŒจํ‚ค์ง€ ๋ณธ๋ฌธ์—์„œ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฆ„)๊ฐ€ ์žˆ๋Š” ์œ ํ˜•๋งŒ ์œ ํ˜• ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ œ๋„ค๋ฆญ์˜ ๋„์ž…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Go ์–ธ์–ด ์ž์ฒด์—์„œ ์ œ๋„ค๋ฆญ์„ ๋„์ž…/๊ตฌํ˜„ํ•˜๋Š” _is_ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

@dc0d

๋‹คํ˜•์„ฑ์„ ์ œ๊ณตํ•˜๋ ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค{}๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‚˜์ค‘์— T๋ฅผ ๋ชจ๋“  ์œ ํ˜•์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

'type T=Int'๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋งŽ์€ ์ด์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” '์œ ํ˜• T'๊ฐ€ ๋จผ์ € ์„ ์–ธ๋˜์ง€ ์•Š์Œ/์ •์˜๋˜์ง€ ์•Š์Œ์ด๋ผ๊ณ  ๋งํ•˜๋ฉด ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” 'T'๊ฐ€ ๋ชจ๋“ˆ/ํŒจํ‚ค์ง€ ์ „์ฒด๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์–ด๋–ค ํ•จ์ˆ˜๋‚˜ ๊ตฌ์กฐ์ฒด์—๋„ ๊ตญํ•œ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ข‹์•„์š”. ์™ธ๋ถ€์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ค‘์ฒฉ ํ˜•์‹ ์„ ์–ธ์ผ ์ˆ˜๋„ ์žˆ์Œ).

์™œ ๋Œ€์‹  ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?:

fun<type T>(t T)

๋˜๋Š”

fun[type T](t T)

๋˜ํ•œ ์ฒ˜์Œ์— ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ „๋ฌธํ™” ์—†์ด ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋˜๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹ ์œ ์ถ” ๊ธฐ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@dc0d ๊ฐ€ ์ผ๋‹ค

๊ทธ๋ฆฌ๊ณ  + ์—ฐ์‚ฐ์ž(๋˜๋Š” - ๋˜๋Š” *; ํ•ด๋‹น ์—ฐ์‚ฐ์ž๊ฐ€ ํŒจํ‚ค์ง€ ๋ณธ๋ฌธ์—์„œ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฆ„)๊ฐ€ ์žˆ๋Š” ์œ ํ˜•๋งŒ ํ•ด๋‹น ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ์žˆ๋Š” ์œ ํ˜• ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@์‹œ๊ณ ์•ผ

๋‹คํ˜•์„ฑ์„ ์ œ๊ณตํ•˜๋ ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค{}๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‚˜์ค‘์— T๋ฅผ ๋ชจ๋“  ์œ ํ˜•์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜• ๋ณ„์นญ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋œ ๊ฒฝ์šฐ:

package genericadd

type T = int

func Add(a, b T) T { return a + b }

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฑฐ์˜ ๋ชจ๋“  ์ˆซ์ž ์œ ํ˜•์„ T ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package main

import (
    "genericadd"
)

var add = genericadd.Add(
    T = float64
)

func main() {
    var (
        a, b float64
    )

    println(add(a, b))
}

@dc0d

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๋“ค์ด ๋™์ผํ•œ์ง€ ๋˜๋Š” ์–ด๋–ป๊ฒŒ ๋™์ผํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์ œ๋„ค๋ฆญ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ?

๋‹ค๋ฅธ ์–ธ์–ด๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์นœ์ˆ™ํ•œ C#. ๊ทธ๋Ÿฌ๋‚˜ Go ํŒ€์ด ์™„์ „ํžˆ ๋ฐฐ์ œํ•œ ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Java๋„ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ตฌํ˜„์ด ๊ฐ€์žฅ ์ข‹์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ianlancetaylor ์ œ์•ˆ ์ค‘ ์ผ๋ถ€๋Š” ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ „์šฉ ํŒจํ‚ค์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚ด ์ดํ•ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ... ๋ณต์‚ฌ/๋ถ™์—ฌ ๋„ฃ๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜์ด ์ €์žฅ์†Œ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค [ ์—ฌ๊ธฐ ]. "int"๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ณ  ์ˆ˜์ •ํ•ด์•ผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ˆ˜์ •ํ•œ๋‹ค๋Š” ๊ฒƒ์€ "int"์˜ ๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ์œ ํ˜•์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ๋ณ„์นญ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์˜ˆ๋ฅผ ๋“ค์–ด T๋ฅผ ํ•œ ๋ฒˆ ์ˆ˜์ •ํ•˜๊ณ  "type T int" ํ–‰์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” T๋ฅผ float64์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฒƒ์— ๋‹ค์‹œ ๋ฐ”์ธ๋”ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ:
a) ์ด ๊ธฐ์ˆ ์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์†๋„ ์ €ํ•˜๊ฐ€ ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์˜ ์„ ํƒ์ž…๋‹ˆ๋‹ค.
b) ๋™์ผํ•œ ์ฝ”๋“œ์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด vgo ํ•ญ๋ชฉ์ด ์ฃผ์–ด์ง€๋ฉด... ์ฆ‰, ์‚ฌ์šฉ๋œ ์†Œ์Šค๋ฅผ ๋ณด์ด์ง€ ์•Š๊ฒŒ ์ง‘์–ด๋„ฃ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ฆฌ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ ํŒฝ์ฐฝ์€ ํ˜„์žฌ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ ๊ธฐ์ˆ ๊ณผ ๋™์ผํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ๋ณ„์นญ๊ณผ ํ–ฅํ›„ vgo ์‚ฌ์ด์— ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๊ธฐ์ดˆ๊ฐ€ ๊ฑฐ์˜ ์™„์„ฑ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

์ œ์•ˆ์„œ [ ์—ฌ๊ธฐ ]์— "์•Œ ์ˆ˜ ์—†๋Š”" ํ•ญ๋ชฉ์ด ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ข€ ๋” ์‚ด์„ ์ฐŒ์šฐ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

@mandolyte ์ผ๋ถ€ ์ผ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ์— ํŠน์ˆ˜ ์œ ํ˜•์„ ๋ž˜ํ•‘ํ•˜์—ฌ ๋˜ ๋‹ค๋ฅธ ์ˆ˜์ค€์˜ ๊ฐ„์ ‘ ์ฐธ์กฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ตฌํ˜„์ด ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋“  ๋งˆ๋ฒ•์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Ian์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ์ œ์•ˆ์ด ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์œ ์ €๊ฐ€ ํƒ€์ž… ์†Œ๊ฑฐ์™€ ๋ชจ๋…ธ๋ชจํ”ผ์ œ์ด์…˜ ์ค‘ ์„ ํƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
ํ›„์ž๋Š” Rust๊ฐ€ ์ œ๋กœ ๋น„์šฉ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ฐ€์•ผํ•ฉ๋‹ˆ๋‹ค.

2018๋…„ 4์›” 9์ผ ์›”์š”์ผ, ์˜ค์ „ 8:32 Antonenko Artem [email protected]
์ผ๋‹ค:

@mandolyte https://github.com/mandolyte ๋‹ค๋ฅธ ๋ ˆ๋ฒจ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ถ€ ์ผ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ์— ํŠน์ˆ˜ ์œ ํ˜•์„ ๋ž˜ํ•‘ํ•˜์—ฌ ๊ฐ„์ ‘ ์ฐธ์กฐ. ์ €๊ฒƒ
๊ตฌํ˜„์ด ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๋งˆ๋ฒ•. Ian์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ์ œ์•ˆ์ด ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/15292#issuecomment-379735199 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AGGWB1v9h5kWmuHCBuoewTTSX751OHgrks5tm1TsgaJpZM4IG-xv
.

๋ชจ๋“ˆ์„ฑ๊ณผ ์„ฑ๋Šฅ ๊ฐ„์˜ ๊ท ํ˜•์— ๋Œ€ํ•œ ์ด ๋…ผ์˜์—์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ผ๋ž€์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์œ ํ˜•์—์„œ ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ์žฌ์œ ํ˜• ๊ฒ€์‚ฌํ•˜๊ณ  ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” C++ ๊ธฐ์ˆ ์€ ๋ชจ๋“ˆํ™”์— ์ข‹์ง€ ์•Š๊ณ  ์ด์ง„ ๋ฐฐํฌ์— ์ข‹์ง€ ์•Š์œผ๋ฉฐ ์ฝ”๋“œ ํŒฝ์ฐฝ์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์— ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์ข‹์€ ๋ถ€๋ถ„์€ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ ์œ ํ˜•์— ์ž๋™์œผ๋กœ ํŠนํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ ์ค‘์ธ ์œ ํ˜•์ด int ์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ์œ ํ˜•์ผ ๋•Œ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. Java๋Š” ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ๋™์งˆ์ ์œผ๋กœ ๋ฒˆ์—ญํ•˜์ง€๋งŒ ํŠนํžˆ ์ฝ”๋“œ๊ฐ€ T[] ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ๋•Œ ์„ฑ๋Šฅ ๋ฉด์—์„œ ๋Œ€๊ฐ€๋ฅผ ์น˜๋ฆ…๋‹ˆ๋‹ค.

๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ C++์˜ ๋น„๋ชจ๋“ˆ์„ฑ ๋ฐ ์ „์ฒด ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ ์ƒ์„ฑ ์—†์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ธฐ๋ณธ ์œ ํ˜•์— ๋Œ€ํ•œ ํŠน์ˆ˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž๋™์œผ๋กœ ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ง€์‹œ์— ์˜ํ•ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ธ์Šคํ„ด์Šคํ™”์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ์ผ๋ถ€ ๋””์ŠคํŒจ์น˜๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ๋™์ข… ๋ฒˆ์—ญ์— ์ด๋ฏธ ํ•„์š”ํ•œ ๋””์ŠคํŒจ์น˜๋กœ ์ ‘ํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ C#๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ์ „์ฒด ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ ์ƒ์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋กœ๋“œ๋กœ ๋””์ŠคํŒจ์น˜ ํ…Œ์ด๋ธ”์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋Ÿฐํƒ€์ž„์—์„œ ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€ ์ง€์›์ด ๋ฐ”๋žŒ์งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. T๊ฐ€ ๊ธฐ๋ณธ ์œ ํ˜•์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ T์˜ ๋ฐฐ์—ด์ด ์‹ค์ œ๋กœ ๊ธฐ๋ณธ ์œ ํ˜•์˜ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„๋˜๋Š” ๋‹จ์ผ ์ผ๋ฐ˜ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. PolyJ, Genus ๋ฐ Familia์—์„œ ์‚ฌ์šฉํ•œ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์™„์ „ํžˆ ์ „๋ฌธํ™”๋œ ๊ตฌํ˜„๋งŒํผ ๋น ๋ฅด์ง€๋Š” ์•Š์ง€๋งŒ Java ์ ‘๊ทผ ๋ฐฉ์‹์— ๋น„ํ•ด ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

@dc0d

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

์œ ํ˜• ๋ณ„์นญ์€ ์ƒ์ˆ˜ ์ฐธ์กฐ์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
'T Type'์„ ์ง์ ‘ ์“ฐ๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์‹ค์ œ๋กœ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ฒด ํŒจํ‚ค์ง€/๋ชจ๋“ˆ์— ๋Œ€ํ•ด ์ „์—ญ ์œ ํ˜• ๋ณ€์ˆ˜ 'T'๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ด์œ ๋Š” <> ๋˜๋Š” []์˜ ๋กœ์ปฌ ์œ ํ˜• vars๊ฐ€ ๋” ๋ชจ๋“ˆ์‹์ž…๋‹ˆ๋‹ค.

@ํฌ๋ ˆ์ปค

ํŠนํžˆ ๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์นœ์ˆ™ํ•œ C#. ๊ทธ๋Ÿฌ๋‚˜ Go ํŒ€์ด ์™„์ „ํžˆ ๋ฐฐ์ œํ•œ ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐ ์œ ํ˜•์šฉ์ด์ง€๋งŒ ๊ฐ’ ์œ ํ˜•์šฉ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@DemiMarie

์œ ์ €๊ฐ€ ํƒ€์ž… ์†Œ๊ฑฐ์™€ ๋ชจ๋…ธ๋ชจํ”ผ์ œ์ด์…˜ ์ค‘ ์„ ํƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
ํ›„์ž๋Š” Rust๊ฐ€ ์ œ๋กœ ๋น„์šฉ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ฐ€์•ผํ•ฉ๋‹ˆ๋‹ค.

"Type Erasure"๋Š” ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. Java๊ฐ€ ์ œ๊ณตํ•˜๋Š” Type Parameter Erasure๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•˜์ง€๋งŒ ์ด๋Š” ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค.
Java์—๋Š” ๋‹จํ˜•ํ™”๊ฐ€ ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์ด Object์ธ ์ผ๋ฐ˜ ์ œ์•ฝ ์กฐ๊ฑด์˜ ์ƒํ•œ์œผ๋กœ ์ผ์ •ํ•˜๊ฒŒ ๋‹จํ˜•ํ™”(๋ฐ˜)ํ•ฉ๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋ฉ”์†Œ๋“œ์™€ ํ•„๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ƒํ•œ์„ ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ ์ ˆํ•œ ์œ ํ˜•์œผ๋กœ ์บ์ŠคํŒ…๋˜์–ด ์ƒ๋‹นํžˆ ์ถ”์•…ํ•ฉ๋‹ˆ๋‹ค.
Valhalla ํ”„๋กœ์ ํŠธ๊ฐ€ ์ˆ˜๋ฝ๋˜๋ฉด ๊ฐ’ ์œ ํ˜•์€ ๋ณ€๊ฒฝ๋˜์ง€๋งŒ ์ฐธ์กฐ ์œ ํ˜•์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ Java ๋ฐฉ์‹์œผ๋กœ ์ด๋™ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

"์ปดํŒŒ์ผ๋œ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜ธํ™˜์„ฑ์€ ๋ฆด๋ฆฌ์Šค ๊ฐ„์— ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."

๋ฐ˜๋ฉด ์ด๊ฒƒ์€ Java์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“ˆ์„ฑ๊ณผ ์„ฑ๋Šฅ ๊ฐ„์˜ ๊ท ํ˜•์— ๋Œ€ํ•œ ์ด ๋…ผ์˜์—์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ผ๋ž€์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์œ ํ˜•์—์„œ ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ์žฌ์œ ํ˜• ๊ฒ€์‚ฌํ•˜๊ณ  ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” C++ ๊ธฐ์ˆ ์€ ๋ชจ๋“ˆํ™”์— ์ข‹์ง€ ์•Š๊ณ  ์ด์ง„ ๋ฐฐํฌ์— ์ข‹์ง€ ์•Š์œผ๋ฉฐ ์ฝ”๋“œ ํŒฝ์ฐฝ์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์— ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ํผํฌ๋จผ์Šค๋ž€?

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

"์ฝ”๋“œ ํŒฝ์ฐฝ"๊ณผ "์„ฑ๋Šฅ"์ด "๋ง์ปค ์ž…๋ ฅ ํฌ๊ธฐ"์™€ "์—ฐ๊ฒฐ ์‹œ๊ฐ„"์„ ์˜๋ฏธํ•˜๋Š” ๊ฒฝ์šฐ ๋นŒ๋“œ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ํŠน์ •(ํ•ฉ๋ฆฌ์ ์ธ) ๊ฐ€์ •์„ ํ•  ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด ๋ฌธ์ œ๋„ ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ปดํŒŒ์ผ ๋‹จ์œ„์—์„œ ๊ฐ ์ „๋ฌธํ™”๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๋Œ€์‹  ํ•„์š”ํ•œ ์ „๋ฌธํ™” ๋ชฉ๋ก์„ ๋‚ด๋ณด๋‚ด๊ณ  ๋นŒ๋“œ ์‹œ์Šคํ…œ์ด ์—ฐ๊ฒฐํ•˜๊ธฐ ์ „์— ๊ฐ ๊ณ ์œ  ์ „๋ฌธํ™”๋ฅผ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค("Cfront ๋ชจ๋ธ"). IIRC, ์ด๊ฒƒ์€ C++ ๋ชจ๋“ˆ ์ด ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ๋†“์นœ ์„ธ ๋ฒˆ์งธ ์ข…๋ฅ˜์˜ "์ฝ”๋“œ ํŒฝ์ฐฝ" ๋ฐ "์„ฑ๋Šฅ"์„ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š” ํ•œ ์‚ฌ์–‘์ด ์•„๋‹ˆ๋ผ ๊ตฌํ˜„์˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. _๊ตฌํ˜„์ด ๋””๋ฒ„๊ทธ๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ •๋ณด,_ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.


Go์˜ ๋” ํฐ ๋ฌธ์ œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ฃผ์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋Ÿฐํƒ€์ž„์— ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์˜ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด type-assertion์ด๋‚˜ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. โ€ํ”„๋กœ๊ทธ๋žจ ๋ถ„์„ - ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ชจ๋“ˆํ™”์˜ ์‹คํŒจ์ด์ง€๋งŒ ์ฝ”๋“œ ํŒฝ์ฐฝ๊ณผ ์•„๋ฌด ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  Go ํ•จ์ˆ˜(๋ฐ ๋ฉ”์„œ๋“œ) ์œ ํ˜•์ด ์ธ์ˆ˜์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์˜ ์™„์ „ํ•œ ์ง‘ํ•ฉ์„ ์บก์ฒ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์—์„œ ๋น„๋กฏ๋ฉ๋‹ˆ๋‹ค.

@์‹œ๊ณ ์•ผ

์ฐธ์กฐ ์œ ํ˜•์šฉ์ด์ง€๋งŒ ๊ฐ’ ์œ ํ˜•์šฉ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฝ์€ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด C# JIT๋Š” ๊ฐ ๊ฐ’ ์œ ํ˜•์— ๋Œ€ํ•ด ๋Ÿฐํƒ€์ž„์— ๋ชจ๋“  ์ฐธ์กฐ ์œ ํ˜•์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ ํŠน์ˆ˜ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„(IL-time) ์ „๋ฌธํ™”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด C# ์ ‘๊ทผ ๋ฐฉ์‹์ด ์™„์ „ํžˆ ๋ฌด์‹œ๋˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. Go ํŒ€์€ Go๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์„ ์ œํ•œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ ์ƒ์„ฑ์— ์˜์กดํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ iOS์—์„œ๋Š” ๋Ÿฐํƒ€์ž„์— ์ฝ”๋“œ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ž‘๋™ํ•˜๊ณ  ์‹ค์ œ๋กœ ์ผ๋ถ€๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ Apple์€ AppStore์—์„œ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„Œ ์–ด๋–ป๊ฒŒ ๊ทธ๊ฑธ ํ–ˆ๋‹ˆ?

2018๋…„ 4์›” 9์ผ ์›”์š”์ผ ์˜คํ›„ 3:41 Antonenko Artem [email protected]
์ผ๋‹ค:

@sighoya https://github.com/sighoya

์ฐธ์กฐ ์œ ํ˜•์šฉ์ด์ง€๋งŒ ๊ฐ’ ์œ ํ˜•์šฉ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฝ์€ ๊ฒƒ์—์„œ C# JIT๋Š” ๊ฐ ๊ฐ’์— ๋Œ€ํ•ด ๋Ÿฐํƒ€์ž„์— ์ „๋ฌธํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์œ ํ˜• ๋ฐ ๋ชจ๋“  ์ฐธ์กฐ ์œ ํ˜•์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ. ์ปดํŒŒ์ผ ํƒ€์ž„์ด ์—†๋‹ค
์ „๋ฌธํ™”. ์ด๊ฒƒ์ด C# ์ ‘๊ทผ ๋ฐฉ์‹์ด ์™„์ „ํžˆ ๋ฌด์‹œ๋˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค - Go team
ํ”Œ๋žซํผ์„ ์ œํ•œํ•˜๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ ์ƒ์„ฑ์— ์˜์กดํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Go
์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ iOS์—์„œ๋Š” ์ฝ”๋“œ ์ƒ์„ฑ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋Ÿฐํƒ€์ž„์—. ์ž‘๋™ํ•˜๊ณ  ์‹ค์ œ๋กœ ์ผ๋ถ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ Apple์—์„œ๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์•ฑ์Šคํ† ์–ด์—์„œ.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/15292#issuecomment-379870005 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AGGWB-tslGeUSGXl2ZlEDLf0dCATUaYvks5tm7lvgaJpZM4IG-xv
.

@DemiMarie ๋Š” ํ™•์‹คํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด ์ด์ „ ์—ฐ๊ตฌ ์ฝ”๋“œ๋ฅผ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค(์—ฐ๊ตฌ๋Š” ๋‹ค๋ฅธ ์ด์œ ๋กœ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค). ๋‹ค์‹œ ํ•œ ๋ฒˆ, ๋””๋ฒ„๊ฑฐ๊ฐ€ ๋‚˜๋ฅผ ์˜ค๋„ํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๋ฅผ ํ• ๋‹นํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ง€์นจ์„ ์ž‘์„ฑํ•˜๊ณ  PROT_EXEC๋กœ mprotectํ•˜๊ณ  ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋””๋ฒ„๊ฑฐ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋””๋ฒ„๊ฑฐ๊ฐ€ ์—†์œผ๋ฉด ์˜ˆ์ƒ๋Œ€๋กœ ์ถฉ๋Œ ๋กœ๊ทธ์— CODESIGN ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์•ฑ์ด SIGKILL๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ AppStore๊ฐ€ ์—†์–ด๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. iOS๊ฐ€ Go์— ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ ์ƒ์„ฑ์— ๋Œ€ํ•œ ๋” ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ.

๋จผ์ €, Rob Pike์˜ 5๊ฐ€์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ทœ์น™์„ ํ•œ ๋ฒˆ ๋” ์ˆ™๊ณ ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ(IMHO):

๋Š๋ฆฐ ์ปดํŒŒ์ผ ๋ฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ์— ๋Œ€ํ•ด Go๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์ค‘์ธ ์ผ๋ฐ˜์ ์ธ ์œ ํ˜•์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ผ๋ฐ˜ ์œ ํ˜•์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๊นŒ(๊ทœ์น™ 3์—์„œ _n์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘์Œ)? ๋ฌธ์ œ๊ฐ€ ๊ตฌ์ฒด์ ์ธ ๊ฐœ๋…(๋งŽ์€ ์ˆ˜์˜ ์œ ํ˜•)์—์„œ ๋†’์€ ์ˆ˜์ค€์˜ ์นด๋””๋„๋ฆฌํ‹ฐ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š” ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ๊ฐ„๊ณผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ์—๋„ ๋‚˜๋Š” ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋ญ”๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๊ณ  ์ฃผ์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „์ž ์ƒ๊ฑฐ๋ž˜ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์•„๋ฌด๋„ ๊ฐ ์ œํ’ˆ ์ข…๋ฅ˜์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์œ ํ˜•์„ ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ณ€ํ˜• ๋ฐ ์•„๋งˆ๋„ ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ์ž ์ •์˜๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Verbosity๋Š” ๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋‹จ์ˆœํ•จ๊ณผ ์นœ์ˆ™ํ•จ(์˜ˆ: ๊ตฌ๋ฌธ)์˜ ์ข‹์€ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. Type Alias โ€‹โ€‹Rebinding์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ๋ถ€ํ’€๋ฆผ์ด ๋” ๋†’์•„์งˆ์ง€ ์˜์‹ฌ์Šค๋Ÿฝ๊ธด ํ•˜์ง€๋งŒ ์นœ์ˆ™ํ•œ Go-ish ๊ตฌ๋ฌธ๊ณผ ์ด์— ์ˆ˜๋ฐ˜๋˜๋Š” ๋ช…๋ฐฑํ•œ ์žฅํ™ฉํ•จ์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. Go์˜ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋Š” ์ฝ๊ธฐ ์‰ฌ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์“ฐ๊ธฐ๋„ ๋น„๊ต์  ์‰ฝ๊ณ  ์ฆ๊ฒ์Šต๋‹ˆ๋‹ค).

๋Ÿฐํƒ€์ž„์— ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ƒ์„ฑ๋œ ๊ตฌ์ฒด์ ์ธ ๊ฒฝ๊ณ„ ์œ ํ˜•๋งŒ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Type Alias โ€‹โ€‹Rebinding๊ณผ ๊ด€๋ จ๋œ ์œ ์ผํ•œ ๊ด€์‹ฌ์‚ฌ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐฐํฌํŒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@dc0d ์„ฑ๋Šฅ ์†์ƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ์˜ ๋‹ค๋ฅธ ๊ตฌํ˜„์œผ๋กœ ์ธํ•ด ๋ช…๋ น ์บ์‹œ๋ฅผ ์ฑ„์šฐ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์„ฑ๋Šฅ๊ณผ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ๊ด€๋ จ๋˜๋Š”์ง€๋Š” ๋ฏธํ•ด๊ฒฐ ์งˆ๋ฌธ์ด๋ฉฐ ๋ฒค์น˜๋งˆํฌ๋Š” ๋ชจ๋ฅด์ง€๋งŒ ์ด๋ก ์ ์œผ๋กœ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

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

Type Alias โ€‹โ€‹Rebinding๊ณผ ๊ด€๋ จ๋œ ์œ ์ผํ•œ ๊ด€์‹ฌ์‚ฌ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐฐํฌํŒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋””๋ฒ„๊น…์„ ์ง€์›ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
๋™์ผํ•œ ํ…œํ”Œ๋ฆฟ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2018๋…„ 4์›” 10์ผ ํ™”์š”์ผ ์˜ค์ „ 5:46 Kaveh Shahbazian [email protected]
์ผ๋‹ค:

๋จผ์ € Rob Pike์˜ 5๊ฐ€์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ทœ์น™์„ ์ˆ™๊ณ ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
https://users.ece.utexas.edu/%7Eadnan/pike.html ํ•œ ๋ฒˆ ๋”.

๋‘ ๋ฒˆ์งธ(IMHO):

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

์žฅํ™ฉํ•จ์€ ๋‹จ์ˆœํ•จ๊ณผ ์นœ์ˆ™ํ•จ์˜ ์ข‹์€ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค(์˜ˆ:
๊ตฌ๋ฌธ)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๋ช…ํ™•ํ•˜๊ณ  ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์˜์‹ฌํ•˜๋ฉด์„œ
Type Alias โ€‹โ€‹Rebinding์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ํŒฝ์ฐฝ์ด ๋” ๋†’์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์นœ์ˆ™ํ•œ Go-ish ๊ตฌ๋ฌธ๊ณผ ๊ทธ์— ์ˆ˜๋ฐ˜๋˜๋Š” ๋ช…๋ฐฑํ•œ ์žฅํ™ฉํ•จ. ์ค‘ ํ•˜๋‚˜
Go์˜ ๋ชฉํ‘œ๋Š” ์ฝ๊ธฐ ์‰ฌ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ฐœ์ธ์ ์œผ๋กœ๋Š”
์“ฐ๊ธฐ๋„ ๋น„๊ต์  ์‰ฝ๊ณ  ์พŒ์ ํ•จ).

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

Type Alias โ€‹โ€‹Rebinding๊ณผ ๊ด€๋ จ๋œ ์œ ์ผํ•œ ๊ด€์‹ฌ์‚ฌ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ถ„ํฌ.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/15292#issuecomment-380040032 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AGGWB6aDfoHz2wbsmu8mCGEt652G_VE9ks5tnH9xgaJpZM4IG-xv
.

์ธ์Šคํ„ด์Šคํ™”๋Š” "๋™์ผํ•œ ์ธ์ˆ˜ ์‚ฌ์šฉ" ๋˜๋Š” "๋™์ผํ•œ ๊ธฐ๋ณธ ์œ ํ˜•์˜ ์ธ์ˆ˜ ์‚ฌ์šฉ"์ด๋ผ๋Š” ์˜๋ฏธ์—์„œ "๋™์ผ"ํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ๊ฐ€๊นŒ์ด ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. (Go์˜ ๊ฒฝ์šฐ "๋™์ผํ•œ ํฌ์ธํ„ฐ ๋งˆ์Šคํฌ"๋„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.)

@ํฌ๋ ˆ์ปค

๋‚ด๊ฐ€ ์ฝ์€ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด C# JIT๋Š” ๊ฐ ๊ฐ’ ์œ ํ˜•์— ๋Œ€ํ•ด ๋Ÿฐํƒ€์ž„์— ๋ชจ๋“  ์ฐธ์กฐ ์œ ํ˜•์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ ํŠน์ˆ˜ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„(IL-time) ์ „๋ฌธํ™”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, ์ด๊ฒƒ์€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ง์ „์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ๊ฐ€ ํ•ด์„๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋•Œ๋•Œ๋กœ ์•ฝ๊ฐ„ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ ์ƒ์„ฑ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ˆ˜ํ–‰๋˜์ง€๋งŒ ์ปดํŒŒ์ผ ํ›„์— ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ์ฝ”๋“œ ์‹คํ–‰ ์ค‘์— ์‹คํ–‰๋˜๋Š” vm์˜ ์˜๋ฏธ๊ฐ€ ์˜ณ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด C#์˜ ์ œ๋„ค๋ฆญ ์‹œ์Šคํ…œ์ด ๊ดœ์ฐฎ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
go๋Š” VM์ด โ€‹โ€‹์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— C#์˜ ์˜๋ฏธ์—์„œ ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ ์ƒ์„ฑ์€ go๋กœ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@dc0d

Type Alias โ€‹โ€‹Rebinding๊ณผ ๊ด€๋ จ๋œ ์œ ์ผํ•œ ๊ด€์‹ฌ์‚ฌ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐฐํฌํŒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข€ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

@sighoya ๋‚ด ์‹ค์ˆ˜; ๋‚˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐฐํฌ ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒจํ‚ค์ง€๋ฅผ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

@creker ์ข‹์€ ์š”์•ฝ์ž…๋‹ˆ๋‹ค! (MO) ๊ฐ•๋ ฅํ•œ ์ด์œ ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š๋Š” ํ•œ Go ์–ธ์–ด ๊ตฌ์กฐ์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ํ˜•ํƒœ๋Š” ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Type Alias โ€‹โ€‹Rebinding์„ ์‚ฌ์šฉํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์ด์œ ๋Š” ์Šฌ๋ผ์ด์Šค ๋˜๋Š” ๋งต๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ์ œ๊ณต ๋ณตํ•ฉ ์œ ํ˜•์˜ ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

Verbosity๋Š” ๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋‹จ์ˆœํ•จ๊ณผ ์นœ์ˆ™ํ•จ(์˜ˆ: ๊ตฌ๋ฌธ)์˜ ์ข‹์€ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. Type Alias โ€‹โ€‹Rebinding์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ๋ถ€ํ’€๋ฆผ์ด ๋” ๋†’์•„์งˆ์ง€ ์˜์‹ฌ์Šค๋Ÿฝ๊ธด ํ•˜์ง€๋งŒ ์นœ์ˆ™ํ•œ Go-ish ๊ตฌ๋ฌธ๊ณผ ์ด์— ์ˆ˜๋ฐ˜๋˜๋Š” ๋ช…๋ฐฑํ•œ ์žฅํ™ฉํ•จ์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. Go์˜ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋Š” ์ฝ๊ธฐ ์‰ฌ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์“ฐ๊ธฐ๋„ ๋น„๊ต์  ์‰ฝ๊ณ  ์ฆ๊ฒ์Šต๋‹ˆ๋‹ค).

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

์šฐ๋ฆฌ๊ฐ€ ๋งค์ผ ๊ณ ์•ˆํ•ด์•ผ ํ•˜๋Š” ์ด๋ฆ„์—๋Š” ์„ธ ๊ฐ€์ง€ ๋ฒ”์ฃผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ/๋กœ์ง์˜ ๊ฒฝ์šฐ
  • ํ”„๋กœ๊ทธ๋žจ ์›Œํฌํ”Œ๋กœ ๋ฐ์ดํ„ฐ ์œ ํ˜•/๋กœ์ง
  • ์„œ๋น„์Šค/์ธํ„ฐํŽ˜์ด์Šค ๋ฐ์ดํ„ฐ ์œ ํ˜•/๋กœ์ง

ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž์‹ ์˜ ์ฝ”๋“œ์—์„œ ์ด๋ฆ„์„ ์ง“๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ•œ ์ ์ด ๋ช‡ ๋ฒˆ์ด๋‚˜ ๋ ๊นŒ์š”?

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

๊ทธ๋ฆฌ๊ณ  ์ด๋ฆ„์€ ์ฝ”๋“œ ๊ตฌ์กฐํ™” ์—ฐ์Šต์„ ๋™๋ฐ˜ํ•  ๋•Œ ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•ด์ง‘๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ ˆ์ด์•„์›ƒ(ํŒŒ์ผ, ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ, ํŒจํ‚ค์ง€/๋ชจ๋“ˆ) ๋ฐ ์‚ฌ๋ก€(๋””์ž์ธ ํŒจํ„ด, REST์™€ ๊ฐ™์€ ์„œ๋น„์Šค ์ถ”์ƒํ™”, ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ - ๋™์‹œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ํ•˜๋“œ ๋“œ๋ผ์ด๋ธŒ ์•ก์„ธ์Šค, ์ฒ˜๋ฆฌ๋Ÿ‰/๋Œ€๊ธฐ ์‹œ๊ฐ„) ์ธก๋ฉด์—์„œ ๋ชจ๋‘.

๊ตฌ๋ฌธ๊ณผ ์žฅํ™ฉํ•จ์— ๊ด€ํ•ด์„œ๋Š” ๋‚˜๋Š” ์˜๋ฆฌํ•œ ๊ฐ„๊ฒฐํ•จ๋ณด๋‹ค ์žฅํ™ฉํ•จ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค(์ ์–ด๋„ Go์˜ ๋งฅ๋ฝ์—์„œ). ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, Go๋Š” ์ฝ๊ธฐ ์‰ฌ์šฐ๋ฉฐ ๋ฐ˜๋“œ์‹œ ์“ฐ๊ธฐ๊ฐ€ ์‰ฝ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค(์ด์ƒํ•˜๊ฒŒ๋„ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค) .

Go์—์„œ ์ œ๋„ค๋ฆญ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ด์œ ์™€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋งŽ์€ ๊ฒฝํ—˜ ๋ณด๊ณ ์„œ์™€ ์ œ์•ˆ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

Go ์ธํ„ฐํ”„๋ฆฌํ„ฐ gomacro ์—์„œ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ณผ๊ฑฐ์— ๋‘ ์–ธ์–ด์— ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•œ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‚ด๊ฐ€ ์ˆœ์ง„ํ–ˆ์„ ๋•Œ ๋‹ค์‹œ ๋งŒ๋“  ์ง€๊ธˆ์€ ๋ฒ„๋ ค์ง„ ์–ธ์–ด :) C ์†Œ์Šค ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜
  2. ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ cl-parametric-types ๊ฐ€ ์žˆ๋Š” Common Lisp - ์ผ๋ฐ˜ ์œ ํ˜• ๋ฐ ํ•จ์ˆ˜์˜ ๋ถ€๋ถ„ ๋ฐ ์ „์ฒด ์ „๋ฌธํ™”๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

@cosmos72 ํ˜•์‹ ์•ˆ์ „์„ฑ์„ ์œ ์ง€ํ•œ ๊ธฐ์ˆ ์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ๋ณด๋Š” ๊ฒƒ์€ ์ข‹์€ ๊ฒฝํ—˜ ๋ณด๊ณ ์„œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง„ํ–‰ ์ƒํ™ฉ์€ https://github.com/cosmos72/gomacro/tree/generics-v1 ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ https://github.com/golang/proposal/blob/master/design/15292-generics.md#Proposal ์— ๋‚˜์—ด๋œ ์„ธ ๋ฒˆ์งธ ๋ฐ ๋„ค ๋ฒˆ์งธ Ian์˜ ์ œ์•ˆ์„ (์•ฝ๊ฐ„ ์ˆ˜์ •๋œ) ํ˜ผํ•ฉํ•˜์—ฌ ์‹œ์ž‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@cosmos72 ์•„๋ž˜ ๋งํฌ์— ์ œ์•ˆ ์š”์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ๋ธ”๋ Œ๋“œ๋Š” ๊ทธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๊นŒ?
https://docs.google.com/document/d/1vrAy9gMpMoS3uaVphB32uVXX4pi-HnNjkMEgyAHX4N4

๋‚˜๋Š” ๊ทธ ๋ฌธ์„œ๋ฅผ ์ฝ์—ˆ๋Š”๋ฐ, ๊ทธ๊ฒƒ์€ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ์˜ํ•œ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์š”์•ฝํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ €๋Š” C++, Rust ๋ฐ ๊ธฐํƒ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” "์œ ํ˜• ํŠน์ˆ˜ํ™”" ๊ธฐ์ˆ ๋กœ ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Go ์ƒˆ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ตฌ๋ฌธ์€ type ( Foo ...; Bar ...) ์ด๊ณ  ์ €๋Š” ํ™•์žฅํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— "๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํ…œํ”Œ๋ฆฟ ๋ฒ”์œ„"๊ฐ€ ์•ฝ๊ฐ„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. template[T1,T2...] type ( Foo ...; Bar ...) .
๋˜ํ•œ "์ œ์•ฝ์  ์ „๋ฌธํ™”"์˜ ๋ฌธ์„ ์—ด์–ด๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋ธ”๋ Œ๋“œ๋Š” https://github.com/golang/proposal/blob/master/design/15292/2013-10-gen.md ์™€ https://github.com/golang/proposal/blob/ ์‚ฌ์ด์ž…๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ: ์ดˆ๊ธฐ ๋ฐœํ‘œ ์ดํ›„์— ์ด ๊ณต์‹ Go ๋ฌธ์ œ์˜ ์ŠคํŒธ์„ ํ”ผํ•˜๋ ค๋ฉด gomacro ๋ฌธ์ œ #24: ์ผ๋ฐ˜ ์ถ”๊ฐ€ ์—์„œ gomacro ๊ด€๋ จ ํ† ๋ก ์„ ๊ณ„์†ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ 2: ์ฒซ ๋ฒˆ์งธ ํ…œํ”Œ๋ฆฟ ํ•จ์ˆ˜๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ปดํŒŒ์ผ๋˜๊ณ  ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/cosmos72/gomacro/tree/generics-v1 ์ฐธ์กฐ

๊ธฐ๋ก์„ ์œ„ํ•ด ๋‚ด ์˜๊ฒฌ์„ ๋‹ค์‹œ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ œ๋„ค๋ฆญ ๋ฐ ์œ ํ˜• ๋ณ„์นญ ๋ฆฌ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•ด).

์ œ๋„ค๋ฆญ์€ ์–ธ์–ด ๊ธฐ๋Šฅ(๋ชจ๋“  ์ˆ˜์ค€์—์„œ Go์˜ ์œ ํ˜• ์‹œ์Šคํ…œ ๊ฐ„์„ญ)์ด ์•„๋‹Œ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋Šฅ(์ฝ”๋“œ ์ƒ์„ฑ, ํ…œํ”Œ๋ฆฟ ๋“ฑ)์œผ๋กœ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@dc0d
๊ทธ๋Ÿฌ๋‚˜ C++ ํ…œํ”Œ๋ฆฟ์€ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐ ์–ธ์–ด ๊ธฐ๋Šฅ์ด ์•„๋‹™๋‹ˆ๊นŒ?

@sighoya ์ œ๊ฐ€ C++์„ ์ „๋ฌธ์ ์œผ๋กœ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ž‘์„ฑํ•œ ๊ฒƒ์€ 2001๋…„ ์ฏค์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ช…๋ช…์˜ ์˜๋ฏธ๊ฐ€ ์ •ํ™•ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด - "ํ…œํ”Œ๋ฆฟ" ๋ถ€๋ถ„ - ์˜ˆ(๋˜๋Š” ์˜คํžˆ๋ ค ์•„๋‹ˆ์˜ค)์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์–ธ์–ด ๊ตฌ์„ฑ๊ณผ ํ•จ๊ป˜ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋Šฅ(์–ธ์–ด ๊ธฐ๋Šฅ ์•„๋‹˜)์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ๊ณผ ๊ด€๋ จ๋œ ์–ธ์–ด ๊ตฌ์„ฑ์„ ์˜ค๋ฒ„๋กœ๋“œํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

@dc0d๋ฅผ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ด ๊ธฐ๋Šฅ์€ ํ†ตํ•ฉ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

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

type BinaryTreeOfStrings struct {
    left, right *BinaryTreeOfStrings;
    string content;
}

// Its methods here

type BinaryTreeOfBigInts struct {
    left, right *BinaryTreeOfBigInts;
    uint64 content;
}

// AGAIN the same methods but different type

... ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋‚˜ ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด ๊ธฐ๋Šฅ์ด ์ปดํŒŒ์ผ๋Ÿฌ ์ž์ฒด์˜ ์ผ๋ถ€๊ฐ€ ๋˜๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ฐธ๊ณ :

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

์ง€๊ธˆ๊นŒ์ง€ ๋‚ด ์˜๊ฒฌ์—์„œ ๋‚ด ์ œ์•ˆ์€ ์™ธ๋ถ€ ๋„๊ตฌ ๋Œ€์‹  ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์› ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Go๊ฐ€ C++ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์€ ๋ถˆํ–‰ํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ C++ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋””๋ฒ„๊น…์˜ ์–ด๋ ค์›€, ๋ชจ๋“ˆ์„ฑ ๋ถ€์กฑ, ์ฝ”๋“œ ํŒฝ์ฐฝ๊ณผ ๊ฐ™์€ ์ œ๋„ค๋ฆญ์˜ ์ „์ฒด ์•„์ด๋””์–ด์— ๋ฐ˜๋Œ€ํ•˜๊ฒŒ ๋งŒ๋“  ํ˜ผ๋ž€์œผ๋กœ ๋ด…๋‹ˆ๋‹ค. ๋ชจ๋“  "์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ" ์†”๋ฃจ์…˜์€ ์‹ค์ œ๋กœ ๋งคํฌ๋กœ ๋Œ€์ฒด์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์›์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@andrewcmyers ์ €๋Š” ์ผ๋ฐ˜ ํŒจํ‚ค์ง€๋งŒ ์ž‘์„ฑํ•˜๊ณ  interface{} ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  type T = interface{} ๋ฅผ ํŒจํ‚ค์ง€ ์ˆ˜์ค€์˜ ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” Type Alias โ€‹โ€‹Rebinding ์ œ์•ˆ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ๋‹ค์•ผ.

  • ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ผ๋ฐ˜ ํŒจํ‚ค์ง€์ฒ˜๋Ÿผ ๋””๋ฒ„๊ทธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ค‘๊ฐ„ ๋ฐ˜๊ฐ๊ธฐ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์ˆ˜์ค€์—์„œ Go ์œ ํ˜• ์‹œ์Šคํ…œ์— ๊ฐ„์„ญํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ๋งŒ ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค.
  • ๋ช…์‹œ์ ์ž…๋‹ˆ๋‹ค. ์ˆจ๊ฒจ์ง„ ๋ชจ์กฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ผ๋ฐ˜ ํ˜ธ์ถœ์„ ๋งค๋„๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฌด์Šน๋ถ€๋กœ ๋ณธ๋‹ค! ๋‘ ๋ฒˆ์˜ ์—ฐ์† ํ˜ธ์ถœ์—์„œ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ํ•˜๋‚˜์˜ ๋ช…๋ น๋ฌธ์—์„œ Goish(IMO)๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋ฌด์—‡๋ณด๋‹ค๋„ Go 1.x(x >= 8) ์‹œ๋ฆฌ์ฆˆ์™€ ํ•˜์œ„ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

์•„์ด๋””์–ด๊ฐ€ ์ƒˆ๋กœ์šด ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ Go์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์€ ์‹ค์šฉ์ ์ด๊ณ  ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ณด๋„ˆ์Šค: Go์—๋Š” ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ ํ˜• ๋ณ„์นญ์˜ ๊ธฐ๋ณธ๊ฐ’์„ (์˜ˆ๋ฅผ ๋“ค์–ด) type T = int ๋กœ ์ •์˜ํ•˜๋ฉด ์ด ์ผ๋ฐ˜ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์œ ํšจํ•œ ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ + ์— ๋Œ€ํ•œ ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ์žˆ๋Š” ์ˆซ์ž ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ณ„์นญ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ผ๋ถ€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ ์œ ํ˜• ๋ฐ ๋ช…๋ น๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๋‘˜ ์ด์ƒ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ Error ๋ฐ Stringer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ณ  + ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์›ํ•˜๋Š” ์ˆซ์ž ์œ ํ˜•์ธ ์ผ๋ฐ˜ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ช…์‹œ์  ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ถ”์•…ํ•ฉ๋‹ˆ๋‹ค. !

์ง€๊ธˆ ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฑฐ์˜ ๋™์ผํ•˜์ง€๋งŒ ์™ธ๋ถ€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์ฐจ์ด์ ์€ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋„๋ฆฌ ํ—ˆ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•( go generate ์„ ํ†ตํ•ด)์ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ผ ์ปค๋ฐ‹/๊ฐœ๋ฐœ ์‹œ๊ฐ„์— ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ž„์˜์˜ ์ฝ”๋“œ ์‹คํ–‰์„ ํ—ˆ์šฉํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๋ช‡ ๋ฐฐ๋‚˜ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณ„๋„์˜ ๋นŒ๋“œ ์ข…์†์„ฑ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(์ฆ‰, ๋” ์ด์ƒ Go๋กœ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋„๊ตฌ). ๋‚˜๋Š” ๋ฉ”ํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ˜ธ์ถœ์„ ์—…์ŠคํŠธ๋ฆผ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ‘ธ์‹œํ•˜๊ธฐ ์œ„ํ•ด Go๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ์ ‘๊ทผ ๋ฐฉ์‹์ด ๊ทธ๋ ‡๋“ฏ์ด ์ด ์ ‘๊ทผ ๋ฐฉ์‹์—๋„ ๋‹จ์ ์ด ์žˆ๊ณ  ์ ˆ์ถฉ์•ˆ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ์ง€์›ํ•˜๋Š” ์‹ค์ œ ์ œ๋„ค๋ฆญ์ด ๋” ๋‚˜์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ(์ฆ‰, ๋” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ๊ฐ€์ง) ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ์•ˆ์ „ํ•œ ์ปดํŒŒ์ผ์˜ ์ด์ ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ฝ์„ ๊ฒƒ์ด๋ผ๊ณ  ์•ฝ์†ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ์ถ”๊ฐ€ํ•  ๊ฒƒ ์ž…๋‹ˆ๋‹ค. Apache Beam์šฉ GoLang SDK๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋””์ž์ด๋„ˆ๊ฐ€ ๋†’์€ ์ˆ˜์ค€์˜ ๋ชจ๋“  ๊ฒƒ์„ _์ ์ ˆํ•˜๊ฒŒ_ ํ•ด๋‚ด๊ธฐ ์œ„ํ•ด ๊ฒฌ๋ŽŒ์•ผ ํ•˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ค์†Œ ๋ฐ์€ ์˜ˆ/์‡ผ์ผ€์ด์Šค์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Go ์ œ๋„ค๋ฆญ์—๋Š” ์ตœ์†Œํ•œ ๋‘ ๊ฐ€์ง€ ์‹คํ—˜์  ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ฃผ ์ดˆ์— ๋‚˜๋Š” (1)๊ณผ ํ•จ๊ป˜ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ์ตœ์†Œํ™”๋˜์–ด ๊ธฐ๋ปค์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ‰๋“ฑ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์€ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์ด ์ •์ˆ˜ ๋˜๋Š” ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ "return nil,err"์˜ ์ผ๋ฐ˜์ ์ธ ๊ด€์šฉ๊ตฌ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ชจ๋‘ ๋ณต์žก์„ฑ ๋น„์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ์ด์ƒํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ Go์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ Go ์ œ๋„ค๋ฆญ ์†”๋ฃจ์…˜์ด ์œ ํ˜•์˜ 0 ๊ฐ’์— ๋Œ€ํ•œ ๋ฒ”์šฉ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ด€์ฐฐํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹จ์ˆœํžˆ ์ˆซ์ž ์œ ํ˜•์˜ ๊ฒฝ์šฐ 0, ๋ฌธ์ž์—ด ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด, ๊ตฌ์กฐ์ฒด์˜ ๊ฒฝ์šฐ nil๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

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

์ •์ˆ˜์— ๋Œ€ํ•ด ๋™์ผํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Point์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

type Point struct {
    x,y int
}

๋‚ด ํ…Œ์ŠคํŠธ ๋ฐ ๊ด€์ฐฐ์— ๋Œ€ํ•ด์„œ๋Š” (2)๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

(1) https://github.com/albrow/fo; ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์•ž์„œ ์–ธ๊ธ‰ํ•œ https://github.com/cosmos72/gomacro#generics ์ž…๋‹ˆ๋‹ค.
(2) https://github.com/mandolyte/fo-experiments

@mandolyte *new(T) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์œ ํ˜•์˜ 0 ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

default(T) ๋˜๋Š” zero(T)์™€ ๊ฐ™์€ ์–ธ์–ด ๊ตฌ์„ฑ(์ฒซ ๋ฒˆ์งธ ๊ฒƒ์€
C# IIRC์—์„œ๋Š” ๋ช…ํ™•ํ•˜์ง€๋งŒ OTOH๋Š” *new(T)๋ณด๋‹ค ๋” ๊ธธ์ง€๋งŒ
์„ฑ๋Šฅ).

2018-07-06 9:15 GMT-05:00 Tom Thorogood ์•Œ๋ฆผ @github.com :

@mandolyte https://github.com/mandolyte *new(T)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ
๋ชจ๋“  ์œ ํ˜•์˜ 0 ๊ฐ’.

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/15292#issuecomment-403046735 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AlhWhQ5cQwnc3x_XUldyJXCHYzmr6aN3ks5uD3ETgaJpZM4IG-xv
.

--
TripleMint์—์„œ ์‚ฌ์šฉํ•  ๋ฉ”์ผ ์„œ๋ช… ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

19642๋Š” ์ผ๋ฐ˜์ ์ธ 0 ๊ฐ’์„ ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@tmthrgd ์–ด์ฉ์ง€ ๊ทธ ์†Œ์†Œํ•œ ์ •๋ณด๊ฐ€ ๊ทธ๋ฆฌ์› ์–ด์š”. ๊ฐ์‚ฌ ํ•ด์š”!

์ „์ฃผ๊ณก

์ œ๋„ค๋ฆญ์€ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ์„ ์ „๋ฌธํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „๋ฌธํ™”์˜ ์„ธ ๊ฐ€์ง€ ๋ฒ”์ฃผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ „๋ฌธํ™” ์œ ํ˜•, Type<T> - _array_;
  • ์ „๋ฌธํ™” ๊ณ„์‚ฐ, F<T>(T) ๋˜๋Š” F<T>(Type<T>) - _์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์—ด_;
  • ์ „๋ฌธ ํ‘œ๊ธฐ๋ฒ•, ์˜ˆ๋ฅผ ๋“ค์–ด _LINQ_ - Go์˜ select ๋˜๋Š” for ๋ฌธ;

๋ฌผ๋ก  ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ _C++_, _C#_ ๋˜๋Š” _Java_์™€ ๊ฐ™์€ ๊ธฐ์กด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ์ด ๋ชฉ๋ก์œผ๋กœ ์ œํ•œ๋œ ์–ธ์–ด ๊ตฌ์„ฑ์„ ๋‹ค์†Œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ƒ๊ฐ

์ œ๋„ค๋ฆญ ์œ ํ˜•/๊ตฌ์„ฑ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ”์ฃผ๋Š” ์œ ํ˜•์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ ์œ ํ˜•/๊ตฌ์„ฑ์˜ ๋‘ ๋ฒˆ์งธ ๋ฒ”์ฃผ๋Š” ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์˜ _property_์— ๋Œ€ํ•ด _act_ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด _sortable array_๋Š” ํ•ญ๋ชฉ์˜ _comparable ์†์„ฑ_์„ _compare_ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. T.(P) ๊ฐ€ T ์˜ ์†์„ฑ์ด๊ณ  A(T.(P)) ๊ฐ€ ํ•ด๋‹น ์†์„ฑ์— ์ž‘์šฉํ•˜๋Š” ๊ณ„์‚ฐ/์•ก์…˜์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด (A, .(P)) ๋Š” ๊ฐ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์— ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์›๋ž˜์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ๊ณ„์‚ฐ์— ์ „๋‹ฌ๋œ ํŠน์ˆ˜ ๊ณ„์‚ฐ์œผ๋กœ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค. Go์—์„œ ํ›„์ž์˜ ๊ฒฝ์šฐ์˜ ์˜ˆ๋กœ๋Š” sort.Interface ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—๋Š” ๋ณ„๋„์˜ ํ•จ์ˆ˜ sort.Reverse ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ ์œ ํ˜•/๊ตฌ์„ฑ์˜ ์„ธ ๋ฒˆ์งธ ๋ฒ”์ฃผ๋Š” _type-specialized_ ์–ธ์–ด ํ‘œ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. _์ผ๋ฐ˜์ ์œผ๋กœ_ Go๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์งˆ๋ฌธ

๊ณ„์† ...

์ด๋ชจํ‹ฐ์ฝ˜๋ณด๋‹ค ๋” ์„ค๋ช…์ ์ธ ํ”ผ๋“œ๋ฐฑ์€ ๋ฌด์—‡์ด๋“  ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

@dc0d ์ œ๋„ค๋ฆญ์„ ์ •์˜ํ•˜๊ธฐ ์ „์— Sepanov์˜ "ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”์†Œ"๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. TL;DR์€ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ฐ™์ด ์‹œ์ž‘ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์šฐ๋ฆฌ๋Š” Btree ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋™์ผํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋งŽ์€ ๋ณต์‚ฌ๋ณธ์„ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ฆฌ๊ณ  '์ •๋ ฌ ๊ฐ€๋Šฅ'๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๊ฐœ๋…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•„์š”ํ•œ ์•ก์„ธ์Šค ํŒจํ„ด๋ณ„๋กœ ๋ถ„๋ฅ˜ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ˆœ๋ฐฉํ–ฅ ์ „์šฉ, ๋‹จ์ผ ํŒจ์Šค(์ŠคํŠธ๋ฆผ), ๋‹ค์ค‘ ํŒจ์Šค๋งŒ ์ „๋‹ฌ(๋‹จ์ผ ์—ฐ๊ฒฐ ๋ชฉ๋ก), ์–‘๋ฐฉํ–ฅ(์ด์ค‘ ์—ฐ๊ฒฐ ๋ชฉ๋ก), ์ •๋ ฌ). ์ƒˆ๋กœ์šด ์ปฌ๋ ‰์…˜ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ชจ๋“  ๊ด€๋ จ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ํ•ด๋‹น ์ปฌ๋ ‰์…˜์ด ์†ํ•˜๋Š” "์ขŒํ‘œ" ๋ฒ”์ฃผ๋งŒ ํ‘œ์‹œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฒ”์ฃผ๋Š” 'Go' ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ถ”์ƒ/์—ฐ๊ด€ ์œ ํ˜•์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Go์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜์— ์ž„์‹œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@dc0d ์ œ๋„ค๋ฆญ์„ ๊ตฌ์„ฑ ์š”์†Œ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๋ ค๋Š” ์‹œ๋„๋กœ ์ด์ „์—๋Š” "ํ‘œ๊ธฐ๋ฒ• ์ „๋ฌธํ™”"๋ฅผ ๋ณ„๋„์˜ ๋ถ€๋ถ„์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์„ ํ™œ์šฉํ•˜์—ฌ DSL์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํŠน์ง•์ง€์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ 1๊ณผ 2๊ฐ€ ๊ฐ๊ฐ "๋ฐ์ดํ„ฐ ๊ตฌ์กฐ"์™€ "์•Œ๊ณ ๋ฆฌ์ฆ˜"์ด๋ผ๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋กœ์— ๋Œ€ํ•œ ์˜์กด๋„๊ฐ€ ๋†’์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์–ด๋ ค์šด ์ด์œ ๊ฐ€ ์กฐ๊ธˆ ๋” ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ sort.Interface๋Š” Indexable ๋ฐ Comparable ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ๋™์ž‘ ์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ† ๋ฆฌ์ง€ ์™€ ๋™์ž‘ ์‚ฌ์ด์— ์„ ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ์œ„์น˜์— ๋Œ€ํ•œ ๊ฝค ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค. "swap" ๋ฐ "less"(๋ฐ len). ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํŠธ๋ฆฌ ๋˜๋Š” ํž™๊ณผ ๊ฐ™์€ ๋” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ๋ถ„ํ•ด๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ํ˜„์žฌ Go ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ˆœ์ˆ˜ํ•œ ๋™์ž‘์œผ๋กœ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ ๋น„ํ‹€๋ฆผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ต๊ณผ์„œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์™œ๊ณก ์—†์ด ๋น„๊ต์  ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ DSL์„ ์„ค๊ณ„ํ•  ๋งŒํผ ๊ฐ•๋ ฅํ•˜์ง€ ์•Š์€ ์ธํ„ฐํŽ˜์ด์Šค(๋˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ)์— ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์€ ์ œ๋„ค๋ฆญ ์ถ”๊ฐ€๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ๋•Œ ์ œํ•œ๋œ ์ œ๋„ค๋ฆญ ๊ตฌํ˜„์œผ๋กœ ์ž์‹ ์„ ์ œํ•œํ•˜๊ณ  ์‹ถ์€์ง€ ๋Š” ๋‹ค๋ฅธ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด์ง„ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ @infogulch ์ขŒํ‘œ ๊ตฌ์กฐ๋Š” "๋ถ„๊ธฐ ์ขŒํ‘œ"์ด๋ฉฐ, ๋‹ค๋ฅธ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ๋“ฑ๊ฐ€๋ฌผ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„ธ ๊ฐ€์ง€ ์ฃผ๋ฌธ, ์ฆ‰ ์‚ฌ์ „ ์ฃผ๋ฌธ, ์ฃผ๋ฌธ ์ค‘ ๋ฐ ์‚ฌํ›„ ์ฃผ๋ฌธ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ†ตํ•ด ํŠธ๋ฆฌ์˜ ์ˆœ์„œ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉด ํŠธ๋ฆฌ๋Š” ์–‘๋ฐฉํ–ฅ ์ขŒํ‘œ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์–‘๋ฐฉํ–ฅ ์ขŒํ‘œ์— ์ •์˜๋œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ œํ’ˆ๊ตฐ์€ ์ตœ์ ์œผ๋กœ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

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

(์ž„ํ˜ธ)

@infogulch

์•„๋งˆ๋„ ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์„ ํ™œ์šฉํ•˜์—ฌ DSL์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํŠน์ง•์ง€์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์€ ์ผ๋ จ์˜ ์–ธ์–ด ๊ตฌ์กฐ์˜ ์ผ๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์— IMO์—์„œ ์ด๋ฅผ DSL์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ๋ถ€์ •ํ™•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

1๊ณผ 2 ... ์ข…์ข… ๋งค์šฐ ์˜์กด์ ์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ์‚ฌ์šฉ์ด ์•„์ง ๊ฒฐ์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์„ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— 1์€ ์Šค์Šค๋กœ ๊ณต๋ถ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

sort.Interface ๋Š” _storage_์™€ _behavior_ ์‚ฌ์ด์— ์„ ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ณณ์˜ ๊ฝค ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

์ž˜ํ–ˆ๋‹ค;

์ด๊ฒƒ์€ ๋” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ๋ถ„ํ•ด๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

๊ทธ๊ฒƒ์€ ๋‚ด ์งˆ๋ฌธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ผ๋ฐ˜ํ™”ํ•˜๊ณ  ์ œํ•œ ์‚ฌํ•ญ(์˜ˆ List<T> where T:new, IDisposable )์œผ๋กœ ์„ค๋ช…ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ํ•ญ๋ชฉ(ํŠน์ • ์œ ํ˜•์˜ ์ง‘ํ•ฉ)์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ํ™”๋œ _ํ”„๋กœํ† ์ฝœ_์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@keean

๋ฌธ์ œ๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ํŒจํ„ด ๋ถ„๋ฅ˜ ์ค‘ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด์œ ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ถ„๋ฅ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ง„์‹ค. ์ธ๋ฑ์Šค๋กœ ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์€ ์Šฌ๋ผ์ด์Šค(๋˜๋Š” ๋ฐฐ์—ด)์˜ _์†์„ฑ_์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ(๋˜๋Š” _tree_ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฌด์—‡์ด๋“  _tree_ ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ)์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์š”๊ตฌ ์‚ฌํ•ญ์€ _access & mutate(swap)_ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์š”๊ตฌ ์‚ฌํ•ญ์€ ํ•ญ๋ชฉ์ด ๋น„๊ต ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์— ๋Œ€ํ•ด (์ €์—๊ฒŒ) ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์š”๊ตฌ ์‚ฌํ•ญ์€ ์–‘์ชฝ(์ปจํ…Œ์ด๋„ˆ ๋ฐ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜)์—์„œ ๋ชจ๋‘ ์ถฉ์กฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ Go์—์„œ ์ œ๋„ค๋ฆญ์„ ์‹ค์šฉ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ๊ฐ ์ธก๋ฉด์€ ์ธํ„ฐํŽ˜์ด์Šค ์ธก๋ฉด์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์„ค๋ช…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํšจ๊ณผ์ ์ธ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@dc0d ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ถฉ๋ถ„ํžˆ ๊ฐ•๋ ฅํ•˜๋‹ค๋ฉด ์ด๊ฒƒ์€ ์™„์ „ํ•œ ์ผ๋ฐ˜์„ฑ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ ํ˜•๋ณ„๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋˜์ง€๋งŒ ์œ ํ˜• ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

'sort'๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด 'Ord'๋Š” ์ปจํ…Œ์ด๋„ˆ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ปจํ…Œ์ด๋„ˆ์— ์ €์žฅ๋œ ์œ ํ˜•์˜ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์•ก์„ธ์Šค ํŒจํ„ด์€ ์ปจํ…Œ์ด๋„ˆ์˜ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœ ์•ก์„ธ์Šค ํŒจํ„ด์€ '๋ฐ˜๋ณต์ž'์ด์ง€๋งŒ ๊ทธ ์ด๋ฆ„์€ C++์—์„œ ์œ ๋ž˜ํ–ˆ์œผ๋ฉฐ Stepanov๋Š” ๋” ๋ณต์žกํ•œ ๋‹ค์ฐจ์› ์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” '์ขŒํ‘œ'๋ฅผ ์„ ํ˜ธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ •๋ ฌ์„ ์ •์˜ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

bubble_sort : forall T U I => T U -> T U requires
   ForwardIterator<T>, Readable<T>, Writable<T>,
   Ord<U>,  ValueType(T) == U, Distance type(T) == I

์ฐธ๊ณ : ์ด ํ‘œ๊ธฐ๋ฒ•์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๊ด€๋ จ ์ž‘์—…์„ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์š”๊ตฌ ์‚ฌํ•ญ ์ ˆ์€ Stepanov๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๊ตฌ๋ฌธ์— ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์œ ํ˜•์€ Haskell์—์„œ ๊ฐ€์ ธ์™”์œผ๋ฉฐ ์œ ํ˜• ํด๋ž˜์Šค๋Š” ์ด๋Ÿฌํ•œ ๊ฐœ๋…์˜ ์ข‹์€ ๊ตฌํ˜„์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@keean
์•„๋งˆ๋„ ๋‚ด๊ฐ€ ๋‹น์‹ ์„ ์˜คํ•ดํ•˜๊ณ  ์žˆ์„์ง€ ๋ชจ๋ฅด์ง€๋งŒ, ์ ์–ด๋„ ์ง€๊ธˆ์€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ •์˜๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋งŒ ์ œํ•œํ•  ์ˆ˜๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด sort.Slice๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” ์Šฌ๋ผ์ด์Šค ์ •๋ ฌ์— ๊ด€์‹ฌ์ด ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ์Šฌ๋ผ์ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@urandom ์ปฌ๋ ‰์…˜์ด ์•„๋‹Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ถ”์ƒํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ "์ •๋ ฌ" ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์–ด๋–ค ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ํŒจํ„ด์ด ์žˆ๋Š”์ง€ ๋ฌป๊ณ  ์ด๋ฅผ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ "์Šฌ๋ผ์ด์Šค"์ธ์ง€ ์—ฌ๋ถ€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์Šฌ๋ผ์ด์Šค์—์„œ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ •์˜ํ•˜๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ฒฐ์ •ํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด์Šค๋Š” ํŠน๋ณ„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์—… ์„ธํŠธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜• T์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ ์œ ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๊ณ ์œ ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ์œ ํ˜•์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•จ๊ป˜ ์ œ๊ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@keean
๊ทธ๊ฒŒ ๋‹น์‹ ์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Go์˜ ๋งฅ๋ฝ์—์„œ ์ด๋Š” ์•„๋งˆ๋„ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ƒ๋‹นํ•œ ์ ๊ฒ€์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. sort.Slice ๋˜๋Š” math.Max ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ผ๋ฐ˜ํ™”๋˜๋„๋ก ํ•˜๋ ค๋ฉด ๋ฐ˜๋ณต ๋˜๋Š” ์—ฐ์‚ฐ์ž์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๊ธฐ๋ณธ ์ œ๊ณต ์ž‘์—…์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค(์˜์‚ฌ ์ฝ”๋“œ)๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

type [T] OrderedIterator interface {
   Len() int
   ValueAt(i int) *T
}

...
package sort

func [T] Slice(s [T]OrderedIterator, func(i, j int) bool) {
   ...
}

๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ์Šฌ๋ผ์ด์Šค์— ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@urandom ๋ฐ˜๋ณต์ž๋Š” ์ปฌ๋ ‰์…˜์˜ ์ถ”์ƒํ™”๊ฐ€ ์•„๋‹ˆ๋ผ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ์ฐธ์กฐ/ํฌ์ธํ„ฐ์˜ ์ถ”์ƒํ™”์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ˆœ๋ฐฉํ–ฅ ๋ฐ˜๋ณต์ž๋Š” ๋‹จ์ผ ๋ฉ”์„œ๋“œ 'successor'(๋•Œ๋กœ๋Š” 'next')๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์ž์˜ ์œ„์น˜์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋ฐ˜๋ณต์ž์˜ ์†์„ฑ์ด ์•„๋‹™๋‹ˆ๋‹ค(๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฐ˜๋ณต์ž์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ/๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ํŠน์ง•์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค). "์ฐธ์กฐ"๋ฅผ Readable, Writable ๋ฐ Mutable ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ„๋„๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

type T ForwardIterator interface {
   type DistanceType D
   successor(x T) T
}

type T Readable interface {
   type ValueType U 
   source(x T) U
}

์ฐธ๊ณ : 'T' ์œ ํ˜•์€ ์Šฌ๋ผ์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์Šฌ๋ผ์ด์Šค์˜ ๋ฐ˜๋ณต๊ธฐ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ •๋ ฌ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜์— ์‹œ์ž‘ ๋ฐ ๋ ๋ฐ˜๋ณต์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” C++ ์Šคํƒ€์ผ์„ ์ฑ„ํƒํ•˜๋ฉด ์ด๊ฒƒ์€ ๋‹จ์ˆœํ•œ ํฌ์ธํ„ฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋žœ๋ค ์•ก์„ธ์Šค ๋ฐ˜๋ณต์ž์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

type T RandomIterator interface {
   type DistanceType D
   setPosition(x DistanceType)
}

๋”ฐ๋ผ์„œ ๋ฐ˜๋ณต์ž/์ขŒํ‘œ๋Š” ์ปฌ๋ ‰์…˜ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ์ฐธ์กฐ์˜ ์ถ”์ƒํ™”์ž…๋‹ˆ๋‹ค. iterator๋ฅผ ์ขŒํ‘œ๋กœ, ์ปฌ๋ ‰์…˜์„ ๋งต์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด 'coordinate'๋ผ๋Š” ์ด๋ฆ„์ด ์ด๊ฒƒ์„ ์•„์ฃผ ์ž˜ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ํด๋กœ์ €์™€ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ Go short๋ฅผ ํŒ๋งคํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? Go์—์„œ ์ฒซ ๋ฒˆ์งธ ํด๋ž˜์Šค ์œ ํ˜•์œผ๋กœ ํ•จ์ˆ˜/๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด albrow/fo ์˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒ„๋ธ” ์ •๋ ฌ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type SortableContainer[C,T] struct {
    Less func(C,T,T) bool
    Swap func(C,int,int)
    Next func(C) (T,bool)
}

func (bs *SortableContainer[C,T]) BubbleSort(container C, e1,e2 T) {    
    swapCount := 1
    var item1, item2 T
    item1, ok1 = bs.Next()
    if !ok1 {return}
    item2, ok2 = bs.Next()
    if !ok2 {return}
    for swapCount > 0 {
        swapCount = 0
        for {
            if Less(item2, item1) { 
                bs.Swap(C,item2,item1)
                swapCount += 1
            }
        }
    }
}

๋ชจ๋“  ์‹ค์ˆ˜๋ฅผ ๊ฐ„๊ณผํ•˜์‹ญ์‹œ์˜ค... ์™„์ „ํžˆ ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค!

@mandolyte ์ด๊ฒƒ์ด ๋‚˜์—๊ฒŒ ์ „๋‹ฌ๋˜์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋‹ค์ค‘ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ถ”์ƒ/์—ฐ๊ด€ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ  ์ œ๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ท€ํ•˜์˜ ์˜ˆ ์‚ฌ์ด์— ์ฐจ์ด์ ์ด ์ „ํ˜€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์™„์ „ํ•œ ์ผ๋ฐ˜์„ฑ์„ ์œ„ํ•œ ์ถ”์ƒ/์—ฐ๊ด€ ์œ ํ˜•์ด ๋ชจ๋‘ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ํ˜„์žฌ Go์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถ”์ƒ ์œ ํ˜• ๋Œ€์‹  ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ์•ˆํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type I ForwardIterator interface {
   successor(x I) I
}
type R V Readable interface {
   source(x R) V
}
type V Ord interface {
   less(x V, y V) : bool
}

๋‘ ๊ฐœ์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ์œ ์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” Readable ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜๋ณต์ž ๊ฐ์ฒด๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ๊ฐ์ฒด์˜ ์œ ํ˜•์„ 'ํฌํ•จ'ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์žƒ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด์ œ ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ '๊ฐ’' ์œ ํ˜•์„ ์ด๋™ํ•ด์•ผ ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ€์ ธ์™€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. . ์ด๋Š” ์ข‹์ง€ ์•Š์€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ™•์‚ฐ์œผ๋กœ ์ด์–ด์ง€๊ณ  ์ฝ”๋”ฉ ์˜ค๋ฅ˜์˜ ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฐ€์žฅ ์ž‘์€ ์ˆซ์ž ์œ ํ˜•์ธ iterator์—์„œ 'DistanceType'์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” int8, int16, int32 ๋“ฑ์— ๋งคํ•‘ํ•˜์—ฌ ํ•„์š”ํ•œ ์œ ํ˜•์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„ํ”Œ๋กœ ์—†์ด ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

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

์•ฝ๊ฐ„์˜ ๋ฌธ์ œ:

  1. ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค์— ํ˜„์žฌ f(x I) ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ๊ตฌ๋ฌธ์ด (์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ์ธ) ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์–ด์จŒ๋“  ์œ ํ˜•๊ณผ ํ˜ผ๋™ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ฃผ์–ด์ง„ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์—ฐ๊ด€๋œ ์œ ํ˜•์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@keean ์ธํ„ฐํŽ˜์ด์Šค ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋˜๋Š” ์™œ ๊ทธ๋ ‡๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์™„์ „ํ•œ ์ž‘์—… ์˜ˆ์ž…๋‹ˆ๋‹ค. https://play.folang.org/p/BZa6BdsfBgZ (์Šฌ๋ผ์ด์Šค ๊ธฐ๋ฐ˜, ์ผ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ Next() ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ).

ํ•˜๋‚˜์˜ ์œ ํ˜• ๊ตฌ์กฐ์ฒด๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋“  ์ต๋ช…์˜ ํ•จ์ˆ˜์™€ ํด๋กœ์ €๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ๋™์ผํ•œ ๊ฑฐํ’ˆ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ˆ˜ ์กฐ๊ฐ๊ณผ "(x,y)" ์  ์กฐ๊ฐ์„ ๋ชจ๋‘ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์›์ ์œผ๋กœ๋ถ€ํ„ฐ์˜ ๊ฑฐ๋ฆฌ๋Š” Less() ํ•จ์ˆ˜์˜ ๊ธฐ์ดˆ์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์œ ํ˜• ์‹œ์Šคํ…œ์— ํ•จ์ˆ˜๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

@mandolyte ์ œ์•ˆํ•˜์‹  ๋‚ด์šฉ์„ ์ œ๊ฐ€ ์ž˜๋ชป ์ดํ•ดํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•˜๋Š” "folang"์ด ์ด๋ฏธ Go์— ์ถ”๊ฐ€๋œ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•œ ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ์†์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์‚ฌ์ „์œผ๋กœ ์•Œ๋ ค์ง„ ๊ฒƒ์„ ์ •๋ ฌ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•”์‹œ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ธฐ๋Šฅ์€ ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ๊ด€๋ จ ์œ ํ˜• ์ด์ „์— ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒฐ๊ตญ ๋ชจ๋“  ์‚ฌ์ „์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋” ๊นจ๋—ํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์Šฌ๋ผ์ด์Šค ์ •๋ ฌ์€ ํ•ด๊ฒฐ๋œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ go-li(golang ๊ฐœ์„ ) ์–ธ์–ด ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋œ ์Šฌ๋ผ์ด์Šค quicksort.go ์— ๋Œ€ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

func main(){
    var data = []int{5,3,1,8,9}

    Sort(data, func(a *int, b *int) int {
        return *a - *b
    })

    fmt.Println(data)
}

๋†€์ดํ„ฐ ์—์„œ ์ด๊ฒƒ์„ ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@go-li ์Šฌ๋ผ์ด์Šค๋ฅผ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ ฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์•ฝ๊ฐ„ ๊ฐ€๋‚œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์š”์ ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ผํ•œ ์ฝ”๋“œ๋กœ ๋ชจ๋“  ์„ ํ˜• ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ์ •๋ ฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ(๋ฐ์ดํ„ฐ ๊ตฌ์กฐ)๊ฐ€ ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์ด ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•œ ๋ฒˆ๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‚ด์šฉ์ด๋‹ค.

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

@keean
์ด์ „ ํ† ๋ก ๊ณผ ๊ด€๋ จ๋œ ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. iterable์—์„œ ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ํ•ญ๋ชฉ์ด ์›๋ž˜ ํ•ญ๋ชฉ๊ณผ ๋‹ค๋ฅธ ์œ ํ˜•์ผ ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๊ตฌ์ฒด์ ์ธ iterable ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋งคํ•‘ ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฌํ•œ ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ์ž๋Š” ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์ด ๋ฐ˜ํ™˜๋˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค.

@urandom ์•ˆ์ „ํ•˜์ง€ ์•Š์€ '๊ทธ ์ž๋ฆฌ์—์„œ' ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์›ํ•˜๋Š” ๊ฒƒ์€ ํ•œ ์œ ํ˜•์˜ '์ฝ๊ธฐ ๋ฐ˜๋ณต๊ธฐ'์™€ ๋‹ค๋ฅธ ์œ ํ˜•์˜ '์“ฐ๊ธฐ ๋ฐ˜๋ณต๊ธฐ'๊ฐ€ ์žˆ๋Š” ๋งต ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

map<I, O, U>(first I, last I, out O, fn U) requires
   ForwardIterator<I>, Readable<I>,
   ForwardIterator<O>, Writable<O>,
   UnaryFunction<U>, Domain(U) == ValueType(I), Codomain(U) == ValueType(O)

๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด "ValueType"์€ "Readable" ๋ฐ "Writable" ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—ฐ๊ด€๋œ ์œ ํ˜•์ด๊ณ , "Domain" ๋ฐ "Codomain"์€ "UnaryFunction" ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—ฐ๊ด€๋œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ "UnaryFunction"๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž๋™์œผ๋กœ ํŒŒ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ถ„๋ช…ํžˆ ๋งŽ์€ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ฆฌํ”Œ๋ ‰์…˜์€ ๋ฐ˜์‚ฌ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉฐ ์ •์  ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ชจ๋‘ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@keean ํ˜„์žฌ Go์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ปจํ…์ŠคํŠธ์—์„œ ์ฝ๊ธฐ ๊ฐ€๋Šฅ ๋ฐ ์“ฐ๊ธฐ ๊ฐ€๋Šฅ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚ด ๋ง์€, A ์œ ํ˜•์ด ์žˆ๊ณ  B ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น UnaryFunction์˜ ์„œ๋ช…์€ func (input A) B ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋–ป๊ฒŒ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ๋งํ•˜๊ณ  ์ผ๋ฐ˜ map (๋˜๋Š” filter , reduce ๋“ฑ)์„ ๋ชจ๋ธ๋งํ•˜์—ฌ ์œ ํ˜•์˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@geovanisouza92 "Type Families"๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ์ง๊ต ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ๊ตฌํ˜„๋œ ๋‹ค์Œ Haskell์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ๋ฌธ์— ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž˜ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ํŒจ๋ฐ€๋ฆฌ๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ์ œํ•œ๋œ ๊ธฐ๋Šฅ(๋งคํ•‘)๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ด ์œ ํ˜•๋ณ„๋กœ ์„ ํƒ๋˜๋ฏ€๋กœ ๊ฐ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์œ ํ˜• ๋งคํ•‘์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ์„ ์ •์˜ํ•˜๋ฉด:

ValueType MyIntArrayIterator -> Int

ํ•จ์ˆ˜๋Š” ์กฐ๊ธˆ ๋” ๊นŒ๋‹ค๋กญ์ง€๋งŒ ํ•จ์ˆ˜์—๋Š” ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

fn(x : Int) Float

์šฐ๋ฆฌ๋Š” ์ด ์œ ํ˜•์„ ์“ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค:

Int -> Float

-> ๋Š” ๋‹จ์ง€ ์ค‘์œ„ ์œ ํ˜• ์ƒ์„ฑ์ž์ผ ๋ฟ์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Array์— ๋Œ€ํ•œ '[]'๋Š” ์œ ํ˜• ์ƒ์„ฑ์ž์ด๋ฏ€๋กœ ์ด๊ฒƒ์„ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Fn Int Float
Or
Fn<Int, Float>

์œ ํ˜• ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์„ ํ˜ธ๋„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด์ œ ๋‹ค์Œ์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Domain  Fn<Int, Float> -> Int
Codomain Fn<Int, Float> -> Float

์ด์ œ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ •์˜๋ฅผ ์†์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์‰ฝ๊ฒŒ ํŒŒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์œ ํ˜• ํŒจ๋ฐ€๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์œ„์—์„œ ์ œ๊ณตํ•œ ๋งต์˜ ์ •์˜๋Š” ์ œ๋„ค๋ฆญ์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜• IO ๋ฐ U๋งŒ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜•์€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ์ด๋“ค ์œ ํ˜•์— ์ข…์†๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์ด ์ธ์ˆ˜์— ์˜ํ•ด ์ง์ ‘ ์ œ๊ณต๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@keean๋‹˜, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด์žฅ/์‚ฌ์ „ ์ •์˜๋œ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋‚˜ ์‚ฌ์šฉ์ž ์˜์—ญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋„ ๋™์ผํ•œ ๊ฐœ๋…์ด ์ ์šฉ๋œ๋‹ค๋Š” ๋ง์”€์ด์‹ ๊ฐ€์š”?

์ผ๋ถ€ ์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น "์œ ํ˜• ์ œํ’ˆ๊ตฐ"์ด ๋Ÿฐํƒ€์ž„์— ์ˆ˜ํ–‰๋ฉ๋‹ˆ๊นŒ?

๋นˆ ์ธํ„ฐํŽ˜์ด์Šค, ์œ ํ˜• ์Šค์œ„์น˜ ๋ฐ ๋ฐ˜์‚ฌ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?


ํŽธ์ง‘: ๋‚˜๋Š” ๋‹จ์ง€ ๊ถ๊ธˆํ•ด์„œ ๋ถˆํ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@giovanisouza92 ๊ธ€์Ž„, ์•„๋ฌด๋„ Go๊ฐ€ ์ œ๋„ค๋ฆญ์„ ๊ฐ–๋„๋ก ์•ฝ์†ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ํšŒ์˜๋ก ์ด ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ œ๋„ค๋ฆญ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

f(x I, y I) requires ForwardIterator<I>

๋Œ€

f(x ForwardIterator, y ForwardIterator)

ํ›„์ž์˜ 'x'์™€ 'y'๋Š” ForwardIterator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ๋ฐ˜๋ฉด ์ „์ž์˜ ๊ตฌ๋ฌธ์—์„œ๋Š” 'x'์™€ 'y'๊ฐ€ ๋ชจ๋‘ ๋™์ผํ•œ ์œ ํ˜•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ˆœ๋ฐฉํ–ฅ ๋ฐ˜๋ณต์ž๋ฅผ ๋งŒ์กฑํ•จ). ์ด๊ฒƒ์€ ํ•จ์ˆ˜๊ฐ€ ๊ณผ์†Œ์ œ์•ฝ๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ  ์ปดํŒŒ์ผ ์ค‘์— ๊ตฌ์ฒด ์œ ํ˜•์ด ํ›จ์”ฌ ๋” ๋งŽ์ด ์ „ํŒŒ๋˜๋„๋ก ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‹จ์ง€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฐœ๋…์„ ํ™•์žฅํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ํ˜• ์Šค์œ„์น˜์™€ ๋ฆฌํ”Œ๋ ‰์…˜๊ณผ ๊ด€๋ จํ•˜์—ฌ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. go์—๋Š” ๋Ÿฐํƒ€์ž„ ์œ ํ˜• ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ Haskell๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์— ๋น ์ง€์ง€ ์•Š๊ณ  ์กด์žฌ ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Go, ๋Ÿฐํƒ€์ž„ ๋‹คํ˜•์„ฑ ๋ฐ ์œ ํ˜• ํŒจ๋ฐ€๋ฆฌ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ๋•Œ, ์—ฐ๊ด€๋œ ๋ชจ๋“  ์œ ํ˜•์„ ๋Ÿฐํƒ€์ž„ ์‹œ ๋Š๋ฆฐ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜• ํŒจ๋ฐ€๋ฆฌ ์ž์ฒด๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œํ•œํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@keean
ํ† ๋ก ์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์—์„œ ๋ฐœ๋ช…๋˜์ง€ ์•Š์€ ์ฆํ›„๊ตฐ์ด ์ง„ํ–‰ ์ค‘์ธ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ๋Š๋ผ๋Š” ์˜คํ•ด๋ฅผ ๋ถ„๋ช…ํžˆ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์–‘๋ฐฉํ–ฅ ๋ฐ˜๋ณต์ž( T ๊ตฌ๋ฌธ func (*T) *[2]*T )์˜ ์œ ํ˜•์€ go-li ๊ตฌ๋ฌธ์—์„œ func (*) *[2]* ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์–ด๋–ค ์œ ํ˜•์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ทจํ•˜๊ณ  ๋™์ผํ•œ ์œ ํ˜•์˜ ๋‹ค์Œ ๋ฐ ์ด์ „ ์š”์†Œ์— ๋Œ€ํ•œ ๋‘ ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์ค‘ ์—ฐ๊ฒฐ ๋ชฉ๋ก ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋ณธ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

์ด์ œ ๋‚ด๊ฐ€ foreach ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅด๋Š” map์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฐ๊ฒฐ ๋ชฉ๋ก๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์–‘๋ฐฉํ–ฅ ๋ฐ˜๋ณต์ž๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์‹ค์ˆ˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค!

func Foreach(link func(*) *[2]*, list **, direction byte, f func(*)) {

    if nil == *list {
        return
    }

    var end *
    end = *list

    var e *
    e = (*link(*list))[direction]
    f(end)

    for (e != end) && ((*link(e))[direction] != nil) {
        var newe = (*link(e))[direction]
        f(e)
        e = newe
    }
    return
}

Foreach๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฉ๋ก ๋˜๋Š” ์ปฌ๋ ‰์…˜ ์š”์†Œ์— ๋Œ€ํ•œ for ๋ฃจํ”„์™€ ๊ฐ™์€ ๋ฐ˜๋ณต์—์„œ ๋žŒ๋‹ค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

const forward = 1
const backwards = 0
Foreach(iterator, collection, forward, func(element *element_type){
    // do something with every element
})

๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ชจ๋“  ์ปฌ๋ ‰์…˜ ์š”์†Œ์— ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Foreach(iterator, collection, backwards, function_to_be_mapped_on_elements)

์–‘๋ฐฉํ–ฅ ๋ฐ˜๋ณต์ž๋Š” ๋ฌผ๋ก  go 1์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ๋งํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
interface Iterator { Iter() [2]Iterator } ๊ธฐ๋ณธ ์œ ํ˜•์„ ๋ž˜ํ•‘("๋ฐ•์Šค")ํ•˜๋ ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์ž ์‚ฌ์šฉ์ž๋Š” ํŠน์ • ์ปฌ๋ ‰์…˜ ์š”์†Œ๋ฅผ ์ฐพ๊ณ  ๋ฐฉ๋ฌธํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฉด ์•Œ๋ ค์ง„ ์œ ํ˜•์„ ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž ์žฌ์ ์œผ๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

func modern(x func  (*) *[2]*, y func  (*) *[2]*){}

์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์œ ํ˜•์ด ๋‘ ์ปฌ๋ ‰์…˜์˜ ๊ธฐ๋ณธ ์œ ํ˜•์ด ๋™์ผํ•œ์ง€, ์ฆ‰ ๋ฐ˜๋ณต์ž๊ฐ€ ์‹ค์ œ๋กœ ๋™์ผํ•œ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

func modern_T_syntax<T>(x func  (*T) *[2]*T, y func  (*T) *[2]*T){}

์œ„์™€ ๊ฐ™์ง€๋งŒ ์นœ์ˆ™ํ•œ T๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์œ ํ˜• ์ž๋ฆฌ ํ‘œ์‹œ์ž ๊ตฌ๋ฌธ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

func legacy(x Iterator, y Iterator){}

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

์ด์ œ ์˜คํ•ด. ๋ฐ˜๋ณต์ž๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ•ด๋‹น ๋ฐ˜๋ณต์ž๋ฅผ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๋‚˜์œ ์ผ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Iterator์™€ Linked List๋Š” ๋™์ „์˜ ์–‘๋ฉด์ž…๋‹ˆ๋‹ค. ์ฆ๋ช…: ๋ฐ˜๋ณต์ž๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๋ชจ๋“  ์ปฌ๋ ‰์…˜์€ ๋‹จ์ˆœํžˆ ์ž์‹ ์„ ์—ฐ๊ฒฐ ๋ชฉ๋ก์œผ๋กœ ๊ด‘๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ ฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ํ•ฉ๋‹ˆ๊นŒ?

๋ถ„๋ช…ํžˆ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์—ฐ๊ฒฐ ๋ชฉ๋ก์„ ์‚ญ์ œํ•˜๊ณ  ์ด์ง„ ํŠธ๋ฆฌ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์ œ์•ˆํ•œ ๋Œ€๋กœ avl, red-black๊ณผ ๊ฐ™์€ ๊ท ํ˜• ์žกํžŒ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Ian et al์ด ๋ช‡ ๋…„ ์ „์— ์ œ์•ˆํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์ด๊ฒƒ์€ golang์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ฐ€์•ผ ํ•  ๊ธธ์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์€ ๋ฐ˜๋ณต์ž๋ฅผ ํ†ตํ•œ O(N) ์‹œ๊ฐ„ ๋ฃจํ”„์—์„œ ์š”์†Œ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ []*T ๋กœ ํ‘œ์‹œ๋œ ์ผ๋ฐ˜ ํฌ์ธํ„ฐ ์กฐ๊ฐ์œผ๋กœ ์ˆ˜์ง‘ ํ•˜๊ณ  ์ž˜๋ชป๋œ ์กฐ๊ฐ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ผ๋ฐ˜ ํฌ์ธํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์•„์ด๋””์–ด์— ๊ธฐํšŒ๋ฅผ ์ฃผ์„ธ์š”

@go-li ๋ฐœ๋ช…๋˜์ง€ ์•Š์€ ์ฆํ›„๊ตฐ์„ ํ”ผํ•˜๋ ค๋ฉด Alex Stepanov๊ฐ€ ์ œ๋„ค๋ฆญ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฑฐ์˜ ๋ฐœ๋ช…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •์˜์— ๋Œ€ํ•ด ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Stepanov์˜ "ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”์†Œ" ํŽ˜์ด์ง€ 111์—์„œ ๊ฐ€์ ธ์˜จ ์ •์˜ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

Bidirectional iterator<T> =
    ForwardIterator<T>
/\ predecessor : T -> T
/\ predecessor takes constant time
/\ (forall i in T) successor(i) is defined =>
        predecessor(successor(i)) is defined and equals i
/\ (forall i in T) predecessor(i) is defined =>
        successor(predecessor(i)) is defined and equals i

์ด๊ฒƒ์€ ForwardIterator์˜ ์ •์˜์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

ForwardIterator<T> =
    Iterator<T>
/\ regular_unary_function(successor)

๋”ฐ๋ผ์„œ ๋ณธ์งˆ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” successor ํ•จ์ˆ˜์™€ predecessor ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•จ๊ป˜ ๊ทธ๋“ค์ด ์œ ํšจํ•˜๊ธฐ ์œ„ํ•ด ์ค€์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ณต๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

id(x T) T

์•„๋งˆ๋„ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•๊ณผ ๋ณดํŽธ์ ์œผ๋กœ ์ˆ˜๋Ÿ‰ํ™”๋œ ์œ ํ˜•์˜ ์ฐจ์ด์ ์„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์€ id<T>(x T) T ์ธ ๋ฐ˜๋ฉด ๋ณดํŽธ์ ์œผ๋กœ ์ˆ˜๋Ÿ‰ํ™”๋œ ์œ ํ˜•์€ id(x T) T ์ž…๋‹ˆ๋‹ค(์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๊ฒฝ์šฐ forall T ). ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ ํ˜• ์‹œ์Šคํ…œ์— id ์— ๋Œ€ํ•œ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ ์ œ๊ณต๋˜๋Š” T ์œ ํ˜•์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ์ปดํŒŒ์ผ์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— T๊ฐ€ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•๊ณผ ํ†ตํ•ฉ๋˜๋Š” ํ•œ ๋ณดํŽธ์  ์ˆ˜๋Ÿ‰ํ™”๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ดํ•ดํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜๋Š” ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ ์œ ํ˜•์— ๋Œ€ํ•œ ํ…œํ”Œ๋ฆฟ์ด๋ฉฐ T๊ฐ€ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์œผ๋กœ ๋Œ€์ฒด๋œ ํ›„์—๋งŒ ์œ ํšจํ•œ ์œ ํ˜•์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณดํŽธ์ ์œผ๋กœ ์ˆ˜๋Ÿ‰ํ™”๋œ ํ•จ์ˆ˜ id ์—๋Š” ์‹ค์ œ๋กœ Int ์ฒ˜๋Ÿผ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋Š” forall T . T -> T ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@๊ณ ๋ฆฌ

๋ถ„๋ช…ํžˆ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์—ฐ๊ฒฐ ๋ชฉ๋ก์„ ์‚ญ์ œํ•˜๊ณ  ์ด์ง„ ํŠธ๋ฆฌ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์ œ์•ˆํ•œ ๋Œ€๋กœ avl, red-black๊ณผ ๊ฐ™์€ ๊ท ํ˜• ์žกํžŒ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Ian et al์ด ๋ช‡ ๋…„ ์ „์— ์ œ์•ˆํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์ด๊ฒƒ์€ golang์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ฐ€์•ผ ํ•  ๊ธธ์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ •๋ ฌํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•  ํ•„์š”๊ฐ€ ์ „ํ˜€ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋ฐœ๋ช…๋˜์ง€ ์•Š์€ ์ฆํ›„๊ตฐ์„ ํ”ผํ•˜๋ ค๋ฉด Alex Stepanov๊ฐ€ ์ œ๋„ค๋ฆญ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฑฐ์˜ ๋ฐœ๋ช…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •์˜์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ œ๋„ค๋ฆญ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด C++์— ์˜ํ•ด ๋ฐœ๋ช…๋˜์—ˆ๋‹ค๋Š” ์ฃผ์žฅ์— ์ด์˜๋ฅผ ์ œ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Liskov ๋“ฑ์„ ์ฝ์œผ์‹ญ์‹œ์˜ค. ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดˆ๊ธฐ ๋ชจ๋ธ(์œ ํ˜• ์•ˆ์ „, ๋ชจ๋“ˆ์‹, ์ฝ”๋“œ ํŒฝ์ฐฝ ์—†์Œ)์„ ๋ณด๋ ค๋ฉด 1977 CACM ๋…ผ๋ฌธ: https://dl.acm.org/citation.cfm?id=359789 (์„น์…˜ 4 ์ฐธ์กฐ) )

์ด ํ† ๋ก ์„ ์ค‘๋‹จํ•˜๊ณ  golang ํŒ€(russ)์ด ์ผ๋ถ€ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•œ ๋‹ค์Œ ์†”๋ฃจ์…˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘(vgo ์ฐธ์กฐ) ๊ทธ๋“ค์€ ๊ทธ๋ƒฅ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐ŸŽ‰

https://peter.bourgon.org/blog/2018/07/27/a-response-about-dep-and-vgo.html

์ด ์ด์•ผ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฒฝ๊ณ ๊ฐ€ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. Go ํ”„๋กœ์ ํŠธ์— ์ƒ๋‹นํ•œ ๊ธฐ์—ฌ๋ฅผ ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋…๋ฆฝ์ ์ธ ์‹ค์‚ฌ๊ฐ€ ์•„๋ฌด๋ฆฌ ๋งŽ์•„๋„ ํ•ต์‹ฌ ํŒ€์—์„œ ์‹œ์ž‘ํ•˜์ง€ ์•Š์€ ๋””์ž์ธ์„ ๋ณด์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋Š” ํ•ต์‹ฌ ํŒ€์ด ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ•จ๊ป˜ โ€‹โ€‹์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๋ฐ ์ ๊ทน์ ์œผ๋กœ ์ฐธ์—ฌํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์—†๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ ๋˜ ์Šค์Šค๋กœ ํ•ด๊ฒฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‚œ ๊ทธ๊ฑธ๋กœ ๊ดœ์ฐฎ์•„ ๐Ÿ‘

@andrewcmyers ์•„๋งˆ๋„ "๋ฐœ๋ช…"์€ ์•ฝ๊ฐ„์˜ ํ™•์žฅ์ด์—ˆ์œผ๋ฉฐ, ๋‚˜์ค‘์— Ada์˜ ์ผ๋ถ€ ์ผ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ Stepanov์™€ ํ•จ๊ป˜ ์ž‘์—…ํ•œ 1971๋…„ David Musser์™€ ๋น„์Šทํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Elements of Programming์€ C++์— ๋Œ€ํ•œ ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ์ œ๋Š” C++์— ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๋งค์šฐ ๋‹ค๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ์ฑ…์ด ์–ด๋–ค ์–ธ์–ด๋กœ๋“  ์ œ๋„ค๋ฆญ์„ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ผญ ํ•„์š”ํ•œ ์ฑ…์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์Šคํ…ŒํŒŒ๋…ธํ”„๋ฅผ ๋ฌด์‹œํ•˜๊ธฐ ์ „์— ๊ทธ ์ฑ…์ด ์‹ค์ œ๋กœ ๋ฌด์—‡์— ๊ด€ํ•œ ๊ฒƒ์ธ์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์ฑ…์„ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ด๋ฏธ GitHub ํ™•์žฅ์„ฑ์˜ ํ•œ๊ณ„ ์•„๋ž˜์—์„œ ๊ธด์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Go ์ œ์•ˆ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ œ์— ์ดˆ์ ์„ ๋งž์ถ˜ ํ† ๋ก ์„ ์—ฌ๊ธฐ์—์„œ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค.

Go๊ฐ€ C++ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์€ ๋ถˆํ–‰ํ•œ ์ผ์ž…๋‹ˆ๋‹ค.

@andrewcmyers ์˜ˆ, ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ์ œ์•ˆ์ด๋‚˜ ์ž‘์—…์„ ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋ฒค์น˜๋งˆํฌ๋กœ C++๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋Œ€์‹  ์˜๊ฐ์„ ์–ป์œผ๋ ค๋ฉด D๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค .

@nomad-software

๋‚˜๋Š” D๋ฅผ ๋งค์šฐ ์ข‹์•„ํ•˜์ง€๋งŒ D๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์ปดํŒŒ์ผ ํƒ€์ž„ ๋ฉ”ํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋Šฅ์ด go์— ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์„๊ธฐ ์‹œ๋Œ€์—์„œ ๋น„๋กฏ๋œ C++์˜ ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ๋„ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ParametricType์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?Java ๋˜๋Š” C#์—์„œ ์ฐพ์€ ํ‘œ์ค€, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ParametricType์œผ๋กœ ์ด๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋” ๋‚˜์•„๊ฐ€, ์ €๋Š” ๋ฑ… ๊ธฐํ˜ธ๊ฐ€ ์žˆ๋Š” D์˜ ํ…œํ”Œ๋ฆฟ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฑ… ๊ธฐํ˜ธ๋Š” ์˜ค๋Š˜๋‚  ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์•ก์„ธ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@nomad-software ๋‚˜๋Š” C++ ๊ตฌ๋ฌธ์ด๋‚˜ ํ…œํ”Œ๋ฆฟ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ œ๋„ค๋ฆญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ œ์•ˆํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. Stepanov๊ฐ€ ์ •์˜ํ•œ "๊ฐœ๋…"์€ ์œ ํ˜•์„ ๋Œ€์ˆ˜ํ•™์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋ฉฐ, ์ด๋Š” ์ œ๋„ค๋ฆญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋งค์šฐ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ๋ณด๋ ค๋ฉด Haskell ์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•œ๋‹ค๋ฉด Haskell ์œ ํ˜• ํด๋ž˜์Šค๋Š” ์˜๋ฏธ์ ์œผ๋กœ C++ ํ…œํ”Œ๋ฆฟ ๋ฐ ๊ฐœ๋…์— ๋งค์šฐ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ C++ ๊ตฌ๋ฌธ์„ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” ๊ฒฝ์šฐ +1, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ˜•์‹์˜ ํ…œํ”Œ๋ฆฟ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ +1 :-)

@keean D ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” <,> ๋ฅผ ์™„์ „ํžˆ ํ”ผํ•˜๊ณ  ์ปจํ…์ŠคํŠธ ์—†๋Š” ๋ฌธ๋ฒ•์„ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ D๋ฅผ ์˜๊ฐ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋‚ด ์š”์ ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. <,> ๋Š” ์ œ๋„ค๋ฆญ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์ •๋ง ๋‚˜์œ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

@nomad-software ์œ„์—์„œ ์ง€์ ํ–ˆ๋“ฏ์ด(ํ˜„์žฌ ์ˆจ๊ฒจ์ง„ ์ฃผ์„์—์„œ) ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ณดํŽธ์ ์œผ๋กœ ์ˆ˜๋Ÿ‰ํ™”๋œ ์œ ํ˜•์—๋Š” ์ง€์ •ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ Rust์™€ Haskell์˜ ์ฐจ์ด์ ์€ ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ์‹ค์ œ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ). ๋˜ํ•œ C++ ๊ฐœ๋… == Haskell ์œ ํ˜• ํด๋ž˜์Šค == ์ตœ์†Œํ•œ ๊ฐœ๋…์  ์ˆ˜์ค€์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

D ๊ตฌ๋ฌธ์ด ์ •๋ง ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๊นŒ?

auto add(T)(T lhs, T rhs) {
    return lhs + rhs;

์ด๊ฒƒ์ด C++/Java/Rust ์Šคํƒ€์ผ๋ณด๋‹ค ๋‚˜์€ ์ด์œ :

T add<T>(T lhs, T rhs) {
    return lhs + rhs;
}

๋˜๋Š” ์Šค์นผ๋ผ ์Šคํƒ€์ผ:

T add[T](T lhs, T rhs) {
    return lhs + rhs;
}

์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ตฌ๋ฌธ ๋ถ„์„์„ ๋งค์šฐ ๊นŒ๋‹ค๋กญ๊ฒŒ ๋งŒ๋“ค๊ณ  ๋„๊ตฌ ๊ฐœ๋ฐœ์„ ๋ฐฉํ•ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— C++ ๋ฐ Java์—์„œ "๊บพ์‡  ๊ด„ํ˜ธ"์˜ ํŒฌ์ด ๋œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€๊ด„ํ˜ธ๋Š” ์‹ค์ œ๋กœ ๊ณ ์ „์ ์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค(CLU, System F ๋ฐ ๊ธฐํƒ€ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹คํ˜•์„ฑ์ด ์žˆ๋Š” ์ดˆ๊ธฐ ์–ธ์–ด์—์„œ).

๊ทธ๋Ÿฌ๋‚˜ Go์˜ ๊ตฌ๋ฌธ์€ ์ด๋ฏธ ๋„ˆ๋ฌด ๊ฐ„๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํžˆ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ด„ํ˜ธ ๋˜๋Š” ๊ด„ํ˜ธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ฐ€๋Šฅํ•œ ๊ตฌ๋ฌธ์€ ๊บพ์‡  ๊ด„ํ˜ธ๋กœ ์ธํ•ด ๋„์ž…๋œ ๊ฒƒ๋ณด๋‹ค ๋ฌธ๋ฒ•์  ๋ชจํ˜ธ์„ฑ์„ ๋”์šฑ ์•…ํ™”์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚ด ์„ฑํ–ฅ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊บพ์‡  ๊ด„ํ˜ธ๊ฐ€ ์‹ค์ œ๋กœ Go์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์„ ํƒ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (๋ฌผ๋ก  ๋ชจํ˜ธํ•จ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์‹ค์ œ ๊บพ์‡ ๊ด„ํ˜ธ(โŸจโŸฉ)๋„ ์žˆ์ง€๋งŒ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).

๋ฌผ๋ก  ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ์‚ฌ์šฉ๋˜๋Š” ์ •ํ™•ํ•œ ๊ตฌ๋ฌธ์€ ์˜๋ฏธ ์ฒด๊ณ„ ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ ์—์„œ C++ ์–ธ์–ด๋Š” ๋‚˜์œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. Genus (PLDI 2015) ๋ฐ Familia (OOPSLA 2017)์˜ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๋‚ด ์—ฐ๊ตฌ ๊ทธ๋ฃน์˜ ์ž‘์—…์€ ์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ†ตํ•ฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@andrewcmyers ๋‚˜๋Š” ๋‘ ๋…ผ๋ฌธ ๋ชจ๋‘ ํฅ๋ฏธ๋กญ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, Genus๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ์ด๊ณ  Go๋Š” ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉฐ Familia๋Š” ํ•˜์œ„ ์œ ํ˜• ์ง€์ •๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ฉํ•˜๊ณ  Go๋Š” ๋‘˜ ๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Go์— ๋Œ€ํ•œ ์ข‹์€ ๋ฐฉํ–ฅ์ด ์•„๋‹ˆ๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. Go๋Š” ๋‹จ์ˆœํžˆ ๋งค๊ฐœ๋ณ€์ˆ˜์  ๋‹คํ˜•์„ฑ์ด๋‚˜ ๋ณดํŽธ์ ์ธ ์ˆ˜๋Ÿ‰ํ™”๋ฅผ ์ฑ„ํƒํ•ด์•ผ ํ•˜๋ฉฐ ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋‚ด ์ƒ๊ฐ์—๋Š” ํ•˜์œ„ ์œ ํ˜•์ด ์—†๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ์–ธ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Go๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ํ•˜์œ„ ์œ ํ˜•์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ œ๋„ค๋ฆญ์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Go๋Š” ์ด๋ฏธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ ์ œ๋„ค๋ฆญ์„ ์œ„ํ•œ ํ›Œ๋ฅญํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Go ์ธํ„ฐํŽ˜์ด์Šค == C++ ๊ฐœ๋… == Haskell ์œ ํ˜• ํด๋ž˜์Šค๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋ฉด 'Go'์˜ ํ’๋ฏธ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ด€๋ จ ์œ ํ˜•๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ๋ณ„๋„์˜ ํ™•์žฅ์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๋Ÿฌ ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ˆ˜๋ฝํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ•ต์‹ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด์ง€๋งŒ ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ '๋Œ€์ฒด' ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์ „์ฒด ๊บพ์‡  ๊ด„ํ˜ธ ๊ตฌ๋ฌธ์ด ๋“ค์–ด์˜ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์—ฌ๋Ÿฌ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

Go ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ ํ˜• ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์œ ํ˜•์ผ ๋ฟ์ด์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ํ˜• ํด๋ž˜์Šค์™€ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์ด Familia๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. Genus์™€ Familia์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์™„์ „ํžˆ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์–ธ์–ด์— ๋ฌถ์—ฌ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Go ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋ฏธ Go๋ฅผ ์ค‘์š”ํ•œ ๋ฐฉ์‹์œผ๋กœ "๊ฐ์ฒด ์ง€ํ–ฅ"์œผ๋กœ ๋งŒ๋“ค๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์•„์ด๋””์–ด๋ฅผ ์•ฝ๊ฐ„ ๋‹จ์ˆœํ™”๋œ ํ˜•ํƒœ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@andrewcmyers

Go ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ ํ˜• ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์œ ํ˜•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

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

f(x : Addable) == f<T>(x : T) requires Addable<T>

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

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

์ž„ํ˜ธ:

์—ฌ์ „ํžˆ ๊ธฐ๋ณธ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ํ˜• ์ œํ•œ์„ ํ‘œํ˜„ํ•˜๋Š” ์ „์šฉ DSL๋ณด๋‹ค ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค. fmt.Stringer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ๋ชจ๋“  ์œ ํ˜•์„ ํ—ˆ์šฉํ•˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์ธ f(s T fmt.Stringer) ํ•จ์ˆ˜๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func add(a, b T int) T int {
    return a + b
}

์ด์ œ add() ํ•จ์ˆ˜๋Š” $ int + ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ T $์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@dc0d ํ˜„์žฌ Go ๊ตฌ๋ฌธ์„ ๋ณด๋ฉด ๋งค๋ ฅ์ ์œผ๋กœ ๋ณด์ธ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ๋„ค๋ฆญ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ œ์•ฝ ์กฐ๊ฑด์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์—†๋‹ค๋Š” ์ ์—์„œ '์™„๋ฒฝ'ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ด๋ฅผ ๋” ํ™•์žฅํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์ด ๊ณ„์†๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœ์„ฑ์˜ ๋ชฉํ‘œ์™€ ์ƒ์ถฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋˜๋Š” ๋‹ค์–‘ํ•œ ๊ตฌ๋ฌธ์˜ ํ™•์‚ฐ์„ ์ดˆ๋ž˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ๋‹จ์ˆœํ•จ์ด ๋‹จ์ˆœํ•˜์ง€ ์•Š๊ณ  ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๋ฉด์„œ๋„ ํ•„์š”ํ•œ ํ‘œํ˜„๋ ฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ Go์˜ ์ผ๋ฐ˜์ ์ธ ํ‘œํ˜„๋ ฅ์˜ ์ฃผ์š” ํ•œ๊ณ„๋Š” ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ถ€์กฑ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Collection ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type T U Collection interface {
   member(c T, v U) Bool
   insert(c T, v U) T
}

์ด๊ฒŒ ๋ง์ด ๋ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์ปฌ๋ ‰์…˜๊ณผ ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ œ๋Š” ํ•จ์ˆ˜์—์„œ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š๋ƒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func[T, U] f(c T, e U) (Bool, T) requires Collection[T, U] {
   a := member(c, e)
   d := insert(c, e)
   return a, d
}

๊ตฌ๋ฌธ์€ ๋‹จ์ง€ ์ œ์•ˆ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ฐœ๋…์„ ์–ธ์–ด๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ตฌ๋ฌธ์ด ๋ฌด์—‡์ธ์ง€๋Š” ๊ทธ๋‹ค์ง€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@keean ๊ตฌ๋ฌธ์— ์ „ํ˜€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•˜๋ฉด ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์š”์ ์€ ๋ชจ๋“  ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๊ธฐ๋ณธ ์œ ํ˜•์„ ๊ฐ–๋Š” ๊ฒƒ์„ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์ œ๊ณต๋œ ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type Collection interface (T interface{}, U interface{}) {
   member(c T, v U) Bool
   insert(c T, v U) T
}

์ด์ œ (T interface{}, U interface{}) ๋ถ€๋ถ„์€ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ •์˜ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉค๋ฒ„๊ฐ€ fmt.Stringer ๋ฅผ ์ถฉ์กฑํ•˜๋„๋ก ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type Collection interface (T fmt.Stringer, U fmt.Stringer) {
   member(c T, v U) Bool
   insert(c T, v U) T
}

@dc0d ์ด๊ฒƒ์€ ๋‘˜ ์ด์ƒ์˜ ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ œํ•œํ•˜๋ ค๋Š” ์˜๋ฏธ์—์„œ ๋‹ค์‹œ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

type OrderedCollection[T, U] interface
   requires Collection[T, U], Ord[U] {...}

๋‚˜๋Š” ๋‹น์‹ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐฐ์น˜์™€ ํ•จ๊ป˜ ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹ค์Œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

type OrderedCollection interface(T, U)
   requires Collection(T, U), Ord(U) {...}

๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด, ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ตฌ๋ฌธ์— ์ต์ˆ™ํ•ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ตฌ๋ฌธ์— ๋„ˆ๋ฌด ์ง‘์ฐฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ๋‚˜๋Š” ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ๊ด„ํ˜ธ '()'๋ฅผ ์„ ํ˜ธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@keean heap.Interface ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ˜„์žฌ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type Interface interface {
    sort.Interface
    Push(x interface{}) // add x as element Len()
    Pop() interface{}   // remove and return element Len() - 1.
}

์ด์ œ ๊ธฐ๋ณธ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

type Interface interface (T interface{}) {
    sort.Interface
    Push(x T) // add x as element Len()
    Pop() T   // remove and return element Len() - 1.
}

์ด๊ฒƒ์€ Go 1.x ์ฝ”๋“œ ์‹œ๋ฆฌ์ฆˆ๋ฅผ ์ค‘๋‹จ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ๊ตฌํ˜„์€ Type Alias โ€‹โ€‹Rebinding์— ๋Œ€ํ•œ ์ œ ์ œ์•ˆ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ๋‚˜์€ ๊ตฌํ˜„์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด Go 1.x ์Šคํƒ€์ผ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ์ผ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํฐ ์Šน๋ฆฌ IMO์ž…๋‹ˆ๋‹ค.

@dc0d ๊ทธ๋ž˜์„œ ์ ์ง„์ ์ธ ๊ฐœ์„ ์„ ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹น์‹ ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ์ ์ง„์ ์ธ ๊ฐœ์„ ์œผ๋กœ ๋‚˜์—๊ฒŒ ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ์ผ๋ฐ˜์ ์ธ ํ‘œํ˜„๋ ฅ์ด ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค. "Collection" ๋ฐ "OrderedCollection" ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์—ฌ๋Ÿฌ ๋ถ€๋ถ„ ์–ธ์–ด ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์™„์ „ํ•œ ์†”๋ฃจ์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋ณต์žกํ•œ ์ตœ์ข… ์ œํ’ˆ(์—ฌ๋Ÿฌ ๋Œ€์ฒด ๊ตฌ๋ฌธ ํฌํ•จ)์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

@keean requires Collection[T, U], Ord[U] ๋ถ€๋ถ„์ด ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ T ๋ฐ U ๋ฅผ ์–ด๋–ป๊ฒŒ ์ œํ•œํ•ฉ๋‹ˆ๊นŒ?

@dc0d ํ•จ์ˆ˜์—์„œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ OrderedCollection์ธ TU ์œ ํ˜•์˜ ์Œ์— ๋Œ€ํ•ด TU๋„ Collection์˜ ์ธ์Šคํ„ด์Šค์ด๊ณ  U๊ฐ€ Ord์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ OrderedCollection์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ Collection ๋ฐ Ord์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

type OrderedCollection interface(T, U)
{
   first(c T) U
}

func[T] first(c T[]) T requires Collection(T[], T), Ord T
{...}

func[T] f(c T[]) requires OrderedCollection(T[], T), Collection(T[], T), Ord(T)
{...}

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋” ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค:

type OrderedCollection interface(T, U) 
   requires Collection(T, U), Ord(U)
{
   first(c T) U
}

func[T] first(c T[]) T
{...}

func[T] f(c T[]) requires OrderedCollection(T[], T)
{...}

@keean (IMO) ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ•„์ˆ˜ ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ๋Š” ํ•œ ํ–‰๋ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด Go 1.x ์ฝ”๋“œ ์‹œ๋ฆฌ์ฆˆ์™€ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ๋˜ ์š”์ ์ด๋‹ค.

@keean

Go ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ ํ˜• ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์œ ํ˜•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ๋“ค์€ ๋‹คํ˜•์„ฑ์„ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์—๊ฒŒ ์œ ํ˜•์ฒ˜๋Ÿผ ํ–‰๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ํ˜• ํด๋ž˜์Šค์˜ ์‹ค์กด์ ์œผ๋กœ ์ˆ˜๋Ÿ‰ํ™”๋œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ด ์—ผ๋‘์—๋‘๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด Genus์™€ Familia์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•œ ์ผ์ž…๋‹ˆ๋‹ค.

@andrewcmyers

์˜ˆ, ํ•˜์œ„ ์œ ํ˜• ๋‹คํ˜•์„ฑ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๊ณต๋ถ„์‚ฐ์ด๋‚˜ ๋ฐ˜๊ณต๋ณ€์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๊ฒƒ์ด ํ•˜์œ„ ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋‹คํ˜•์„ฑ ์œ ํ˜• ์‹œ์Šคํ…œ์€ ๋ถˆ๋ณ€ํ•˜๋ฏ€๋กœ Go๊ฐ€ ์ด ๋ชจ๋ธ์— ๋” ๊ฐ€๊น๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜• ํด๋ž˜์Šค๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด Go์˜ ๋‹จ์ˆœ์„ฑ์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๊ณต๋ถ„์‚ฐ๊ณผ ๋ฐ˜๊ณต๋ณ€์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ ์ œ๋„ค๋ฆญ์— ํฐ ์ด์ ์ž…๋‹ˆ๋‹ค. C#๊ณผ ๊ฐ™์€ ์–ธ์–ด์—์„œ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์ด ๋งŒ๋“ค์–ด๋‚ด๋Š” ํ˜ผ๋ž€์„ ๋ณด์„ธ์š”.

https://docs.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance

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

๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ํ˜• ํด๋ž˜์Šค์˜ ์‹ค์กด์ ์œผ๋กœ ์ˆ˜๋Ÿ‰ํ™”๋œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ด ์—ผ๋‘์—๋‘๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด Genus์™€ Familia์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•œ ์ผ์ž…๋‹ˆ๋‹ค.

Go๋Š” ๋Ÿฐํƒ€์ž„์— ์œ ํ˜• ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์กด์  ์ˆ˜๋Ÿ‰ํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Haskell์—์„œ ์œ ํ˜•์€ (๋„ค์ดํ‹ฐ๋ธŒ 'C' ์œ ํ˜•๊ณผ ๊ฐ™์ด) ๋ฐ•์‹ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์กด์žฌ ์ปฌ๋ ‰์…˜์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๋„ฃ์œผ๋ฉด ๋‚ด์šฉ ์œ ํ˜•์„ (์‰ฝ๊ฒŒ) ๋ณต๊ตฌํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ์ œ๊ณต๋œ ์ธํ„ฐํŽ˜์ด์Šค(์œ ํ˜• ํด๋ž˜์Šค ). ์ด๊ฒƒ์€ ์›์‹œ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ €์žฅํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. Go์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ๋Œ€์‹  ์ €์žฅ๋˜๋ฉฐ ๋ฐ์ดํ„ฐ๋Š” 'Boxed'์ž…๋‹ˆ๋‹ค(C# boxed ๋ฐ unboxed ๋ฐ์ดํ„ฐ์—์„œ์™€ ๊ฐ™์ด). ์ด์™€ ๊ฐ™์ด Go๋Š” ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์ €์žฅ๋œ ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด 'Reflection'์„ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ Haskell์—์„œ๋งŒ ๊ฐ€๋Šฅํ•œ ์ปฌ๋ ‰์…˜์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. typeclass (๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๋Š” ๊ฒƒ์ด ์–ด์ƒ‰ํ•˜์ง€๋งŒ ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์ด ์œ ํ˜•๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ง๋ ฌํ™”ํ•œ ๋‹ค์Œ ์กด์žฌ ์ƒ์ž ์™ธ๋ถ€์—์„œ ์—ญ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฐ๋ก ์€ Haskell์ด 'Reflection' ์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ๋‚ด์žฅ์œผ๋กœ ์ œ๊ณตํ–ˆ๋‹ค๋ฉด Go ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์œ ํ˜• ํด๋ž˜์Šค์™€ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์กด์žฌ ์ƒ์ž๊ฐ€ ์—†์œผ๋ฉฐ ์ปฌ๋ ‰์…˜์˜ ๋‚ด์šฉ์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ ํ˜• ํด๋ž˜์Šค์™€ ์ •ํ™•ํžˆ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Haskell๊ณผ Go์˜ ์ฐจ์ด์ ์€ boxed์™€ unboxed ๋ฐ์ดํ„ฐ์˜ ์˜๋ฏธ์— ์žˆ์œผ๋ฉฐ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜• ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ 'Go'๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ํ˜•์œผ๋กœ ์ทจ๊ธ‰ํ•  ๋•Œ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Addable[] == exists T . T[] requires Addable[T], Reflection[T]

์ด๊ฒƒ์ด Rust์—์„œ "Trait Objects"๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์ด๋ผ๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๊ณต๋ถ„์‚ฐ์ด๋‚˜ ๋ฐ˜๊ณต๋ณ€์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๊ฒƒ์ด ํ•˜์œ„ ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งํ•ฉ๋‹ˆ๋‹ค.

๋‹คํ˜•์„ฑ ์œ ํ˜• ์‹œ์Šคํ…œ์€ ๋ถˆ๋ณ€ํ•˜๋ฏ€๋กœ ์ด ๋ชจ๋ธ์— ๋” ๊ฐ€๊น๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜• ํด๋ž˜์Šค๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด Go์˜ ๋‹จ์ˆœ์„ฑ์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

๋‘˜ ๋‹ค ์˜ณ๋‹ค๊ณ  ์ œ์•ˆํ•ด๋„ ๋ ๊นŒ์š”? ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ ํ˜• ํด๋ž˜์Šค์™€ ๋™์ผํ•˜์ง€๋งŒ ์œ ํ˜• ํด๋ž˜์Šค๋Š” ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์˜ ํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ ์ฐพ์€ ํ•˜์œ„ ์œ ํ˜•์˜ ์ •์˜๋Š” ๋ชจ๋‘ ๋งค์šฐ ๋ชจํ˜ธํ•˜๊ณ  ๋ถ€์ •ํ™•ํ•˜๋ฉฐ "A๋Š” B์˜ ํ•˜์œ„ ์œ ํ˜•์ด๋ฉฐ, ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด"๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค. IMO ๋Š” ์œ ํ˜• ํด๋ž˜์Šค๋กœ ๋งŒ์กฑํ•œ๋‹ค๊ณ  ์‰ฝ๊ฒŒ ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

Variance-argument ์ž์ฒด๋Š” ์‹ค์ œ๋กœ IMO์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Variance๋Š” ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๋ผ ํ˜•์‹ ์ƒ์„ฑ์ž์˜ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ธ์–ด์˜ ๋ชจ๋“  ์œ ํ˜• ์ƒ์„ฑ์ž๊ฐ€ ๋ณ€ํ˜•์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด, ํ•˜์œ„ ์œ ํ˜•์ด ์žˆ๋Š” ๋งŽ์€ ์–ธ์–ด์—๋Š” ๊ฐ€๋ณ€ ๋ฐฐ์—ด์ด ์žˆ์œผ๋ฉฐ ์œ ํ˜•์ด ์•ˆ์ „ํ•˜๋ ค๋ฉด ๋ถˆ๋ณ€์ด์–ด์•ผ ํ•จ). ๊ทธ๋ž˜์„œ ์™œ ๋‹น์‹ ์ด ๋ณ€ํ˜• ์œ ํ˜• ์ƒ์„ฑ์ž ์—†์ด ํ•˜์œ„ ์œ ํ˜•์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

@Merovius Variance๋Š” ์„œ๋ธŒํƒ€์ดํ•‘๊ณผ ๊ด€๋ จ๋œ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ํ•˜์œ„ ์ž…๋ ฅ์ด ์—†๋Š” ์–ธ์–ด์—์„œ๋Š” ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ถ„์‚ฐ์ด ์กด์žฌํ•˜๋ ค๋ฉด ๋จผ์ € ์œ ํ˜• ์ƒ์„ฑ์ž์— ๊ณต๋ถ„์‚ฐ/๋ฐ˜๊ณต๋ถ„์‚ฐ ๋ฌธ์ œ๋ฅผ ๋„์ž…ํ•˜๋Š” ํ•˜์œ„ ์œ ํ˜•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•˜์œ„ ์œ ํ˜•์ด ์žˆ๋Š” ์–ธ์–ด์—์„œ๋Š” ๋ชจ๋“  ์œ ํ˜• ์ƒ์„ฑ์ž๋ฅผ ๋ถˆ๋ณ€ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด ์˜ณ์Šต๋‹ˆ๋‹ค.

์œ ํ˜• ํด๋ž˜์Šค๋Š” ์œ ํ˜•์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ํ˜• ํด๋ž˜์Šค๋Š” ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” Go์—์„œ '์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•'์„ ๋Ÿฌ์ŠคํŠธ๊ฐ€ ์œ ํ˜• ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒ๋œ ์œ ํ˜•์œผ๋กœ ํšจ๊ณผ์ ์œผ๋กœ 'ํŠน์„ฑ ๊ฐ์ฒด'๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Go์˜ ์˜๋ฏธ๋Š” ๋ถ„์‚ฐ์ด ์—†๊ณ  ์•”์‹œ์ ์ธ 'ํŠน์„ฑ ๊ฐœ์ฒด'๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๋‘ ๋ชจ๋ธ์— ๋ชจ๋‘ ๋งž๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Go๋Š” ์ „ํ™˜์ ์— ์žˆ์œผ๋ฉฐ ํ•˜์œ„ ์œ ํ˜• ์ง€์ • ๋ผ์ธ์„ ๋”ฐ๋ผ ์ œ๋„ค๋ฆญ ๋ฐ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜์—ฌ C#์˜ ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ™์€ ๋ณ€ํ˜•์„ ๋„์ž…ํ•˜๊ณ  ๋๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” Go์—์„œ ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•˜์—ฌ Collections์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ '์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•' ๊ฐ„์˜ ์ฆ‰๊ฐ์ ์ธ ์—ฐ๊ฒฐ์„ ๋Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ:

type (T, U) Collection interface {
    member : (c T, e U) Bool
    insert: (c T, e U) T
}

member(c int32[], e int32) Bool {...}
insert(c int32[], e int32) int32[] {...}

member(c float32[], e float32) Bool {...}
insert(c float32[], e float32) float32[] {...}

T, U ์œ ํ˜•๊ณผ Collection ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์ด์— ๋” ์ด์ƒ ๋ช…๋ฐฑํ•œ ํ•˜์œ„ ์œ ํ˜• ๊ด€๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธ์Šคํ„ด์Šค ์œ ํ˜•๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜• ๊ฐ„์˜ ๊ด€๊ณ„๋Š” ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํ•˜์œ„ ์œ ํ˜•์œผ๋กœ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ปฌ๋ ‰์…˜๊ณผ ๊ฐ™์€ ์ถ”์ƒํ™”๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

@keean ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ณ  ์œ ํ˜• ํด๋ž˜์Šค๋Š” ์œ ํ˜•์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— Go ์˜๋ฏธ๋ก ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์ž์—ฐ์Šค๋Ÿฌ์šด ์„ค๋ช…์€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์œ ํ˜• ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ํ˜• ํด๋ž˜์Šค๋กœ ์ผ๋ฐ˜ํ™”ํ•˜๋ ค๋Š” ์ฃผ์žฅ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ธ์–ด๋ฅผ ์ทจํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉํ–ฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , ์‚ฌ์‹ค ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ถœํŒ๋œ ์ž‘์—…์—์„œ ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ํƒ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Go์— ํ•˜์œ„ ์œ ํ˜•์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์™€ ๊ด€๋ จํ•˜์—ฌ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

package main

type Cloneable interface {
    Clone() Cloneable
}

type CloneableZ interface {
    Clone() Cloneable
    zero() int
}

type S struct {}

func (t S) Clone() Cloneable {
    c := t
    return c
}

func (t S) zero() int {
    return 0
}

var x CloneableZ = S{}
var y Cloneable = x

func main() {
    print("ok\n")
}

x ์—์„œ y $๋กœ์˜ ํ• ๋‹น์€ $# x ์œ ํ˜•์ด ์˜ˆ์ƒ๋˜๋Š” ๊ณณ์— y ์œ ํ˜•์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ CloneableZ <: Cloneable ๋ฐ S <: CloneableZ ํ•˜์œ„ ์œ ํ˜• ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ํด๋ž˜์Šค์˜ ๊ด€์ ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค๋ช…ํ•˜๋”๋ผ๋„ S <: โˆƒT.CloneableZ[T] <: โˆƒT.Cloneable[T] ์™€ ๊ฐ™์€ ํ•˜์œ„ ์œ ํ˜• ์ง€์ • ๊ด€๊ณ„๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

Go์—์„œ Clone S ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ์™„๋ฒฝํ•˜๊ฒŒ ์•ˆ์ „ํ•˜์ง€๋งŒ Go๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ค€์ˆ˜๋ฅผ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ œํ•œ์ ์ธ ๊ทœ์น™์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, Java์™€ ๋™์ผํ•œ ๊ทœ์น™์ž…๋‹ˆ๋‹ค. ์›๋ž˜ ์‹œํ–‰. @Merovius ๊ฐ€ ๊ด€์ฐฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์—๋Š” ๋น„๋ถˆ๋ณ€ ์œ ํ˜• ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@andrewcmyers ์ปฌ๋ ‰์…˜์„ ์ถ”์ƒํ™”ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

๋” ๋‚˜์•„๊ฐ€ x์—์„œ y๋กœ์˜ ํ• ๋‹น์€ ํ•˜์œ„ ์œ ํ˜•์ด ์ „ํ˜€ ์—†๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Haskell(๋ถ„๋ช…ํžˆ ํ•˜์œ„ ์œ ํ˜•์ด ์—†์Œ)์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

class Cloneable t => CloneableZ t where...

x ๊ฐ€ ์žˆ๋Š” ๊ณณ์€ CloneableZ ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์ด๋ฉฐ ์ •์˜์— ๋”ฐ๋ผ Cloneable ๋„ ๊ตฌํ˜„ํ•˜๋ฏ€๋กœ ๋ถ„๋ช…ํžˆ y ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ํ˜•์œผ๋กœ ๋ณด๊ณ  ๊ณต๋ณ€ ๋˜๋Š” ๋ฐ˜๊ณต๋ณ€ ์œ ํ˜• ์ƒ์„ฑ์ž๊ฐ€ ์—†๋Š” ์ œํ•œ๋œ ํ•˜์œ„ ์œ ํ˜•์„ ๊ฐ–๋„๋ก Go๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ "ํŠน์„ฑ ๊ฐœ์ฒด"๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” Go์—์„œ๋Š” ์ด๋ฅผ " "typeclass" ์ธํ„ฐํŽ˜์ด์Šค์— ์˜ํ•ด ์ œํ•œ๋œ ๋‹คํ˜•์„ฑ ์ปจํ…Œ์ด๋„ˆ์ธ "์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ์ฒด"์ž…๋‹ˆ๋‹ค. typeclass ๋ชจ๋ธ์—๋Š” ํ•˜์œ„ ์œ ํ˜•์ด ์—†์œผ๋ฏ€๋กœ ๊ณต๋ถ„์‚ฐ๊ณผ ๋ฐ˜๊ณต๋ถ„์‚ฐ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์œ„ ์œ ํ˜• ์ง€์ • ๋ชจ๋ธ์„ ๊ณ ์ˆ˜ํ•˜๋ฉด ์ปฌ๋ ‰์…˜ ์œ ํ˜•์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด C++์—์„œ ํ…œํ”Œ๋ฆฟ์„ ๋„์ž…ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ํ•˜์œ„ ์œ ํ˜•ํ™”๋Š” ์ปจํ…Œ์ด๋„ˆ์™€ ๊ฐ™์€ ๊ฐœ๋…์„ ์ผ๋ฐ˜์ ์œผ๋กœ ์ •์˜ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ถ”์ƒํ™”, ๊ฐ์ฒด ๋ฐ ํ•˜์œ„ ์œ ํ˜• ์ง€์ •, ํ…œํ”Œ๋ฆฟ/ํŠน์„ฑ ๋ฐ ์ œ๋„ค๋ฆญ์„ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ๋‘˜ ์‚ฌ์ด์˜ ์ƒํ˜ธ ์ž‘์šฉ์€ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด C++, C# ๋ฐ Scala๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”. ๋‹ค๋ฅธ ์–ธ์–ด์™€ ํ•จ๊ป˜ ์ œ๋„ค๋ฆญ์˜ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ณต๋ณ€ ๋ฐ ๋ฐ˜๊ณต ์ƒ์„ฑ์ž๋ฅผ ๋„์ž…ํ•˜๋ผ๋Š” ์š”์ฒญ์ด ๊ณ„์† ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณ„๋„์˜ ์ œ๋„ค๋ฆญ ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ  ์ œ๋„ค๋ฆญ ์ปฌ๋ ‰์…˜์„ ์›ํ•˜๋ฉด ์œ ํ˜• ํด๋ž˜์Šค์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋” ์ด์ƒ ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Go์—์„œ ์ œ๋„ค๋ฆญ์„ ๊ฐœ์„ ํ•˜๊ณ  ์ปฌ๋ ‰์…˜๊ณผ ๊ฐ™์€ ์ถ”์ƒํ™”๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  C++, C#, Scala ๋“ฑ๊ณผ ๊ฐ™์€ ์–ธ์–ด ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๋ณต์žก์„ฑ์„ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†์ด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ† ๊ณ .

@keean

์ปฌ๋ ‰์…˜์„ ์ถ”์ƒํ™”ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์„ ์ง€์›ํ•˜๋Š” Genus ๋ฐ Familia์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. Familia๋Š” ์ด๋Ÿฌํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ†ตํ•ฉํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์œ ํ˜•์„ ์ œ์•ฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์œ„ ์œ ํ˜• ๋ชจ๋ธ์„ ๊ณ ์ˆ˜ํ•˜๋ฉด ์ปฌ๋ ‰์…˜ ์œ ํ˜•์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

"์„œ๋ธŒํƒ€์ดํ•‘ ๋ชจ๋ธ"์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์™„์ „ํžˆ ํ™•์‹ ํ•  ์ˆ˜ ์—†์ง€๋งŒ Java์™€ C#์— ์ปฌ๋ ‰์…˜ ์œ ํ˜•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•˜๋ฏ€๋กœ ์ด ์ฃผ์žฅ์€ ๋‚˜์—๊ฒŒ ๋ณ„๋กœ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

x๊ฐ€ ์žˆ๋Š” ๊ณณ์—์„œ ์ •์˜์— ๋”ฐ๋ผ Cloneable๋„ ๊ตฌํ˜„ํ•˜๋Š” CloneableZ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์ด๋ฏ€๋กœ ๋ถ„๋ช…ํžˆ y์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์ œ ์˜ˆ์—์„œ x๋Š” ๋ณ€์ˆ˜ ์ด๊ณ  y๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. y๊ฐ€ CloneableZ ์œ ํ˜•์ด๊ณ  x๊ฐ€ Cloneable ์œ ํ˜•์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด์„œ y์—์„œ x๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚˜์˜ ๋ชจ๋ฒ”์ด ํ•˜๋Š” ์ผ์ด๋‹ค.

Go๋ฅผ ๋ชจ๋ธ๋งํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ธŒํƒ€์ดํ•‘์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด, ์•„๋ž˜๋Š” Haskell์—์„œ ๋„๋•์ ์œผ๋กœ ๋™๋“ฑํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๋Š” ์˜ˆ์˜ ์˜ˆ๋ฆฌํ•œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์„ ํ†ตํ•ด ๋‹ค๋ฅธ ์š”์†Œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌํ˜„์„ ๊ฐ–๋Š” ์ด๊ธฐ์ข… ์ปฌ๋ ‰์…˜์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ€๋Šฅํ•œ ๊ตฌํ˜„ ์„ธํŠธ๋Š” ๊ฐœ๋ฐฉํ˜•์ž…๋‹ˆ๋‹ค.

type Cloneable interface {
    Clone() Cloneable
}

type CloneableZ interface {
    Clone() Cloneable
    zero() int
}

type S struct {}

func (t S) Clone() Cloneable {
    c := t
    return c
}

type T struct { x int }

func (t T) Clone() Cloneable {
    c := t
    return c
}

func (t S) zero() int {
    return 0
}

var x CloneableZ = S{}
var y Cloneable = T{}
var a [2]Cloneable = [2]Cloneable{x, y}

@andrewcmyers

"์„œ๋ธŒํƒ€์ดํ•‘ ๋ชจ๋ธ"์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์™„์ „ํžˆ ํ™•์‹ ํ•  ์ˆ˜ ์—†์ง€๋งŒ Java์™€ C#์— ์ปฌ๋ ‰์…˜ ์œ ํ˜•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•˜๋ฏ€๋กœ ์ด ์ฃผ์žฅ์€ ๋‚˜์—๊ฒŒ ๋ณ„๋กœ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

C++์—์„œ ํ…œํ”Œ๋ฆฟ์„ ๊ฐœ๋ฐœํ•œ ์ด์œ ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. OO ํ•˜์œ„ ์œ ํ˜• ๋ชจ๋ธ์€ ์ปฌ๋ ‰์…˜๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ผ๋ฐ˜ ๊ฐœ๋…์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. C#๊ณผ Java๋Š” ๋˜ํ•œ ๊ฐœ์ฒด, ํ•˜์œ„ ์œ ํ˜• ์ง€์ • ๋ฐ ์ƒ์†๊ณผ ๋ถ„๋ฆฌ๋œ ์™„์ „ํ•œ ์ œ๋„ค๋ฆญ ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•ด์•ผ ํ–ˆ์œผ๋ฉฐ ๊ณต๋ณ€ ๋ฐ ๋ฐ˜๊ณต๋ณ€ ์œ ํ˜• ์ƒ์„ฑ์ž์™€ ๊ฐ™์€ ๋‘ ์‹œ์Šคํ…œ์˜ ๋ณต์žกํ•œ ์ƒํ˜ธ ์ž‘์šฉ์„ ์ •๋ฆฌํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋’ค๋Šฆ๊ฒŒ ์•Œ๊ฒŒ ๋œ ์ด์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” OO ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์„ ํ”ผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋Œ€์‹  ๋‹จ์ˆœ ์œ ํ˜• ์–ธ์–ด์— ์ธํ„ฐํŽ˜์ด์Šค(์œ ํ˜• ํด๋ž˜์Šค)๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Rust๊ฐ€ ํ•œ ์ผ์ด๋ฏ€๋กœ ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ ๋ฌผ๋ก  ํ‰์ƒ ๋™์•ˆ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. Go์—๋Š” GC๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ณต์žก์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ œ ์ œ์•ˆ์€ Go๊ฐ€ ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํ™•์žฅ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Haskell์—์„œ ์ด ์˜ˆ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ท€ํ•˜์˜ ์ฃผ์žฅ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{-# LANGUAGE ExistentialQuantification #-}

class ICloneable t where
    clone :: t -> t

class ICloneable t => ICloneableZ t where
    zero :: t

data S = S deriving Show

instance ICloneable S where
    clone x = x

data T = T Int deriving Show

instance ICloneable T where
    clone x = x

instance ICloneableZ T where
    zero = T 0

data Cloneable = forall a . (ICloneable a, Show a) => ToCloneable a

instance Show Cloneable where
    show (ToCloneable x) = show x

main = do
    x <- return S
    y <- return (T 27)
    a <- return [ToCloneable x, ToCloneable y]
    putStrLn (show a)

๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Go๋Š” ์ž๋™์œผ๋กœ ์ด ์œ ํ˜•์„ data Cloneable = forall a . (ICloneable a, Show a) => ToCloneable a ๋กœ ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ธํ„ฐํŽ˜์ด์Šค(์ €์žฅ์†Œ๊ฐ€ ์—†๋Š”)๋ฅผ ์œ ํ˜•(์ €์žฅ์†Œ๊ฐ€ ์žˆ๋Š”)์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Rust๋„ ์ด๋Ÿฌํ•œ ์œ ํ˜•์„ ์œ ๋„ํ•˜๊ณ  "ํŠน์„ฑ ๊ฐœ์ฒด"๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. . Java, C# ๋ฐ Scala์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” ์‹ค์ œ๋กœ "์˜ฌ๋ฐ”๋ฅธ" ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ ํ˜•์ด ์•„๋‹ˆ๋ฉฐ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ ํ˜•๊ณผ ๋น„์Šทํ•˜๋ฉฐ Go๋Š” ์กด์žฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์— ํŒŒ์ƒ๋œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋™์ผํ•œ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์—ฌ ์ด๋ฅผ ์ˆจ๊น๋‹ˆ๋‹ค. ์ฃผ์˜ํ•ด์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ์‚ฌํ•ญ์€ ์ด [2]Cloneable{x, y} ๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ์›์„ Cloneable ๋กœ ๊ฐ•์ œํ•˜๋Š” ๋ฐ˜๋ฉด Haskell์—๋Š” ์ด๋Ÿฌํ•œ ์•”์‹œ์  ๊ฐ•์ œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ToCloneable ๋กœ ๊ตฌ์„ฑ์›์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ•์ œํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

๋˜ํ•œ S ๋ฐ T ๋Š” Cloneable ์˜ S ๋ฐ T ํ•˜์œ„ ์œ ํ˜•์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ ์œผ๋กœ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋ชจ๋“  ์œ ํ˜•์˜ Cloneable ์ธ์Šคํ„ด์Šค๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ(Go์—์„œ clone ํ•จ์ˆ˜์˜ ๊ด€๋ จ ์ •์˜๋ฅผ ์„ ์–ธํ•จ์œผ๋กœ์จ) ์ด๋Ÿฌํ•œ ์œ ํ˜•์€ ์„œ๋กœ ๊ด€๋ จ์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Generics์— ๋Œ€ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์ œ์•ˆ์€ ๊ฐ€๋…์„ฑ๊ณผ Go์˜ ๋‹จ์ˆœํ•œ ๋Š๋‚Œ์„ ํ•ด์น˜๋Š” ์ถ”๊ฐ€ ํ† ํฐ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Go์˜ ๊ธฐ์กด ๋ฌธ๋ฒ•๊ณผ ์ž˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(Github Markdown์—์„œ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๋„ ๊ฝค ์ž˜ ๋ฐœ์ƒํ•จ).

์ œ์•ˆ์˜ ์š”์ :

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

    • ๊ฐ€๋…์„ฑ์„ ํ•ด์น˜๋Š” ๊ฒƒ์— ๊ด€ํ•ด์„œ๋Š” ์–ด๋Š ์ชฝ์ด๋“  ๋…ผ์Ÿํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.๋˜๋Š” [T]๋Š” ๊ตฌ๋ฌธ์ƒ์˜ ๋…ธ์ด์ฆˆ๋ฅผ ๋งŽ์ด ๋งŒ๋“ค์–ด ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฝ๋‹ˆ๋‹ค.

    • ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ๋•Œ ํ•จ์ถ•์„ฑ์€ ์–ธ์–ด์˜ ์žฅํ™ฉํ•จ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :=์— ์˜ํ•ด ์ˆจ๊ฒจ์ง„ ์ •๋ณด๋Š” ๋งค๋ฒˆ ์ฒ ์ž๋ฒ•์„ ์„ค๋ช…ํ•  ๋งŒํผ ์ค‘์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ := ์œ ํ˜• ์„ ์–ธ์„ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.

    • ๊ตฌ์ฒด์ ์ธ(์ผ๋ฐ˜์ด ์•„๋‹Œ) ์œ ํ˜•์˜ ์ด๋ฆ„์„ a ๋˜๋Š” t ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ ๋‚˜์œ ์Šต๊ด€์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ์ œ์•ˆ์€ ์ด๋Ÿฌํ•œ ์‹๋ณ„์ž๋ฅผ ์ผ๋ฐ˜ ์œ ํ˜• ์ธ์ˆ˜๋กœ ์ž‘๋™ํ•˜๋„๋ก ์˜ˆ์•ฝํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ์ด๋™ ์ˆ˜์ • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ํ•„์š”ํ•˜์ง€๋งŒ?

package main

import "fmt"

type LinkedList a struct {
  Head *Node a
  Tail *Node a
}

type Node a {
  Next *Node a
  Prev *Node a

  Value a
}

func main() {
  // Not sure about how recursive we could get with the inference
  ll := LinkedList string {
    // The string bit could be inferred
    Head: Node string { Value: "hello world" },
  }
}

func (l *LinkedList a) Append(value a) {
  newNode := &Node{Value: value}

  if l.Tail == nil {
    l.Head = newNode
    l.Tail = l.Head
    return
  }

  l.Tail.Next = newNode
  l.Tail = l.Tail.Next
}

์ด๊ฒƒ์€ https://gist.github.com/aarondl/9b950373642fcf5072942cf0fca2c3a2 ์— ์ œ์•ˆ๋œ ํ•ฉ๊ณ„ ์œ ํ˜•๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์กฐ๊ธˆ ๋” ์„ธ๋ถ€์ ์ธ Gist์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค

์ด๊ฒƒ์€ ์™„์ „ํžˆ ํ”Œ๋Ÿฌ์‹œ๋œ Generics ์ œ์•ˆ์ด ์•„๋‹ˆ๋ฉฐ ์˜๋„๋œ ๊ฒƒ๋„ ์•„๋‹™๋‹ˆ๋‹ค. Go์— Generics๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌ๋ฌธ๋งŒ์„ ๋‹ค๋ฃจ๋ฉฐ ์ œ์•ˆ๋œ ๋‚ด์šฉ์ด ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ์ง€/๋ฐ”๋žŒ์งํ•œ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@์•„๋ก ๋“ค
์ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.

type Collection a b interface {
   member(c a, e b) Bool
   insert(c a, e b) a
}

func insert(c *LinkedList a, e a) *LinkedList a {
   c.Append(e)
   return c
}

@keean Collection ์œ ํ˜•์„ ์กฐ๊ธˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค:

type Collection a b interface {
   member(c a, e b) Bool
   insert(c a, e b) a
}

@dc0d Collection์€ _all_ ์ปฌ๋ ‰์…˜์„ ์ถ”์ƒํ™”ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฏ€๋กœ ํŠธ๋ฆฌ, ๋ชฉ๋ก, ์กฐ๊ฐ ๋“ฑ์„ ์ถ”์ƒํ™”ํ•˜๋ฏ€๋กœ member ๋ฐ insert $์™€ ๊ฐ™์€ ์ผ๋ฐ˜ ์ž‘์—…์ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ์ปฌ๋ ‰์…˜์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ์—์„œ๋Š” ์ด์ „ ์˜ˆ์ œ์—์„œ LinkedList ์œ ํ˜•์— ๋Œ€ํ•ด '์‚ฝ์ž…'์„ ์ •์˜ํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

func insert(c *LinkedList a, e a) *LinkedList a {
   c.Append(e)
   return c
}

์Šฌ๋ผ์ด์Šค์— ๋Œ€ํ•ด ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

func insert(c []a, e a) []a {
   return append(c, e)
}

๊ทธ๋Ÿฌ๋‚˜ ๋‹คํ˜•์„ฑ ์œ ํ˜•์ด a ์ธ @aarondl ์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์œ ํ˜• ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์— ๋Œ€ํ•ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

func insert(c *LinkedList int, e int) *LinkedList int {
   c.Append(e)
   return c
}

func insert(c *LinkedList float, e float) *LinkedList float {
   c.Append(e)
   return c
}

func insert(c int[], e int) int[] {
   return append(c, e)
}

func insert(c float[], e float) float[] {
   return append(c, e)
}

๋”ฐ๋ผ์„œ Collection ๋Š” ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•๊ณผ ๋‚ด์šฉ ์œ ํ˜• ๋ชจ๋‘๋ฅผ ์ผ๋ฐ˜ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์ปจํ…Œ์ด๋„ˆ์™€ ๋‚ด์šฉ์˜ ๋ชจ๋“  ์กฐํ•ฉ์—์„œ ์ž‘๋™ํ•˜๋Š” ์ผ๋ฐ˜ ๊ธฐ๋Šฅ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

member ๋ฐ insert ๊ฐ€ ๊ฐ ์กฐํ•ฉ์— ๋Œ€ํ•ด ์ •์˜๋œ ๊ฒฝ์šฐ ์ฝ˜ํ…์ธ ๊ฐ€ ๋‹ค๋ฅธ ๊ฐ’ ์œ ํ˜•์„ ๊ฐ€์ง„ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ์œ ํ˜•์ธ []Collection ์ปฌ๋ ‰์…˜ ์กฐ๊ฐ์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. .

@aarondl type LinkedList a ์ด ์ด๋ฏธ ์œ ํšจํ•œ ์œ ํ˜• ์„ ์–ธ์ž„์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํŒจ ์‚ฌ๋ก€์˜ ์ž˜๋ชป๋œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋•Œ๋ฌธ์— go ๋ฌธ๋ฒ•์ด ํ”ผํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ์˜คํ•ดํ•˜๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ IMO๋Š” ํ† ํฐ ์—†๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

Go์˜ @keean ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ œ์•ˆํ•œ ํŠน์ • ๊ตฌ๋ฌธ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•ด insert ๋ฅผ *LinkedList ์— ์ฒจ๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค(Haskell์—์„œ๋Š” instance ์„ ์–ธ์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋จ). ๋ฉ”์†Œ๋“œ๊ฐ€ ์ž‘๋™ ์ค‘์ธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋„ ์ •์ƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์ œ์•ˆํ•˜๋Š” ๊ตฌ๋ฌธ์ด Go์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ง€์ ํ•œ ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ ๋” ๋น„์Šทํ•œ

type Collection e interface {
    Element(e) book
    Insert(e)
}

func (l *(LinkedList e)) Element(el e) book {
    // ...
}

func (l* (LinkedList e)) Insert(el e) {
    // ...
}

๋˜ํ•œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„์™€ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์งˆ๋ฌธ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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

@keean ๊ทธ๋ž˜๋„ a ๊ฐ€ ๋ชฉ๋ก(๋˜๋Š” ์Šฌ๋ผ์ด์Šค ๋˜๋Š” ๊ธฐํƒ€ ์ปฌ๋ ‰์…˜)์œผ๋กœ ์ œํ•œ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ ์ข…์† ํŠน์ˆ˜ ๋ฌธ๋ฒ•์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ ๊ฐ€์น˜๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์„ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@Merovius ๊ทธ๊ฒƒ์€ Go๊ฐ€ ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ  'ํ•จ์ˆ˜'์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ํŠน๋ณ„ํ•˜๊ฒŒ ๋งŒ๋“œ๋‚˜์š”? ์ด๊ฒƒ์€ ์—ฐ๊ด€๋œ ์œ ํ˜•์ด ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค ๋” ์ ํ•ฉํ•  ๊ฒƒ์ž„์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ™์€:

type Collection interface {
   type Element
   Member(e Element) Bool
   Insert(e Element) Collection
}

type IntSlice struct {
    value []Int,
}

type IntSlice.Element = Int

func (IntSlice) Member(e Int) Bool {...}
func (IntSlice) Insert(e Int) IntSlice {...}

func useIt(c Collection, e Collection.Element) {...}

๊ทธ๋Ÿฌ๋‚˜ ๋‘ ์ปฌ๋ ‰์…˜์„ ๋™์ผํ•œ ์œ ํ˜•์œผ๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

func[A] useIt(c A, e A.Element) requires A:Collection

์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ์ธ์Šคํ„ด์Šค ์„ ํƒ์— ์ฐธ์—ฌํ•˜๋Š” ์ถ”๊ฐ€ _input_ ์œ ํ˜•์ด ์žˆ๋Š” ๋ฐ˜๋ฉด(๋”ฐ๋ผ์„œ ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜ ์—ฐ๊ฒฐ) ์—ฐ๊ฒฐ๋œ ์œ ํ˜•์€ _output_ ์œ ํ˜•์ด๊ณ  ์ˆ˜์‹ ๊ธฐ ์œ ํ˜•๋งŒ ์ธ์Šคํ„ด์Šค ์„ ํƒ์— ์ฐธ์—ฌํ•˜๊ณ  ๊ทธ๋Ÿฐ ๋‹ค์Œ ์—ฐ๊ฒฐ๋œ ์œ ํ˜•์€ ์ˆ˜์‹ ๊ธฐ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

@dc0d a ๋ฐ b ๋Š” Haskell ์œ ํ˜• ํด๋ž˜์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. Collection ๋กœ ๊ฐ„์ฃผ๋˜๋ ค๋ฉด a ๋ฐ b ๊ฐ€ ๋ชจ๋“  ์œ ํ˜•์ผ ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์œ ํ˜•๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ @Merovius ๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด Go ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฉ”์„œ๋“œ ๊ธฐ๋ฐ˜์ด๋ฉฐ ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go์˜ ๋‹จ์ผ ๋””์ŠคํŒจ์น˜ ๋ฉ”์†Œ๋“œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค์— ์—ฐ๊ด€๋œ ์œ ํ˜•์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜์˜ ๋ถ€์žฌ๋Š” unify(x, y) ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ  ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š์€ ์ด์ค‘ ๋””์ŠคํŒจ์น˜ ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์ค‘ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์กฐ๊ธˆ ๋” ์„ค๋ช…ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

type Cloneable[A] interface {
   clone(x A) A
}

์—ฌ๊ธฐ์„œ a ๋Š” ๋ชจ๋“  ์œ ํ˜•์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š” ํ•œ ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Cloneable ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ํ˜• ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ์œผ๋กœ ๊ฐ„์ฃผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

func clone(x int) int {...}

๊ทธ๋ž˜์„œ 'clone'์˜ ๊ฒฝ์šฐ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์—์„œ int ๋ฅผ $ a ๋กœ ๋Œ€์ฒดํ•˜๊ณ  ๋Œ€์ฒด๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด clone์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์Œ ํ‘œ๊ธฐ๋ฒ•๊ณผ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค.

func[A] test(x A) A requires Cloneable[A] {...}

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type Cloneable interface {
   clone() Cloneable
}

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

Go์—๋Š” ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ชจ๋“  ๊ฒƒ์ด ํ•œ ๋ฒˆ์— ๋ณ€๊ฒฝํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋” ์ œํ•œ์ ์ด๊ธด ํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ๋œ ์œ ํ˜•์ด ๋” ์ ํ•ฉํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ถ”์ƒ ์ปฌ๋ ‰์…˜์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ํ†ต์ผ๊ณผ ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•œ ์šฐ์•„ํ•œ ์†”๋ฃจ์…˜์€ ์•„๋‹™๋‹ˆ๋‹ค.

@Merovius ์ œ์•ˆ์„ ๊ฒ€ํ† ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์šฐ๋ ค ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•˜๋„๋ก ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๋…ผ์˜๋ฅผ ํ•˜๊ธฐ ์ „์— ์ œ์•ˆ์„ ๊ฑฐ์ ˆํ•˜์…จ๋‹ค๋‹ˆ ์•ˆํƒ€๊น์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋งˆ์Œ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์ œ ์ƒ๊ฐ์„ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. :)

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

a ๊ฐ€ ์ œ๋„ค๋ฆญ ์œ ํ˜• ์ธ์ˆ˜์ด๊ณ  type LinkedList ๊ณผ ๋™์ผํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ œ์•ˆ์—์„œ type LinkedList a ์˜ ๋ฌธ์ œ๋Š” ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. type LinkedList ๋Š” prog.go:3:16: expected type, found newline (and 1 more errors) ๋กœ ์˜ค๋Š˜ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ์€ ์‹ค์ œ๋กœ ๋‚˜์˜ค์ง€ ์•Š์•˜๊ณ  ๋งํ–ˆ์ง€๋งŒ ๋” ์ด์ƒ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์˜ ์ด๋ฆ„์„ [a-z]{1} ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ํฌ์ƒ์ž…๋‹ˆ๋‹ค. ๋งŒ๋“ค๊ธฐ(์˜ค๋Š˜๋‚  Go ์ฝ”๋“œ์—์„œ ๋‹จ์ผ ๋ฌธ์ž ์ด๋ฆ„์œผ๋กœ ์‹ค์ œ ์œ ํ˜•์„ ์ƒ์„ฑํ•  ๋•Œ์˜ ๋‹จ์ ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

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

์ด ์ œ์•ˆ์— ๋”ฐ๋ฅด๋ฉด + ์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋ชจ๋“  ์ˆซ์ž ์œ ํ˜•์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ์ˆ˜ ์—†์ง€๋งŒ ์ผ๋ฐ˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ธ์ˆ˜๋กœ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์„ธ์š”:

func Sort(slice []a, compare func (a, a) bool) { ... }

๋ฒ”์œ„ ์ง€์ •์— ๋Œ€ํ•œ ์งˆ๋ฌธ

๋‹น์‹ ์€ ์—ฌ๊ธฐ์— ์˜ˆ๋ฅผ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค:

type Collection e interface {
    Element(e) book
    Insert(e)
}

func (l *(LinkedList e)) Element(el e) book {
    // ...
}

func (l* (LinkedList e)) Insert(el e) {
    // ...
}

์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์‹๋ณ„์ž์˜ ๋ฒ”์œ„๋Š” ํ•ด๋‹น ์‹๋ณ„์ž๊ฐ€ ์†ํ•œ ํŠน์ • ์„ ์–ธ/์ •์˜์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์–ด๋””์—๋„ ๊ณต์œ ๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ทธ๋Ÿด ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

๋‹จ์ผ ๋ฌธ์ž ์†Œ๋ฌธ์ž๋Š” ํ•ด๋‹น ์ผ๋ฐ˜ ์ธ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ตฌ๋ฌธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ธฐ๋ถ„์ด ์ข‹์ง€ ์•Š๋‹ค. ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ์‹๋ณ„์ž๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์ƒ์„ฑ์ด ํ•„์š”ํ•˜๊ณ  ์œ ํ˜•์— ๋Œ€ํ•œ ํŠน์ • ์‹๋ณ„์ž๋ฅผ ์ž„์˜๋กœ ๊ธˆ์ง€ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์— ๋”ฐ๋ผ +์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ์ง€๊ธˆ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

๊ฐ’์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ ๊ฐ’์€ ์™„์ „ํ•œ ์ œ๋„ค๋ฆญ ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ผ๋ฐ˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ธ์ˆ˜๋กœ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@๋ฉ”๋กœ๋น„์šฐ์Šค

@aarondl ์˜ ์ด ์ ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ธฐ

์ผ๋ฐ˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ธ์ˆ˜๋กœ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์œ„ ์—ฐ์‚ฐ์ž๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ตฌ๋ฌธ์ด ์ฃผ์–ด์ง€๋ฉด ๋ง์…ˆ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ—ˆ์šฉํ•˜๋Š” Addable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

type Addable interface {
   + (x Addable, y Addable) Addable
}

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

type Addable[A] interface {
   + (x A, y A) A
}

๊ทธ๋Ÿฐ ๋‹ค์Œ Go์—์„œ ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜์˜ ๋ชจ๋“  ์ธ์ˆ˜๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ์ผ์น˜๋ฅผ ์œ„ํ•œ ์ˆ˜์‹ ๊ธฐ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ์˜ˆ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์˜ ํ•จ์ˆ˜ ์ •์˜๋ฅผ ์ถฉ์กฑํ•˜๋Š” + ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉด ๋ชจ๋“  ์œ ํ˜•์€ Addable ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type S struct {
   value: int
}

func (+) (x S, y S) S {
   return S {
      value: x.value + y.value
   }
}

func main() {
    println(S {value: 27} + S {value: 5})
}

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

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

์ผ๋ถ€๋Š” ๊ทธ ๊ธฐ๋Šฅ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :) AFAIR ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋…ผ์˜ํ•˜๋Š” ์–ด๋”˜๊ฐ€์— ๋– ๋‹ค๋‹ˆ๋Š” ์ œ์•ˆ์ด๋‚˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. FWIW, ๋‚˜๋Š” ์ด๊ฒƒ์ด - ๋‹ค์‹œ - ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚˜ ๋ฐฉํ™ฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ(๋˜๋Š” ์ผ๋ฐ˜์ ์ธ "Go๋ฅผ ๋” ๋งŽ์ด Haskell์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•" ์•„์ด๋””์–ด)์€ ์‹ค์ œ๋กœ ์ด ๋ฌธ์ œ์˜ ์š”์ ์ด ์•„๋‹™๋‹ˆ๋‹ค. :)

๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜(์•„๋งˆ๋„ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ)๊ฐ€ Go์—์„œ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ์ผ์ž…๋‹ˆ๊นŒ?

์ ˆ๋Œ€ ์ ˆ๋Œ€ ๋งํ•˜์ง€ ๋งˆ์„ธ์š”. ๊ฐœ์ธ์ ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ.

@๋ฉ”๋กœ๋น„์šฐ์Šค

์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๊ฒƒ์„ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. :)

๋ฌผ๋ก , Go๊ฐ€ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด๋„ ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค :-) Go๊ฐ€ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ณตํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Go์—์„œ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ผ๋ถ€ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ดˆ์ ์€ ๋‚˜ ์ž์‹ ๊ณผ ์ƒ์šฉ๊ตฌ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ์ผ๋ฐ˜์ ์ธ ์–ธ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋งคํฌ๋กœ๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ๋งค๋ฒˆ 1ํŽ˜๋‹ˆ๊ฐ€ ์žˆ๋‹ค๋ฉด ํŠน์ • ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋Œ€ํ•ด 'C'๋กœ ์—ฐ๊ฒฐ ๋ชฉ๋ก์ด๋‚˜ ํŠธ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ๋Š” ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋จธ๋ฆฌ์— ๋‹ด๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ณ  ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘ ๋•Œ๋ฌธ์— ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์ œ๋„ค๋ฆญ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์ด ์•„์ง ์ถฉ๋ถ„ํžˆ ํฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋Œ€์‹  ํฐ ํŒ€์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ „์ฒด ์ฝ”๋“œ์˜ ์ž‘์€ ๋ถ€๋ถ„๋งŒ ๋‹ด๋‹นํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ €๋Š” ๋‹จ์ผ ๊ฐœ๋ฐœ์ž(๋˜๋Š” ์†Œ๊ทœ๋ชจ ํŒ€)๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ ๋ฐ ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ณ  @aarondl ์˜ ์ œ์•ˆ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฌธ์ œ๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค์— ๊ด€๋ จ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•จ์ˆ˜์— ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์›ํ•˜๋Š” ๋งŒํผ Go์—์„œ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์ข…๋ฅ˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type Collection interface {
   type Element
   Member(e Element) Bool
   Insert(e Element) Collection
}

type IntSlice struct {
    value []Int,
}

type IntSlice.Element = Int

func (IntSlice) Member(e Int) Bool {...}
func (IntSlice) Insert(e Int) IntSlice {...}

func useIt<T>(c T, e T.Element) requires T:Collection {...}

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ตฌํ˜„ ์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ• ์ง€ ๋˜๋Š” ๋ณดํŽธ์ ์œผ๋กœ ์ˆ˜๋Ÿ‰ํ™”๋œ ์œ ํ˜•์„ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Java์™€ ๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์˜ ๊ฒฝ์šฐ '์ผ๋ฐ˜' ํ•จ์ˆ˜๋Š” ์‹ค์ œ๋กœ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ์ข…์˜ ์œ ํ˜• ์•ˆ์ „ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์ด๋ฉฐ, ๋”ฐ๋ผ์„œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ํ•œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

f(useIt) // not okay with parametric types
f(useIt<List>) // okay with parametric types

๋ณดํŽธ์ ์œผ๋กœ ์ˆ˜๋Ÿ‰ํ™”๋œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด useIt์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ f ๋‚ด๋ถ€์— ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์„ ์„ ํ˜ธํ•˜๋Š” ์ด์œ ๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๋‹คํ˜•์„ฑ์„ ๋‹จ์ผํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์— ๋‹คํ˜•์„ฑ ํ•จ์ˆ˜๋ฅผ ์ •๊ตํ•˜๊ฒŒ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Go๊ฐ€ ์ด๋ฏธ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋Ÿฐํƒ€์ž„ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด Go์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค useIt ์ •๋Ÿ‰ํ™”๋Š” ์•„๋งˆ๋„ Go์˜ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@bcmills๋งŒ ์–ธ๊ธ‰ํ•œ SFINAE๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ œ์•ˆ์„œ์—๋„ ์–ธ๊ธ‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์˜ˆ๋กœ Sort๊ฐ€ ์žˆ์ง€๋งŒ).
๊ทธ๋Ÿฌ๋ฉด ์Šฌ๋ผ์ด์Šค ๋ฐ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์˜ Sort ๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

@keean
๊ท€ํ•˜์˜ ์ œ์•ˆ์œผ๋กœ ์ผ๋ฐ˜์ ์ธ '์Šฌ๋ผ์ด์Šค' ์ปฌ๋ ‰์…˜์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. '์ปฌ๋ ‰์…˜'์„ ๊ตฌํ˜„ํ•˜๋Š” 'IntSlice'๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ(Insert๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์›ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ) ์ด๋Š” int์—๋งŒ ํ•ด๋‹น๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ์ผ๋ฐ˜ '์Šฌ๋ผ์ด์Šค'๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. , ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์€ int์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ์œ ํ˜•๋ณ„๋กœ ํŠน์ • ๊ตฌํ˜„์„ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋•Œ๋กœ๋Š” ์ œ๋„ค๋ฆญ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์ด ์•„์ง ์ถฉ๋ถ„ํžˆ ํฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  "์˜ฌ๋ฐ”๋ฅธ ์ œ์•ˆ์„ ์›ํ•˜๊ณ  ๊ธฐ์กด ์ œ์•ˆ์ด ์—†๋Š” ๋ถ€๋ถ„์„ ์ง€์ ํ•˜๋Š” ๊ฒƒ"์„ "๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ”๋กœ ๊ทธ ์•„์ด๋””์–ด์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ"๊ณผ ์ฐฉ๊ฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

@aarondl ์˜ ์ œ์•ˆ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฌธ์ œ๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

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

@urandom

๊ท€ํ•˜์˜ ์ œ์•ˆ์œผ๋กœ ์ผ๋ฐ˜์ ์ธ '์Šฌ๋ผ์ด์Šค' ์ปฌ๋ ‰์…˜์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

type<T> []T.Element = Int

func<T> ([]T) Member(e T) Bool {...}
func<T> ([]T) Insert(e T) Collection {...}

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

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

@๋ฉ”๋กœ๋น„์šฐ์Šค

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ •๋ง๋กœ ํ•„์š”์„ฑ์„ ๋Š๋ผ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํฐ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ๋„ ๋ฌธ์ œ ์—†์ด ์ž˜ ์ง€๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‹น์‹ ์ด ์˜ณ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 'ํ•„์š”'๊ฐ€ ๋„ˆ๋ฌด ๊ฐ•ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ–‰๋ณตํ•˜๊ฒŒ go ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ๋ถ€์กฑ์— ๋Œ€ํ•œ ๊ฐ€๋” ์ขŒ์ ˆ๊ฐ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go์—์„œ๋Š” ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ง์ ‘์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ž ๊ทธ๋Œ€๋กœ.

์ œํ•œ๋œ ๋‹คํ˜•์„ฑ์˜ ๊ฒฐ์—ฌ๋Š” ์˜๋ฏธ์ ์œผ๋กœ ํ›จ์”ฌ ๋” ์‹ฌ๊ฐํ•ฉ๋‹ˆ๋‹ค. IMO, ๊ทธ๊ฒƒ ์—†์ด ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋…ธ๋ ฅํ•  ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

100,000๊ฐœ์˜ ์ผ๋ฐ˜ ๋ผ์ธ์ด ์•„๋‹Œ ๋ผ์ธ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค 100,000๊ฐœ์˜ ์ผ๋ฐ˜ ๋ผ์ธ์œผ๋กœ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฐ˜๋ณต์œผ๋กœ ์ธํ•ด)

๊ท€ํ•˜์˜ ๊ฐ€์ƒ์˜ ์˜ˆ์—์„œ ๊ทธ ํ–‰์˜ ๋ช‡ %๊ฐ€ ์ผ๋ฐ˜ ํ•จ์ˆ˜๊ฐ€ ๋  ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ์ด๊ฒƒ์€ 2% ๋ฏธ๋งŒ(115k LOC๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ)์ด๋ฏ€๋กœ "์ปฌ๋ ‰์…˜"์— ๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด๊ฒƒ์ด ์ข‹์€ ์ธ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ๊ตญ ์ œ๋„ค๋ฆญ์„ ์–ป์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

@keean

Haskell์—์„œ ์ด ์˜ˆ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ท€ํ•˜์˜ ์ฃผ์žฅ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๋Š” ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์™€ ๋„๋•์ ์œผ๋กœ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ICloneable ์ธํ„ฐํŽ˜์ด์Šค ์™ธ์— ์ƒˆ๋กœ์šด Cloneable ๋ž˜ํผ ์œ ํ˜•์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. Go ์ฝ”๋“œ์—๋Š” ๋ž˜ํผ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์„œ๋ธŒํƒ€์ดํ•‘์„ ์ง€์›ํ•˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

@andrewcmyers

์ด ์ฝ”๋“œ๋Š” ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์™€ ๋„๋•์ ์œผ๋กœ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ICloneable ์ธํ„ฐํŽ˜์ด์Šค ์™ธ์— ์ƒˆ๋กœ์šด Cloneable ๋ž˜ํผ ์œ ํ˜•์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ด ์ฝ”๋“œ๊ฐ€ ํ•˜๋Š” ์ผ์ด ์•„๋‹™๋‹ˆ๊นŒ?

type Cloneable interface {...}

์ธํ„ฐํŽ˜์ด์Šค์—์„œ ํŒŒ์ƒ๋œ 'Cloneable' ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ธ์Šคํ„ด์Šค ์„ ์–ธ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— 'ICloneable'์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๊ณ  ๋ฉ”์„œ๋“œ๋งŒ ์„ ์–ธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์ด ๊ตฌ์กฐ์ ์œผ๋กœ ํ˜ธํ™˜๋  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@keean ์ €๋Š” Cloneable ๋ฅผ ๋‹จ์ˆœํžˆ "๋ฐ์ดํ„ฐ ์œ ํ˜•"์ด ์•„๋‹Œ ์œ ํ˜•์œผ๋กœ ๊ฐ„์ฃผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Java์™€ ๊ฐ™์€ ์–ธ์–ด์—์„œ๋Š” ์ฝ”๋“œ์™€ ๋‹ฌ๋ฆฌ ๋ž˜ํผ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Cloneable ์ถ”์ƒํ™”์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถ”๊ฐ€ ๋น„์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

@andrewcmyers
์œ ํ˜•๊ณผ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์„œ๋กœ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์œ ํ˜•์€ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ์™€ ๋‹ฌ๋ฆฌ ๋ž˜ํผ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Go ์œ ํ˜•์€ ํ•ญ์ƒ ์ƒ์žํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ๋ž˜ํผ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ž˜ํผ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Haskell์€ unboxed ์œ ํ˜•์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ž˜ํผ๊ฐ€ ๋ช…์‹œ์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜• ๊ฐ„์˜ ๊ตฌ์กฐ์  ์œ ์‚ฌ์„ฑ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ์ƒ๊ฐ์„ ํ•˜๋Š”์ง€ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๊ตฌ์กฐ์  ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์€ ์œ ํ˜•์ด '๊ตฌ์กฐ์ ์œผ๋กœ ํ˜ธํ™˜ ๊ฐ€๋Šฅ'ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์†์ด ์žˆ๋Š” OO ์–ธ์–ด์™€ ๊ฐ™์ด ๋ช…์‹œ์  ์œ ํ˜• ๊ณ„์ธต์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์€ ๋ช…๋ชฉ์ ์ผ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ตฌ์กฐ์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ์ถ”์ƒ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ์œ ํ˜•๊ณผ ์ผ์ข…์˜ ์•”์‹œ์  ๋ช…๋ชฉ ํ•˜์œ„ ์œ ํ˜• ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

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

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

@๋ฉ”๋กœ๋น„์šฐ์Šค
๋‚˜๋Š” ๋‹น์‹ ์ด ๋‚˜๋ณด๋‹ค ๋” ์œ ๋Šฅํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์ด๊ณ  ๋”ฐ๋ผ์„œ ๋” ๋ณต์žกํ•œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ™•์‹คํžˆ ๋‹น์‹ ์ด ๋œ ํฅ๋ฏธ๋กญ๊ฑฐ๋‚˜ ๋œ ๋ณต์žกํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž‘์—…ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋ณด๊ฒŒ ๋œ ๊ฒƒ์— ๋Œ€ํ•ด ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์–ด์ œ ์Šค์บ๋„ˆ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ํฅ๋ฏธ๋กญ์ง€ ์•Š์€ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

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

๋‚ด๊ฐ€ ์„ ์˜๋กœ ํ–‰๋™ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ํ™•์‹ ์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ˆจ๊ฒจ์ง„ ์˜์ œ๊ฐ€ ์—†์œผ๋ฉฐ Go๊ฐ€ ์ œ๋„ค๋ฆญ์„ ์ฑ„ํƒํ•˜์ง€ ์•Š๋”๋ผ๋„ ๊ณ„์† ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜๊ฒฌ์ด ์žˆ์ง€๋งŒ ์œ ์ผํ•œ ์˜๊ฒฌ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ œ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์ด์•ผ๊ธฐํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋•๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์ผ๋“ค์ด ์žˆ์œผ๋ฏ€๋กœ ๋ง์”€๋งŒ ํ•˜์‹œ๋ฉด ๋‹ค๋ฅธ ๊ณณ์— ๋‹ค์‹œ ์ง‘์ค‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Merovius ๊ณ„์†๋˜๋Š” ๋Œ€ํ™”์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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

์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์„ ๋งค์šฐ ๋‹ค๋ฅด๊ฒŒ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ๋ชฉ๋ก ์˜ˆ์ œ์—๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ ๋ž˜ํ•‘์ด ์—†์œผ๋ฏ€๋กœ ์ฃผ์–ด์ง„ ์œ ํ˜•์— ๋Œ€ํ•ด ์†์œผ๋กœ ์“ด ๊ฒƒ์ฒ˜๋Ÿผ ์„ฑ๋Šฅ์ด ์ข‹์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ์•ˆ์ „ ์ธก๋ฉด์—์„œ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

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

๋‚˜๋Š” ์‚ฌ์‹ค ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ „ํ˜€ ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ธฐ๋Šฅ์˜ ์–‘์ด ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์„ ๊ฒƒ์ด๋ผ๊ณ ๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ๋ฐ˜๋ก€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๋ถˆํ‰ํ•˜๋Š” API๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” API๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๊ธฐ์— ์žˆ๋Š” ์›๋ž˜ API์˜€์Šต๋‹ˆ๋‹ค. https://golang.org/pkg/sort/#Interface ๋‹น์‹ ์˜ ์Šฌ๋ผ์ด์Šค + ์œ ํ˜•, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์— 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ด€๋ จ๋œ ๋ถˆ๋งŒ๊ณผ ๊ณ ํ†ต์„ ๊ณ ๋ คํ•˜์—ฌ ๋‹ค์Œ์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://golang.org/pkg/sort/#Slice , ์ €๋Š” ์ด API์— ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉฐ ์ด์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ณต๊ตฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ์•ˆ์— ๋”ฐ๋ผ ์ •์˜๋ฅผ func Slice(slice []a, less func(a, a) bool) ๋กœ ๊ฐ„๋‹จํžˆ ๋ณ€๊ฒฝํ•˜์—ฌ ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

container/heap ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ๊ด€๋ จํ•˜์—ฌ ์ „์ฒด ์žฌ์ž‘์„ฑ์ด ํ•„์š”ํ•œ ์ผ๋ฐ˜ ์ œ์•ˆ์ด ๋ฌด์—‡์ด๋“  ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค. container/heap sort ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์œ„์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๋‘ ํŒจํ‚ค์ง€ ๋ชจ๋‘ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์†Œ์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด []interface{} ๊ฐ€ ์žˆ๊ณ  ๊ทธ์™€ ๊ด€๋ จ๋œ ๋น„์šฉ. ์•„๋งˆ๋„ ์ œ๋„ค๋ฆญ ๋•๋ถ„์— ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์˜ ์Šฌ๋ผ์ด์Šค๋ฅผ ์†Œ์œ ํ•˜๋Š” Heap ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๋ณ€๊ฒฝํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

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

๋‹ค์Œ ํ•ด์‹œ ํ…Œ์ด๋ธ” ์ •์˜๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

// Hasher turns a key into a hash
type Hasher interface {
  func Hash() []byte
}

type HashTable v struct {
   Keys   []Hasher
   Values []v
}

// Note that the generic arguments must be repeated here and immediately
// understood without reading another line of code, which to me
// is a readability win over the sudden appearance of the K and V which are
// defined elsewhere in the code in the example below. This is of course because
// the tokenized type declarations with constraints are fairly painful in general
// and repeating them everywhere is simply too much.
func (h (*HashTable v)) Insert(key Hasher, value v) { ... }

์„ฑ๋Šฅ/์Šคํ† ๋ฆฌ์ง€ ๋ฌธ์ œ๋กœ ์ธํ•ด []Hasher ๊ฐ€ ๋น„์Šคํƒ€ํ„ฐ์ด๊ณ  Go์—์„œ ์„ฑ๊ณต์ ์ธ Generics ๊ตฌํ˜„์„ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ง์”€์ด์‹ ๊ฐ€์š”?

// Without selecting another proposal I have no idea how the constraint might be defined or implemented so let's just pretend
type [K: Hasher, V] HashTable a struct {
   Keys   []K
   Values []V
}

func (h *HashTable) Insert(key K, value V) { ... }

๋‚ด๊ฐ€ ์–ด๋””์—์„œ ์™”๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠน์ • ์ฝ”๋“œ์— ๋ถ€๊ณผํ•˜๋ ค๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋ฌด์—‡์ด๋ฉฐ ์ œ์•ˆ์ด ์–ด๋–ป๊ฒŒ ์‹คํŒจํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ดํ•ด์— ๋„๋‹ฌํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

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

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

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ท€ํ•˜์˜ ์ œ์•ˆ(์›๋ž˜ ์ž‘์„ฑ๋œ ๋Œ€๋กœ)์€ ์‹ค์ œ๋กœ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ผ๋ฐ˜ ๋งต ์ž‘์„ฑ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด == ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์†Œํ•œ ํ‚ค๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ง€๋„์—๋Š” ์ œํ•œ๋œ ๋‹คํ˜•์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค).

์ด ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ด€๋ จ๋œ ๋ถˆ๋งŒ๊ณผ ๊ณ ํ†ต์— ๋น„์ถ”์–ด ๋‹ค์Œ์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://golang.org/pkg/sort/#Slice

์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธธ์ด์™€ ์Šค์™€ํ•‘์— ๋Œ€ํ•œ ๋ฆฌํ”Œ๋ ‰์…˜์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋„ค๋ฆญ ์ œ์•ˆ์—์„œ ์—ฌ์ „ํžˆ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ๋‹ค์‹œ ์Šฌ๋ผ์ด์Šค ์ž‘์—…์— ์ œ์•ฝ์ด ์žˆ์Œ). ๊ทธ API๋ฅผ ์ œ๋„ค๋ฆญ์ด ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์˜ ํ•˜ํ•œ์„ ์œผ๋กœ ๋ฐ›์•„๋“ค์ธ๋‹ค ํ•ด๋„(๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น API์˜ ํ˜•์‹ ์•ˆ์ „์„ฑ ๋ถ€์กฑ์— ๋Œ€ํ•œ ๋ถˆ๋งŒ์ด ์—ฌ์ „ํžˆ ๋งŽ์Šต๋‹ˆ๋‹ค), ๊ท€ํ•˜์˜ ์ œ์•ˆ์€ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋ฐ”.

๊ทธ๋Ÿฌ๋‚˜ ๋˜ํ•œ, ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋‹น์‹ ์€ ๋‹น์‹ ์ด ๋งŒ๋“  ํŠน์ • ์š”์ ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ธ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, API์—์„œ ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์„ ์ „๋‹ฌํ•˜์—ฌ ์ œํ•œ๋œ ๋‹คํ˜•์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ์•ฝ๋œ ๋‹คํ˜•์„ฑ์ด ์—†๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ์•ˆํ•œ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์€ ๋‹ค์†Œ ์˜ค๋ž˜๋œ API๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‹น์‹ ์€ ์ด ์ฃผ์žฅ์— ๋Œ€ํ•œ ๋‚ด ๋Œ€๋‹ต์„ ์ธ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ •์˜๋ฅผ func Slice(slice []a, less func(a, a) bool)๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋…ผ์˜ ์ค‘์ธ ์ œ์•ˆ์—์„œ ์ด์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ณต๊ตฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์˜ค๋ž˜๋œ API์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ "์ œ ์ œ์•ˆ์€ ์ œํ•œ๋œ ๋‹คํ˜•์„ฑ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  ๋Œ€์‹  ๊ธฐ์กด ์†”๋ฃจ์…˜(๋ฐ˜์‚ฌ/์ธํ„ฐํŽ˜์ด์Šค)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ธ€์Ž„, "๋‹น์‹ ์˜ ์ œ์•ˆ์€ ์‚ฌ๋žŒ๋“ค์ด ์ œ๋„ค๋ฆญ์„ ์›ํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"์— "์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์ œ๋„ค๋ฆญ ์—†์ด ํ•˜๊ณ  ์žˆ๋Š” ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"์— ์‘๋‹ตํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋””๋“ ์ง€, TBH. ๊ธฐ๋ณธ์ ์ธ ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•, sort, maxโ€ฆ ์ž‘์„ฑ์—๋„ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ์ œ๋„ค๋ฆญ ์ œ์•ˆ์€ ๊ฐ€์น˜๊ฐ€ ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์—์„œ ๋ณธ ๋ชจ๋“  ์ œ์•ˆ(๋‚ด ์ œ์•ˆ ํฌํ•จ)์—์„œ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์ œ๋„ค๋ฆญ ์ œ์•ˆ์—๋Š” ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, "์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” Less ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•จ" ๋˜๋Š” "์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋น„๊ต ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ"์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ AFAICT๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํ•ด์‹œ ํ…Œ์ด๋ธ” ์ •์˜๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๊ท€ํ•˜์˜ ์ •์˜๊ฐ€ ๋ถˆ์™„์ „ํ•ฉ๋‹ˆ๋‹ค. a) ํ‚ค ์œ ํ˜•๋„ ๋™์ผํ•ด์•ผ ํ•˜๊ณ  b) ๋‹ค๋ฅธ ํ‚ค ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด๊ฒƒ์€ ํ•ฉ๋ฒ•์ ์ž…๋‹ˆ๋‹ค.

type hasherA uint64

func (a hasherA) Hash() []byte {
    b := make([]byte, 8)
    binary.BigEndian.PutUint64(b, uint64(a))
    return b
}

type hasherB string

func (b hasherB) Hash() []byte {
    return []byte(b)
}

h := new(HashTable int)
h.Insert(hasherA(42), 1)
h.Insert(hasherB("Hello world"), 2)

๋‹ค๋ฅธ ํ‚ค ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ•ฉ๋ฒ•์ ์ด์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ปจํ…Œ์ด๋„ˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜๋Š” ์ •๋„๋กœ ์œ ํ˜• ๊ฒ€์‚ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‚ค ์œ ํ˜•๊ณผ ๊ฐ’ ์œ ํ˜• ๋ชจ๋‘ ์— ๋Œ€ํ•ด ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

type HashTable k v struct {
    Keys []k
    Values []v
}

func (h *(HashTable k v)) Insert(key k, value v) {
    // You can't actually do anything with k, as it's unconstrained. i.e. you can't hash it, compare itโ€ฆ
    // Implementing this is impossible in your proposal.
}

// If it weren't impossible, you'd get this:
h := new(HashTable hasherA int)
h[hasherA(42)] = 1
h[hasherB("Hello world")] = 2 // compile error - can't use hasherB as hasherA

๋˜๋Š” ๋„์›€์ด ๋œ๋‹ค๋ฉด ํ•ด์‹œ ์„ธํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ์ด์ œ ๊ฒฐ๊ณผ ์ปจํ…Œ์ด๋„ˆ์—๋Š” interface{} ์ด์ƒ์˜ ์ถ”๊ฐ€ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค .

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

Go์—์„œ ์„ฑ๊ณต์ ์ธ Generics ๊ตฌํ˜„์„ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

@๋ฉ”๋กœ๋น„์šฐ์Šค ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹  ์ด ์›ํ•˜๋Š” ๊ฒƒ์„ ์ดํ•ดํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค. ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์†Œ์ˆ˜์˜ ์˜๊ฒฌ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‚˜๋Š” ์œ ํ˜• ์•ˆ์ „ ์šฉ๊ธฐ์— ๋Œ€ํ•ด ์ •๋ง๋กœ ๊ฐ€๋ ค์›Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณด๊ณ  ์‹ถ์€ ๊ฐ€์žฅ ํฐ ๊ฒƒ ์ค‘ ๋ช‡ ๊ฐ€์ง€๋Š” ์˜ค๋ฅ˜ ๋Œ€์‹  ๊ฒฐ๊ณผ ์œ ํ˜•๊ณผ ๋‚ด ์ œ์•ˆ์ด ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ฉ๋ฆฌ์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ๋ณต์ œ ๋˜๋Š” ๋ฐ˜์˜ ์—†์ด ์‰ฌ์šด ์Šฌ๋ผ์ด์Šค ์กฐ์ž‘์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ "๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”" ๊ด€์ ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธธ์ด์™€ ์Šค์™€ํ•‘์— ๋Œ€ํ•œ ๋ฆฌํ”Œ๋ ‰์…˜์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋„ค๋ฆญ ์ œ์•ˆ์—์„œ ์—ฌ์ „ํžˆ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ๋‹ค์‹œ ์Šฌ๋ผ์ด์Šค ์ž‘์—…์— ์ œ์•ฝ์ด ์žˆ์Œ). ๊ทธ API๋ฅผ ์ œ๋„ค๋ฆญ์ด ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์˜ ํ•˜ํ•œ์„ ์œผ๋กœ ๋ฐ›์•„๋“ค์ธ๋‹ค ํ•ด๋„(๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น API์˜ ํ˜•์‹ ์•ˆ์ „์„ฑ ๋ถ€์กฑ์— ๋Œ€ํ•œ ๋ถˆ๋งŒ์ด ์—ฌ์ „ํžˆ ๋งŽ์Šต๋‹ˆ๋‹ค), ๊ท€ํ•˜์˜ ์ œ์•ˆ์€ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋ฐ”.

์ด๊ฒƒ์„ ์ฝ์œผ๋ฉด ์ผ๋ฐ˜ ์Šฌ๋ผ์ด์Šค๊ฐ€ ์ด ์ œ์•ˆ์— ๋”ฐ๋ผ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์™„์ „ํžˆ ์˜คํ•ดํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜คํ•ด๋ฅผ ํ†ตํ•ด "์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์—ฌ์ „ํžˆ ๊ท€ํ•˜์˜ ์ œ์•ˆ์—์„œ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ์ž˜๋ชป๋œ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ œ์•ˆ์—์„œ๋„ ์ผ๋ฐ˜์ ์ธ ์Šฌ๋ผ์ด์Šค๊ฐ€ ๊ฐ€๋Šฅ ํ•ด์•ผ ํ•˜๋ฉฐ ์ด๊ฒƒ์ด ์ œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  len() ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค. func len(slice []a) ์ด๊ฒƒ์€ ๋ชจ๋“  ์Šฌ๋ผ์ด์Šค์— ๋Œ€ํ•ด ๋น„๋ฐ˜์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋Š” ์ผ๋ฐ˜ ์Šฌ๋ผ์ด์Šค ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ด ์ œ์•ˆ์˜ ๋งŽ์€ ์š”์ ์ž…๋‹ˆ๋‹ค(์‰ฌ์šด ์Šฌ๋ผ์ด์Šค ์กฐ์ž‘). ๊ทธ๋ฆฌ๊ณ  ์ œ๊ฐ€ ์ œ์‹œํ•œ ์˜ˆ์ œ์™€ ์ œ๊ฐ€ ๋งŒ๋“  ์š”์ ์„ ํ†ตํ•ด ์ž˜ ์ „๋‹ฌํ•˜์ง€ ๋ชปํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์Šฌ๋ผ์ด์Šค๋Š” ์˜ค๋Š˜๋‚  []int ๋งŒํผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์ œ์•ˆ(์Šฌ๋ผ์ด์Šค/๋ฐฐ์—ด ๊ตํ™˜, ํ• ๋‹น, len, cap ๋“ฑ)์— ๋Œ€ํ•ด ๋‹ค์‹œ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ) ์ œ ์ƒ๊ฐ์—๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

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

๊ฐ€์žฅ ์ข‹์€ ๋ฐ˜๋ก€๋Š” ์•ž์„œ ๋…ผ์˜ํ•œ ์ •๋ ฌ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

type Sort(slice []a:Lesser, less func(a:Lesser, a:Lesser)) { ... }

๋ณด์‹œ๋‹ค์‹œํ”ผ ์ด๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์—†์œผ๋ฉฐ Generics์— ๋Œ€ํ•œ ํ† ํฐ ์ŠคํŒธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‹ค์‹œ ์ข‹์•„์ง€๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ œ์•ฝ์„ ์ •์˜ํ•˜๋ ค๋ฉด ์›๋ž˜ ์ œ์•ˆ์—์„œ ๋‘ ๊ฐ€์ง€๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๋ฉด์ฑ… ์กฐํ•ญ: ๋‹ค์Œ์€ ์ œ์•ˆ์— ๋Œ€ํ•œ ์‹ค์ œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ €๋Š” ๊ทธ๋ƒฅ ๋ฌด์ž‘์œ„ ๊ธฐํ˜ธ๋ฅผ ๋˜์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์„ ์˜ˆ์ œ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์›๋ž˜ ๊ทธ๋Œ€๋กœ์˜ ์ œ์•ˆ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์„ ์„ค๋ช…ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

// Decorator style, follows the definition of the type thorugh all
// of it's methods.
<strong i="14">@a</strong>: Lesser, Hasher, Equaler
func Sort(slice []a) { ... }
<strong i="15">@k</strong>: Equaler, Hasher
type HashTable k v struct

// Inline, follows the definition of the type through
// all of it's methods.
func [a: Hasher, Equaler] Sort(slice []a) { ... }
type [k: Hasher, Equaler] HashTable k v struct

// File-scope global style, if k appears as a generic argument
// it's constrained by this that appears at the top of the file underneath
// the imports but before any other code.
<strong i="16">@k</strong>: Equaler, Hasher

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

๊ทธ๋Ÿฐ ๋‹ค์Œ ์šฐ๋ฆฌ๊ฐ€ ๋Œ€๋‹ตํ•ด์•ผ ํ•˜๋Š” ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•”์‹œ์  ์ผ๋ฐ˜ ์ธ์ˆ˜์—์„œ ์—ฌ์ „ํžˆ ๊ฐ€์น˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ์•ˆ์˜ ์š”์ ์€ ์–ธ์–ด์˜ ๊นจ๋—ํ•œ Go-like ๋Š๋‚Œ์„ ์œ ์ง€ํ•˜๊ณ , ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ , ๊ณผ๋„ํ•œ ํ† ํฐ์„ ์ œ๊ฑฐํ•˜์—ฌ ์ถฉ๋ถ„ํžˆ ๋‚ฎ์€ ์†Œ์Œ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด map ํ•จ์ˆ˜๋‚˜ Result ์œ ํ˜•์˜ ์ •์˜์™€ ๊ฐ™์ด ์ œ์•ฝ ์กฐ๊ฑด์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋งŽ์€ ๊ฒฝ์šฐ์— ๋ณด๊ธฐ์— ์ข‹๊ณ  Go์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๋‚˜์š”? ์œ ์šฉํ•œ๊ฐ€์š”? ์ œ์•ฝ ์กฐ๊ฑด์ด ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

func map(slice []a, mapper func(a) b) {
  for i := range slice {
    slice[i] = mapper(slice[i])
  }
}

type Result a b struct {
  Ok  a
  Err b
}

@aarondl ์„ค๋ช…์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ˜•์‹ ์ œ์•ฝ ์กฐ๊ฑด์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ํ˜•์‹์— ๋Œ€ํ•œ ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ œ์•ฝ์ด ์—†๋Š” ์œ ํ˜• a ์ด๊ฒƒ์ด ์–ด๋–ค ์œ ํ˜•์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋ฌธ์ž์—ด์ด๋‚˜ Int ๋˜๋Š” ๋ฌด์—‡์ด๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ ํ˜•์„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ์ „ํ™˜ ๋ฐ ๋Ÿฐํƒ€์ž„ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜•์„ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ ํ•ด๋‹น ์œ ํ˜•์— ๋Œ€ํ•ด ์ผ๋ถ€ ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์ œ๋„ค๋ฆญ์—์„œ ํ”ผํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด a is an Animal ๊ณผ ๊ฐ™์€ ์œ ํ˜•์„ ์ œํ•œํ•˜๋ฉด a ์—์„œ ๋™๋ฌผ์— ๋Œ€ํ•ด ์ •์˜๋œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ์—์„œ๋Š” ๋งคํผ ํ•จ์ˆ˜๋ฅผ โ€‹โ€‹์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ํ•จ์ˆ˜๊ฐ€ ๋งŽ์€ ์ธ์ˆ˜๋ฅผ ์ทจํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†๊ณ  ์ผ๊ธ‰ ํ•จ์ˆ˜๋งŒ ์žˆ๋Š” ์–ธ์–ด์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. a ์œ ํ˜•์— ์‚ฌ์šฉํ•  ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋ฉด ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋งค์šฐ ๊ธด ํ•จ์ˆ˜ ๋ชฉ๋ก์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ข…์†์„ฑ ์ฃผ์ž…์„ ์œ„ํ•œ ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ์ฃผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ, ์ปคํ”Œ๋ง์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด map์„ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋„ ์ œ๋„ค๋ฆญ์ด๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ œ๋„ค๋ฆญ์ด๋ฉด ์–ด๋–ป์Šต๋‹ˆ๊นŒ? a ์œ ํ˜•์„ ์•„์ง ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ ๋งคํผ๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•ฉ๋‹ˆ๊นŒ?

func m(slice []a) []b {
   mapper := func(x a) b {...}
   return map(slice, mapper)
}

mapper ๋ฅผ ์ •์˜ํ•˜๋ ค๊ณ  ํ•  ๋•Œ x ์—์„œ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@keean ์ œ์•ฝ ์กฐ๊ฑด์˜ ๋ชฉ์ ๊ณผ ๊ธฐ๋Šฅ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ์ผ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์กฐ์ฒด(๋งํ•˜์ž๋ฉด ์ผ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹˜) ๋ฐ ์ผ๋ฐ˜ ์Šฌ๋ผ์ด์Šค์™€ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ๊ฒƒ๋งŒํผ ๋†’์ด ํ‰๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์›๋ž˜ ์ œ์•ˆ์— ํฌํ•จํ•˜์ง€๋„ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ„์น˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ๋‹ต์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์ œ๋„ค๋ฆญ์— ์ ํ•ฉํ•œ ์žฅ์†Œ๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ œ๊ฐ€ ๋ˆ„๊ตฌ๋ฅผ ๋งํ•ด์•ผ ํ• ๊นŒ์š”? ๋‚ด ๋ˆˆ์—๋Š” ๊ทธ๋“ค์˜ ์ฑ…์ž„ ๊ฐ„์˜ ์ค‘์ฒฉ์ด ์ƒ๋‹นํžˆ ์ปค์„œ @Merovius ์™€ ๋‚ด๊ฐ€ ๊ทธ๋“ค ์—†์ด ์‚ด ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ๋…ผ์˜ํ•ด์•ผ ํ–ˆ๋˜ ์ด์œ ๋Š” ๊ทธ๊ฐ€ ์ผ๋ถ€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜๊ฒŒ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›๋ž˜ ๋งŒ๋“  ์ œ์•ˆ์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์„ ์กฐ๊ธˆ ํƒ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ์™€ ๊ฐ™์ด x์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์ž์ฒด๋กœ ๋งค์šฐ ์œ ์šฉํ•œ ๋‹ค๋ฅธ ์Šฌ๋ผ์ด์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šฌ๋ผ์ด์Šค์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ func ๋‚ด๋ถ€์˜ func๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค... ์•„๋งˆ๋„ var์— ํ• ๋‹นํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๊นŒ?

@์•„๋ก ๋“ค
๋•๋ถ„์— ๊ตฌ๋ฌธ์„ ์ˆ˜์ •ํ–ˆ์ง€๋งŒ ์˜๋ฏธ๋Š” ์—ฌ์ „ํžˆ ๋ช…ํ™•ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์œ„์—์„œ ์ œ์‹œํ•œ ์˜ˆ์ œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹คํ˜•์„ฑ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋Š ์ •๋„์˜ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ˆ˜์ค€์„ ๋‹ฌ์„ฑํ–ˆ์ง€๋งŒ ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜์˜ ๋ถ€์กฑ์€ ํ•ญ์ƒ ๋‹ฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์ผ๋ฐ˜์„ฑ ์ˆ˜์ค€์— ์ƒํ•œ์„ ์„ ๋‘ก๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Go๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์–ธ์–ด๋กœ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ์ผ๋ถ€ ์ž‘์—…์— Go๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ €๋Š” ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ด๋ฉฐ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํ•˜๋‚˜์˜ ์ •์˜๋งŒ ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ž˜๋ผ๋‚ด์–ด ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ถ™์—ฌ๋„ฃ์€ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์–ธ์–ด์— ํฐ ๋ณ€ํ™” ์—†์ด ๊ฐ€๋Šฅํ•œ ์ œํ•œ๋œ ๋ณดํŽธ์„ฑ์ด ์ถ”๊ฐ€๋  ๋ณต์žก์„ฑ์„ ๊ณ ๋ คํ•  ๋•Œ ์ข‹์€ ์ƒ๊ฐ์ธ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ๋‘ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ Go๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์ „ ์ฒ˜๋ฆฌ ๋˜๋Š” Go๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๊ฐ™์€ ๋งคํฌ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐ˜๋ฉด์— ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹คํ˜•์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ด€๋ จ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ  ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜ ์—†์ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๋” ์ž‘์€ ๊ธฐ๋Šฅ์œผ๋กœ ๋ถ„ํ• ํ•˜๋ฉด ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์Šน์ธ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

@keean
๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜๊ฐ€ ๊ผญ ํ•„์š”ํ•œ๊ฐ€์š”? ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ์–ธ์–ด๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. C++์—์„œ๋„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C#์€ dynamic ๋ฅผ ํ†ตํ•ด ๊ทธ๊ฒƒ์„ ์ง€์›ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•œ ์ ์ด ์—†์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ‚ค์›Œ๋“œ๋Š” ์‹ค์ œ ์ฝ”๋“œ์—์„œ ๋งค์šฐ ๋“œ๋ญ…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ์˜ˆ๋Š” ์ œ๋„ค๋ฆญ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  JSON ๊ตฌ๋ฌธ ๋ถ„์„๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜๊ฐ€ ๊ผญ ํ•„์š”ํ•œ๊ฐ€์š”?

IMHO, @keean์€ typeclasses /์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ •์  ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ†ตํ•ด C++์—์„œ๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค(C#์€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค).

๋‹น์‹ ์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ๊ณต์šฉ์ฒด ์œ ํ˜•์ด ์—†๋Š” ์ •์  ์–ธ์–ด์—์„œ ์ƒ๋‹นํžˆ ๋ฒˆ๊ฑฐ๋กœ์šด ๋™์  ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜์ž…๋‹ˆ๋‹ค. ๋™์  ์–ธ์–ด๋Š” ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ(๋™์  ์–ธ์–ด์— ๋Œ€ํ•œ ๋ถ€๋ถ„ ์œ ํ˜• ์ถ”๋ก , C#์˜ "๋™์ " ์œ ํ˜•์— ๋Œ€ํ•ด ๋™์ผ)๋ฅผ ์ƒ๋žตํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜•์„ "๋‹จ์ง€" ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

func Append(t, t2 type, arr []t, value t2) []t {
    v := t(value) // conversion
    return append(arr, v)
}

var arr []float64
v := 0

arr = Append(float64, int, arr, v)

@Inuart ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์œ ํ˜•์„ "๋‹จ์ง€" ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์–ด๋Š ์ •๋„ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์›ํ•˜๋Š”์ง€ ์˜๋ฌธ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ์ง€์›๋˜๋Š” ๊ฒฝ์šฐ ์›ํ•˜๋Š” ๊ฒƒ์„ ๋Œ€์‹  ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func Append(arr []t, value s) []t  requires Convertible<s,t>{
    v := t(value) // conversion
    return append(arr, v)
}

var arr []int64
v := 0.5

arr = Append(arr, v)

๋˜ํ•œ ์ด๊ฒƒ์€ ์ œ์•ฝ ์กฐ๊ฑด์—์„œ๋„ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

func convert(value s) t requires Convertible<s,t>{
    return t(value);
}

f:float64:=2.0

i:int64=convert(f)

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Genus ์–ธ์–ด๋Š” ๋‹ค์ค‘ ๋ฐœ์†ก์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋ชจ๋ธ์€ ๋””์ŠคํŒจ์น˜๋˜๋Š” ์—ฌ๋Ÿฌ ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์•ˆ์ „์„ ์œ„ํ•ด Convertible<s,t> ํ‘œ๊ธฐ๋ฒ•์ด ํ•„์š”ํ•˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋กœ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Œ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

func Append(t, t2 type, arr []t, value t2) []t {
    v, ok := t(value) // conversion
    if !ok {
        panic(...) // or return an err
    }
    return append(arr, v)
}

var arr []float64
v := 0

arr = Append(float64, int, arr, v)

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ reflect ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

@Inuart ์š”์ ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ ์€ ๋” ๋‚˜์€ ์„ฑ๋Šฅ(์ด๋ฅธ๋ฐ” ์ œ๋กœ ๋น„์šฉ ์ถ”์ƒํ™”)์ž…๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ์ธ ๊ฒฝ์šฐ reflect ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@ํฌ๋ ˆ์ปค

๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜๊ฐ€ ๊ผญ ํ•„์š”ํ•œ๊ฐ€์š”?

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋งˆ์Œ์— ๋“ ๋‹ค. ํ•œํŽธ์œผ๋กœ ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜(๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜• ํด๋ž˜์Šค ํฌํ•จ)๋Š” 'Go'๊ฐ€ '์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’'์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์‹ค์กด ํ•ญ๋ชฉ๊ณผ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

type Equals<T> interface {eq(right T) bool}
(left I) eq(right I) bool {return left == right}
(left I) eq(right F) bool {return false}
(left F) eq(right I) bool {return false}
(left F) eq(right F) bool {return left == right}

func main() {
    x := []Equals<?>{I{2}, F{4.0}, I{2}, F{4.0}}
}

์˜ค๋ฅธ์ชฝ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋™์ผํ•œ ์ปฌ๋ ‰์…˜์— ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ผ ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— Equals ์กฐ๊ฐ์„ ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Haskell์—์„œ๋Š” ์ด ์ž‘์—…์กฐ์ฐจ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

data Equals = forall a . IEquals a a => Equals a

์ด๊ฒƒ์€ ์œ ํ˜•์ด ์ž์‹ ๊ณผ๋งŒ ๋น„๊ต๋  ์ˆ˜ โ€‹โ€‹์žˆ๋„๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

data Equals = forall a b . IEquals a b => Equals a

b ๊ฐ€ a ์™€ ๊ฐ™์€ ์ปฌ๋ ‰์…˜์˜ ๋˜ ๋‹ค๋ฅธ ์กด์žฌ๊ฐ€ ๋˜๋„๋ก ์ œํ•œํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค( a ๊ฐ€ ์ปฌ๋ ‰์…˜์— ์žˆ๋Š” ๊ฒฝ์šฐ).

๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ๋กœ์šด ์œ ํ˜•์œผ๋กœ ํ™•์žฅํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

(left K) eq(right I) bool {return false}
(left K) eq(right F) bool {return false}
(left I) eq(right K) bool {return false}
(left F) eq(right K) bool {return false}
(left K) eq(right K) bool {return left == right}

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๊ธฐ๋ณธ ์ธ์Šคํ„ด์Šค๋‚˜ ์ „๋ฌธํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋” ๊ฐ„๊ฒฐํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๋ฐ”๋กœ ์ง€๊ธˆ ์ž‘๋™ํ•˜๋Š” 'Go'๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package main

type I struct {v int}
type F struct {v float32}

type EqualsInt interface {eqInt(left I) bool}
func (right I) eqInt (left I) bool {return left == right}
func (right F) eqInt (left I) bool {return false}

type EqualsFloat interface {eqFloat(left F) bool}
func (right I) eqFloat (left F) bool {return false}
func (right F) eqFloat (left F) bool {return left == right}

type EqualsRight interface {
    EqualsInt
    EqualsFloat
}

type EqualsLeft interface {eq(right EqualsRight) bool}
func (left I) eq (right EqualsRight) bool {return right.eqInt(left)}
func (left F) eq (right EqualsRight) bool {return right.eqFloat(left)}

type Equals interface {
    EqualsLeft
    EqualsRight
}

func main() {
    x := []Equals{I{2}, F{4.0}, I{2}, F{4.0}}
    println(x[0].eq(x[1]))
    println(x[1].eq(x[0]))
    println(x[0].eq(x[2]))
    println(x[1].eq(x[3]))
}

์ด๊ฒƒ์€ ์‹ค์กด์ (์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’)๊ณผ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ, ํ›จ์”ฌ ๋” ๋ณต์žกํ•˜๊ณ  ์ง„ํ–‰ ์ƒํ™ฉ๊ณผ ์ž‘๋™ ๋ฐฉ์‹์„ ๋ณด๊ธฐ๊ฐ€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์œ ํ˜•๋‹น ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ•˜๊ณ  ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ํ•˜๋“œ ์ฝ”๋”ฉ์„ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ํฐ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅธ์ชฝ ์œ ํ˜•:

type EqualsRight interface {
    EqualsInt
    EqualsFloat
}

์ฆ‰, EqualsRight ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ™•์žฅํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†์œผ๋ฉด ๊ฐ™์Œ๊ณผ ๊ฐ™์€ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์กด์žฌ(์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’)๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ ๋งŽ์€ ๊ตฌ๋ฌธ(๊ตฌ๋ฌธ?) Blah[E] ์— ๋Œ€ํ•œ ๋‚˜์˜ ์ฃผ์š” ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ ์œ ํ˜•์ด ์ œ๋„ค๋ฆญ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

type Comparer[C] interface {
    Compare(other C) bool
}
// or
type Comparer c interface {
    Compare(other c) bool
}
...

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ ์œ ํ˜•์— ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ƒˆ๋กœ์šด ์œ ํ˜•์„ ์„ ์–ธํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. type ์„ ์–ธ์˜ ์š”์ง€๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์— ๋”ฐ๋ผ ์ด๋ฆ„์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€์š”?

๋‚˜๋Š” ๋” ๋งŽ์€ ๋ผ์ธ์„ ๋”ฐ๋ผ ๊ตฌ๋ฌธ์„ ์ œ์•ˆ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

type Comparer interface[C] {
    Compare(other C) bool
}

์ฆ‰, ์‹ค์ œ๋กœ Comparer ๋Š” interface[C] { ... } ๊ธฐ๋ฐ˜์˜ ์œ ํ˜•์ด๊ณ  interface[C] { ... } ๋Š” ๋ฌผ๋ก  interface { ... } ๊ณผ ๋ณ„๊ฐœ์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ผ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ํ—ˆ์šฉ๋จ). ์ด ์†”๋ฃจ์…˜์ด ์ข€ ๋” ์ง๊ด€์ ์ด๊ณ  Go์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ œ๋„ค๋ฆญ ์œ ํ˜• ์„ ์–ธ์€ ๋‹ค์Œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค, ๊ตฌ์กฐ์ฒด ๋ฐ ํ•จ์ˆ˜์—์„œ๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
interface[G] { ... }
struct[G] { ... }
func[G] (vars...) { ... }

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ œ๋„ค๋ฆญ์„ "๊ตฌํ˜„"ํ•˜๋ฉด ๋‹ค์Œ ๊ตฌ๋ฌธ์ด ๋ฉ๋‹ˆ๋‹ค.
interface[G] { ... }[string]
struct[G] { ... }[string]
func[G] (vars...) { ... }[int](args...)

์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค

package add

type Adder interface[E] {
    // Adds the element and returns the size
    Add(elem E) int
}

// Adds the integer 5 to any implementation of Adder[int].
func AddFiveTo(a Adder[int]) int {
    return a.Add(5)
}

๊ตฌ์กฐ์ฒด

package heap

type List struct[T] {
    slice []T
}

func (l *List) Add(elem T) { // T is a type defined by the receiver
    l.slice = append(l.slice, elem)
}

๊ธฐ๋Šฅ

func[A] AddManyTo(a Adder[A], many ...A) {
    for _, each := range a {
        a.Add(each)
    }
}

์ด๊ฒƒ์€ Go2 ๊ณ„์•ฝ ์ดˆ์•ˆ์— ๋Œ€ํ•œ ์‘๋‹ต์ด๋ฉฐ ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹คํ˜•์„ฑ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ œ์•ˆ์— ์ ์šฉ๋˜๋ฏ€๋กœ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๊ณ ๋ คํ•˜๋‹ค

type X(type T C) struct {
  R // A regular type with method Foo()
  T // Some type parameter
}
// X defines some methods other than Foo(),
// some of which invoke Foo.

์ผ๋ถ€ ์ž„์˜ ์œ ํ˜• R ๋ฐ Foo() ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ์ž„์˜์˜ ๊ณ„์•ฝ C Foo() .

T ์—๋Š” C ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ์ง€๋งŒ T Foo ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ž„์˜์˜ ๋‹ค๋ฅธ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Bar ๊ฐ€ C ์—์„œ ํ—ˆ์šฉ๋˜๋Š” ๊ตฌ์กฐ์ฒด์ด๊ณ  Foo ๋ผ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

X(Bar) ๋Š” ๋ถˆ๋ฒ• ์ธ์Šคํ„ด์Šคํ™”์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜•์‹์— ์„ ํƒ๊ธฐ๊ฐ€ ์—†๋Š” ๊ณ„์•ฝ์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฉด ์ด๊ฒƒ์€ ์œ ์ถ”๋œ ์†์„ฑ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

X(Bar) Foo X(Bar).R.Foo ๋กœ ๊ณ„์† ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ œ๋„ค๋ฆญ ์œ ํ˜•์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ ํ•ด๊ฒฐ ๊ทœ์น™์˜ nitpickery์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๋…์ž์—๊ฒŒ ํ˜ผ๋™์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. X ์˜ ๋ฉ”์†Œ๋“œ ์™ธ๋ถ€์—์„œ ์„ ํƒ์ž๋Š” ๋ชจํ˜ธํ•œ ์ƒํƒœ๋กœ ์œ ์ง€๋˜์ง€๋งŒ interface { Foo() } ๋Š” X ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  X ์˜ ์ผ๋ถ€ ์ธ์Šคํ„ด์Šคํ™”๋Š” ๋งŒ์กฑํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํฌํ•จ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

(๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ํ—ˆ์šฉ๋œ๋‹ค๋ฉด type S = io.Reader ๋กœ ์ •์˜๋œ ์ž„๋ฒ ๋””๋“œ S ์˜ ํ•„๋“œ ์ด๋ฆ„์ด T S ์ธ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ํ•„๋“œ ์ด๋ฆ„์€ T๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. Reader ๊ฐ€ ์•„๋‹ˆ๋ผ T ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ์œ ํ˜•์ด ๋ฐ˜๋“œ์‹œ ์ด๋ฆ„์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)

@jimmyfrasche ์ œ๋„ค๋ฆญ ํƒ€์ž…์˜ ์ž„๋ฒ ๋””๋“œ ํ•„๋“œ๋Š” ์•ฝ๊ฐ„์˜ ์–ด์ƒ‰ํ•จ์ด ์žˆ๋”๋ผ๋„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์€ ๋ชจ๋“  ์ผ๋ฐ˜ ์ฝ”๋“œ์—์„œ ์ž„๋ฒ ๋””๋“œ ์œ ํ˜• ์ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆ˜์ค€์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜์—ฌ ์ผ๋ฐ˜ ์ฝ”๋“œ ๋‚ด์—์„œ ๋น„์ œ๋„ค๋ฆญ ์œ ํ˜•์˜ ๋ชจ๋“  ์ž„๋ฒ ๋””๋“œ ๋ฉ”์†Œ๋“œ์™€ ํ•„๋“œ๊ฐ€ ์ง€์›Œ์ง„๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ฃผ์–ด์ง„:

type R struct(type T) {
    io.Reader
    T
}

R์˜ ๋ฉ”์„œ๋“œ๋Š” Reader๋ฅผ ํ†ตํ•œ ๊ฐ„์ ‘ ์ง€์ • ์—†์ด R์—์„œ ์ฝ๊ธฐ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

func (r R) Do() {
     r.Read(buf)     // Illegal
     r.Reader.Read(buf)  // ok
}

๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋‹จ์ ์€ ๋™์  ์œ ํ˜•์ด ์ •์  ์œ ํ˜•๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฉค๋ฒ„๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

func (r R) Do() {
    var x interface{} = r
    x.(io.Reader)    // Succeeds
}

@rogpeppe

๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋‹จ์ ์€ ๋™์  ์œ ํ˜•์ด ์ •์  ์œ ํ˜•๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฉค๋ฒ„๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

contract C(t T) {
  interface { Foo() } (X(T){})
  // ...
}

type X(type T C) struct {
  R // A regular type with method Foo()
  T // Some type parameter
}
// X defines some methods other than Foo(),
// some of which invoke Foo.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Foo X ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ "๊ณ„์•ฝ์— ๋กœ์ปฌ ์ด๋ฆ„ ์—†์Œ" ๊ทœ์น™์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค...

@stevenblenkinsop ํ , ์–ด์ƒ‰ํ•˜๋ฉด X ๋ฅผ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

contract C(t T) {
  struct{ R; T }{}.Foo
}

C ๋Š” ์•ฝ๊ฐ„ ๋” ๋Š์Šจํ•˜์ง€๋งŒ X ์˜ ๊ตฌํ˜„์— ์—ฌ์ „ํžˆ ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ณ  ๊ธ€์„ ์“ด๋‹ค๋ฉด

func (x X(T)) Fooer() interface { Foo() } {
  return x
}

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

๊ทธ๋ƒฅ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” Go2 ์ดˆ์•ˆ์ด ๋ฐœํ‘œ๋˜๊ธฐ ์ „์— ์ด ์ œ์•ˆ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ณต๊ณ ๋ฅผ ๋ณด์•˜์„ ๋•Œ ๊ธฐ๊บผ์ด ๋‚ด ๊ฒƒ์„ ์Šคํฌ๋žฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ดˆ์•ˆ์˜ ๋ณต์žก์„ฑ์ด ๋ถˆ์•ˆํ•ด์ ธ์„œ ๋‚ด ์ž‘์—…์„ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋œ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ํ›”์น  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๋น„ํŠธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ianlancetaylor ์˜ ์ดˆ๊ธฐ ์ œ์•ˆ ๊ตฌ๋ฌธ์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‹œ์ž‘ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ทผ๋ณธ์ ์ธ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. (type T ๋“ฑ์˜ ๊ตฌ๋ฌธ์ด๋‚˜ ์ด์— ์ƒ์‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜๋ฏธ๋ก ์— ๋Œ€ํ•œ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์ผ๋ถ€ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์œ„์น˜: https://gist.github.com/jimmyfrasche/656f3f47f2496e6b49e041cd8ac716e4

๊ทœ์น™์€ (1) ํ˜•์‹ ์ธ์ˆ˜์˜ ID๊ฐ€ ์•Œ๋ ค์ ธ ์žˆ์ง€ ์•Š๊ฑฐ๋‚˜ (2) ๋ฉ”์„œ๋“œ๊ฐ€ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅ๋˜์ง€ ์•Š๋Š” ํ•œ ํฌํ•จ๋œ ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฒƒ๋ณด๋‹ค ๋” ๊นŠ์€ ๊นŠ์ด์—์„œ ์Šน๊ฒฉ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๊ณ„์•ฝ์— ๋”ฐ๋ผ ์œ ํ˜•์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋˜ํ•œ ์™ธ๋ถ€ ์œ ํ˜• O ๋‚ด์—์„œ ์Šน๊ฒฉ๋œ ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ๊นŠ์ด์˜ ์ƒํ•œ ๋ฐ ํ•˜ํ•œ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ O ๋ฅผ ํฌํ•จํ•˜๋Š” ์œ ํ˜•์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ํ™๋ณด ๋ฐฉ๋ฒ•๊ณผ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€. ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅ๋˜๋Š” ๋ชจ๋“  ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜์—๋„ ์œ ์‚ฌํ•œ ๊ฒƒ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋‚ด ๋ฉ”์„œ๋“œ์˜ ๊นŠ์ด ๋ฒ”์œ„๋Š” [0, inf)์ž…๋‹ˆ๋‹ค.

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

๋˜ํ•œ ๊ณ„์•ฝ์„ ์ •์˜ํ•  ๋•Œ ์ž ์žฌ์ ์ธ ์šฉ๋„๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. *T ์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” T ์œ ํ˜•์˜ ๊ฐ’(ํฌ์ธํ„ฐ ์œ ํ˜•์ผ ์ˆ˜ ์žˆ์Œ)์„ ํ—ˆ์šฉํ•˜๊ณ  ํ•ด๋‹น ๊ฐ’์„ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ฉ”์†Œ๋“œ๊ฐ€ *T ์— ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐํŽ˜์ด์Šค์— T ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋„ฃ์„ ์ˆ˜๋Š” ์—†์œผ๋ฉฐ *T T ์ธํ„ฐํŽ˜์ด์Šค์— ๋„ฃ์„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. *T ์—๋Š” ๋นˆ ๋ฉ”์†Œ๋“œ ์„ธํŠธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ). ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ž˜ํผ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

type Wrapper(type T) { T }

๊ณ„์•ฝ์— ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋งŒ์กฑํ•œ๋‹ค๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์œผ๋ฉด ๋ชจ๋“  ๊ฒฝ์šฐ์— ์ธํ„ฐํŽ˜์ด์Šค์— *Wrapper(T) ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ํ•˜๋ฉด ์•ˆ๋˜๋‚˜์š”

type Interface interface {
  SomeMethod(int) error
}

contract MightBeAPointer(t T) {
  Interface(t)
}

func Example(type T MightBeAPointer)(v T) {
  var i Interface = v
  // ...
}

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ „ํ™”ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค

type S struct{}
func (s *S) SomeMethod(int) error { ... }
...
var s S
Example(S)(s)

S ๋Š” Interface ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๊ณ  *S ๋งŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋Œ€๋‹ต์€ "ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค"์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณ„์•ฝ ์ œ์•ˆ์„œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ„์•ฝ์ด ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

contract Contract(t T) {
    var _ error = t.SomeMethod(int(0))
}

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

์–ด์จŒ๋“  ์ด๊ฒƒ์€ ์ž„๋ฒ ๋”ฉ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ์ž ์žฌ์ ์ธ ์šฉ๋„๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์•ฝ๊ฐ„์˜ ์ ‘์„ ์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ์ž„๋ฒ ๋”ฉ, "๊ตฌ์กฐ์ฒด์— ์ž„๋ฒ ๋“œ ๊ฐ€๋Šฅ"์€ ํ—ˆ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ๊ณ„์•ฝ์ด ์บก์ฒ˜ํ•ด์•ผ ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ œํ•œ ์‚ฌํ•ญ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๋ คํ•˜๋‹ค:

contract Embeddable(type X, Y) {
    type S struct {
        X
        Y
    }
}

type Embedded(type First, Second Embeddable) struct {
        First
        Second
}

// Error: First and Second both provide method Read.
// That must be diagnosed to the Embeddable contract, not the definition of Embedded itself.
type Boom = Embedded(*bytes.Buffer, *strings.Reader)

๋ชจํ˜ธํ•œ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” @bcmills ์ž„๋ฒ ๋”ฉ ์œ ํ˜•์ด ํ—ˆ์šฉ๋˜๋ฏ€๋กœ ํ•ด๋‹น ๊ณ„์•ฝ์ด ์–ด๋–ป๊ฒŒ ํ•ด์„๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

๋ชจํ˜ธํ•œ ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ๋Š” @bcmills ์ž„๋ฒ ๋”ฉ ์œ ํ˜•์ด ํ—ˆ์šฉ๋˜๋ฏ€๋กœ ํ•ด๋‹น ๊ณ„์•ฝ์ด ์–ด๋–ป๊ฒŒ ํ•ด์„๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ , ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด ํ•˜๋‚˜ ๋” ์—†์Šต๋‹ˆ๋‹ค.ยน

contract Embeddable(type X, Y) {
    type S struct {
        X
        Y
    }
    var _ io.Reader = S{}
}

ยน https://play.golang.org/p/3wSg5aRjcQc

X ๋˜๋Š” Y ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ๋‘˜ ๋‹ค io.Reader ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ณ„์•ฝ ์‹œ์Šคํ…œ์ด ๊ทธ๊ฒƒ์„ ํ—ˆ์šฉํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ํ‘œํ˜„๋ ฅ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ง์Šน์— ๋Œ€ํ•œ ํ˜•์‹ ์œ ์ถ” ๊ทœ์น™์„ ์•Œ์•„๋‚ผ ํ•„์š”๊ฐ€ ์—†์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ •๋ง๋กœ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค

type S (type T C) struct {
  io.Reader
  T
}
func (s *S(T)) X() io.Reader {
  return s
}

C T ์— Read ์„ ํƒ๊ธฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ์— ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

struct{ io.Reader; T }.Read

๊ทธ๋Ÿฌ๋‚˜ C ๊ฐ€ ์„ ํƒ๊ธฐ ์„ธํŠธ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  S ๊ฐ€ ์„ ํƒ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ทœ์น™์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ชจํ˜ธํ•œ ์„ ํƒ๊ธฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์œ ํ˜•์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ์ธ์Šคํ„ด์Šคํ™” S ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ชจํ˜ธํ•œ ์„ ํƒ๊ธฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์œ ํ˜•์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ์ธ์Šคํ„ด์Šคํ™” S ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋„ค, ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋” ๊นŠ์€ ๋œป์ด ์žˆ๋Š” ๊ฑด ์•„๋‹๊นŒ... ๐Ÿค”

๋‚˜๋Š” ํšŒ๋ณตํ•  ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋ถˆ์พŒํ•œ ๊ฒƒ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์—ˆ์ง€๋งŒ ๋น„๋Œ€์นญ์€ ์ƒ๋‹นํžˆ ๋ถˆ์พŒํ•˜๊ณ  ๋‚˜๋ฅผ ๋ถˆ์•ˆํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

type I interface { /* ... */ }
a := G(A) // ok, A satisfies contract
var _ I = a // ok, no selector overlap
b := G(B) // ok, B satisfies contract
var _ = b // error, selector overlap

G0(B) ๊ฐ€ G1(B) ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค. . . Gn(B) ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Gn ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. . . .

FTR์„ ์‚ฌ์šฉํ•˜๋ฉด ํฌํ•จ ์‹œ ์œ ํ˜• ์˜ค๋ฅ˜๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋ชจํ˜ธํ•œ ์„ ํƒ๊ธฐ์˜ ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

// Error: Duplicate field name Reader
type Boom = Embedded(*bytes.Reader, *strings.Reader)

ํฌํ•จ๋œ ํ•„๋“œ ์ด๋ฆ„์€ ์ธ์ˆ˜ ์œ ํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ ํฌํ•จ๋œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์œ ํ˜• ๋ณ„์นญ์„ ํฌํ•จํ•˜๊ณ  ํ•„๋“œ ์ด๋ฆ„์ด ๋ณ„์นญ์„ ์ง€์ •ํ•˜๋Š” ์œ ํ˜•์˜ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ ๋ณ„์นญ์ธ ๊ฒฝ์šฐ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜• ์— ๋Œ€ํ•œ ์„น์…˜์˜ ์ดˆ์•ˆ ๋””์ž์ธ์— ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ ๋ณ€์ˆ˜ํ™”๋œ ํ˜•์‹์ด ๊ตฌ์กฐ์ฒด์ด๊ณ  ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ๊ตฌ์กฐ์ฒด์˜ ํ•„๋“œ๋กœ ํฌํ•จ๋œ ๊ฒฝ์šฐ ํ•„๋“œ ์ด๋ฆ„์€ ํ˜•์‹ ์ธ์ˆ˜์˜ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

type Lockable(type T) struct {
    T
    mu sync.Mutex
}

func (l *Lockable(T)) Get() T {
    l.mu.Lock()
    defer l.mu.Unlock()
    return l.T
}

(์ฐธ๊ณ : ๋ฉ”์„œ๋“œ ์„ ์–ธ์— Lockable(X)์„ ์ž‘์„ฑํ•˜๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ lT ๋˜๋Š” lX๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋‚˜์š”? ๊ตฌ์กฐ์ฒด์— ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ๋‹จ์ˆœํžˆ ๊ธˆ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

๋‚˜๋Š” ๊ทธ์ € ์˜†์ž๋ฆฌ์— ์•‰์•„์„œ ๊ด€์ฐฐํ•˜๊ณ  ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋˜ํ•œ ์•ฝ๊ฐ„ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•˜๊ธฐ ๋ถ€๋„๋Ÿฝ์ง€ ์•Š์€ ํ•œ ๊ฐ€์ง€๋Š” ์ด ํ† ๋ก ์˜ 90%๊ฐ€ ๋‚ด ๋จธ๋ฆฌ ์œ„์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹คํ˜•์„ฑ์ด ๋ฌด์—‡์ธ์ง€๋„ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ž‘์„ฑํ•˜์—ฌ 20๋…„ ๋™์•ˆ ์ƒ๊ณ„๋ฅผ ์œ ์ง€ํ–ˆ์ง€๋งŒ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๋ฐฉํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

๋‚ด๊ฐ€ ๋” ํ‹€๋ฆด ์ˆ˜ ์—†์—ˆ๋‹ค.

๋‚˜๋Š” ์ฃผ๋ง๋„ ์•ˆ๋˜์–ด ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋˜ node.js ์„œ๋น„์Šค๋ฅผ ์™„์ „ํžˆ ํŒŒ๊ดดํ•˜๋Š” ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ Go๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ ๋‚˜๋Š” ๊ทธ์ € ๋†€๊ณ ๋งŒ ์žˆ์—ˆ๋‹ค. ๋‚˜๋Š” ๋ฐ”๋‘‘์œผ๋กœ ์„ธ๊ณ„๋ฅผ ์ •๋ณตํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ํŠน๋ณ„ํžˆ ์ง„์ง€ํ•˜์ง€ ์•Š์•˜๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ Go์— ๋Œ€ํ•ด ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค ..... ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•ด. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์„ฑ๋Šฅ ๊ธฐ๋Šฅ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์†๋„๋Š” ์ œ๊ฐ€ ์ˆ˜๋…„ ๋™์•ˆ ๋ฐฐ์šด ๋‹ค๋ฅธ 8๊ฐœ ์–ธ์–ด์™€ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ ์ดํ›„๋กœ ๋‚˜๋Š” ๋ฐ”๋‘‘์„ ์ฐฌ์–‘ํ•˜๋ฉฐ 4๋ช…์˜ Devs๋ฅผ ๋” ์‚ฌ๋ž‘ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ๊ทธ๋“ค๊ณผ ํ•จ๊ป˜ ์•‰์•„์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ๋งํ•ด์ค๋‹ˆ๋‹ค.

๋‹จ์ˆœํ•จ๊ณผ ํ•™์Šต ์†๋„. ์ด๊ฒƒ์ด ์–ธ์–ด์˜ ์ง„์ •ํ•œ ํ‚ฌ๋Ÿฌ โ€‹โ€‹๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์ˆ˜๊ฐœ์›” ๋™์•ˆ ์—ด์‹ฌํžˆ ํ•™์Šตํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ์œ ์น˜ํ•˜๋ ค๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ์œ ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ด์•ผ ํ•  ์ผ์ด ์žˆ๊ณ  ๋งค์ผ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋ณด๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ณ ์šฉ์ฃผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(Agile ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค).

๋”ฐ๋ผ์„œ Go ํŒ€์ด ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1) ์šฐ๋ฆฌ๊ฐ€ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ์ผ์ƒ์ ์ธ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ œ๋„ค๋ฆญ์— ์˜ํ•ด ํ•ด๊ฒฐ๋˜๋Š” ์‡ผ ์Šคํ† ํผ ๋˜๋Š” ํ˜ธ์ถœ๋˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ํฌํ•จ๋œ ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์–ธ์–ด ๋ณ€๊ฒฝ ์ œ์•ˆ์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ์™€ ํ•จ๊ป˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ผ์ƒ ์ž‘์—…์˜ ์š”๋ฆฌ์ฑ… ์Šคํƒ€์ผ ์˜ˆ.

2) Go์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค.

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

์•„๋งˆ๋„ ๊ทธ๋Ÿฌํ•œ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์ธ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? '--ํ•˜๋“œ์ฝ”์–ด'

์ปดํŒŒ์ผ๋Ÿฌ ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋ฉด ์ •๋ง ์Šฌํ”Œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋งํ•ด

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ Go์— ๋Œ€ํ•ด ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค ..... ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•ด. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์„ฑ๋Šฅ ๊ธฐ๋Šฅ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์†๋„๋Š” ์ œ๊ฐ€ ์ˆ˜๋…„ ๋™์•ˆ ๋ฐฐ์šด ๋‹ค๋ฅธ 8๊ฐœ ์–ธ์–ด์™€ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

์ œ๋„ค๋ฆญ์— ์˜ํ•ด ํ•ด๊ฒฐ๋˜๋Š” ์‡ผ ์Šคํ† ํผ ๋˜๋Š” ํ˜ธ์ถœ๋˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ํฌํ•จ๋œ ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ง„ ํŠธ๋ฆฌ, ์ง‘ํ•ฉ ๋ฐ sync.Map ์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ์œ ํ˜• ์•ˆ์ „ ์ƒ์šฉ๊ตฌ ์ œ๊ฑฐ ๋ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜๋Š” _compile-time_ ์œ ํ˜• ์•ˆ์ „ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ ˆ์ด์•„์›ƒ์ด ์•„๋‹ˆ๋ผ ์ˆœ์ „ํžˆ ์ธ์ˆ˜์˜ ๊ธฐ๋Šฅ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋ฉ‹์ง„ ๊ฒƒ๋“ค์ด ์žˆ์ง€๋งŒ ์–ธ์–ด์˜ ๋‹จ์ˆœํ•จ์„ ์™„์ „ํžˆ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ํ•  ์ˆ˜ _์—†๊ฒŒ_ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ, ์–ธ์–ด์—๋Š” ์ด๋ฏธ ์ƒ๋‹นํžˆ ๋‚จ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๊ทธ๋ ‡๊ฒŒ ์ž์ฃผ ๋‚จ์šฉ๋˜์ง€ _์•Š์€_ ์ฃผ๋œ ์ด์œ ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊นจ๋—ํ•˜๊ณ  ์ฐพ๊ธฐ ์‰ฌ์šด ์ด๋Ÿฌํ•œ ์ฝ”๋“œ์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฒฐํ•ฉ๋œ '๊ด€์šฉ์ ' ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” Go ๋ฌธํ™” ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ œ๋„ค๋ฆญ์„ ์ž˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ตฌํ˜„๋  ๋•Œ ํ™•์‹คํžˆ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@camstuart

์ œ๋„ค๋ฆญ์— ์˜ํ•ด ํ•ด๊ฒฐ๋˜๋Š” ์‡ผ ์Šคํ† ํผ ๋˜๋Š” ํ˜ธ์ถœ๋˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ํฌํ•จ๋œ ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

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

๋” ๋‚˜์€ ์ ์€ ์ด ๋ชจ๋“  ๊ฒƒ์ด ์ง€๊ธˆ ๋‹น์žฅ Go์—์„œ ๊ธฐ์ˆ ์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ถ€ ์ž ์žฌ์ ์œผ๋กœ ์ฃผ์š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ํ•จ๊ป˜ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํ˜•์‹ ์•ˆ์ „์„ฑ์ด ๊ฑฐ์˜ ์™„์ „ํžˆ ์†์‹ค๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋‹จ์  ์—†์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ํ•จ์ˆ˜ ๊ตฌํ˜„:

/*

* "generic" is a KIND of types, just like "struct", "map", "interface", etc...
* "T" is a generic type (a type of kind generic).
* var t = T{int} is a value of type T, values of generic types looks like a "normal" type

*/

type T generic {
    int
    float64
    string
}

func Sum(a, b T{}) T{} {
    return a + b
}

ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž:

Sum(1, 1) // 2
// same as:
Sum(T{int}(1), T{int}(1)) // 2

์ผ๋ฐ˜ ๊ตฌ์กฐ์ฒด ๊ตฌํ˜„:

type ItemT generic {
    interface{}
}

type List struct {
    l []ItemT{}
}

func NewList(t ItemT) *List {
    l := make([]t)
    return &List{l}
}

func (p *List) Push(item ItemT{}) {
    p.l = append(p.l, item)
}

๋ฐฉ๋ฌธ๊ฐ:

list := NewList(ItemT{int})
list.Push(42)

๋ˆ„๊ตฐ๊ฐ€ Swift๋ฅผ ๋ฐฐ์šฐ๊ณ  ์ข‹์•„ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ Go, C, Java ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋Œ€ํ•œ ํ’๋ถ€ํ•œ ๊ฒฝํ—˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ œ๋„ค๋ฆญ(๋˜๋Š” ํ…œํ”Œ๋ฆฟ ๋˜๋Š” ๋ฌด์—‡์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ์‹ถ์€์ง€)์ด Go ์–ธ์–ด์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€ ์•Š๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋‚˜๋Š” ํ˜„์žฌ ๋ฒ„์ „์˜ Go์— ๋” ์ต์ˆ™ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ต๋‹ค๋Š” ์ ์—์„œ ์ด๊ฒƒ์€ C++๋กœ์˜ ํšŒ๊ท€์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ์œ ํ˜•์— ๋Œ€ํ•œ ๊ณ ์ „์ ์ธ T ์ž๋ฆฌ ํ‘œ์‹œ์ž๋Š” ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ์ž‘์—…์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ธ๊ธฐ์žˆ๋Š” ๊ธฐ๋Šฅ ์š”์ฒญ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋„์ฐฉํ•˜๋ฉด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ 2์„ผํŠธ(์˜๊ฒฌ)๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

@jlubawy
์—ฐ๊ฒฐ ๋ชฉ๋ก์ด๋‚˜ ํ€ต์†ŒํŠธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? Alexander Stepanov๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” "์ตœ์†Œ" ๋ฐ "์ตœ๋Œ€" ๊ธฐ๋Šฅ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋งŽ์€ ๋””๋ฒ„๊น… ์‹œ๊ฐ„ ์—†์ด ๋” ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด๋Ÿฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ‘œ์ค€ ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋‚ด๊ฐ€ ๊ฐ€์ง„ ์œ ํ˜•์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@jlubawy

๋˜๋Š” ํ…œํ”Œ๋ฆฟ, ๋˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๋ถ€๋ฅด๊ณ  ์‹ถ์€ ๋ฌด์—‡์ด๋“ 

๋ชจ๋“  ๊ฒƒ์€ ๊ตฌํ˜„์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ C++ ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ์“ฐ๋Š” ๊ฒƒ์กฐ์ฐจ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— C# ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐœ๋… ์ž์ฒด๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋ชจ๋ฅธ๋‹ค๋ฉด, Go ํŒ€์€ Go 2.0์˜ ์ดˆ์•ˆ์„ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค:
https://golang.org/s/go2designs

Go 2.0(๊ณ„์•ฝ)์˜ Generics ๋””์ž์ธ์— ๋Œ€ํ•œ ์ดˆ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Wiki ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ํ”ผ๋“œ๋ฐฑ ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ์„น์…˜:

์ œ๋„ค๋ฆญ

์ดˆ์•ˆ์„ ์ฝ์€ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค.

์™œ

T: ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

"์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ณ„์•ฝ์„ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜• T"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ์ด์œ 
์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ ๊ฐœ๋…์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ธํ„ฐํŽ˜์ด์Šค ํ• ๋‹น์€
๋นŒ๋“œ ์‹œ๊ฐ„์— ์ฒดํฌ์ธ ํ–ˆ์œผ๋ฏ€๋กœ ์ด๋ฏธ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ˆ˜๋‹จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์— ์ถ”๊ฐ€ ๊ฐœ๋…. ์ด ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค Addable์„ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜• T. ๋˜ํ•œ T:_ ๋˜๋Š” T:Any
(Any ํŠน์ˆ˜ ํ‚ค์›Œ๋“œ ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค{}์˜ ๊ธฐ๋ณธ ์ œ๊ณต ๋ณ„์นญ)์€
ํŠธ๋ฆญ.

์™œ ๊ทธ๋Ÿฐ ๊ฒƒ๋“ค์„ ๋Œ€๋ถ€๋ถ„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ์˜ค
๊ฐ์ง€ ๋ฐ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค(์ค‘๋ณต์€ ์˜ค๋ฅ˜ wrt์˜ ์ƒˆ๋กœ์šด ์ฒ˜๋ฆฌ์ด๋ฏ€๋กœ
๊ณตํ™ฉ ์ฒ˜๋ฆฌ).

2018-09-14 6:15 GMT-05:00 Koala Yeung [email protected] :

๋‹น์‹ ์ด ๋ชจ๋ฅธ๋‹ค๋ฉด, Go ํŒ€์€ Go 2.0์˜ ์ดˆ์•ˆ์„ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค:
https://golang.org/s/go2designs

Go 2.0(๊ณ„์•ฝ)์˜ Generics ๋””์ž์ธ์— ๋Œ€ํ•œ ์ดˆ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์›ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค
์‚ดํŽด๋ณด๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๊ธฐ ์œ„ํ•ด
Wiki์˜ https://github.com/golang/go/wiki/Go2GenericsFeedback
https://github.com/golang/go/wiki/Go2GenericsFeedback .

๊ด€๋ จ ์„น์…˜:

์ œ๋„ค๋ฆญ

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/15292#issuecomment-421326634 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AlhWhS8xmN5Y85_aUKT5VnutoOKUAaLLks5ua4_agaJpZM4IG-xv
.

--
TripleMint์—์„œ ์‚ฌ์šฉํ•  ๋ฉ”์ผ ์„œ๋ช… ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: "[...] ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์œ ํ˜• ์ธ์ˆ˜".

2018-09-17 11:10 GMT-05:00 ๋ฃจ์ด์Šค ๋งˆ์ˆ˜ ์—˜๋ฆฌ [email protected] :

์ดˆ์•ˆ์„ ์ฝ์€ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค.

์™œ

T: ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

"์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ณ„์•ฝ์„ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜• T"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ์ด์œ 
์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ ๊ฐœ๋…์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ธํ„ฐํŽ˜์ด์Šค ํ• ๋‹น์€
๋นŒ๋“œ ์‹œ๊ฐ„์— ์ฒดํฌ์ธ ํ–ˆ์œผ๋ฏ€๋กœ ์ด๋ฏธ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ˆ˜๋‹จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์— ์ถ”๊ฐ€ ๊ฐœ๋…. ์ด ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค Addable์„ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜• T. ๋˜ํ•œ T:_ ๋˜๋Š” T:Any
(Any ํŠน์ˆ˜ ํ‚ค์›Œ๋“œ ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค{}์˜ ๊ธฐ๋ณธ ์ œ๊ณต ๋ณ„์นญ)์€
ํŠธ๋ฆญ.

์™œ ๊ทธ๋Ÿฐ ๊ฒƒ๋“ค์„ ๋Œ€๋ถ€๋ถ„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ์˜ค
๊ฐ์ง€ ๋ฐ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค(์ค‘๋ณต์€ ์˜ค๋ฅ˜ wrt์˜ ์ƒˆ๋กœ์šด ์ฒ˜๋ฆฌ์ด๋ฏ€๋กœ
๊ณตํ™ฉ ์ฒ˜๋ฆฌ).

2018-09-14 6:15 GMT-05:00 Koala Yeung [email protected] :

๋‹น์‹ ์ด ๋ชจ๋ฅธ๋‹ค๋ฉด, Go ํŒ€์€ Go 2.0์˜ ์ดˆ์•ˆ์„ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค:
https://golang.org/s/go2designs

Go 2.0(๊ณ„์•ฝ)์˜ Generics ๋””์ž์ธ์— ๋Œ€ํ•œ ์ดˆ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ•  ์ˆ˜์žˆ๋‹ค
์‚ดํŽด๋ณด๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค
Wiki์˜ https://github.com/golang/go/wiki/Go2GenericsFeedback
https://github.com/golang/go/wiki/Go2GenericsFeedback .

๊ด€๋ จ ์„น์…˜:

์ œ๋„ค๋ฆญ

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/15292#issuecomment-421326634 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AlhWhS8xmN5Y85_aUKT5VnutoOKUAaLLks5ua4_agaJpZM4IG-xv
.

--
TripleMint์—์„œ ์‚ฌ์šฉํ•  ๋ฉ”์ผ ์„œ๋ช… ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

--
TripleMint์—์„œ ์‚ฌ์šฉํ•  ๋ฉ”์ผ ์„œ๋ช… ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

@luismasuelli-jobsity Go์˜ ์ œ๋„ค๋ฆญ ๊ตฌํ˜„ ์ด๋ ฅ์„ ์ œ๋Œ€๋กœ ์ฝ์–ด๋ณด๋ฉด, Contract๋ฅผ ๋„์ž…ํ•œ ์ด์œ ๋Š” Interface์—์„œ ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์›ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๊ฑฐ๋ถ€๋œ ์ด์ „ ์ œ์•ˆ์€ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‹คํ˜•์„ฑ์„ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ •์˜ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜์—์„œ '+'์™€ ๊ฐ™์€ ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ๋ถ€๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•˜๋ฉด t == t ๋˜๋Š” t + t ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์œ ํ˜•์ด ๊ฐ™์Œ ๋˜๋Š” ๋ง์…ˆ ๋“ฑ์„ ์ง€์›ํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

T:Addable ๊ฐ€ "Addable ๊ณ„์•ฝ์„ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜• T"๋ฅผ ์˜๋ฏธํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

func Example(type K, V someContract)(k K, v V) V

๋‹น์‹ ์€ ๊ฐ™์€ ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

contract someContract(k K, v V) {
  k.someMethod(v)
}

์ด๊ฒƒ์€ ํ•จ์ˆ˜ ์„œ๋ช…์—์„œ ์œ ํ˜•์„ ์ค‘๋ณต ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์—ฌ๋Ÿฌ ์œ ํ˜•์„ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์„ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ '๊ธฐ๋ฌ˜ํ•˜๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด'์„ ํ”ผํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Œ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ํ˜•์„ ์ œํ•œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋Š” ๋™์ผํ•œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type someMethoder(V) interface {
  someMethod(V)
}

func Example(type K: someMethoder(V), V)(k K, v V) V

๋‹ค์†Œ ์–ด์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์•ฝ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด ์ž‘์—…์„ ๊ณ„์† ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์•ฝ์˜ '์ธ์ˆ˜'๊ฐ€ ํ•จ์ˆ˜๊ฐ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ˆ˜์˜ ๊ณ„์•ฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ๋กœ ์›ํ•˜๋ฉด func Example(type K, V someContract(K, V))(k K, v V) V _ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜์ง€๋งŒ ์ด ์ƒํ™ฉ์—์„œ๋Š” ํŠนํžˆ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณ„์•ฝ์ด ๊ฐœ๋ณ„ ์ธ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ „์ฒด ๊ธฐ๋Šฅ์— ๊ด€ํ•œ ๊ฒƒ์ž„์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋‹จ์ˆœํžˆ ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์•ฝ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

contract Example(k K, v V) {
  k.someMethod(v)
}

func Example(type K, V)(k K, v V) V

์œ„์™€ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ ์€ ๊ณ„์•ฝ์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  ๊ณ„์•ฝ์˜ ์ธ์ˆ˜๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์ƒ์‹คํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: ํฅ๋ฏธ๋กญ๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” ํŒจํ„ด์„ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์ด์œ ๋ฅผ ์ถ”๊ฐ€๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๊ณ„์† ์–ธ๊ธ‰ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •์˜๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

type E(Node) interface {
  Nodes() []Node
}

type N(Edge) interface {
  Edges() (from, to Edge)
}

type Graph(type Node: N(Edge), Edge: E(Node)) struct { ... }
func New(type Node: N(Edge), Edge: E(Node))(nodes []Node) *Graph(Node, Edge) { ... }
func (*Graph(Node, Edge)) ShortestPath(from, to Node) []Edge { ... }

๊ฐœ์ธ์ ์œผ๋กœ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๊ณ„์•ฝ์ด ์ง€์ •๋˜๋Š” ๋ฐฉ์‹์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” '์ •์ƒ์ ์ธ' ๊ธฐ๋Šฅ ๋ณธ๋ฌธ์„ ์‹ค์ œ ๊ณ„์•ฝ ์‚ฌ์–‘์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๊ทธ๋‹ค์ง€ ๊ด€์‹ฌ์ด ์—†์ง€๋งŒ, ๊ณ„์•ฝ์„ ์ž๋™์œผ๋กœ ๋‹จ์ˆœํ™”ํ•˜๋Š” ์ผ์ข…์˜ gofmt์™€ ์œ ์‚ฌํ•œ ๋‹จ์ˆœํ™”๊ธฐ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ž ์žฌ์ ์ธ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ถ€ํ’ˆ. ๊ทธ๋Ÿฌ๋ฉด _ํ•  ์ˆ˜ ์žˆ๋Š”__ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ๊ฑฐ๊ธฐ์— ๋ณต์‚ฌํ•˜๊ณ  ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์ด ๊ตฌํ˜„๋  ๊ฐ€๋Šฅ์„ฑ์ด ์–ผ๋งˆ๋‚˜ ๋ ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ์‚ฌํ•ญ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ง€์ •ํ•˜๊ธฐ๊ฐ€ ๋‹ค์†Œ ์–ด์ƒ‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ณ„์•ฝ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ„์˜ ๋ช…๋ฐฑํ•œ ์ค‘๋ณต์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์•ฝ๊ฐ„ ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

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

์„ค๋ช…. ๋“œ๋ž˜ํ”„ํŠธ ๋””์ž์ธ ์— ์˜ํ•ด ๊ณ„์•ฝ์€ ๊ธฐ๋Šฅ๊ณผ ์œ ํ˜• ๋ชจ๋‘์— ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

""
์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ๊ณ„์•ฝ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋” ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋‘˜์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.
""

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

๋‹ค์Œ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

contract Example(t T, v V) {
  t.(interface{
    SomeMethod() V
  })
}

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

@DeedleFake ์•„๋‹ˆ์š”. ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์ด ์œ ํ˜• ์–ด์„ค์…˜๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๊ทธ๋Ÿฐ ๋‹ค์Œ ๋Ÿฐํƒ€์ž„์— ์ž ์žฌ์ ์œผ๋กœ ํŒจ๋‹‰ ์ƒํƒœ์ด์ง€๋งŒ ๊ณ„์•ฝ์€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ). ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€์‹  ํ• ๋‹น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

t.(someInterface) ๋Š” ๋˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์—ฌ์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์ง€์ . ์ด๋Ÿฐ.

์ด๊ฒƒ์˜ ์˜ˆ๋ฅผ ๋งŽ์ด ๋ณผ์ˆ˜๋ก 'ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—์„œ ์•Œ์•„๋‚ด๊ธฐ' ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์ €๋„ ์ฐธ๊ณ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

contract I(t T) {
  var i interface { Foo() }
  i = t
  t.(interface{})
}

T ๋Š” ์ตœ์†Œํ•œ Foo() ๊ฐ€ ํฌํ•จ๋œ ์ธํ„ฐํŽ˜์ด์Šค์—ฌ์•ผ ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ˆ˜์˜ ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

T ๋Š” ์ตœ์†Œํ•œ Foo() ๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—ฌ์•ผ ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ˆ˜์˜ ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๊ทธ๊ฒŒ ๋ฌธ์ œ์ธ๊ฐ€์š”? ์ผ๋ฐ˜์ ์œผ๋กœ ํŠน์ • ๊ธฐ๋Šฅ์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋„๋ก ์ œํ•œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ„์•ฝ

contract Example(t T) {
  t + t
}

์˜ˆ๋ฅผ ๋“ค์–ด ๋นผ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ๊ด€์ ์—์„œ ์œ ํ˜•์ด ๋บ„์…ˆ์„ ํ—ˆ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋บ„์…ˆ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋„๋ก ์ œํ•œํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด ์ž„์˜๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด Sum() ํ•จ์ˆ˜๋‚˜ ๊ทธ ๋ฐ–์˜ ๊ฒƒ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž„์˜๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์ €์—๊ฒŒ๋Š”) ์ง๊ด€์ ์ด์ง€ ์•Š์€ ์†์„ฑ์ด์—ˆ์ง€๋งŒ, ์•„๋งˆ๋„ ์ปคํ”ผ๊ฐ€ ๋ถ€์กฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ณ„์•ฝ ์„ ์–ธ์—๋Š” ๋” ๋‚˜์€ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ์–ด์•ผ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ ํšจํ•œ ๊ณ„์•ฝ์— ๋Œ€ํ•œ ๊ทœ์น™์€ ์—„๊ฒฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•
์ €๋Š” ์•ฝ 1๋…„ ๋ฐ˜ ์ „์— ์ด ์Šค๋ ˆ๋“œ์— ๊ฒŒ์‹œํ•œ ์ œ๋„ค๋ฆญ ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ์ œ์•ˆ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ ๋ฒ„์ „ 2 ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ตฌ๋ฌธ์€ go-team์—์„œ ์ œ์•ˆํ•œ ๊ตฌ๋ฌธ์— ๋งž๊ฒŒ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ•„๋“œ์— ์˜ํ•œ ์ œ์•ฝ์ด ์ƒ๋žต๋˜์–ด ์ƒ๋‹นํžˆ ๋‹จ์ˆœํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ผญ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ํ•ญ๋ชฉ์€ ์‚ญ์ œํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ตœ๊ทผ์— ํƒ€์ž… ์•„์ด๋ดํ‹ฐํ‹ฐ์— ๊ด€ํ•œ ํฅ๋ฏธ๋กœ์šด (ํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ๋””์ž์ธ์˜ ์ด ๋‹จ๊ณ„์—์„œ ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฒƒ๋ณด๋‹ค ๋” ์ž์„ธํ•œ) ์งˆ๋ฌธ์„ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

func Foo() interface{} {
    type S struct {}
    return S{}
}

func Bar(type T)() interface{} {
    type S struct {}
    return S{}
}

func Baz(type T)() interface{} {
    type S struct{t T}
    return S{}
}

func main() {
    fmt.Println(Foo() == Foo()) // 1
    fmt.Println(Bar(int)() == Bar(string)()) // 2
    fmt.Println(Baz(int)() == Baz(string)()) // 3
}
  1. ๋ฐ˜ํ™˜๋œ ๊ฐ’์˜ ์œ ํ˜•์ด ๋™์ผํ•œ ์œ ํ˜• ์„ ์–ธ์—์„œ ์‹œ์ž‘๋˜๊ธฐ ๋•Œ๋ฌธ์— true ๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ธ์‡„๋ฌผโ€ฆ?
  3. false ๋ฅผ ์ธ์‡„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋ฌธ์ œ๋Š” ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜์—์„œ ์„ ์–ธ๋œ ๋‘ ์œ ํ˜•์ด ๋™์ผํ•  ๋•Œ์™€ ๋™์ผํ•˜์ง€ ์•Š์„ ๋•Œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ~spec~ ๋””์ž์ธ์— ์„ค๋ช…๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ์ ์–ด๋„ ์ง€๊ธˆ์€ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค :)

@merovius ์ค‘๊ฐ„ ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

fmt.Println(Bar(int)() == Bar(int)()) // 2

์ด๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šด ๊ฒฝ์šฐ์ด๋ฉฐ ์œ ํ˜•์ด "์ƒ์„ฑ์ "์ธ์ง€ "์ ์šฉ์ "์ธ์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•˜๋Š” ML์˜ ๋ณ€ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์šฉ ์œ ํ˜•์€ ์ œ๋„ค๋ฆญ์„ ์œ ํ˜• ํ•จ์ˆ˜๋กœ ๊ฐ„์ฃผํ•˜๋ฏ€๋กœ f(int) == f(int)์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ ์œ ํ˜•์€ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ณ ์œ ํ•œ '์ธ์Šคํ„ด์Šค' ์œ ํ˜•์„ ์ƒ์„ฑํ•˜๋Š” ์œ ํ˜• ํ…œํ”Œ๋ฆฟ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋ฏ€๋กœ t<int> != t<int>์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ†ตํ•ฉ, ์ถ”๋ก  ๋ฐ ๊ฑด์ „์„ฑ์— ๋ฏธ๋ฌ˜ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ ์ „์ฒด ์œ ํ˜• ์‹œ์Šคํ…œ ์ˆ˜์ค€์—์„œ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‹น์‹œ์˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์˜ˆ๋ฅผ ๋ณด๋ ค๋ฉด Andreas Rossberg ์˜ "F-ing ๋ชจ๋“ˆ" ๋ฌธ์„œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. functors" ์ด๋Š” ML์ด ํ•ด๋‹น ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๋‘ ๊ฐ€์ง€ ์ˆ˜์ค€์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  functor๊ฐ€ ์ œ๋„ค๋ฆญ๊ณผ ๋™์ผํ•œ ML์ด๋ฉฐ ๋ชจ๋“ˆ ์ˆ˜์ค€์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@keean ๋‹น์‹ ์€ ํ‹€๋ ธ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

@merovius ์˜ˆ, ๋‚ด ์‹ค์ˆ˜์ž…๋‹ˆ๋‹ค. ์งˆ๋ฌธ์€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(ํŒฌํ…€ ์œ ํ˜•).

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

์ ์šฉ ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๊ฐ ์ธ์Šคํ„ด์Šคํ™”์˜ 'S'๋Š” ๋™์ผํ•œ ์œ ํ˜•์ด๋ฏ€๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”์— ๋”ฐ๋ผ ์‚ฌ๋ก€ 2์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ด์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. UB์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

2018๋…„์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ 1982๋…„์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฏฟ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์ตœ์†Œ(x, y ์ •์ˆ˜) ์ •์ˆ˜ {
๋งŒ์•ฝ x < y {
๋ฆฌํ„ด x
}
๋ฆฌํ„ด y
}

ํ•จ์ˆ˜ ์ตœ๋Œ€(x, y ์ •์ˆ˜) ์ •์ˆ˜ {
๋งŒ์•ฝ x > y {
๋ฆฌํ„ด x
}
๋ฆฌํ„ด y
}

๋‚ด ๋ง์€, ์ง„์ง€ํ•˜๊ฒŒ, ์นœ๊ตฌ๋“ค MIN(INT,INT) INT, ์–ด๋–ป๊ฒŒ ๊ทธ๊ฒƒ์ด ์–ธ์–ด์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
๋‚˜๋Š” ํ™”๊ฐ€ ํ•ด์š”.

@dataf3l ์‚ฌ์ „ ์ฃผ๋ฌธ์œผ๋กœ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

func min(x, y int) int {
   if x <= y {
      return x
   }
   return y
}

์ด๊ฒƒ์€ (min(x, y), max(x, y)) ์Œ์ด ํ•ญ์ƒ ๊ตฌ๋ณ„๋˜๊ณ  (x, y) ๋˜๋Š” (y, x)์ด๋ฏ€๋กœ ๋‘ ์š”์†Œ์˜ ์•ˆ์ •์ ์ธ ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๊ฒƒ๋“ค์ด ์–ธ์–ด๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ์–ด์•ผ ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋Œ€๋ถ€๋ถ„ ์ž˜๋ชป ์ดํ•ดํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค :-)

์ •์ˆ˜์˜ ๊ฒฝ์šฐ < ๋Œ€ <=์— ๋Œ€ํ•ด ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด์ ์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ๋ฐ”๋ณด์ผ ์ˆ˜๋„...

ํ™•์‹คํžˆ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

@cznic ์ด ๊ฒฝ์šฐ ์ •์ˆ˜์ด๋ฏ€๋กœ true์ด์ง€๋งŒ ์Šค๋ ˆ๋“œ๊ฐ€ ์ œ๋„ค๋ฆญ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฃผ์„์ด min ๋ฐ max์˜ ์ผ๋ฐ˜ ์ •์˜๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์„ ์–ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. OP๋ฅผ ๋‹ค์‹œ ์ฝ์œผ๋ฉด ์ •์ˆ˜์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ตœ์†Œ๊ฐ’๊ณผ ์ตœ๋Œ€๊ฐ’์„ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ ์ž˜๋ชป์ด์ง€๋งŒ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์Šค๋ ˆ๋“œ์—์„œ ๊ฐ„๋‹จํ•œ ํ†ตํ•ฉ ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค :-)

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

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

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

@webern ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. https://go.googlesource.com/proposal/+/master/design/go2draft.md ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

@webern ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. https://go.googlesource.com/proposal/+/master/design/go2draft.md ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

@ianlancetaylor , ๊ฒŒ์‹œํ•œ ํ›„ ์–ธ์–ด์™€ ๋„๊ตฌ์— ๊ด€ํ•œ ํ•œ '๊ฐ€๋ฒผ์šธ ๊ฒƒ'์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ƒ๋‹นํžˆ ๊ธ‰์ง„์ ์ด๊ณ  ๋…ํŠนํ•œ ์•„์ด๋””์–ด๊ฐ€ ๋จธ๋ฆฌ์— ๋– ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง ๋‹น์‹ ์˜ ๋งํฌ๋ฅผ ์™„์ „ํžˆ ์ฝ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ MD ํ˜•์‹์˜ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด/์ œ์•ˆ์„ ์ œ์ถœํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ฐ์‚ฌ ํ•ด์š”.

@webern ์ž‘์„ฑ(๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ๋งˆํฌ๋‹ค์šด ํ˜•์‹์— ์š”์ ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ)ํ•˜๊ณ  ์—ฌ๊ธฐ์—์„œ ์œ„ํ‚ค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์‹ญ์‹œ์˜ค. https://github.com/golang/go/wiki/Go2GenericsFeedback

๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” (์ตœ์‹  ํŒ์— ๋Œ€ํ•ด) ๊ณ„์•ฝ ์ดˆ์•ˆ ๋””์ž์ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ํŒŒ์„œ(๋ฐ ํ”„๋ฆฐํ„ฐ)์˜ Gophercon ์ด์ „ ํ”„๋กœํ† ํƒ€์ž… ๊ตฌํ˜„์˜ CL์„ ๋ณ‘ํ•ฉํ•˜๊ณ  ์—…๋กœ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์„ ์‹œ๋„ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด https://golang.org/cl/149638 ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ๋†€๋ ค๋ฉด:

1) ์ตœ๊ทผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ CL์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
์ž์‹ ๊ฐ€์ ธ์˜ค๊ธฐ https://go.googlesource.com/go refs/changes/38/149638/2 && ์ž์‹ ์ฒด๋ฆฌ ์„ ํƒ FETCH_HEAD

2) ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ณ  ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
cmd/์ปดํŒŒ์ผ ์„ค์น˜๋กœ ์ด๋™

3) ์ปดํŒŒ์ผ๋Ÿฌ ์‚ฌ์šฉ:
์ด๋™ ๋„๊ตฌ ์ปดํŒŒ์ผ foo.go

์ž์„ธํ•œ ๋‚ด์šฉ์€ CL ์„ค๋ช…์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ฆ๊ธฐ๋‹ค!

contract Addable(t T) {
    t + t
}

func Sum(type T Addable)(x []T) T {
    var total T
    for _, v := range x {
        total += v
    }
    return total
}

์ด ์ œ๋„ค๋ฆญ ๋””์ž์ธ func Sum(type T Addable)(x []T) T ์€ ๋งค์šฐ ๋งค์šฐ ๋งค์šฐ ๋ชป์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค!!!

func Sum(type T Addable)(x []T) T func Sum<T: Addable> (x []T) T ๊ฐ€ ๋” ๋ช…ํ™•ํ•˜๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์˜ค๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ๋ถ€๋‹ด์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ์ด ๋” ์žฅํ™ฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?
func Sum(T Addable)(x []T) T ์ด ์•„๋‹Œ ์ด์œ ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

type ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ์ž์ฒด์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌ๋ณ„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

@urandom ๊ทธ๊ฒƒ์€ ์ธ์Šคํ„ด์Šคํ™” ์‹œ๊ฐ„์˜ ๋ฌธ์ œ์ผ ๋ฟ์ด๋ฉฐ type ํ‚ค์›Œ๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ชจํ˜ธํ•œ AIUI๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” type ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์œผ๋ฉด func Foo(x T) (y T) ๊ฐ€ T ๋ฅผ ์ทจํ•˜๊ณ  ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ T ๋ฅผ ์ทจํ•˜๋Š” ๋น„์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. T ๋ฐ˜ํ™˜.

ํ•จ์ˆ˜ ํ•ฉ๊ณ„(x []T) T

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

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์ด ์ธ๊ฐ„ ๋…์ž๋ฅผ ์œ„ํ•ด ํŒŒ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ์‰ฝ๊ฒŒ(์ฝ๊ธฐ: Lisp-y๋กœ ์ฝ์Œ) ๋งŒ๋“ค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจํ˜ธํ•œ ํŒŒ์‹ฑ ๋ชจํ˜ธ์„ฑ์„ ์ค„์ธ ๋ผ์ธ ์•„๋ž˜์—์„œ ๋” ๋งŽ์ด ์น  ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(C++์˜ "๊ฐ€์žฅ ์„ฑ๊ฐ€์‹  ํŒŒ์‹ฑ" ์ฐธ์กฐ, ์ฃผ์˜๋ฅผ ๋งŽ์ด ๊ธฐ์šธ์ด๋„๋ก ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

2018๋…„์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ 1982๋…„์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฏฟ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์ตœ์†Œ(x, y ์ •์ˆ˜) ์ •์ˆ˜ {
๋งŒ์•ฝ x < y {
๋ฆฌํ„ด x
}
๋ฆฌํ„ด y
}

ํ•จ์ˆ˜ ์ตœ๋Œ€(x, y ์ •์ˆ˜) ์ •์ˆ˜ {
๋งŒ์•ฝ x > y {
๋ฆฌํ„ด x
}
๋ฆฌํ„ด y
}

๋‚ด ๋ง์€, ์ง„์ง€ํ•˜๊ฒŒ, ์นœ๊ตฌ๋“ค MIN(INT,INT) INT, ์–ด๋–ป๊ฒŒ ๊ทธ๊ฒƒ์ด ์–ธ์–ด์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
๋‚˜๋Š” ํ™”๊ฐ€ ํ•ด์š”.

๊ฑฐ๊ธฐ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋ฐฐ์šฐ๊ฑฐ๋‚˜ ๋– ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹น์‹ ์˜ ์„ ํƒ.

๊ทธ๋“ค์ด ๋” ๋‚˜์•„์ง€๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์˜ "๋ฐฐ์šฐ๊ฑฐ๋‚˜ ๋– ๋‚  ์ˆ˜ ์žˆ๋‹ค"๋Š” ํƒœ๋„๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋”ฐ๋ผ์•ผ ํ•  ์ข‹์€ ๋ณธ๋ณด๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์—ฐ๋งˆ์žฌ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ @petar-dambovaliev์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜จ๋ผ์ธ์—์„œ ๋ฌด์—‡์„ ํ•˜๊ฑฐ๋‚˜ ์–ด๋–ป๊ฒŒ ํ–‰๋™ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์€ ์ œ๊ฐ€ ํ•  ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด ๊ฐ•ํ•œ ๊ฐ์ •์ด ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ Gopher ๊ฐ€์น˜ ๋ฅผ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค. ๋Œ€ํ™”๋ฅผ ์กด์ค‘ํ•˜๊ณ  ์‚ฌ๋ฐฉ์—์„œ ํ™˜์˜ํ•˜์‹ญ์‹œ์˜ค.

@bcmills ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋” ๋‚˜์€ ๊ณณ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

@katzdm ์€ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด์—๋Š” ์ด๋ฏธ ๋งŽ์€ ๊ด„ํ˜ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ƒˆ๋กœ์šด ๋‚ด์šฉ์€ ์ €์—๊ฒŒ ์ •๋ง ๋ชจํ˜ธํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

generics ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ type's type ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€ํ”ผํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋Š” Go ๋ฅผ ๋‹ค์†Œ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋„ˆ๋ฌด ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ function overload ์˜ ๊ธฐ๋Šฅ์€ ์ €์—๊ฒŒ ์ถฉ๋ถ„ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

BTW, ์˜ค๋ฒ„๋กœ๋”ฉ ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@xgfone ์–ธ์–ด์— ์ด๋ฏธ ๋งŽ์€ ๊ด„ํ˜ธ๊ฐ€ ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
func Sum<T: Addable> (x []T) T ๋˜๋Š” func Sum<type T Addable> (x []T) T ๊ฐ€ ๋” ์ข‹๊ณ  ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

์ผ๊ด€์„ฑ(๋‚ด์žฅ ์ œ๋„ค๋ฆญ ํฌํ•จ)์„ func Sum[T: Addable] (x []T) T ๊ฐ€ func Sum<T: Addable> (x []T) T ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋œ ์ด์ „ ์ž‘์—…์˜ ์˜ํ–ฅ์„ ๋ฐ›์•˜์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ Sum<T: Addable> (x []T) T ๋Š” ์–ธ๋œป ๋ณด๊ธฐ์—๋Š” ๋” ๋šœ๋ ทํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์–ธ์–ด์˜ ์ƒˆ๋กœ์šด ๊ฒƒ์— ์ฃผ์˜๋ฅผ ์ง‘์ค‘์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๋Š” ์ ์—์„œ @katzdm ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. Go๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋„ Go์— ๋›ฐ์–ด๋“œ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์นœ์ˆ™ํ•ฉ๋‹ˆ๋‹ค.

FWIW, Go๊ฐ€ ์ œ๋„ค๋ฆญ์— ๊บพ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ํ™•๋ฅ ์€ ์•ฝ 0%์ž…๋‹ˆ๋‹ค. C++์˜ ๋ฌธ๋ฒ•์€ , b ๋ฐ c ์œ ํ˜•์„ ์ดํ•ดํ•˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜ ํ˜ธ์ถœ์—์„œ < b > c(ํ•ฉ๋ฒ•์ ์ด์ง€๋งŒ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ์ผ๋ จ์˜ ๋น„๊ต)๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๋Š” ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ œ๋„ค๋ฆญ์— ๊บพ์‡  ๊ด„ํ˜ธ ์‚ฌ์šฉ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค.

func a < b Addable> (...
func ๋‹ค์Œ์— ํ•จ์ˆ˜ ์ด๋ฆ„, ( ๋˜๋Š” < ์ค‘ ํ•˜๋‚˜๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๋Š”๋‹ค๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@carlmjohnson ๋‹น์‹ ์ด ์˜ณ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค

f := sum<int>(10)

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ sum ๋Š” ๊ณ„์•ฝ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

C++์˜ ๋ฌธ๋ฒ•์€ , b ๋ฐ c ์œ ํ˜•์„ ์ดํ•ดํ•˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜ ํ˜ธ์ถœ์—์„œ < b > c(ํ•ฉ๋ฒ•์ ์ด์ง€๋งŒ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ์ผ๋ จ์˜ ๋น„๊ต)๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

< ๋ฐ > ์—ฐ์‚ฐ์ž๊ฐ€ Go ๋ฐ < ์—์„œ bool ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Go๋Š” C++์™€ ๋‹ฌ๋ฆฌ ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ง€์ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. < ๋ฐ > ๋Š” bool ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ตฌ๋ฌธ์ƒ์œผ๋กœ _์ ํ•ฉํ•˜๋ฏ€๋กœ ์ด๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊บพ์‡  ๊ด„ํ˜ธ์˜ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” List<List<int>> ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ >> ๋Š” ์˜ค๋ฅธ์ชฝ ์‹œํ”„ํŠธ ์—ฐ์‚ฐ์ž๋กœ ํ† ํฐํ™”๋ฉ๋‹ˆ๋‹ค.

[] ์‚ฌ์šฉ ์‹œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ์œ„์˜ ๋Œ€๋ถ€๋ถ„์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ฌธ๋ฒ•์ ์œผ๋กœ, ์œ„์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด f := sum[int](10) ๋Š” ๋ฐฐ์—ด ๋˜๋Š” ๋งต ์•ก์„ธ์Šค์™€ ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์œ ํ˜• ์‹œ์Šคํ…œ์ด ๋‚˜์ค‘์— ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์—ด๊ณผ ๋งต ์•ก์„ธ์Šค์˜ ์ฐจ์ด. ์ด๊ฒƒ์€ <> ์˜ ๊ฒฝ์šฐ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‹จ์ผ < ๋Š” ํ•ฉ๋ฒ•์ด์–ด์„œ ๋ชจํ˜ธ์„ฑ์„ ์œ ๋ฐœํ•˜์ง€๋งŒ ๋‹จ์ผ [ ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • func Example[T](v T) T ๋„ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • ]] ๋Š” ์ž์ฒด ํ† ํฐ์ด ์•„๋‹ˆ๋ฏ€๋กœ ํ•ด๋‹น ๋ฌธ์ œ๋„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋””์ž์ธ ์ดˆ์•ˆ์€ type A [T] int ์™€ ๊ฐ™์€ ํ˜•์‹ ์„ ์–ธ์˜ ๋ชจํ˜ธ์„ฑ์„ ์–ธ๊ธ‰ํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋น„๊ต์  ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ฐ˜ ์ •์˜๋Š” ์œ ํ˜• ์ด๋ฆ„์ด ์•„๋‹Œ ํ‚ค์›Œ๋“œ ์ž์ฒด๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

  • func[T] Example(v T) T
  • type[T] A int

์—ฌ๊ธฐ์„œ ๋ณต์žก์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ํ˜• ์„ ์–ธ ๋ธ”๋ก์˜ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type (
  A int
)

ํ•˜์ง€๋งŒ ์ œ๋„ค๋ฆญ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ๋ธ”๋ก ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ๋“œ๋ฌธ ๊ฒฝ์šฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์“ฐ๊ธฐ ๋„ˆ๋ฌด ์•„๊นŒ์šธ ๊ฒƒ ๊ฐ™์•„์š”

type[T] A []T
var s A[int]

๋Œ€๊ด„ํ˜ธ๊ฐ€ A ์˜ ํ•œ ์ชฝ์—์„œ ๋‹ค๋ฅธ ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ๋‚˜์€ ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ํ˜„์žฌ ๊ตฌ๋ฌธ์—์„œ type ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ด„ํ˜ธ๋ฅผ ๋Œ€๊ด„ํ˜ธ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฐฐ์—ด ์œ ํ˜• ๋Œ€ ํ‘œํ˜„์‹ ๊ตฌ๋ฌธ์ด [N]T ๋Œ€ arr[i] ์ธ ๊ฒƒ๊ณผ ๋‹ค๋ฅด์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์„ ์–ธ ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ, var arr [N]T ์—์„œ ๋Œ€๊ด„ํ˜ธ๋Š” $#$ arr #$ ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๊ฐ™์ด arr ์˜ ๊ฐ™์€ ์ชฝ์— ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ˜•์‹ ๋Œ€ ํ‘œํ˜„์‹ ๊ตฌ๋ฌธ ์ธก๋ฉด์—์„œ ๊ตฌ๋ฌธ์„ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋˜๋Š” ๊ฒƒ.

( vs < vs [ ๊ทธ๋ฆฌ๊ณ  type ์˜ ์‚ฌ์šฉ์ด ๋ฐ”์ดํฌ์‰๋”ฉ์ธ์ง€ ์•„๋‹ˆ๋ฉด ์‹ค์ œ๋กœ ๊ตฌ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@ianlancetaylor ... ํ”ผ๋“œ๋ฐฑ์ด ์ œ์•ˆ๋œ ๋””์ž์ธ์— ๋Œ€ํ•œ ์กฐ์ •์„ ๋ณด์ฆํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ญ๋‹ˆ๊นŒ? ํ”ผ๋“œ๋ฐฑ์— ๋Œ€ํ•œ ๋‚ด ์ž์‹ ์˜ ๋Š๋‚Œ์€ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ ์–ด๋„ ์ดˆ๊ธฐ์—๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ณ„์•ฝ์„ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž ์‹œ ํ›„ ๋‘ ๊ฐœ๋…์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๋ณ€ํ™”์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ถ”์„ธ๋ฅผ ์ž˜๋ชป ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌํ•ด ๋ฆด๋ฆฌ์Šค์—์„œ ์‹คํ—˜์ ์ธ ์˜ต์…˜์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

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

์‹ค์šฉ์ ์ธ ๊ฒฝํ—˜ ๋ณด๊ณ ์„œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด Juts:
๋‚ด Go ์ธํ„ฐํ”„๋ฆฌํ„ฐ https://github.com/cosmos72/gomacro์—์„œ ์ œ๋„ค๋ฆญ์„ ์–ธ์–ด ํ™•์žฅ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๋‘ ๊ตฌ๋ฌธ ๋ชจ๋‘

type[T] Pair struct { First T; Second T }
type Pair[T] struct { First T; Second T }

ํŒŒ์„œ์— ๋งŽ์€ ๋ชจํ˜ธ์„ฑ์ด ๋„์ž…๋œ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” Pair๊ฐ€ T ๊ตฌ์กฐ์ฒด์˜ ๋ฐฐ์—ด์ด๋ผ๋Š” ์„ ์–ธ์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ T๋Š” ์ƒ์ˆ˜ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค. Pair ๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ ๋ชจํ˜ธ์„ฑ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Pair[int] ๋Š” ์œ ํ˜• ๋Œ€์‹  ํ‘œํ˜„์‹์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Pair ๋ผ๋Š” ์ด๋ฆ„์˜ ๋ฐฐ์—ด/์Šฌ๋ผ์ด์Šค/๋งต์„ ๋‹ค์Œ์œผ๋กœ ์ธ๋ฑ์‹ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ํ‘œํ˜„์‹ int (์ฐธ๊ณ : int ๋ฐ ๊ธฐํƒ€ ๊ธฐ๋ณธ ์œ ํ˜•์€ Go์—์„œ ์˜ˆ์•ฝ์–ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค), ๊ทธ๋ž˜์„œ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์— ์˜์กดํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

template[T] type Pair struct { First T; Second T }
type pairOfInt = Pair#[int]
var p Pair#[int]

๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋„ ์œ ์‚ฌํ•˜๊ฒŒ:

template[T] func Sum(args ...T) T { /*...*/ }
Sum#[int] (1,2,3)

๋”ฐ๋ผ์„œ ์ด๋ก ์ ์œผ๋กœ๋Š” ๊ตฌ๋ฌธ์ด ํ”ผ์ƒ์ ์ธ ๋ฌธ์ œ๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ๋‹ค์Œ์„ ์ง€์ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
1) ํ•œํŽธ์œผ๋กœ ๊ตฌ๋ฌธ์€ Go ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ๋…ธ์ถœ๋  ๊ฒƒ์ด๋ฏ€๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋‹จ์ˆœํ•˜๋ฉฐ ์•„๋งˆ๋„ ์ž…๋ง›์— ๋งž์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
2) ๋‹ค๋ฅธ ์ชฝ์—์„œ ์ž˜๋ชป๋œ ๊ตฌ๋ฌธ ์„ ํƒ์€ ๋„์ž…๋œ ๋ชจํ˜ธ์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ, ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ ๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Pair[int] ๋Š” ์œ ํ˜• ๋Œ€์‹  ํ‘œํ˜„์‹์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Pair ๋ผ๋Š” ๋ฐฐ์—ด/์Šฌ๋ผ์ด์Šค/๋งต์„ ์ธ๋ฑ์Šค ํ‘œํ˜„์‹ int ๋กœ ์ธ๋ฑ์‹ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ชจํ˜ธ์„ฑ์ด ์•„๋‹ˆ๋ผ ์˜๋ฏธ ๋ก ์ ์ž…๋‹ˆ๋‹ค(์ด๋ฆ„ ํ™•์ธ ํ›„๊นŒ์ง€). ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋Š” ์–ด๋Š ์ชฝ์ด๋“  ๋™์ผํ•ฉ๋‹ˆ๋‹ค. Sum#[int] ๋Š” Sum ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋”ฐ๋ผ ์œ ํ˜• ๋˜๋Š” ํ‘œํ˜„์‹์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ์˜ (*T) ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„ ํ™•์ธ์ด ๊ตฌ๋ฌธ ๋ถ„์„๋˜๋Š” ๊ตฌ์กฐ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ํ•œ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ <> ์˜ ๋ฌธ์ œ์™€ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค.

f ( a < b , c < d >> (e) )

>> ๋Š” ํ•˜๋‚˜ ๋˜๋Š” ๋‘ ๊ฐœ์˜ ํ† ํฐ์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์„ ํ† ํฐํ™”ํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด f ์— ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ํ•˜๋‚˜ ๋˜๋Š” ๋‘ ๊ฐœ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. a ๋กœ ํ‘œ์‹œ๋˜๋Š” ํ•ญ๋ชฉ์— ๋”ฐ๋ผ ํ‘œํ˜„์‹์˜ ๊ตฌ์กฐ๊ฐ€ ํฌ๊ฒŒ ๋ฐ”๋€๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์ €๋Š” ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ํ˜„์žฌ ํŒ€์˜ ์ƒ๊ฐ, ํŠนํžˆ "constraints-are-just-code"๊ฐ€ ๋ฐ˜๋ณต๋˜๊ฑฐ๋‚˜ ํฌ๊ธฐ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์œ ํ•œ ์ œ์•ฝ ์กฐ๊ฑด ์–ธ์–ด๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ด€๋ จ๋œ ์œ ํ˜•์„ ์ถฉ๋ถ„ํžˆ ์ œํ•œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ถ€์ž์—ฐ์Šค๋Ÿฌ์šด ์Šคํƒ€์ผ์ด ๋ฐœ์ƒํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ ํ˜•์— ๋Œ€ํ•ด ์‹ค์ œ๋กœ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด๋Ÿฌํ•œ ์ถ”๋ก ์ด ์ž„์˜๋กœ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๋ฏธ๋ž˜์— ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด์— ๋Œ€ํ•œ ์‚ฌ์‹ค์— ์˜์กดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@cosmos72

์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์ง€๋งŒ @stevenblenkinsop ์ด ๋งํ•œ ๊ฒƒ ์™ธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์šฉ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

a b

b๊ฐ€ ์„ ํƒ์ ์ธ [identifier] ๊ฐ€ ์ถ”๊ฐ€๋œ ์˜์ˆซ์ž(์—ฐ์‚ฐ์ž ์—†์Œ/๊ตฌ๋ถ„์ž ์—†์Œ)์ด๊ณ  a๊ฐ€ ํŠน์ˆ˜ ํ‚ค์›Œ๋“œ/ํŠน์ˆ˜ ์˜์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ(์˜ˆ: import/์—†์Œ) b๊ฐ€ ์œ ํ˜•์ด ์•„๋‹˜์„ ์•”์‹œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€/์œ ํ˜•/๊ธฐ๋Šฅ)?.

go too much์˜ ๋ฌธ๋ฒ•์„ ๋ชจ๋ฅธ๋‹ค.

์–ด๋–ค ๋ฉด์—์„œ int ๋ฐ Sum[int]์™€ ๊ฐ™์€ ์œ ํ˜•์€ ์–ด์จŒ๋“  ํ‘œํ˜„์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

type (
    nodeList = []*Node  // nodeList and []*Node are identical types
    Polar    = polar    // Polar and polar denote identical types
)

go๊ฐ€ ์ค‘์œ„ ํ•จ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋ฉด type ๊ฐ€ ์ค‘์œ„ ํ•จ์ˆ˜ ๋˜๋Š” ์œ ํ˜•์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ a type tag ๋Š” ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜ค๋Š˜ ์ด ์ œ์•ˆ์˜ ๋ฌธ์ œ ๊ฐœ์š” ๊ฐ€ Swift์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค.

T ๊ฐ€ Equatable ํ”„๋กœํ† ์ฝœ์„ ์ถฉ์กฑํ•œ๋‹ค๊ณ  ์„ ์–ธํ•˜๋ฉด ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—์„œ == ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Equatable ๋Š” Swift์— ๋‚ด์žฅ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ๋‹ฌ๋ฆฌ ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

protocol Equatable2 {
    static func == (lhs: Self, rhs: Self) -> Bool
}

class uniq: Equatable2 {
    static func == (lhs: uniq, rhs: uniq) -> Bool {
        return false
    }
}

let narf = uniq(), poit = uniq()

func !=<T: Equatable2> (lhs: T, rhs: T) -> Bool {
    return !(lhs == rhs)
}

print(narf != poit)

@์‹œ๊ณ ์•ผ
์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด ์ œ์•ˆ๋œ a[b] ๊ตฌ๋ฌธ์˜ ๋ชจํ˜ธ์„ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. a b ๊ฐ€ ์•„๋‹ˆ๋ผ ์Šฌ๋ผ์ด์Šค์™€ ๋งต์„ ์ธ๋ฑ์‹ฑํ•˜๋Š” ๋ฐ ์ด๋ฏธ ์‚ฌ์šฉ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋™์•ˆ ๋‚˜๋Š” Haskell์„ ์—ฐ๊ตฌํ•ด ์™”์œผ๋ฉฐ, ์œ ํ˜• ์ถ”๋ก ์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ์—ˆ์ง€๋งŒ, ๊ทธ ์ œ๋„ค๋ฆญ์˜ ํ‘œํ˜„๋ ฅ๊ณผ ์ •๊ตํ•จ์— ๋†€๋ž์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๊ทธ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๋…ํŠนํ•œ ๋ช…๋ช… ์ฒด๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ์–ธ๋œป ๋ณด๊ธฐ์— ํ•ญ์ƒ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด class ๋Š” ์‹ค์ œ๋กœ ์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค(์ผ๋ฐ˜ ์—ฌ๋ถ€). Eq ํด๋ž˜์Šค๋Š” ๊ฐ’์„ '==' ๋ฐ '/='์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

class Eq a where
  (==) :: a -> a -> Bool
  (/=) :: a -> a -> Bool

a ์œ ํ˜•์ด == ๋ฐ /= ์ค‘์œ„ ํ•จ์ˆ˜์˜ "์ „๋ฌธํ™”"(์‹ค์ œ๋กœ Haskell ์šฉ์–ด๋กœ "์ธ์Šคํ„ด์Šค")๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ œ์•ฝ ์กฐ๊ฑด Eq $์„ ์ถฉ์กฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. /= ๋Š” ๊ฐ๊ฐ a ์œ ํ˜•์˜ ๋‘ ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  Bool ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ํ˜„์žฌ Haskell ์ œ๋„ค๋ฆญ์—์„œ ์ฐพ์€ ์•„์ด๋””์–ด ์ค‘ ์ผ๋ถ€๋ฅผ Go ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ œ์•ˆ์— ์ ์šฉํ•˜๊ณ  ๊ทธ๋“ค์ด ์–ผ๋งˆ๋‚˜ ์ž˜ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. C++ ๋ฐ Java ์ด์™ธ์˜ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋„ ์กฐ์‚ฌ๊ฐ€ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์–ด ์ •๋ง ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์œ„์˜ Swift ์˜ˆ์ œ์™€ ๋‚ด Haskell ์˜ˆ์ œ๋Š” ์ œ๋„ค๋ฆญ ์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์ด ์ด๋ฏธ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ์ œ๋„ค๋ฆญ ๋ฐ ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ƒ๋‹นํ•œ ๊ฒฝํ—˜์ด ์กด์žฌํ•˜๋ฉฐ ์ด๋Ÿฌํ•œ ์ œ์•ฝ ์กฐ๊ฑด์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. (๋ฐ ๊ธฐํƒ€) ์–ธ์–ด.

์ œ ์ƒ๊ฐ์—๋Š” Go ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ œ์•ˆ์„ ๋งˆ๋ฌด๋ฆฌํ•˜๊ธฐ ์ „์— ๊ทธ๋Ÿฌํ•œ ๊ฒฝํ—˜์„ ์—ฐ๊ตฌํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ์ƒ๊ฐ: ์ œ๋„ค๋ฆญ ์œ ํ˜•์ด ์ถฉ์กฑ์‹œํ‚ค๋ ค๋Š” ์ œ์•ฝ ์กฐ๊ฑด์˜ ํ˜•์‹์ด ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์™€ ๋‹ค์†Œ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ์ต์ˆ™ํ•œ ๊ธฐ์กด ํ˜•์‹ ์ฃผ์žฅ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type Comparer interface {
  Compare(v interface{}) (*int, error)
}
type PriorityQueue<T.(Comparer)> struct {
  things []T
}

์ด๊ฒƒ์ด ์ด๋ฏธ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ฒ ์ €ํ•˜๊ฒŒ ๋…ผ์˜๋œ ๊ฒฝ์šฐ ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์ง€๋งŒ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋ฌธํ•™์— ๋น ์ ธ๋“ค๊ณ  ์žˆ๋‹ค. ์ €๋Š” Go์˜ ์–ด๋–ค ๋ฒ„์ „์—์„œ๋„ ์ œ๋„ค๋ฆญ์„ ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž ์‹œ ๋ฌด์‹œํ•ด ์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์•„์ด๋””์–ด๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ์ „์ฒด์—์„œ ์ถ”์ง„๋ ฅ๊ณผ ๋ถˆ๊ฐ€ํ”ผ์„ฑ์„ ์–ป๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@jesse-amano ์–ด๋–ค ๋ฒ„์ „์˜ Go์—์„œ๋„ ์ œ๋„ค๋ฆญ์„ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์€ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ์„œ ๋‚˜๋Š” ๋‚˜ ์ž์‹ ์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์„ ์ •๋ง๋กœ ์ข‹์•„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 'C'๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ชฉ๋ก ๋˜๋Š” ํŠธ๋ฆฌ์™€ ๊ฐ™์€ ๋™์ผํ•œ ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฉฐ ํ•„์—ฐ์ ์œผ๋กœ ๋‚ด ๊ตฌํ˜„์€ ๋ฒ„๊ทธ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•œ ๋ฒ„์ „๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ „์ฒด ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ•ด๋‹น ๋ฒ„์ „์„ ์ตœ๊ณ ๋กœ ๋งŒ๋“œ๋Š” ๋ฐ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์‹ ์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋Š” ๋‹น์‹ ์˜ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‹ค๋ฅธ ์ ๊ณผ ๊ด€๋ จํ•˜์—ฌ Go๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์˜ค๋ฒ„๋กœ๋“œ ์—ฐ์‚ฐ์ž(์˜ˆ: '==' ๋ฐ '+')๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋กœ๋ถ€ํ„ฐ ์•ž์œผ๋กœ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋Š” Go๊ฐ€ ๊ฐ€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋ฐฉ์‹์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์—ฐ์‚ฐ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์–ธ๊ธ‰ํ•  ๋˜ ๋‹ค๋ฅธ ์š”์ ์€ ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ œ๋„ค๋ฆญ ์ œ์•ฝ ์กฐ๊ฑด์ด ํ˜•์‹์— ๋Œ€ํ•œ ์ˆ ์–ด์ธ ๊ฒฝ์šฐ ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ œ์•ฝ ์กฐ๊ฑด์ด ํ˜•์‹์— ๋Œ€ํ•œ ๊ด€๊ณ„์ธ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ œ๋„ค๋ฆญ ์ œ์•ฝ ์กฐ๊ฑด์ด ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Go ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹ค์‹œ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์žฌ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

@keean ํ•„์š”ํ•  ๋•Œ ๋ช‡ ๋ฒˆ์ด๊ณ  ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ๊ฑฐ๋ถ€๊ฐ์ด ์—†์œผ๋ฉฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ, ๋ฉ”์„œ๋“œ ์ˆ˜์‹ ๊ธฐ ๋“ฑ์— ๋Œ€ํ•œ Go์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์ข‹์€ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ง€๋‚œ 4๋…„ ๋™์•ˆ ์†Œ์ˆ˜์˜ ์‚ฌ๋ก€์—์„œ ์ €๋Š” ๋ณต์žกํ•˜์ง€๋งŒ ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด 2๊ฐœ ์ด์ƒ์˜ ๋ณต์žกํ•˜์ง€๋งŒ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— ์ฒ˜ํ•ด ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‹ฌ๊ฐ์„ฑ -- go:generate๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ ์ƒ์„ฑ์ด ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

๊ฒฝํ—˜ ๋ณด๊ณ ์„œ๋ฅผ ์ฝ์œผ๋ฉด์„œ ๋งŽ์€ ๊ฒฝ์šฐ์— go:generate ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๋„๊ตฌ๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” Go1์ด ์˜ฌ๋ฐ”๋ฅธ ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ์—ˆ๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์ด ์ž˜๋ชป๋˜์—ˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(์ผ๋ถ€ Go ์ฝ”๋“œ์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ž˜ํผ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ). ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‚ด๊ฐ€ _ํ–ˆ์„ ์ˆ˜๋„ ์žˆ๋Š”_ ์ผ์„ ์ถ”์ธกํ•˜๋Š” ๊ฒƒ์ด ์ถฉ๋ถ„ํžˆ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง€๊ธˆ๊นŒ์ง€ Go1์ด ์ œ๋„ค๋ฆญ ์œ ํ˜•์„ ํ‘œํ˜„ํ•˜๋Š” ๋” ๋งŽ์€ ๋ฐฉ๋ฒ•์„ ์›ํ–ˆ๋˜ ์‹ค์ œ ๊ฒฝํ—˜์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํ”„๋กœ์ ํŠธ์—์„œ.

Go2๊ฐ€ ์ผ๋ฐ˜ ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ƒ์„ฑ๋  ๋กœ์ง์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ•œ ๋งคํ•‘์„ ํ•˜๊ณ  ๋ฐ•์‹ฑ/์–ธ๋ฐ•์‹ฑ, "๋ฌผํ™”", ์ƒ์† ์ฒด์ธ ๋“ฑ์œผ๋กœ ์ธํ•ด ์ด์ƒํ•œ ์—ฃ์ง€ ์ผ€์ด์Šค๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ๊ฑฑ์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jesse-amano ๋‚ด ๊ฒฝํ—˜์ƒ ๋ช‡ ๋ฒˆ์ด ์•„๋‹ˆ๋ผ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์€ ์ž˜ ์•Œ๋ ค์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›๋ž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ž‘์„ฑํ•œ ๋•Œ๊ฐ€ ์–ธ์ œ์ธ์ง€ ๊ธฐ์–ต๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋„๋ฉ”์ธ ์ง€์‹์ด ํ•„์š”ํ•œ ๋ณต์žกํ•œ ์ตœ์ ํ™” ๋ฌธ์ œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ํ•˜๋Š” ์ผ์€ ๋ฌธ์ œ๋ฅผ ์ž˜ ์•Œ๋ ค์ง„ ๋ฉ์–ด๋ฆฌ, ์ธ์ˆ˜ ํŒŒ์„œ, ์ผ๋ถ€ ํŒŒ์ผ ์ŠคํŠธ๋ฆฌ๋ฐ, ์ œ์•ฝ ๊ธฐ๋ฐ˜ UI ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๋ถ„ํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ˆ˜๋ฅผ ํ•˜๋Š” ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ "์ตœ์†Œ" ๋ฐ "์ตœ๋Œ€"์˜ ์˜ฌ๋ฐ”๋ฅธ ๊ตฌํ˜„์„ ์ฒ˜์Œ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค(์ฐธ์กฐ: http://componentsprogramming.com/writing-min-function-part5/).

go:generate์˜ ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งคํฌ๋กœ ํ”„๋กœ์„ธ์„œ์ผ ๋ฟ์ด๋ฉฐ ์œ ํ˜• ์•ˆ์ „์„ฑ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ๋“  ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์œ ํ˜• ๊ฒ€์‚ฌํ•˜๊ณ  ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋ฅผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ƒ์„ฑ์„ ์‹คํ–‰ํ•  ๋•Œ๊นŒ์ง€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฉ”ํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋””๋ฒ„๊ทธํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค :-)

๋”ฐ๋ผ์„œ ์ œ๋„ค๋ฆญ๊ณผ์˜ ์ฐจ์ด์ ์€ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ํ•„์š” ์—†์ด ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ์œ ํ˜•์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ _direct_ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ •๋ง ๊ฐ„๋‹จํ•œ ์˜ˆ๋Š” "์Šค์™‘"์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐ’์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€ ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

swap<A>(x: *A, y: *A) {
   let tmp = *x
   *x = *y
   *y = tmp
}

์ด์ œ ์ด ๊ธฐ๋Šฅ์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ผ๋ฐ˜์ ์ด๋ฉฐ ๋ชจ๋“  ์œ ํ˜•์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์Šค์™‘์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฐ’์— ๋Œ€ํ•œ ๋ชจ๋“  ์œ ํ˜•์˜ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ์ด ํ•จ์ˆ˜๋ฅผ ๊ณ„์†ํ•ด์„œ ์ž…๋ ฅํ•˜๊ณ  ์‹ถ์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ฌผ๋ก  ์ด๋กœ๋ถ€ํ„ฐ ๋‚ด๋ถ€ ์ •๋ ฌ๊ณผ ๊ฐ™์€ ๋” ํฐ ์ผ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฒฝ์šฐ์—๋„ go:generate ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let tmp = *x
*y = *x
*x = tmp

๋‘ ํฌ์ธํ„ฐ์˜ ๋‚ด์šฉ์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์„ ๋•Œ๋งˆ๋‹ค ์ด๊ฒƒ์„ ์†์œผ๋กœ ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

Go์—์„œ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ด€์šฉ์  ๋ฐฉ๋ฒ•์€ ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ด๊ฒƒ์€ ํ˜•์‹์ด ์•ˆ์ „ํ•˜์ง€ ์•Š๊ณ  ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Go์—๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์šฐ์•„ํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฉฐ ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํƒˆ์ถœ๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋‘‘ ์Šคํƒ€์ผ์„ ์™„์ „ํžˆ ๋ฐ”๊พธ๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ œ๋„ค๋ฆญ์— ์ ํ•ฉํ•œ ์–ธ์–ด๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ 'Rust'๋Š” ๋งŽ์€ ์ผ๋ฐ˜ ํ•ญ๋ชฉ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘ ๋Œ€์‹  ์ •์  ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ณต์žก์„ฑ์ด ๋งŽ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” Haskell, Go, Rust ์‚ฌ์ด์— ๊ดœ์ฐฎ์€ ์ฃผ๋ฅ˜ ์ผ๋ฐ˜ ์–ธ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๋น„ํŠธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ •๋ณด: ์ €๋Š” ํ˜„์žฌ Go ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์œ„์‹œ๋ฆฌ์ŠคํŠธ ๋ฅผ ์ž‘์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ Go ์ œ๋„ค๋ฆญ(C++ ํ…œํ”Œ๋ฆฟ์„ ๋ชจ๋ธ์œผ๋กœ ํ•จ)์˜ ๋‹ค๋ฅธ ๊ตฌํ˜„์ด ์žˆ๋Š” Go ์ธํ„ฐํ”„๋ฆฌํ„ฐ gomacro ์—์„œ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ์˜๋„์ž…๋‹ˆ๋‹ค.

์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. :)

@keean

๋‹น์‹ ์ด min ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋งํฌํ•œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ๊ณผ ์ด์— ๊ด€๋ จ๋œ 4๊ฐœ์˜ ๊ฒŒ์‹œ๋ฌผ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. "'min'์˜ ์˜ฌ๋ฐ”๋ฅธ ๊ตฌํ˜„์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค..."๋ผ๋Š” ์ฃผ์žฅ์„ ํ•˜๋ ค๋Š” ์‹œ๋„์กฐ์ฐจ ๊ด€์ฐฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž‘๊ฐ€๋Š” ์‹ค์ œ๋กœ ๋„๋ฉ”์ธ์ด ์ˆซ์ž๋กœ ์ œํ•œ๋˜์–ด ์žˆ๋Š” ํ•œ ์ฒซ ๋ฒˆ์งธ ๊ตฌํ˜„์ด ์ •ํ™•ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐœ์ฒด์™€ ํด๋ž˜์Šค๊ฐ€ ๋„์ž…๋˜๊ณ  ํ•ด๋‹น ์ฐจ์›์˜ ๊ฐ’์ด ๋™์ผํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ํ•œ ์ฐจ์›์—์„œ๋งŒ ๋น„๊ต๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ถ”๊ฐ€ ๋ณต์žก์„ฑ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋น„๊ต๊ธฐ ๋ฐ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋ฏธ๋ฌ˜ํ•œ ์ˆจ๊ฒจ์ง„ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ •ํ™•ํžˆ ์ œ๊ฐ€ ์ œ๋„ค๋ฆญ์„ ๊ฐœ๋…์œผ๋กœ _์‹ซ์–ดํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค(์ ์–ด๋„ Go์—์„œ๋Š”; Spring with Java๋Š” ์ด๋ฏธ ์ž‘์„ฑํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ํ™˜๊ฒฝ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์„ฑ์ˆ™ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ).

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

swap ๋Š” ๋‚˜์œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ฃ„์†กํ•˜์ง€๋งŒ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. Go์—์„œ๋Š” ์ด๋ฏธ ํ•œ ์ค„์งœ๋ฆฌ์ด๋ฏ€๋กœ ์ด๋ฅผ ๋ž˜ํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ฐ˜ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๋ฅผ ๋ฒ”ํ•  ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

*y, *x = *x, *y

๋˜ํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—๋Š” ์ด๋ฏธ ์ œ์ž๋ฆฌ์— sort ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์— ํŠน์ •ํ•œ ๋ฒ„์ „์„ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ์„ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค.

type myslice []mytype
func (s myslice) Len() int { return len(s) }
func (s myslice) Less(i, j int) bool { return s[i].whatWouldAlsoBeNeededInAGenericImpl(s[j]) }
func (s myslice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }

SortableList<mytype>(myThings).Sort() ๋ณด๋‹ค ์ž…๋ ฅํ•  ๋ฐ”์ดํŠธ๊ฐ€ ๋ช‡ ๋ฐ”์ดํŠธ ๋” ๋งŽ์ง€๋งŒ ์ฝ๊ธฐ ๋ฐ€๋„๊ฐ€ _lot_ ์ ๊ณ  ๋‚˜๋จธ์ง€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ "๋ง๋”๋“ฌ"ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†์œผ๋ฉฐ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ฐ€๋Šฅ์„ฑ์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ์›์ธ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์Šคํƒ ์ถ”์ ๋งŒํผ ๋ฌด๊ฑฐ์šด ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ์œผ๋ฉฐ ์ œ๋„ค๋ฆญ์— ๋„ˆ๋ฌด ์˜์กดํ•˜๋ฉด ์ด์ ์„ ์žƒ์„๊นŒ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค.

@jesse-amano
์•ˆ์ •์ ์ธ ์ •๋ ฌ์˜ ํ•„์š”์„ฑ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋”๋ผ๋„ '์ตœ์†Œ/์ตœ๋Œ€'์˜ ๋ฌธ์ œ๋Š” ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•œ ๋ชจ๋“ˆ์˜ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋Œ€ํ•ด ์ตœ์†Œ/์ตœ๋Œ€๋ฅผ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ ์ ์ ˆํ•œ ๊ฐ€์ • ํ™•์ธ ์—†์ด ๋‹ค๋ฅธ ํŒ€ ๊ตฌ์„ฑ์›์ด ์ •๋ ฌ ๋˜๋Š” ๊ธฐํƒ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์‚ฌ์šฉํ•˜๊ณ  ์•ˆ์ •์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด์ƒํ•œ ๋ฒ„๊ทธ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋Œ€๋ถ€๋ถ„ ํ‘œ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ƒˆ๋กœ์šด ํ˜์‹ ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋Š” ๋งค์šฐ ๋“œ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์†Œ/์ตœ๋Œ€ ๋ฐ ์ •๋ ฌ์€ ๋‹จ์ง€ ์˜ˆ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์„ ํƒํ•œ ํŠน์ • ์˜ˆ์—์„œ ๊ตฌ๋ฉ์„ ๊ณ ๋ฅด๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ์•„์ฃผ ์ข‹์€ ์˜ˆ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์•˜์Œ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ค์ œ ์š”์ ์„ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋Š” "swap"์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ ์ •๋ ฌ, ํšŒ์ „, ๋ถ„ํ•  ๋“ฑ ๋งŽ์€ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปฌ๋ ‰์…˜์„ ์›ํ•˜๋Š” ๋ชจ๋“  ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋Œ€ํ•ด ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ฐ ์ง€๊ฒน๋„๋ก ๋ ˆ๋“œ/๋ธ”๋ž™ ํŠธ๋ฆฌ์™€ ๊ฐ™์€ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค๋Š” 'C'์˜ "void*"๋ณด๋‹ค ์•ฝ๊ฐ„ ๋‚ซ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด pre-order, in-order, post-order iteration, ๊ฒ€์ƒ‰๊ณผ ๊ฐ™์ด ์ด๋Ÿฌํ•œ ํŠธ๋ฆฌ ๊ฐ๊ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ์ „์— Tarjan์˜ ๋„คํŠธ์›Œํฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜(disjoint ์„ธํŠธ, ํž™, ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ, ์ตœ๋‹จ ๊ฒฝ๋กœ, ํ๋ฆ„ ๋“ฑ)

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

์–ด์จŒ๋“  ๋‚˜๋Š” 'Go'์— ๋Œ€ํ•ด ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. 'Go'๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์ข‹์€ ์ œ๋„ค๋ฆญ ์–ธ์–ด๊ฐ€ ๋˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ง€๊ธˆ ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ข‹์€ ์ œ๋„ค๋ฆญ ์–ธ์–ด๊ฐ€ ๋˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ง์ ‘์„ฑ๊ณผ ๋‹จ์ˆœ์„ฑ์„ ์žƒ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์— ๋„๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ(json ์Šคํ‚ค๋งˆ์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ฌธ๋ฒ• ํŒŒ์ผ์—์„œ ํŒŒ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ ์™ธ์—) ์–ด์จŒ๋“  ์ž˜๋ชป๋œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: "float" "string" "pointer-to-struct"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๋„ค๋ฆญ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ '์Šค์™‘'์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜• ์ง‘ํ•ฉ์—์„œ ์ž‘๋™ํ•˜๋Š” ์ผ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋งŽ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ง„์ •ํ•œ '์ผ๋ฐ˜' ๊ธฐ๋Šฅ์€ ์‹ค์ œ๋กœ ์…”ํ”Œ์— ์ œํ•œ๋˜๋ฉฐ ์ž์ฃผ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ œ๋„ค๋ฆญ์€ ์ œ๋„ค๋ฆญ ์œ ํ˜•์ด ์ผ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜ํ•ด ์ œํ•œ๋˜๋Š” ํ›จ์”ฌ ๋” ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ œ์ž๋ฆฌ ์ •๋ ฌ ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ œํ•œ๋œ ๊ฒฝ์šฐ์— '์ด๋™'์—์„œ ์ผ๋ถ€ ์ œํ•œ๋œ ์ œ๋„ค๋ฆญ์ด ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Go ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด ๋งˆ์Œ์— ๋“œ๋Š”๋ฐ, Go ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋งŽ์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง„์ •ํ•œ ์ œ์•ฝ ์ œ๋„ค๋ฆญ์„ ํ›จ์”ฌ ๋” ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ˜„์žฌ์˜ ์ œ๋„ค๋ฆญ ์ œ์•ˆ์ฒ˜๋Ÿผ ๋‘ ๋ฒˆ์งธ ์ œ์•ฝ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณ„๋กœ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์œ ํ˜•์„ ์ง์ ‘์ ์œผ๋กœ ์ œํ•œํ•˜๋Š” ์–ธ์–ด๋Š” ํ›จ์”ฌ ๋” ์šฐ์•„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ, ์ƒˆ๋กœ์šด ์ œ์•ฝ ์กฐ๊ฑด์ด ๋„์ž…๋œ ์œ ์ผํ•œ ์ด์œ ๋Š” Go๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์—ฐ์‚ฐ์ž๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ์ด์ „ ์ œ๋„ค๋ฆญ ์ œ์•ˆ์€ ์œ ํ˜•์ด ์ธํ„ฐํŽ˜์ด์Šค์— ์˜ํ•ด ์ œํ•œ๋˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ–ˆ์ง€๋งŒ '+'์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์ž์— ๋Œ€์ฒ˜ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@keean
์•„๋งˆ๋„ ์˜ค๋žœ ํ† ๋ก ์„ ํ•˜๊ธฐ์— ๋” ์ข‹์€ ๊ณณ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์•„๋งˆ ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋‘˜๋Ÿฌ๋ณธ ๊ฒฐ๊ณผ ์—ฌ๊ธฐ๊ฐ€ Go2์—์„œ ์ œ๋„ค๋ฆญ์„ ๋…ผ์˜ํ•  _the_ ์žฅ์†Œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

์•ˆ์ •์ ์ธ ์ •๋ ฌ์˜ ํ•„์š”์„ฑ์„ ํ™•์‹คํžˆ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค! sort.Stable ์ด ๊ณต๊ฐœ ๋ฆด๋ฆฌ์Šค ์ดํ›„์— ๊ฑฐ๊ธฐ์— ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์›๋ž˜ Go1 ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ž‘์„ฑ์ž๋„ ์ด๋ฅผ ์ดํ•ดํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ sort ํŒจํ‚ค์ง€์˜ ๊ฐ€์žฅ ์ข‹์€ ์ ์€ ์Šฌ๋ผ์ด์Šค์—์„œ๋งŒ ์ž‘๋™ํ•˜์ง€ _์•Š์Šต๋‹ˆ๋‹ค_๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜์‹ ์ž๊ฐ€ ์Šฌ๋ผ์ด์Šค์ผ ๋•Œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์€ ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๊ฐ’์˜ ์ˆ˜( Len() int ๋ฐฉ๋ฒ•), ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•( Less(int, int) bool ๋ฐฉ๋ฒ•) ๋ฐ ๊ตํ™˜ ๋ฐฉ๋ฒ•(๋ฌผ๋ก  Swap(int, int) ๋ฐฉ๋ฒ•). ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ sort.Interface ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์ฑ„๋„์ด ํšจ์œจ์ ์ธ ์ธ๋ฑ์‹ฑ์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌผ๋ก  ๋Š๋ฆฌ์ง€๋งŒ ๊ด€๋Œ€ํ•œ ์‹คํ–‰ ์‹œ๊ฐ„ ์˜ˆ์‚ฐ์ด ์ฃผ์–ด์ง€๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ์œผ๋กœ ์ž…์ฆ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์งค๋ง‰ํ•˜๊ฒŒ ๋”ฐ์ง€๋ ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋‚˜์œ ์˜ˆ์˜ ๋ฌธ์ œ๋Š”... ๋‚˜์˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. sort ๋ฐ min ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์€ ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ™์€ ์˜ํ–ฅ๋ ฅ์ด ํฐ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์„ ํ˜ธํ•˜๋Š” _not_ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ์˜ˆ์—์„œ ๊ตฌ๋ฉ์„ ๋šซ๋Š” ๊ฒƒ์ด ์‹ค์ œ ์š”์ ์„ ํ•ด๊ฒฐํ•œ๋‹ค๋Š” _does_๋ฅผ ๊ฝค ๊ฐ•ํ•˜๊ฒŒ ๋Š๋‚๋‹ˆ๋‹ค. _my_ ์š”์ ์€ ์–ธ์–ด์— ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ œ๋„ค๋ฆญ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jesse-amano

๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์ด๋ฏธ ์–ธ์–ด์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

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

sort , min ๋ฐ ๊ธฐํƒ€ ์ œ๋„ค๋ฆญ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ œ๋„ค๋ฆญ์˜ ์ฃผ์š” ์ด์ ์ธ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ์„ฑ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ ๋ณ€ํ™˜ ๋ฃจํ‹ด์˜ ๊ด‘๋ฒ”์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€, ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ์•ˆ์ „ํ•˜๊ณ  ๋น ๋ฅด๋ฉฐ(์ ์–ด๋„ ์ œ๋„ค๋ฆญ์—์„œ๋Š” ๊ฐ€๋Šฅ) ์ƒ์šฉ๊ตฌ, ์ƒ์„ฑ๊ธฐ, ์ธํ„ฐํŽ˜์ด์Šค{}, ๋ฆฌํ”Œ๋ ‰์…˜ ๋ฐ ๊ธฐํƒ€ ๋ชจํ˜ธํ•œ ์–ธ์–ด ๊ธฐ๋Šฅ์ด ํ•„์š” ์—†๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@ํฌ๋ ˆ์ปค

์–ด๋Š ๊ฒƒ?

๋ฌผ๊ฑด์„ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ํŒจํ‚ค์ง€ sort . sort.Interface ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์€ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์•ˆ์ •์ ์ด๊ฑฐ๋‚˜ ๋ถˆ์•ˆ์ •ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•˜์—ฌ ์ผ๋ถ€ ๋‚ด๋ถ€ ๋ฒ„์ „์€ sort ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋˜์ง€๋งŒ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž์œ ๋กญ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์‚ฌํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ API). ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ sort.Sort ๋ฐ sort.Stable ๋‘˜ ๋‹ค ์ธ์ˆ˜ ๋ชฉ๋ก์„ ํ†ตํ•ด ์ „๋‹ฌ๋œ ๊ฐ’์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์€ ์‹œ์ž‘ํ•œ ๊ฐ’๊ณผ ๋™์ผํ•˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ํ˜•์‹ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ์œ ํ˜•๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฒฝํ•˜๊ฒŒ ํ˜•์‹์ด ์•ˆ์ „ํ•˜๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ˜•์‹์ด ํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์ œ๋„ค๋ฆญ ์Šคํƒ€์ผ์˜ sort<T> ํ•จ์ˆ˜๋กœ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ตœ์ ํ™”๋ฅผ _์ ์–ด๋„_ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ถ”๋ก ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. .

๋ฌผ๊ฑด์„ ๋ฐ”๊พธ๋ ค๋ฉด ํ•œ ์ค„ x, y = y, x . ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ํ˜•์‹ ์ฃผ์žฅ, ์ธํ„ฐํŽ˜์ด์Šค ์บ์ŠคํŠธ ๋˜๋Š” ๋ฆฌํ”Œ๋ ‰์…˜์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๊ตํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ž‘์—…์ด ์œ ํ˜• ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” xerrors ํŒจํ‚ค์ง€๋„ ๋ณ„๋กœ ์ข‹์•„ํ•˜์ง€ ์•Š์ง€๋งŒ xerrors.As ๋Š” ๋น„๊ด€์šฉ์ ์ด๋ผ๋Š” ์ธ์ƒ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ json.Unmarshal ์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ API์ž…๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ๋ฌธ์„œ ๋ฐ/๋˜๋Š” ์˜ˆ์ œ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•„๋‹ˆ์š”, sort ๋ฐ min ๋Š” ๊ทธ ์ž์ฒด๋กœ ๋งค์šฐ ๋”์ฐํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ „์ž๋Š” ์ด๋ฏธ Go์— ์กด์žฌํ•˜๋ฉฐ ์ œ๋„ค๋ฆญ์ด ํ•„์š” ์—†์ด ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„์ž๋Š” ๊ฐ€์žฅ ๋„“์€ ์˜๋ฏธ์—์„œ sort ์˜ ์ถœ๋ ฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค(์ด๋ฏธ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค). ๋” ์ „๋ฌธํ™”๋˜๊ฑฐ๋‚˜ ์ตœ์ ํ™”๋œ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ œ๋„ค๋ฆญ. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ sort ํŒจํ‚ค์ง€์—๋Š” ์ƒ์„ฑ๊ธฐ, ์ธํ„ฐํŽ˜์ด์Šค{}, ๋ฆฌํ”Œ๋ ‰์…˜ ๋˜๋Š” "๋ถˆ๋ถ„๋ช…ํ•œ" ์–ธ์–ด ๊ธฐ๋Šฅ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(API์— ์ž˜ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ์บ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ์œ ์ถ”๋˜๋ฉฐ, ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์ฃผ์žฅ). ๋‹น์‹ ์ด ์ •๋ ฌํ•˜๊ณ  ์žˆ๋Š” ์ปฌ๋ ‰์…˜์ด ์Šฌ๋ผ์ด์Šค๋ผ๋ฉด ์–ด๋–ค ์ƒ์šฉ๊ตฌ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ๊ตฌ์กฐ์ฒด์ธ ๊ฒฝ์šฐ(์˜ˆ: ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”?), sort.Interface ๋ฅผ ๋งŒ์กฑํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jesse-amano

๋‚ด ์š”์ ์€ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์ด๋ฏธ ์–ธ์–ด์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ œ๋„ค๋ฆญ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ์†”๋ฃจ์…˜์€ ์‹ค์ œ๋กœ ๋ณด๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ƒ๋Œ€์ ์œผ๋กœ ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ์–ธ์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์–ธ์–ด๋ฅผ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋” ๋‚˜์€ ์ œ๋„ค๋ฆญ์ด ์กด์žฌํ•œ๋‹ค๋ฉด stdlib์— ๋” ๋‚˜์€ sort ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ํ˜„์žฌ ์ •๋ ฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ €์—๊ฒŒ ์ข‹์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์œ ์‚ฌํ•œ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์ถ”์ƒํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ•ํ•˜๊ฒŒ ๋Š๋‚€๋‹ค.

@jesse-amano

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ •๋ ฌ ํŒจํ‚ค์ง€์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ์Šฌ๋ผ์ด์Šค์—์„œ๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ํ‘œ์ค€ ์ข…๋ฅ˜๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์ „์ž๋Š” ์ด๋ฏธ Go์— ์กด์žฌํ•˜๋ฉฐ ์ œ๋„ค๋ฆญ์ด ํ•„์š” ์—†์ด ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ์ด๋ถ„๋ฒ•์ž…๋‹ˆ๋‹ค. Go์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋ฏธ ์ œ๋„ค๋ฆญ์˜ ํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์‚ฌ๋ฌผ ์ž์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ๋„ˆ๋จธ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ œํ•œ ์—†์ด ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ‘œํ˜„ํ•˜๋Š” ๊ธฐ๋Šฅ์ธ ๋ชฉํ‘œ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. '์ •๋ ฌ'์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ถ”์ƒํ™”๋Š” ์ œ๋„ค๋ฆญ์ด๋ฉฐ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ๊ธฐ๋ฒ•์ด ๋‹ค๋ฅผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

f<T>(x: T) requires Sortable(T)

์ด๋Š” 'T' ์œ ํ˜•์ด 'Sortable' ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 'Go'์—์„œ๋Š” func f(x Sortable) ๋กœ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ ์–ด๋„ Go์˜ ํ•จ์ˆ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฐ์ˆ  ๋˜๋Š” ์—ญ์ฐธ์กฐ๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. Go๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์œ ํ˜•-์ˆ ์–ด๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฝค ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ Go๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ๊ด€๊ณ„์— ๋Œ€ํ•ด ๋‹ต์ด ์—†์Šต๋‹ˆ๋‹ค.

Go์˜ ํ•œ๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์„ธ์š”.

func merge(x, y Sortable)

์—ฌ๊ธฐ์—์„œ ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ๋‘ ๊ฐ€์ง€๋ฅผ ๋ณ‘ํ•ฉํ•  ๊ฒƒ์ด์ง€๋งŒ Go์—์„œ๋Š” ์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ•์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋‹ค์Œ๊ณผ ๋Œ€์กฐํ•˜์‹ญ์‹œ์˜ค.

merge<T>(x: T, y: T) requires Sortable(T)

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๋™์ผํ•œ ๋‘ ๊ฐ€์ง€ ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ์œ ํ˜•์„ ๋ณ‘ํ•ฉํ•˜๊ณ  ์žˆ์Œ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. 'Go'๋Š” ๊ธฐ๋ณธ ์œ ํ˜• ์ •๋ณด๋ฅผ ๋ฒ„๋ฆฌ๊ณ  "์ •๋ ฌ ๊ฐ€๋Šฅํ•œ" ๋ชจ๋“  ๊ฒƒ์„ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๋นจ๊ฐ„์ƒ‰/๊ฒ€์€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Go์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋ฏธ ์ œ๋„ค๋ฆญ์˜ ํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋Š” ์ด๋ฏธ ํ•ด๊ฒฐ๋œ ๊ฒƒ์œผ๋กœ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ์ง„์ˆ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” Go๊ฐ€ ์–ด๋–ค ํ˜•ํƒœ์˜ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์• ๋งค๋ชจํ˜ธํ•จ์€ ๋ชจ๋“  ๋‹น์‚ฌ์ž์—๊ฒŒ ํ•ด๋ฅผ ๋ผ์นฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์‹ค์ œ๋กœ ์ œ๋„ค๋ฆญ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ _a_ ํ˜•์‹์ด๋ฉฐ ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ํ˜•์‹์˜ ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋งˆ์ง€๋ง‰ ๋ฌธ์ œ๋ฅผ ์ž์ฒด์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜์ง€ _ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค_. ๋”ฐ๋ผ์„œ ๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด ์ด ์ œ์•ˆ/๋ฌธ์ œ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๋„๊ตฌ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ "์ œ๋„ค๋ฆญ ์—†์ด ํ•ด๊ฒฐ๋œ" ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค. (์ „๋ถ€๋Š” ์•„๋‹์ง€๋ผ๋„ ํ˜„์‹ค ์„ธ๊ณ„์—์„œ ์ง๋ฉดํ•˜๋Š” ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์˜ ์••๋„์  ๋‹ค์ˆ˜๊ฐ€ ๊ทธ ์„ธํŠธ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋‹จ์ง€ ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋‘ ๊ฐ™์€ ์–ธ์–ด๋กœ ๋งํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

๊ณ ๋ ค: func merge(x, y Sortable)

์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ๋‘ ๊ฐ€์ง€(๋˜๋Š” sort.Interface ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ•ญ๋ชฉ)๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ด _์ผ๋ฐ˜์ ์œผ๋กœ_ ๋‘ ์ปฌ๋ ‰์…˜์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์ด์œ ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์กฐ๊ฐ์˜ ๊ฒฝ์šฐ append ์ž…๋‹ˆ๋‹ค. ์ง€๋„์˜ ๊ฒฝ์šฐ for k, v := range m { n[k] = v } ์ž…๋‹ˆ๋‹ค. ๋” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๊ฒฝ์šฐ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ํ•„์—ฐ์ ์œผ๋กœ ๋” ๋ณต์žกํ•œ ๋ณ‘ํ•ฉ ์ „๋žต์ด ์žˆ์Šต๋‹ˆ๋‹ค(๊ตฌ์กฐ์— ํ•„์š”ํ•œ ์ผ๋ถ€ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์ฝ˜ํ…์ธ ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ). ํŒŒํ‹ฐ์…˜์„ ๋ถ„ํ• ํ•˜๊ณ  ๋‹ค์‹œ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•œ ํ•˜์œ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•˜๋Š” ๋” ๋ณต์žกํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ํ•„์š”ํ•œ ๊ฒƒ์€ ํŒŒํ‹ฐ์…˜์ด "์ •๋ ฌ ๊ฐ€๋Šฅ"ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŒŒํ‹ฐ์…˜์ด ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ์ด๋ฏธ _์ •๋ ฌ_๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ์ด๋ฉฐ ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ์ด ์–ด๋–ค ๋ถ„๋ช…ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹น์—ฐํžˆ ๋ณ‘ํ•ฉ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋งค์šฐ ์—„๊ฒฉํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์›ํ•  ๊ฒƒ์ด์ง€๋งŒ ํ™•์‹คํžˆ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ถ€๋‹ด์„ ์ฃผ๋Š” _exported_ API๋ฅผ ๋…ธ์ถœํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Go๊ฐ€ ๋ฆฌํ”Œ๋ ‰์…˜, ์œ ํ˜• ์ „ํ™˜ ๋“ฑ ์—†์ด ๋™์ผํ•œ ์œ ํ˜•์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ์ ์— ๋Œ€ํ•ด ํฅ๋ฏธ๋กœ์šด ์ง€์ ์„ ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์ €๋Š” interface{} ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜•์‹ ์•ˆ์ „์„ ์œ„ํ•œ API ๋ž˜ํ•‘๊ณผ ๊ด€๋ จ๋œ ์ƒ์šฉ๊ตฌ๋กœ์„œ์˜ ๋ฒ”์šฉ ์ปจํ…Œ์ด๋„ˆ(์˜ˆ: ์ˆœํ™˜ ์—ฐ๊ฒฐ ๋ชฉ๋ก)์˜ ๊ฒฝ์šฐ๋Š” ์ ˆ๋Œ€์ ์œผ๋กœ ์‚ฌ์†Œํ•ฉ๋‹ˆ๋‹ค.

type MyStack struct { stack Stack }
func (s *MyStack) Push(v MyType) error { return s.stack.Push(v) }
func (s *MyStack) Pop() (MyType, error) {
  v, err := s.stack.Pop()
  var m MyType
  if v != nil {
    if m, ok := v.(MyType); ok { return m, err; }
    panic("this code should be unreachable from the exported API")
  }
  return nil, err
}

์ด ์ƒ์šฉ๊ตฌ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ด์œ ๋ฅผ ์ƒ์ƒํ•˜๊ธฐ ํž˜๋“ค์ง€๋งŒ ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ํ•ฉ๋ฆฌ์ ์ธ ๋Œ€์•ˆ์ด (text/) ํ…œํ”Œ๋ฆฟ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ์„ ์ •์˜ํ•˜๋ ค๋Š” ์œ ํ˜•์— //go:generate stackify MyType github.com/me/myproject/mytype ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๊ณ  go generate ๊ฐ€ ์ƒ์šฉ๊ตฌ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. cmd/stackify/stackify_test.go ์ ์–ด๋„ ํ•˜๋‚˜์˜ ๊ตฌ์กฐ์ฒด์™€ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋‚ด์žฅ ์œ ํ˜•์œผ๋กœ ์‹œ๋„ํ•˜๊ณ  ์ปดํŒŒ์ผํ•˜๊ณ  ํ†ต๊ณผํ•˜๋Š” ํ•œ ์ด๊ฒƒ์ด ์™œ ๋ฌธ์ œ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ฝค ๋น„์Šทํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์„ ์ •์˜ํ–ˆ๋‹ค๋ฉด ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ "ํ›„๋“œ์—์„œ" ์ˆ˜ํ–‰ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ์˜ค๋ฅ˜๊ฐ€ ๋œ ์กฐ๋ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋” ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(๋˜ํ•œ "๋ฌผ๊ฑด์˜ ์ปจํ…Œ์ด๋„ˆ" ๋ฒ”์ฃผ์— ์†ํ•˜์ง€ ์•Š๋Š” ๋™์ผํ•œ ์œ ํ˜•์˜ ๋‘ ๊ฐ€์ง€์— ๋” ๊ด€์‹ฌ์ด ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ _๋ฌด์–ธ๊ฐ€_๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด์— ์ผ๋ฐ˜ ํ…œํ”Œ๋ฆฟ ๊ตฌ์„ฑ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์ƒ์šฉ๊ตฌ๊ฐ€ ๋ฌธ์ œ๊ฐ€ _์•„๋‹ˆ๋ฉด_ ๊ฐ€์ •ํ•˜๋ฉด ํ˜ธ์ถœ์ž๊ฐ€ sort ๋˜๋Š” encoding/json ์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๋ ˆ๋“œ/๋ธ”๋ž™ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ถ„๋ช…ํžˆ ์‹คํŒจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด... ๊ธ€์Ž„์š”, ์ €๋Š” ๊ทธ๋ ‡๊ฒŒ ๋˜‘๋˜‘ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊ฐ€๊นŒ์ด ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์˜ˆ์ œ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์€ here ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์™„์ „ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค(๋ช‡ ์‹œ๊ฐ„ ์•ˆ์— ํ•จ๊ป˜ ๋˜์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ). ๋ฌผ๋ก  ์œ ์‚ฌํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์‹œ๋„ ๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค .

@jesse-amano

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋Š” ์ด๋ฏธ > ํ•ด๊ฒฐ๋œ ๊ฒƒ์œผ๋กœ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ์ง„์ˆ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

์ธํ„ฐํŽ˜์ด์Šค๋Š” ์˜๋ฏธ์ƒ Haskell์˜ ์œ ํ˜• ํด๋ž˜์Šค์™€ ์œ ์‚ฌํ•˜๋ฉฐ ์ด๋Ÿฌํ•œ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” _do_ ํ•˜๋Š” Rust์˜ ํŠน์„ฑ์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ํด๋ž˜์Šค์™€ ํŠน์„ฑ์€ C++ ํ…œํ”Œ๋ฆฟ์ด ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ชจ๋“  ์ผ๋ฐ˜ ๋ฌธ์ œ๋ฅผ ์œ ํ˜•์— ์•ˆ์ „ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์ƒ์šฉ๊ตฌ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ด์œ ๋ฅผ ์ƒ์ƒํ•˜๊ธฐ ํž˜๋“ค์ง€๋งŒ ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ํ•ฉ๋ฆฌ์ ์ธ ๋Œ€์•ˆ์ด (text/) ํ…œํ”Œ๋ฆฟ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์ƒ์šฉ๊ตฌ์— ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ์ƒ์šฉ๊ตฌ๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ์š•๊ตฌ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ์„œ ๊ทธ๊ฒƒ์€ ์ง€๋ฃจํ•˜๊ณ  ๋ฐ˜๋ณต์ ์ด๋ฉฐ ํ”ผํ•ด์•ผ ํ•  ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๊ฐœ์ธ์ ์œผ๋กœ '์Šคํƒ' ์ธํ„ฐํŽ˜์ด์Šค/์œ ํ˜• ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ '์Šคํƒ ๊ฐ€๋Šฅ'ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” _์˜ฌ๋ฐ”๋ฅธ_ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

mul<T>(x, y T) T requires Addable(T) {
    r := 0
    for i := 0; i < y; ++i  {
        r = r + x
    }
    return r
}

'+'์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋ ค๋ฉด x ๋ฐ y ๊ฐ€ ์ˆซ์ž์ด์ง€๋งŒ ๋‘˜ ๋‹ค ๋™์ผํ•œ ๊ธฐ๋ณธ ์œ ํ˜•์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

type Stack<T> interface {...}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌด์—‡๋ณด๋‹ค๋„ T T ๋งค๊ฐœ๋ณ€์ˆ˜์  ๊ตฌํ˜„์„ โ€‹โ€‹์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ํ‘ธ์‹œ ๋ฐ ๋™์ผํ•œ MyStack ์ธ์Šคํ„ด์Šค์—์„œ Pop์€ ๋™์ผํ•œ '๊ฐ’' ์œ ํ˜•์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‘ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ผ๋ฐ˜ ๋ ˆ๋“œ/๋ธ”๋ž™ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค ์—†์ด๋Š” ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜์ง€๋งŒ ์Šคํƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ ˆ๋“œ/๋ธ”๋ž™ ํŠธ๋ฆฌ์— ๋„ฃ์œผ๋ ค๋Š” ๊ฐ ์œ ํ˜•์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ด€์ ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์œ„์˜ ๋‘ ๊ฐ€์ง€ ํ™•์žฅ์€ Go๊ฐ€ '์ œ๋„ค๋ฆญ'์„ ์™„์ „ํžˆ ์ง€์›ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jesse-amano
๋ ˆ๋“œ/๋ธ”๋ž™ ํŠธ๋ฆฌ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ •๋ง๋กœ ์›ํ•˜๋Š” ๊ฒƒ์€ ๋ ˆ๋“œ/๋ธ”๋ž™ ํŠธ๋ฆฌ์˜ ์ •์˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ตฌํ˜„ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type Map<Key, Value> interface {
   put(x Key, y Value) 
   get(x Key) Value
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋นจ๊ฐ„์ƒ‰/๊ฒ€์€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ๊ตฌํ˜„์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”, ๋ ˆ๋“œ ๋ธ”๋ž™ ํŠธ๋ฆฌ ๋˜๋Š” BTree๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

f<K, V, T>(index T) T requires Map<K, V> {
   ...
}

์ด์ œ f ๊ฐ€ ๋ฌด์—‡์ด๋“  Map์˜ ๊ตฌํ˜„๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. f ๋Š” ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด red/ ๋ธ”๋ž™ ํŠธ๋ฆฌ ๋˜๋Š” ํ•ด์‹œ ๋งต.

์ง€๊ธˆ์ฒ˜๋Ÿผ ์ด๋™ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŠน์ • ๋งต์„ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

type MapIntString interface {
   put(x Int, y String)
   get(x Int) String
}

๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€๋Š” ์•Š์ง€๋งŒ '๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ' ํ•จ์ˆ˜ f ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ํ‚ค ๋ฐ ๊ฐ’ ์œ ํ˜•์˜ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์— ๋Œ€ํ•ด ์ž‘์„ฑ๋˜์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ํ‚ค์™€ ๊ฐ’์˜ ์œ ํ˜•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@keean ๋งˆ์ง€๋ง‰ ์˜๊ฒฌ์— ๋™์˜ํ•˜์ง€๋งŒ, ์–ด๋ ค์›€์€ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฉ๊ธˆ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ์•Œ๋ ค์ง„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” Go์—์„œ ๋นจ๊ฐ„์ƒ‰/๊ฒ€์ • ํŠธ๋ฆฌ๋ฅผ ์ž‘์„ฑ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์ด ์—†์œผ๋ฉด ์œ ํ˜•์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด interface{} ๋ฐ/๋˜๋Š” ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋‘ ์ ‘๊ทผ ๋ฐฉ์‹ ๋ชจ๋‘ ๋Š๋ฆฌ๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

@keean

์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ œ๋„ค๋ฆญ์˜ ํ•œ ํ˜•ํƒœ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธํ„ฐํŽ˜์ด์Šค ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ฐœ์„ ํ•˜๋ฉด ์ œ๋„ค๋ฆญ์˜ ๋ชจ๋“  ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋นจ๊ฐ„์ƒ‰/๊ฒ€์€์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ ˆ๋“œ/๋ธ”๋ž™ ํŠธ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์š”์†Œ์— "์•ฝํ•œ" ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ Less(v interface{}) bool ๋ผ๋Š” ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•˜์ง€๋งŒ ํ˜ธ์ถœ์ž์—๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ์ด๋ฆ„์ด Less(v interface{}) bool ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์ž‘๋™ํ•˜๋„๋ก ์ƒ์šฉ๊ตฌ ๋ž˜ํผ/์‹ฌ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž์˜ ๋ชซ์ž…๋‹ˆ๋‹ค.

๋ ˆ๋“œ/๋ธ”๋ž™ ํŠธ๋ฆฌ์— ํฌํ•จ๋œ ์š”์†Œ์— ์•ก์„ธ์Šคํ•  ๋•Œ interface{} ๋ฅผ ์–ป์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•œ _is_ ๋ ˆ๋“œ/๋ธ”๋ž™ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ์ œ ๋ณด์ฆ์„ ๊ธฐ๊บผ์ด ์‹ ๋ขฐํ•œ๋‹ค๋ฉด ์™œ ' ์ž…๋ ฅํ•œ ์š”์†Œ์˜ ์œ ํ˜•์ด ๋‚˜์˜ค๋Š” ์š”์†Œ์˜ ์œ ํ˜•๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์œผ์‹ญ์‹œ์˜ค. ์ด ๋‘ ๊ฐ€์ง€ ๋ณด์žฅ์„ ๋ชจ๋‘ _do_ ์‹ ๋ขฐํ•œ๋‹ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ค๋ฅ˜๊ฐ€ ์ „ํ˜€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜•์‹ ์ฃผ์žฅ์„ ํฌํ•จํ•˜๋Š” ์ˆ˜์‹ญ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ(๋˜๋Š” ๋ถ™์—ฌ๋„ฃ๊ธฐ)ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋‹น์‹ ์€ ๋‹น์‹ ์ด ์›ํ•˜๋Š” ์ •ํ™•ํ•œ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์™„๋ฒฝํ•˜๊ฒŒ ์•ˆ์ „ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๊ฐ€ _exact_ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์— ๋Œ€ํ•ด ๊ฑฐ๊พธ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” Java ์Šคํƒ€์ผ ์—์ฝ”์‹œ์Šคํ…œ์—์„œ(์–ธ์–ด๊ฐ€ class MyClassImpl extends AbstractMyClass implements IMyClass ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ์ด๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ _๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค) ์ถ”๊ฐ€ ๊ด€๋ฃŒ์ฃผ์˜๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กฐ์ง์˜ ์ฝ”๋”ฉ ํ‘œ์ค€(์ด๋Š” ๋” ๋งŽ์€ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋™์ผํ•œ ์–‘์˜ ์ƒ์šฉ๊ตฌ)์— ๋งž๋„๋ก ์™ธ๊ด€์„ ๋งŒ๋“ค๊ฑฐ๋‚˜, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด๊ฒƒ์ด "์˜ˆ์™ธ"๊ฐ€ ๋˜๋„๋ก ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์กฐ์ง์˜ ์ฝ”๋”ฉ ํ‘œ์ค€(๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ ์กฐ์ง์€ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ์™€ ๊ฐ™์ด ํ‘œ์ค€์— ๋งŽ์€ ์˜ˆ์™ธ๊ฐ€ ์žˆ์Œ) ๋˜๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ข‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์„ ํฌ๊ธฐํ•ฉ๋‹ˆ๋‹ค(๋…ผ์ฆ์„ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ํ›Œ๋ฅญํ•˜๋‹ค๊ณ  ๊ฐ€์ •).

์ด์ƒ์ ์œผ๋กœ๋Š” ๊ตฌํ˜„์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”, ๋ ˆ๋“œ ๋ธ”๋ž™ ํŠธ๋ฆฌ ๋˜๋Š” BTree๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ์ด์ƒ์— ๋™์˜ํ•˜์ง€๋งŒ ๋ฐ”๋‘‘์€ ์ด๋ฏธ ๊ทธ๊ฒƒ์„ ๋งŒ์กฑ์‹œํ‚จ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ:

type MyStorage interface {
  Get(KeyType) (ValueType, error)
  Put(KeyType, ValueType) error
}

๋ˆ„๋ฝ๋œ ์œ ์ผํ•œ ๊ฒƒ์€ KeyType ๋ฐ ValueType ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋ฉฐ ์ด๊ฒƒ์ด ํŠนํžˆ ์ค‘์š”ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋ ˆ๋“œ/๋ธ”๋ž™ ํŠธ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ (๊ฐ€์ƒ์˜) ์œ ์ง€ ๊ด€๋ฆฌ์ž๋กœ์„œ ๋‚˜๋Š” ๋‹น์‹ ์˜ ์œ ํ˜•์ด ๋ฌด์—‡์ธ์ง€ ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "์ผ๋ถ€ ๋ฐ์ดํ„ฐ"๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“  ํ•ต์‹ฌ ๊ธฐ๋Šฅ์— interface{} ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  string ๋ฐ int ์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ์œ ํ˜•์—์„œ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก _์–ด์ฉŒ๋ฉด_ ์ผ๋ถ€ ๋‚ด๋ณด๋‚ธ ์˜ˆ์ œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์ด ์ฝ”๋“œ๊ฐ€ _๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด_ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด, ํ‚ค/๊ฐ’ ์ €์žฅ์†Œ์˜ ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”์ƒ์ ์ธ ํ‚ค/๊ฐ’ ์ €์žฅ์†Œ "๊ฐœ๋…"์„ ์ „๋‹ฌํ•˜๋ฉด ํ‚ค/๊ฐ’ ์ €์žฅ์†Œ๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ๋ฐฉ๋ฒ•์˜ ๋ณต์žก์„ฑ์ด ์ˆจ๊ฒจ์ง€๊ณ  ๋‚ด ํŒ€์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์—…์— ๋Œ€ํ•ด ์ž˜๋ชป๋œ ๊ฒƒ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ‚ค์— ๋Œ€ํ•œ ์ง€์‹์ด ์žˆ๋Š” ๋ฏธ๋ž˜ ๋ฒ„์ „ ํฌํ•จ /value ์Šคํ† ๋ฆฌ์ง€ ๊ตฌํ˜„์ด ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ํŽ˜์ด์ง•๋˜์—ˆ์Šต๋‹ˆ๋‹ค!). ์ฝ”๋“œ ๊ฒ€ํ† ์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ์ตœ์„ ์˜ ๋…ธ๋ ฅ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ํ•ด๋‹น ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—๋Š” ์ผ๋ถ€ ํ‚ค/๊ฐ’ ์ €์žฅ์†Œ๊ฐ€ DB ์—ฐ๊ฒฐ์— ์˜์กดํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฏธ๋ฌ˜ํ•œ ๊ตฌํ˜„ ์ข…์† ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ณด๊ณ ์„œ๊ฐ€ ํฐ ์Šคํƒ ์ถ”์ ๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๊ณ  _real_ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์Šคํƒ ์ถ”์ ์˜ ์œ ์ผํ•œ ๋ผ์ธ์ด ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ธ์„ ๊ฐ€๋ฆฌํ‚ค๋ฉด ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ด ์ƒ์„ฑ๋œ ์ฝ”๋“œ(์ด ๋Ÿฐํƒ€์ž„์—์„œ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Œ) ์ผ๋ฐ˜ ๊ตฌ์กฐ์ฒด ๋Œ€์‹  ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@jesse-amano
๋‚˜๋Š” ๋‹น์‹ ์—๊ฒŒ ๋™์˜ํ•˜๊ณ  "์‚ฌ์šฉ์ž" ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ ๋ฐฉ์‹์„ ์ถ”์ƒํ™”ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•œ ๋‹ค์Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์ข…์†์„ฑ์— ๋Œ€ํ•œ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์„ ์ž‘์„ฑํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” '์ด๋™' ๋ฐฉ์‹์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋‹จ ์–ป์œผ๋ฉด ๋งค์šฐ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์ผ๋ฐ˜ ์–ธ์–ด๋กœ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • RBTree<Int, String> ์™€ ๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์€ ์‚ฌ์šฉ์ž ์ปฌ๋ ‰์…˜์˜ ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • f<T>(x, y T) T ์™€ ๊ฐ™์€ ์œ ํ˜• ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋‹คํ˜•์„ฑ์ธ ๋ง์…ˆ, ๋บ„์…ˆ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ด€๋ จ ํ•จ์ˆ˜ ํŒจ๋ฐ€๋ฆฌ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ธ์ˆ˜๊ฐ€ ๋™์ผํ•œ ๊ธฐ๋ณธ ์œ ํ˜•์ด์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • f<T: Addable>(x, y T) T ์™€ ๊ฐ™์€ ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์€ ์œ ํ˜• ๋ณ€์ˆ˜์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๋ณ€์ˆ˜๋ฅผ ๋„์ž…ํ•˜๋ฉด Addable ๋ฅผ ์œ ํ˜•์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๋Œ€์‹  ํ•ด๋‹น ์œ ํ˜• ๋ณ€์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Addable ๋ฅผ ์œ ํ˜•์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  f(x, y Addable) Addable x ๋ฐ y ์˜ ์›๋ž˜ ๊ธฐ๋ณธ ์œ ํ˜•์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ๋˜๋Š” ๋ฐ˜ํ™˜๋œ ์œ ํ˜•.
  • type<K, V> Map<K, V> interface {...} ์™€ ๊ฐ™์€ ๋‹ค์ค‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” merge<K, V, T: Map<K, V>>(x, y T) T ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด ๊ฒฝ์šฐ ํ‚ค์™€ ๊ฐ’๋„ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๋„์˜ ์ข…๋ฅ˜.

๋‚˜๋Š” ์ด๊ฒƒ๋“ค ๊ฐ๊ฐ์ด ์–ธ์–ด์˜ ์ถ”์ƒ์ ์ธ ํž˜์„ ์ฆ๊ฐ€์‹œํ‚ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ง„ํ–‰ ์ƒํ™ฉ์ด๋‚˜ ์ผ์ •์€?

@leaxoy GopherCon ์—์„œ @ianlancetaylor ์˜ "Generics in Go"์— ๋Œ€ํ•œ ๊ฐ•์—ฐ์ด ์˜ˆ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์—ฐ์„ค์—์„œ ํ˜„์žฌ ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ๋“ค์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

@griesemer ๋งํฌ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@keean ์—ฌ๊ธฐ์„œ Rust์˜ Where ์ ˆ๋„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋Š” type constraints ์ œ์•ˆ์„ ๊ฐœ์„ ํ•œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ๋ฐ˜์˜ ์—†์ด ์œ ํ˜•์„ ๊ฒ€์‚ฌํ•  "์ฟผ๋ฆฌ ์ „์— ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘"๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋น„๋””์˜ค๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค: https://www.youtube.com/watch?v=jSpio0x7024

@jadbox ๋‚ด ์„ค๋ช…์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฃ„์†กํ•˜์ง€๋งŒ 'where' ์ ˆ์€ ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ฑฐ์˜ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. Rust์—์„œ 'where' ๋’ค์— ์˜ค๋Š” ๊ฒƒ์€ ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด์ด์ง€๋งŒ ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ 'requires'๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ์ž‘์—…์€ ์ตœ์†Œ 10๋…„ ์ „์— Haskell์—์„œ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, Haskell์€ ํ˜•์‹ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ํ˜•์‹ ์„œ๋ช…์—์„œ '=>' ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

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

merge<K, V, T>(x, y T) T requires T: Map<K, V>

๊ทธ๋Ÿฌ๋‚˜ ๊ธด ์ œ์•ฝ ์กฐ๊ฑด ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ๋” ์ฝ๊ธฐ ์‰ฌ์šด ๊ตฌ๋ฌธ์„ ์ œ์™ธํ•˜๊ณ  ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์— ์‹ค์ œ๋กœ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ดˆ๊ธฐ ์„ ์–ธ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅํ•œ ํ›„ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋„ฃ์–ด 'where' ์ ˆ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

merge<K, V, T: Map<K, V>>(x, y T) T

์œ ํ˜• ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์ „์— ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๊ฑฐ๊ธฐ์— ๋ชจ๋“  ์ œ์•ฝ ์กฐ๊ฑด์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์œ ํ˜• ๋ณ€์ˆ˜์— ์—ฌ๋Ÿฌ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ 'where'/'requires' ์ ˆ์˜ ์œ ์ผํ•œ ์žฅ์ ์€ ๋ชจ๋“  ์œ ํ˜• ๋ณ€์ˆ˜๊ฐ€ ์ด๋ฏธ ์„ ์–ธ๋˜์–ด ์žˆ์–ด ํŒŒ์„œ์™€ ์ข…๋ฅ˜ ์ถ”๋ก ์ด ๋” ์‰ฌ์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ตœ๊ทผ์— ๋ฐœํ‘œ๋œ ํ˜„์žฌ/์ตœ์‹  ์ž‘์—… Go 2 Generics ์ œ์•ˆ ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ/ํ† ๋ก ์„ ์œ„ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๊นŒ?

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

Go 2 Generics์— ๋Œ€ํ•ด Type ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ Generic์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๊นŒ?

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

์‚ฌ๋žŒ๋“ค์ด ์ƒ์ˆ˜ ๊ฐ’์— ๋Œ€ํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํ•จ์ˆ˜๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์›ํ• ์ง€ ์•„์ง ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋ช…๋ฐฑํ•œ ๊ฒฝ์šฐ๋Š” ๋ฐฐ์—ด ์ฐจ์›์— ๋Œ€ํ•œ ๊ฒƒ์ด์ง€๋งŒ ์›ํ•˜๋Š” ๋ฐฐ์—ด ์œ ํ˜•์„ ์œ ํ˜• ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜์—ฌ ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฝ์šฐ ์™ธ์— const๋ฅผ ๋Ÿฐํƒ€์ž„ ์ธ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜์—ฌ ์‹ค์ œ๋กœ ์–ป๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Go๋Š” ์ด๋ฏธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•˜๊ณ  ํ›Œ๋ฅญํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ์ •๋ง ํฐ ๋ฌธ์ œ์™€ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜์ง€ ์•Š๋Š” ํ•œ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์ถ”๊ฐ€ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ง€๋ถˆํ•ด์•ผ ํ•  ๋†’์€ ๊ฐ€๊ฒฉ.

Go๋Š” ๋ฐ”๋กœ ๊ทธ ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ๋…ํŠนํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์žฅ๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ณ ์น˜๋ ค๊ณ  ํ•˜์ง€ ๋งˆ์„ธ์š” !

Go๊ฐ€ ์„ค๊ณ„๋œ ๋ฐฉ์‹์— ๋ถˆ๋งŒ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ด ์ถ”๊ฐ€๋˜๊ณ  ์„ฑ๊ฐ€์‹  ๋ณต์žก์„ฑ์„ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆ˜๋งŽ์€ ๋‹ค๋ฅธ ์–ธ์–ด ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Go๋Š” ๋ฐ”๋กœ ๊ทธ ๋ฐฉ์‹ ๋•Œ๋ฌธ์— ๋…ํŠนํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์žฅ๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ณ ์น˜๋ ค๊ณ  ํ•˜์ง€ ๋งˆ์„ธ์š”!

๊ณ ์žฅ๋‚ฌ์œผ๋‹ˆ ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์žฅ๋‚ฌ์œผ๋‹ˆ ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๊ณผ๊ฑฐ ๋ฉ”๊ฐ€ ์ด์Šˆ์— ์ฐธ์—ฌํ•œ ์ ์ด ์žˆ์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด Gopher Slack์— ์ฑ„๋„์„ ๊ฐœ์„คํ•˜๊ณ  ์ด์Šˆ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ž ๊ทผ ๋‹ค์Œ ํ†ตํ•ฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ด์Šˆ๊ฐ€ ๊ณ ์ • ํ•ด์ œ๋˜๋Š” ์‹œ๊ฐ„์„ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Slack์˜ ํ† ๋ก ? "478๊ฐœ์˜ ์ˆจ๊ฒจ์ง„ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€๋กœ ๋กœ๋“œ..." ๋งํฌ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด Github ๋ฌธ์ œ๋Š” ๋” ์ด์ƒ ํฌ๋Ÿผ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด Gopher Slack์— ์ฑ„๋„์„ ๊ฐœ์„คํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.
๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ๋Š” ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•œ ์•„์นด์ด๋ธŒ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์š”์•ฝ์„ ๊ณ„์† ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณผ๊ฑฐ ๋ฉ”๊ฐ€ ์ด์Šˆ์— ์ฐธ์—ฌํ•œ ์ ์ด ์žˆ์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด Gopher Slack์— ์ฑ„๋„์„ ๊ฐœ์„คํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํ† ๋ก ์„ ํ์‡„ํ˜• ํ”Œ๋žซํผ์œผ๋กœ ์™„์ „ํžˆ ์˜ฎ๊ธฐ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์–ด๋””์—์„œ๋‚˜ golang-nuts๋Š” ๋ชจ๋‘๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ(ish? ์‹ค์ œ๋กœ Google ๊ณ„์ • ์—†์ด๋„ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ ์–ด๋„ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๊ฐ–๊ณ  ์žˆ๊ฑฐ๋‚˜ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ ํ†ต์‹  ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค) ๊ทธ๊ณณ์œผ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค. . GitHub๋Š” ์ถฉ๋ถ„ํžˆ ๋‚˜์˜์ง€๋งŒ, ๋ชจ๋“  ์‚ฌ๋žŒ์ด Slack ๊ณ„์ •์„ ์–ป๊ฑฐ๋‚˜ ๋”์ฐํ•œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ชจ๋“  ์‚ฌ๋žŒ์ด Slack ๊ณ„์ •์„ ์–ป๊ฑฐ๋‚˜ ๋”์ฐํ•œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ "ํ•  ์ˆ˜ ์žˆ๋‹ค"๋Š” ๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์•Œ์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” Slack์— ๋Œ€ํ•œ ์‹ค์ œ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ›„์ž๋Š” ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ Microsoft๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Github๋„ ๋ณด์ด์ฝงํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ์žƒ๊ณ  ๋ˆ„๊ตฐ๊ฐ€๋Š” ์–ป์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์‚ฌ๋žŒ์ด Slack ๊ณ„์ •์„ ์–ป๊ฑฐ๋‚˜ ๋”์ฐํ•œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ "ํ•  ์ˆ˜ ์žˆ๋‹ค"๋Š” ๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์•Œ์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” Slack์— ๋Œ€ํ•œ ์‹ค์ œ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ›„์ž๋Š” ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ Microsoft๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Github๋„ ๋ณด์ด์ฝงํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ์žƒ๊ณ  ๋ˆ„๊ตฐ๊ฐ€๋Š” ์–ป์Šต๋‹ˆ๋‹ค.

Slack์€ ๋ฏธ๊ตญ ํšŒ์‚ฌ์ด๋ฏ€๋กœ ๋ฏธ๊ตญ์ด ๋ถ€๊ณผํ•˜๋Š” ๋ชจ๋“  ์™ธ๊ต ์ •์ฑ…์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

Github์—๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์•„๋ฌด๋Ÿฐ ๊ฒฝ๊ณ ๋„ ์—†์ด ์ด๋ž€์ธ์„ ์ซ“์•„๋‚ธ๋‹ค๋Š” ๋‰ด์Šค์— ๋‚˜์™”์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํ•œ ์ผ์ด์ง€๋งŒ Tor๋‚˜ IPFS ๋“ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ์‹ค์ œ ํ† ๋ก  ํฌ๋Ÿผ์—์„œ๋Š” ๋ฏธ๊ตญ/์œ ๋Ÿฝ ๋ฒ•๋ฅ ์„ ์กด์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Github์—๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์•„๋ฌด๋Ÿฐ ๊ฒฝ๊ณ ๋„ ์—†์ด ์ด๋ž€์ธ์„ ์ซ“์•„๋‚ธ๋‹ค๋Š” ๋‰ด์Šค์— ๋‚˜์™”์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํ•œ ์ผ์ด์ง€๋งŒ Tor๋‚˜ IPFS ๋“ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ์‹ค์ œ ํ† ๋ก  ํฌ๋Ÿผ์—์„œ๋Š” ๋ฏธ๊ตญ/์œ ๋Ÿฝ ๋ฒ•๋ฅ ์„ ์กด์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์šฐ๋ฆฌ๋Š” GitHub ๋ฐ Google ๊ทธ๋ฃน์Šค์— ๊ฐ‡ํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฉ๋ก์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ๋” ์ถ”๊ฐ€ํ•˜์ง€ ๋ง™์‹œ๋‹ค. ๋˜ํ•œ ์ฑ„ํŒ…์€ ์ข‹์€ ์•„์นด์ด๋ธŒ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ํ† ๋ก ์ด ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ๊ณ  golang-nuts(๋ฐ›์€ ํŽธ์ง€ํ•จ์œผ๋กœ ๋ฐ”๋กœ ์˜ค๋Š” ๊ณณ)์— ์žˆ์„ ๋•Œ ์ด๋Ÿฌํ•œ ํ† ๋ก ์„ ํŒŒํ—ค์น˜๋Š” ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. Slack์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๊ฐ™์€ ์‹œ๊ฐ„๋Œ€์— ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋Œ€๋Ÿ‰์˜ ์ฑ„ํŒ… ์•„์นด์ด๋ธŒ, ๋น„ ๊ฒฉ๋ฆฌ์ž ๋“ฑ์„ ํ†ตํ•ด ๊ฑธ์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ๋Š” ์ ์–ด๋„ ์–ด๋Š ์ •๋„ ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ  ์‚ฌ๋žŒ๋“ค์€ ๋‹ต์žฅ์— ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜์—ฌ ๋ฌด์‹ฌ์ฝ” ๋‚จ๊ฒจ์ง„ ๋ฌด์ž‘์œ„ 1ํšŒ์„ฑ ๋Œ“๊ธ€์„ ๋ฐ›์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚˜๋Š” Slack ๊ณ„์ •์ด ์—†๊ณ  ๊ทธ๋“ค์˜ ์–ด๋ฆฌ์„์€ ํด๋ผ์ด์–ธํŠธ๋Š” ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋–ค ์ปดํ“จํ„ฐ์—์„œ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— Mutt(๋˜๋Š” ์„ ํƒํ•œ ์ด๋ฉ”์ผ ํด๋ผ์ด์–ธํŠธ, ์˜ˆ์˜ ํ‘œ์ค€)๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ด ๋ฌธ์ œ๋ฅผ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค. GitHub ๋ฌธ์ œ ์ถ”์ ๊ธฐ๊ฐ€ ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ํ† ๋ก ์— ์ด์ƒ์ ์ด์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋…ผ์˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์œ„์˜ ์—ฌ๋Ÿฌ ๋Œ“๊ธ€์„ "์ฃผ์ œ ์™ธ"๋กœ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

Go์˜ ๋…์ฐฝ์„ฑ์— ๊ด€ํ•˜์—ฌ: Go์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ข‹์€ ๊ธฐ๋Šฅ์ด ์žˆ์ง€๋งŒ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋งŒํผ ๊ณ ์œ ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์˜ˆ๋กœ์„œ CLU์™€ Modula-3๋Š” ์œ ์‚ฌํ•œ ๋ชฉํ‘œ์™€ ์œ ์‚ฌํ•œ ๋ณด์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋‘˜ ๋‹ค ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ์ œ๋„ค๋ฆญ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค(CLU์˜ ๊ฒฝ์šฐ ~1975๋…„๋ถ€ํ„ฐ!) ๊ทธ๋“ค์€ ํ˜„์žฌ ์‚ฐ์—… ์ง€์›์ด ์—†์ง€๋งŒ FWIW๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ.

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

์ œ์•ˆ์„œ์— ์žˆ๋Š” ๋ฐฉ์‹์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ณ ๋ คํ•ด๋ณผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์‹ ์—:

type Vector(type Element) []Element
var v Vector(int)
func (v *Vector(Element)) Push(x Element) { *v = append(*v, x) }
type VectorInt = Vector(int)

์šฐ๋ฆฌ๋Š” ๊ฐ€์งˆ ์ˆ˜ ์žˆ์—ˆ๋‹ค

type Vector<Element> []Element
var v Vector<int>
func (v *Vector<Element>) Push(x Element) { *v = append(*v, x) }
type VectorInt = Vector<int>

<> ๊ตฌ๋ฌธ์€ ์ดˆ์•ˆ @jnericks ์— ์–ธ๊ธ‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(๊ท€ํ•˜์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์€ ์ด ํ† ๋ก ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค...). ์ด์— ๋Œ€ํ•œ ์ฃผ์š” ์ฃผ์žฅ์€ ํŒŒ์„œ์˜ ๋ณต์žก์„ฑ์„ ์—„์ฒญ๋‚˜๊ฒŒ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ผ๋ฐ˜์ ์œผ๋กœ, ์ด๊ฒƒ์€ ๊ฑฐ์˜ ์ด์ต์„ ์œ„ํ•ด Go๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ํ›จ์”ฌ ๋” ์–ด๋ ค์šด ์–ธ์–ด๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ, ์ ˆ์ถฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด์„œ๋Š” ์˜๊ฒฌ์ด ๋ถ„๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

type ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ์€ ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด func Example(T)(arg int) {} ์™€ func Example(arg int) (int) {} ์˜ ์ฐจ์ด๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” go ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ตœ์‹  ์ œ์•ˆ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์•ฝ ์„ ์–ธ ๋ฌธ๋ฒ•์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ ๋‚ด ์ทจํ–ฅ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

์•Œ๋‹ค์‹œํ”ผ, go์—์„œ๋Š” ํ•ญ์ƒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์กฐ์ฒด ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

type MyStruct struct {
        a int
        s string
}

type MyInterface inteface {
    Method1() err
    Method2() string
}

๊ทธ๋Ÿฌ๋‚˜ ์ตœ์‹  ์ œ์•ˆ์˜ ๊ณ„์•ฝ ์„ ์–ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

contract Ordered(T) {
    T int, int8
}

contract G(Node, Edge) {
    Node Edges() []Edge
    Edge Nodes() (from Node, to Node)
}

๋‚ด ์ƒ๊ฐ์— ๊ณ„์•ฝ ๋ฌธ๋ฒ•์€ ์ „ํ†ต์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ํ˜•์‹์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ๋ฒ•์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

type Ordered(T) contract {
    T int, int8
}

if there is only one type parameter, the declaration above can be also wrote like this:

type Ordered contract {
    int , int8
}


if there are more than one type parameter, we have to use named parameter:

type G(Node, Edge) contract {
    Node Edges() []Edge
    Edge Nodes() (from Node, to Node)
}

์ด์ œ ๊ณ„์•ฝ์˜ ํ˜•ํƒœ๋Š” ์ „ํ†ต์ ์ธ ๊ฒƒ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• ๋ธ”๋ก์—์„œ ๊ณ„์•ฝ์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type (
        Sequence contract {
                string, []byte
        }

    Stringer(T) contract {
        T String() string
    }

    Stringer contract { // equivalent with the above Stringer(T), single type parameter could be omitted
        String() string
    }

        MyStruct struct {
                a int
                b string
        }

    G(Node, Edge) contract {
        Node Edges() []Edge
        Edge Nodes() (from Node, to Node)
    }
)

๋”ฐ๋ผ์„œ "contract"๋Š” struct, interface์™€ ๊ฐ™์€ ์ˆ˜์ค€์˜ ํ‚ค์›Œ๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ๊ณ„์•ฝ์ด ์œ ํ˜•์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ์œ ํ˜•์„ ์„ ์–ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@bigwhite ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ด ํ‘œ๊ธฐ๋ฒ•์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๊ณ„ ์ดˆ์•ˆ์—์„œ ์ œ์•ˆ๋œ ํ‘œ๊ธฐ๋ฒ•์— ์ฐฌ์„ฑํ•˜๋Š” ์ฃผ์žฅ์€ ๊ณ„์•ฝ์€ ์œ ํ˜•์ด ์•„๋‹ˆ๋ฏ€๋กœ(์˜ˆ: ๊ณ„์•ฝ ์œ ํ˜•์˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†์Œ) ๊ณ„์•ฝ์€ ์ƒ์ˆ˜์™€ ๊ฐ™์€ ํ—›๋œ ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ์‹ค์ฒด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. , ํ•จ์ˆ˜, ๋ณ€์ˆ˜ ๋˜๋Š” ์œ ํ˜•. ๊ท€ํ•˜์˜ ์ œ์•ˆ์— ์ฐฌ์„ฑํ•˜๋Š” ์ฃผ์žฅ์€ ๊ณ„์•ฝ์ด ๋‹จ์ˆœํžˆ "์œ ํ˜• ์œ ํ˜•"(๋˜๋Š” ๋ฉ”ํƒ€ ์œ ํ˜•)์ด๋ฏ€๋กœ ์ผ๊ด€๋œ ํ‘œ๊ธฐ๋ฒ•์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ œ์•ˆ์— ์ฐฌ์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ฃผ์žฅ์€ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•  ํ•„์š” ์—†์ด "์ต๋ช…" ๊ณ„์•ฝ ๋ฆฌํ„ฐ๋Ÿด์˜ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์š”์ปจ๋Œ€, IMHO ์ด๊ฒƒ์€ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธธ์„ ๊ฐ€๋‹ค๊ฐ€๋„ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

FWIW, CL 187317 ์€ ํ˜„์žฌ ๋‘ ํ‘œ๊ธฐ๋ฒ•์„ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค(๊ณ„์•ฝ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ณ„์•ฝ๊ณผ ํ•จ๊ป˜ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•จ). ์˜ˆ:

type C contract(X) { ... }

๊ทธ๋ฆฌ๊ณ 

contract C (X) { ... }

๋‚ด๋ถ€์ ์œผ๋กœ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์šฉ๋˜๊ณ  ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ๋ณด๋‹ค ์ผ๊ด€๋œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type C(type X) contract { ... }

๊ณ„์•ฝ์€ ์œ ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์œ ํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”ํƒ€ ์œ ํ˜•๋„ ์•„๋‹™๋‹ˆ๋‹ค.
๋ฌธ์ œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์ˆ˜์‹ ๊ธฐ ์œ ํ˜•์ด ์—†์Šต๋‹ˆ๋‹ค.
๊ณ„์•ฝ์€ ๋ฉ”ํƒ€ ์œ ํ˜•์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Go์—๋Š” ํ•จ์ˆ˜ ์„ ์–ธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

func Name(args) { body }

์ œ์•ˆ๋œ ๊ณ„์•ฝ ๊ตฌ๋ฌธ์ด ๋ณด๋‹ค ์ง์ ‘์ ์œผ๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

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

ํŽธ์ง‘: ์ธ๋ผ์ธ ๊ณ„์•ฝ๊ณผ ๊ด€๋ จํ•˜์—ฌ Go์—๋Š” ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์•ฝ ๋ฆฌํ„ฐ๋Ÿด์ด ์—†๋Š” ์ด์œ ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์ด๋‚˜ ๊ฐ’์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๊ฐ€ ๋” ์ œํ•œ์ ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

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

๊ณ„์•ฝ์„ ์œ ํ˜•์œผ๋กœ ๊ณ ๋ คํ•˜๋Š” @griesemer ๋Š” Russel ์—ญ์„ค์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ž์‹ ์˜ '๊ตฌ์„ฑ์›'์ด ์•„๋‹Œ ๋ชจ๋“  ์œ ํ˜•์˜ ์œ ํ˜•์—์„œ์™€ ๊ฐ™์ด). ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด '์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ'์œผ๋กœ ๋” ์ž˜ ๊ณ ๋ ค๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ์„ '๋…ผ๋ฆฌ'์˜ ํ•œ ํ˜•ํƒœ๋กœ ๊ฐ„์ฃผํ•˜๋ฉด Prolog์—์„œ ์ด๋ฅผ ํ”„๋กœํ† ํƒ€์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๋ณ€์ˆ˜๋Š” ๋…ผ๋ฆฌ ๋ณ€์ˆ˜๊ฐ€ ๋˜๊ณ  ์œ ํ˜•์€ ์›์ž๊ฐ€ ๋˜๋ฉฐ ๊ณ„์•ฝ/์ œ์•ฝ์€ Constraint Logic Programming์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ๊น”๋”ํ•˜๊ณ  ์—ญ์„ค์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ์ธก๋ฉด์—์„œ ์šฐ๋ฆฌ๋Š” ๋ถ€์šธ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜•์‹์— ๋Œ€ํ•œ ๊ณ„์•ฝ ํ•จ์ˆ˜๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@keean ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ด๋ฏธ "์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ" ์—ญํ• ์„ ํ•˜์ง€๋งŒ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ์ด๋ก  ์‚ฌ๋žŒ๋“ค์€ ๋งค์šฐ ํ˜•์‹์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์œ ํ˜•์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ ํ˜•์œผ๋กœ ๋ด…๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ ํ–ˆ๋“ฏ์ด ์–ด๋Š ์ชฝ ๊ด€์ ์—์„œ๋“  ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ•ฉ๋ฆฌ์ ์ธ ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” "๋…ผ๋ฆฌ์  ์—ญ์„ค"์ด ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœํ† ํƒ€์ž…์€ ํ˜„์žฌ ๋ฌธ์ œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€์ ์œผ๋กœ ๊ณ„์•ฝ์„ ์œ ํ˜•์œผ๋กœ ๋ชจ๋ธ๋งํ•ฉ๋‹ˆ๋‹ค.

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

์—ฌ๊ธฐ์—๋Š” ์—ญ์„ค์ด ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. Girard์˜ ์—ญ์„ค์€ Russel์˜ ์—ญ์„ค์„ ์œ ํ˜• ์ด๋ก ์œผ๋กœ '์ธ์ฝ”๋”ฉ'ํ•œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ '์ธ์ฝ”๋”ฉ'์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ์ด๋ก ์€ ์ด๋Ÿฌํ•œ ์—ญ์„ค์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์ฃผ์˜ ๊ฐœ๋…์„ ๋„์ž…ํ•˜๋ฉฐ, 'U+1' ์šฐ์ฃผ์—์„œ 'U' ์šฐ์ฃผ์˜ ์œ ํ˜•๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์œ ํ˜• ์ด๋ก ์€ ๊ณ ์ฐจ ๋…ผ๋ฆฌ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค(์˜ˆ: Elf๋Š” ๋žŒ๋‹ค-ํ”„๋กค๋กœ๊ทธ ์‚ฌ์šฉ). ์ด๊ฒƒ์€ ์ฐจ๋ก€๋กœ ๊ณ ์ฐจ ๋…ผ๋ฆฌ์˜ ๊ฒฐ์ • ๊ฐ€๋Šฅํ•œ ํ•˜์œ„ ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ์ œ์•ฝ ํ•ด๊ฒฐ๋กœ ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค.

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

์ œ์•ฝ ์กฐ๊ฑด์„ ์œ ํ˜•์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ํ˜„์žฌ ํ”„๋กœํ† ํƒ€์ž…๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด "์ œ์•ฝ ์œ ํ˜•"์„ ์ผ๋ฐ˜ ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ํ•ด๋‹น ์œ ํ˜•์— ๋‹ค๋ฅธ '์ œ์•ฝ ์œ ํ˜•'์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์œ„ํ—˜์ด ์˜ต๋‹ˆ๋‹ค. ์ž์ฒด ์ฐธ์กฐ(์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์†Œํ•œ ์ผ์ž„) ๋ฐ ์ƒํ˜ธ ์ฐธ์กฐ ๋ฃจํ”„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํ”„๋กœํ† ํƒ€์ž…์€ ๊ตฌํ˜„ ๊ทœ์น™์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ Prolog๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” Rust ๊ฐœ๋ฐœ์ž๋“ค์ด ์ด๊ฒƒ์„ ์–ผ๋งˆ ์ „์— ๋งˆ์นจ๋‚ด ๊นจ๋‹ฌ์•˜๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค(Chalk ์ฐธ์กฐ).

@griesemer ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๊ณ„์•ฝ์„ ์œ ํ˜•์œผ๋กœ ๋‹ค์‹œ ๋ชจ๋ธ๋งํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ž์‹ ์˜ ๋ฉ˜ํƒˆ ๋ชจ๋ธ์—์„œ ์ œ์•ฝ ์กฐ๊ฑด ์„ ๋ฉ”ํƒ€ ์œ ํ˜•์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ๊ณ„์•ฝ์„ ์ผ์ข…์˜ ์œ ํ˜• ์ˆ˜์ค€ ๊ตฌ์กฐ์ฒด๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

type A int
func (a A) Foo() int {
    return int(a)
}

type C contract(T, U) {
    T int
    U int, uint
    U Foo() int
}

var B (int, uint; Foo() int).type = A
var C1 C = C(A, B)

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๊ณ„์•ฝ์— ๋Œ€ํ•œ ํ˜„์žฌ ์œ ํ˜• ์„ ์–ธ ์Šคํƒ€์ผ ๊ตฌ๋ฌธ์ด ๋‘˜ ์ค‘ ๋” ์ •ํ™•ํ•œ ๊ตฌ๋ฌธ์ž„์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ดˆ์•ˆ์— ๋ช…์‹œ๋œ ๊ตฌ๋ฌธ์ด "์œ ํ˜•์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€"์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@stevenblenkinsop ๋‹น์‹ ์€ ์ €๋ฅผ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ T ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ C contract ์— ์ „๋‹ฌํ•˜๊ณ  var ํ–‰์€ ๋ฌด์—‡์„ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๊นŒ?

@griesemer ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Go์˜ ๋””์ž์ธ ์›์น™ ์ค‘ ํ•˜๋‚˜๋Š” "๋ฌด์–ธ๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋งŒ ์ œ๊ณต"์ž…๋‹ˆ๋‹ค. ๊ณ„์•ฝ ์„ ์–ธ ์–‘์‹์€ ํ•˜๋‚˜๋งŒ ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์œ ํ˜• C(์œ ํ˜• X) ๊ณ„์•ฝ { ... }์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

@Goodwine ๊ณ„์•ฝ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜•์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋ ๊นŒ์š”? (int, uint; Foo() int).type ๋Š” int ๋˜๋Š” uint ์˜ ๊ธฐ๋ณธ ์œ ํ˜•์ด ์žˆ๊ณ  Foo() int ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฉ”ํƒ€ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. var B ๋Š” ์œ ํ˜•์„ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์œ ํ˜•์ด ๋ฉ”ํƒ€ ์œ ํ˜•์ธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋ฉ”ํƒ€ ์œ ํ˜•์€ ๊ฐ’์ด ์œ ํ˜•์ธ ์œ ํ˜•๊ณผ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์—). var C1 ๋Š” ์œ ํ˜•์ด ๊ณ„์•ฝ์ธ ๋ณ€์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜์— ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ์˜ ์˜ˆ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ "๊ณ„์•ฝ์ด ์œ ํ˜•์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ’์€ ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋‚˜์š”?"๋ผ๋Š” ์งˆ๋ฌธ์— ๋‹ตํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์š”์ ์€ ๊ทธ ๊ฐ’ ์ž์ฒด๊ฐ€ ์œ ํ˜•์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ๊ณ„์•ฝ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ณ„์•ฝ์— ๋Œ€ํ•ด ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋‚จ๊ฒจ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค
type Graph (type Node, Edge) struct { ... }
๊ทธ๋ฆฌ๊ณ 
type Graph (type Node, Edge G) struct { ... } ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‘ ๊ฐ€์ง€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ์ค‘ ํ•˜๋‚˜์—๋งŒ ๊ณ„์•ฝ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

contract G(Node, Edge) {
    Node Edges() []Edge
    Edge Nodes() (from Node, to Node)
}

VS

contract G(Edge) {
    Edge Nodes() (from Node, to Node)
}

@themez ์ดˆ์•ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด (type T, U comparable(T)) ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@stevenblenkinsop ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@themez ์ด๊ฒƒ์€ ์ด์ œ ๋‘์–ด ๋ฒˆ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•์ด ๋ณ€์ˆ˜ ์ •์˜์— ๋Œ€ํ•œ ์œ ํ˜•์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋Š” ์‚ฌ์‹ค์—์„œ ์•ฝ๊ฐ„์˜ ํ˜ผ๋™์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณ„์•ฝ์€ ์ธ์ˆ˜ ์ •์˜๋ณด๋‹ค ์ „์ฒด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  ์ผ๋ฐ˜ ๊ธฐ๋Šฅ/์œ ํ˜•์— ๋Œ€ํ•ด ๋ฐ˜๋ณต์„ ๋•๊ธฐ ์œ„ํ•ด ์ž ์žฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ณ„์•ฝ์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ƒˆ ๊ณ„์•ฝ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. @stevenblenkinsop ์ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ๊ทธ ๊ฐ€์ •์ด ๋ง์ด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ํฌ์ฐฉํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์ ์–ด๋„ '๊ณ„์•ฝ'์ด๋ผ๊ณ  ํ•˜๋Š” ์ ์—์„œ ์ธ์ƒ ๊นŠ์—ˆ์Šต๋‹ˆ๋‹ค.

@keean ์ œ ์ƒ๊ฐ์—๋Š” "์ œ์•ฝ์กฐ๊ฑด"์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ณต์‹์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์— ๋”ฐ๋ผ I ์ธํ„ฐํŽ˜์ด์Šค์™€ I ์œ ํ˜•์˜ $ x ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ I ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์˜ ๊ฐ’๋งŒ x ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. I ๋Š” ํ•ด๋‹น ์œ ํ˜•์— ๋Œ€ํ•œ "์ œ์•ฝ์กฐ๊ฑด"์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  ํ•ด๋‹น "์ œ์•ฝ์กฐ๊ฑด"์„ ์ถฉ์กฑํ•˜๋Š” ์œ ํ˜•์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฌดํ•œํžˆ ๋งŽ์Šต๋‹ˆ๋‹ค). ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ I ๋ฅผ ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜ P ์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. I ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์„ธํŠธ๊ฐ€ ์žˆ๋Š” ์‹ค์ œ ์œ ํ˜• ์ธ์ˆ˜๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ I ๋Š” ๊ฐ€๋Šฅํ•œ ์‹ค์ œ ์ธ์ˆ˜ ์œ ํ˜• ์„ธํŠธ๋„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

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

๊ท€ํ•˜์˜ ์˜๊ฒฌ ์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ ์ผ๋ถ€ ์ œํ•œ ์—†์ด ๋ฉ”์†Œ๋“œ๋ฅผ "๋ถ„ํ•ด"ํ•˜๊ธฐ๋งŒ ํ•˜๋Š” ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ณ„์•ฝ์— ๋Œ€ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด ํŠน์ • ์•„์ด๋””์–ด์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ณ„์•ฝ ์ œ์•ˆ์€ ์–ด๋–ป๊ฒŒ ๋„์ž…๋ฉ๋‹ˆ๊นŒ? go ๋ชจ๋“ˆ go1.14 ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? GO114CONTRACTS ํ™˜๊ฒฝ ๋ณ€์ˆ˜? ๋‘˜ ๋‹ค? ๋‹ค๋ฅธ ๊ฒƒ..?

์ด์ „์— ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒฝ์šฐ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์–ธ์ œ๋“ ์ง€ ์ €๋ฅผ ๊ทธ๊ณณ์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜์‹ญ์‹œ์˜ค.

ํ˜„์žฌ ์ œ๋„ค๋ฆญ ๋“œ๋ž˜ํ”„ํŠธ ๋””์ž์ธ์—์„œ ํŠนํžˆ ๋งˆ์Œ์— ๋“œ๋Š” ์ ์€ contracts ์™€ interfaces ์‚ฌ์ด์— ๊นจ๋—ํ•œ ๋ฌผ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐœ๋… ์‚ฌ์ด์— ์„ธ ๊ฐ€์ง€ ๊ธฐ๋ณธ์ ์ธ ์ฐจ์ด์ ์ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‘ ๊ฐœ๋…์ด ์‰ฝ๊ฒŒ ํ˜ผ๋™๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. Contracts ๋Š” _set_ ์œ ํ˜•์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ˜๋ฉด interfaces ๋Š” _single_ ์œ ํ˜•์ด ์ถฉ์กฑํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  2. Contracts ๋Š” ๋‚ด์žฅ ์ž‘์—…, ๋ณ€ํ™˜ ๋“ฑ์„ ์ง€์›ํ•˜๋Š” ์œ ํ˜•์„ ๋‚˜์—ดํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. interfaces ๋Š” ๋‚ด์žฅ ์œ ํ˜• ์ž์ฒด์— ์—†๋Š” ๋ฉ”์†Œ๋“œ๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์œ ํ˜• ์ด๋ก ์ƒ์˜ ์šฉ์–ด๋กœ ๋ฌด์—‡์ด๋“  contracts ๋Š” Go์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ์œ ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ฆ‰, contract ์œ ํ˜•์˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๊ฐ’์„ ์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— interfaces ๋Š” ์œ ํ˜•์ด๋ฏ€๋กœ ํ•ด๋‹น ์œ ํ˜•์˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ ์ ˆํ•œ ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

contract ์˜ ์˜๋ฏธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–๊ธฐ ์œ„ํ•ด ๋‹จ์ผ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๋Œ€์‹  interface ๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด๋Š” ์ œ๊ฐ€ ๊ณผ๊ฑฐ์—๋„ ์˜นํ˜ธํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ์•ˆ), contracts ์™€ interfaces ์‚ฌ์ด์˜ ๋ฌผ์„ ๋‹ค์‹œ ์ง„ํ™ํƒ•์œผ๋กœ ๋งŒ๋“ค ๊ฒƒ์ด๊ธฐ โ€‹โ€‹๋•Œ๋ฌธ์— ์ง€๊ธˆ์€ ๋ถˆํ–‰ํ•œ ์›€์ง์ž„์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@bigwhite ๊ฐ€ ๊ธฐ์กด 'type' ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ์•ˆํ•œ ๋ฐฉ์‹์œผ๋กœ contracts ๊ฐ€ ๊ทธ๋Ÿด๋“ฏํ•˜๊ฒŒ ์„ ์–ธ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ซ๊ธฐ ์ „์—๋Š” ์ •๋ง ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ ์œ„์˜ (3)๊ณผ ํƒ€ํ˜‘ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ทธ ์•„์ด๋””์–ด์— ์—ด๊ด‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ๋ฐ˜ ๊ตฌ์กฐ์ฒด๋ฅผ ์„ ์–ธํ•  ๋•Œ type ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ:

type List(type Element) struct {
    next *List(Element)
    val  Element
}

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

๋‚ด๊ฐ€ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๋˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด๋Š” contracts ๋ฅผ ๋ณ„๋„์˜ ๊ตฌ๋ฌธ์ด ์•„๋‹Œ '์ œ์ž๋ฆฌ์—' ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” `๊ณ„์•ฝ ๋ฆฌํ„ฐ๋Ÿด'์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜ ๋ฐ ์œ ํ˜• ์ •์˜๋ฅผ ์ฝ๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง€๋ฉฐ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€๋งŒ ์ œ๋„ค๋ฆญ์ด ์ข‹์€ ๊ฒƒ์ด๋ผ๊ณ  ์‚ฌ๋žŒ๋“ค์„ ์„ค๋“ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ ๋“œ๋ž˜ํ”„ํŠธ์— ๋Œ€ํ•œ ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(์ผ๋ถ€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์€ ์ธ์ •ํ•จ)์— ๋Œ€ํ•ด ๊ทธ๋ ‡๊ฒŒ ์ €ํ•ญํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์€ ์œ ๊ฐ์ด์ง€๋งŒ, Go์šฉ ๋‹จ์ˆœ ์ œ๋„ค๋ฆญ์„ ์—ด์„ฑ์ ์œผ๋กœ ์ง€์ง€ํ•˜๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ ์ €๋Š” ์ด๋Ÿฌํ•œ ์‚ฌํ•ญ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• "๊ณ„์•ฝ"์— ๋Œ€ํ•ด ์ˆ ์–ด๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • "๊ณ„์•ฝ"์ด๋ผ๋Š” ์šฉ์–ด๋Š” ์ด๋ฏธ ์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. (https://scholar.google.com/scholar?hl=ko&as_sdt=0%2C33&q=contracts+languages&btnG=)
  • ์ปดํ“จํ„ฐ ๊ณผํ•™ ๋ฌธํ—Œ์—๋Š” ์ด๋ฏธ ์ด ์•„์ด๋””์–ด์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” "typesets", "type classes", "concepts", "constraints"์˜ ์ ์–ด๋„ ~3~4๊ฐ€์ง€๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋” ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง‘๋‹ˆ๋‹ค.

@griesemer "์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ"์€ ๋Ÿฐํƒ€์ž„ ์ „์— ์œ ํ˜•์ด ์ง€์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ „ํžˆ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด ์ผ๋ฐ˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ด ์•„๋‹Œ ์ฝ”๋“œ๋กœ ์ •๊ตํ•ด์ง‘๋‹ˆ๋‹ค. ํ•˜์œ„ ์œ ํ˜•์€ ๋Ÿฐํƒ€์ž„์— ์กด์žฌํ•˜๋ฉฐ ์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์ด ์ตœ์†Œํ•œ ์œ ํ˜• ๋™์ผ ๋˜๋Š” ์œ ํ˜• ๋ถˆ์ผ์น˜๋ผ๋Š” ์ ์—์„œ ์ œ์•ฝ ์กฐ๊ฑด์ด ์•„๋‹ˆ๋ฉฐ, ์œ ํ˜• ์‹œ์Šคํ…œ์— ๋”ฐ๋ผ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” 'ํ•˜์œ„ ์œ ํ˜•'๊ณผ ๊ฐ™์€ ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ํ•˜์œ„ ์œ ํ˜•์˜ ๋Ÿฐํƒ€์ž„ ํŠน์„ฑ์€ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค. X <: Y์ธ ๊ฒฝ์šฐ Y๊ฐ€ ์˜ˆ์ƒ๋˜๋Š” ์œ„์น˜์— X๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋Ÿฐํƒ€์ž„ ์ž‘์—… ์—†์ด ์œ ํ˜•์„ Y๋กœ๋งŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜๋ฏธ์—์„œ ์œ ํ˜• Y๋ฅผ ์ œํ•œํ•˜์ง€ ์•Š๊ณ  Y๋Š” ํ•ญ์ƒ Y์ž…๋‹ˆ๋‹ค. ํ•˜์œ„ ์œ ํ˜• ์ง€์ •๋„ '๋ฐฉํ–ฅ์„ฑ'์ด๋ฏ€๋กœ ์ž…๋ ฅ ์ธ์ˆ˜ ๋˜๋Š” ์ถœ๋ ฅ ์ธ์ˆ˜์— ์ ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๊ณต๋ณ€ ๋˜๋Š” ๋ฐ˜๊ณต์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด 'pred(X)'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™„์ „ ๋‹คํ˜•์„ฑ X๋กœ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ํ—ˆ์šฉ๋œ ๊ฐ’์„ ์ œ์•ฝํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ '์ธ์‡„'๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” X๋งŒ ๋งํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ๋ฐฉํ–ฅ์„ฑ์ด ์—†์œผ๋ฏ€๋กœ ๊ณต๋ถ„์‚ฐ์ด๋‚˜ ๋ฐ˜๊ณต๋ถ„์‚ฐ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„์— X์˜ ๊ธฐ๋ณธ ์œ ํ˜•์„ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ์ ์—์„œ ์‚ฌ์‹ค ๋ถˆ๋ณ€์ž…๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์ด ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ์š”์ ์„ ๋†“์ณค์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘: ์œ„์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ 'Go' ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์Œ์„ ์ง€์ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์— ๋Œ€ํ•œ ์š”์ ์€ ํ•˜์œ„ ์œ ํ˜•์ด ์žˆ๋Š” ๋ชจ๋“  ์–ธ์–ด์— ์ ์šฉ๋˜์ง€๋งŒ Go๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ํ˜•์œผ๋กœ ๋งŒ๋“ค๊ณ  ํ•˜์œ„ ์œ ํ˜• ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š” ๋ฐ ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Java์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์œ ํ˜•์ด ์•„๋‹ˆ๋ฏ€๋กœ(ํด๋ž˜์Šค๋Š” ์œ ํ˜•์ž„) ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ _์ž…๋‹ˆ๋‹ค_. ๋”ฐ๋ผ์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ณ์ง€๋งŒ ํŠนํžˆ 'Go'์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Inuart ์ด๊ฒƒ์ด ๊ตฌํ˜„์— ์–ด๋–ป๊ฒŒ ์ถ”๊ฐ€๋ ์ง€ ๋งํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ด๋ฅด๋‹ค. ์•„์ง ์ œ์•ˆ์€ ์—†๊ณ  ๋””์ž์ธ ์ดˆ์•ˆ๋งŒ ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ํ™•์‹คํžˆ 1.14์—๋Š” ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@andrewcmyers ์ €๋Š” "contract"๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด ๋‹จ์–ด๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ ์ž‘์„ฑ์ž์™€ ํ˜ธ์ถœ์ž ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

"typesets" ๋ฐ "type classes"์™€ ๊ฐ™์€ ๋‹จ์–ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฉ”ํƒ€ ์œ ํ˜•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Œ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณ„์•ฝ์€ ๋˜ํ•œ ์—ฌ๋Ÿฌ ์œ ํ˜• ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Haskell์˜ ์œ ํ˜• ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ทธ ์ด๋ฆ„์€ ์„ค๋ช…ํ•˜๋ ค๋Š” ์•„์ด๋””์–ด์— ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” C++์—์„œ ์ด๊ฒƒ์„ "๊ฐœ๋…"์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ด์œ ๋ฅผ ๊ฒฐ์ฝ” ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋ฌด์Šจ ๋œป์ด์•ผ?

"์ œ์•ฝ์กฐ๊ฑด" ๋˜๋Š” "์ œ์•ฝ์กฐ๊ฑด"์€ ์ €์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ €๋Š” ๊ณ„์•ฝ์ด ์—ฌ๋Ÿฌ ์ œ์•ฝ ์กฐ๊ฑด์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๊ทธ ์ƒ๊ฐ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” C++์—์„œ ์ด๊ฒƒ์„ "๊ฐœ๋…"์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ด์œ ๋ฅผ ๊ฒฐ์ฝ” ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋ฌด์Šจ ๋œป์ด์•ผ?

๊ฐœ๋…์€ ์„œ๋ช…๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ๊ณตํ†ต์„ฑ์„ ๊ณต์œ ํ•˜๋Š” ์ธ์Šคํ„ด์Šคํ™”์˜ ์ถ”์ƒํ™”์ž…๋‹ˆ๋‹ค.

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

@sighoya ๋‚˜๋Š” ๋˜ํ•œ '๊ฐœ๋…'์ด ๊ฐœ๋…์ ์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, '๊ฐœ๋…'์—๋Š” ์—ฐ์‚ฐ์ž ๋‚จ์šฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ '๊ณต๋ฆฌ'๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋”ํ•˜๊ธฐ '+'๋Š” ์—ฐ๊ด€ ๋ฐ ๊ตํ™˜ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณต๋ฆฌ๋Š” C++๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ถ”์ƒ์ ์ธ ์•„์ด๋””์–ด, ๋”ฐ๋ผ์„œ '๊ฐœ๋…'์œผ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋…์€ ๊ตฌ๋ฌธ '๊ณ„์•ฝ'์— ์˜๋ฏธ ๊ณต๋ฆฌ๋ฅผ ๋”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ianlancetaylor "์ œ์•ฝ์กฐ๊ฑด"์€ ์šฐ๋ฆฌ๊ฐ€ Genus(http://www.cs.cornell.edu/~yizhou/papers/genus-pldi2015.pdf)์—์„œ ๋ถˆ๋ €๋˜ ๊ฒƒ์ด๋ฏ€๋กœ ํ•ด๋‹น ์šฉ์–ด์— ๋ถ€๋ถ„์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. "๊ณ„์•ฝ"์ด๋ผ๋Š” ์šฉ์–ด๋Š” PL ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์–ธ๊ธ‰ํ•˜๊ธฐ ์œ„ํ•ด ๋งค์šฐ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ  ์™„์ „ํžˆ ํ•ฉ๋ฆฌ์ ์ธ ์„ ํƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

typeConstraint C(T) {
}

๋˜๋Š”

์œ ํ˜•๊ณ„์•ฝ C(T) {
}

์ด๊ฒƒ์ด ๋Ÿฐํƒ€์ž„ ๊ตฌ๋ฌธ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ์œ ํ˜• ์„ ์–ธ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ๊ณ„์•ฝ ๋””์ž์ธ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1.

์ œ๋„ค๋ฆญ ์œ ํ˜• A๊ฐ€ ๋‹ค๋ฅธ ์ œ๋„ค๋ฆญ ์œ ํ˜• B๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ
๋˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜ A๊ฐ€ ๋‹ค๋ฅธ ์ผ๋ฐ˜ ํ•จ์ˆ˜ B๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ
A์— ๋Œ€ํ•œ B์˜ ๊ณ„์•ฝ๋„ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋Œ€๋‹ต์ด ์ฐธ์ด๋ฉด ์ œ๋„ค๋ฆญ ์œ ํ˜•์ด ๋‹ค๋ฅธ ๋งŽ์€ ์ œ๋„ค๋ฆญ ์œ ํ˜•์„ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ
๋˜๋Š” ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž„๋ฒ ๋”ฉ ์œ ํ˜• ๋˜๋Š” ํ˜ธ์ถœ์ž ํ•จ์ˆ˜์˜ ๊ณ„์•ฝ์œผ๋กœ ๋งŽ์€ ๊ณ„์•ฝ์„ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ const-poisoning ์œ ์‚ฌ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์‚ผ.

์ผ๋ฐ˜ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

v.Foo()

Foo ๊ฐ€ ํ•จ์ˆ˜ ์œ ํ˜•์˜ ๋ฉ”์†Œ๋“œ ๋˜๋Š” ํ•„๋“œ๊ฐ€ ๋˜๋„๋ก ํ•˜๋Š” ๊ณ„์•ฝ์„ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@merovius type-constraints๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•˜๋ฉฐ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์œ ํ˜• ์‹œ์Šคํ…œ์ด ๋น„์ •์ƒ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„๊นŒ์ง€ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๋‹ค๋ฅธ ์œ ํ˜•์— ์ข…์†๋˜๋Š” ์œ ํ˜•์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์„ ํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํ•œ ์ข…์† ์œ ํ˜• ์‹œ์Šคํ…œ(์œ ํ˜•์ด ์•Œ๋ ค์ง€๋ฉด ๋Ÿฐํƒ€์ž„์— ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ํ—ˆ์šฉ)์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์œ ํ˜• ์‹œ์Šคํ…œ์— ์กด์žฌ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์กด์€ ์ •์ ์œผ๋กœ ์•Œ๋ ค์ง„ ์œ ํ˜•์˜ ์œ„์ƒ์ฐจ์™€ ๋Ÿฐํƒ€์ž„์—๋งŒ ์•Œ๋ ค์ง„ ์œ ํ˜•(์˜ˆ: IO์—์„œ ์ฝ๊ธฐ์— ์˜์กดํ•˜๋Š” ์œ ํ˜•)์„ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ํ•˜์œ„ ์œ ํ˜•์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋Ÿฐํƒ€์ž„๊นŒ์ง€ ์•Œ๋ ค์ง€์ง€ ์•Š์ง€๋งŒ ์œ ํ˜•์ด ์ •์ ์œผ๋กœ ์•Œ๋ ค์ง„ ๊ฒฝ์šฐ ๋งŽ์€ ์–ธ์–ด์— ์ตœ์ ํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์–ธ์–ด(์ข…์† ์œ ํ˜• ๋˜๋Š” ์‹ค์กด ์œ ํ˜•)์— ๋„์ž…๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์—ฌ์ „ํžˆ ํ•˜์œ„ ์œ ํ˜• ๋ฐ ์œ ํ˜• ์ œ์•ฝ์˜ ๊ฐœ๋…์„ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Go์˜ ๊ฒฝ์šฐ ํŠนํžˆ ์œ ํ˜• ์ œํ•œ์ž๋Š” ๋ถˆ๋ณ€์ด๋ฉฐ ์ด๋Ÿฌํ•œ ์ฐจ์ด์ ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Go-์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด(์ •์ ์œผ๋กœ)์ž„์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Go-์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋“  ๊ธฐ๋Šฅ/๋ฉ”์„œ๋“œ์˜ ์ˆ˜์‹ ์ž์ธ ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ณ„์•ฝ์œผ๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด go์— ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ณ„์•ฝ์ด ๋ชจ๋‘ ์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Go๊ฐ€ ์—ฐ์‚ฐ์ž(์˜ˆ: '+')์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ  Go์— ์ข…์† ์œ ํ˜•์ด๋‚˜ ์กด์žฌ ์œ ํ˜•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

@keean Cool, ๊ทธ๋ž˜์„œ AIUI๋Š” ์ ์–ด๋„ Go์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. :)

๋‚˜๋จธ์ง€์™€ ๊ด€๋ จํ•˜์—ฌ: ์œ„์—์„œ ๊ท€ํ•˜๊ฐ€ ์ฃผ์žฅํ•œ ์‚ฌํ•ญ:

"์œ ํ˜•์— ๋Œ€ํ•œ ์ œ์•ฝ"์€ ๋Ÿฐํƒ€์ž„ ์ „์— ์œ ํ˜•์ด ์ง€์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ „ํžˆ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด ์ผ๋ฐ˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ด ์•„๋‹Œ ์ฝ”๋“œ๋กœ ์ •๊ตํ•ด์ง‘๋‹ˆ๋‹ค.

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

FWIW, ๋‚˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•œ๋‹ค๊ณ  ์ด์ „์— ์ฃผ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์ฝ”๋“œ์—์„œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ์ฃผ์š” ์žฅ์• ๋ฌผ์ด๋ฉฐ ๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ ๊ณ„์•ฝ์˜ ํ˜•ํƒœ๋กœ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

@keean ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋‹ˆ์˜ค, ๊ท€ํ•˜์˜ ๋‹ต๋ณ€์€ ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€ ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด ์˜๊ฒฌ ์—์„œ ํ•ด๋‹น ๊ณ„์•ฝ/"์ œ์•ฝ" ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์ด์ „ ๋Œ“๊ธ€ ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด "์ผ๋ถ€ ์ œํ•œ ์—†์ด" ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” _simple_ _concrete_ ์˜ˆ์ œ๋ฅผ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๋Ÿฌํ•œ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ @Merovius ๊ฐ€ ์ด๋ฏธ ๊ด€์ฐฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ "๋”ฐ๋ผ์„œ Go-์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋“  ๊ธฐ๋Šฅ/๋ฉ”์„œ๋“œ์˜ ์ˆ˜์‹ ์ž์ธ ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ณ„์•ฝ์œผ๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .". ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ฒ˜์Œ์— ๋งํ•˜๊ณ  ์žˆ๋˜ ๋ฐ”๋กœ ๊ทธ ์š”์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ๋งํ•œ ๊ฒƒ์„ ๊ณ„์†ํ•ด์„œ ํ™•์ธํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@๋„ํƒ€ํ—ค์–ด

์ œ๋„ค๋ฆญ ์œ ํ˜• A๊ฐ€ ๋‹ค๋ฅธ ์ œ๋„ค๋ฆญ ์œ ํ˜• B๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜ A๊ฐ€ ๋‹ค๋ฅธ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜ B๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ A์— ๋Œ€ํ•œ B์˜ ๊ณ„์•ฝ๋„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ œ๋„ค๋ฆญ ์œ ํ˜• A๊ฐ€ ๋‹ค๋ฅธ ์ œ๋„ค๋ฆญ ์œ ํ˜• B๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ B์— ์ „๋‹ฌ๋œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” B๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ณ„์•ฝ์„ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด A๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ณ„์•ฝ์ด B๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ณ„์•ฝ์„ ์•”์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ์ œ์•ฝ ์กฐ๊ฑด์ด B์— ์ „๋‹ฌ๋œ ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” A๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ณ„์•ฝ์— ํ‘œํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋Œ€๋‹ต์ด ์ฐธ์ด๋ฉด ์ œ๋„ค๋ฆญ ์œ ํ˜•์ด ๋‹ค๋ฅธ ๋งŽ์€ Genirc ์œ ํ˜•์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๋งŽ์€ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ์ž„๋ฒ ๋”ฉ ์œ ํ˜• ๋˜๋Š” ํ˜ธ์ถœ์ž ํ•จ์ˆ˜์˜ ๊ณ„์•ฝ์œผ๋กœ ๋งŽ์€ ๊ณ„์•ฝ์„ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ const-poisoning ์œ ์‚ฌ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ const-poisoning ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. const-poisoning ๋ฌธ์ œ๋Š” ์ธ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ const ๋ฅผ ํผํŠธ๋ ค์•ผ ํ•˜๊ณ  ์ธ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ณณ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ๋ชจ๋“  ๊ณณ์—์„œ const ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์˜ ๊ฒฝ์šฐ๋Š” "์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ ํ•จ์ˆ˜์— ์˜ฌ๋ฐ”๋ฅธ ์œ ํ˜•์˜ ๊ฐ’์„ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์‚ฌ๋žŒ๋“ค์ด ๋ชจ๋‘ ๋‹ค๋ฅธ ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๊ทนํžˆ ๋‚ฎ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ๋˜์—ˆ์„๊นŒ?

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

๋ณ€ํ™˜ ๊ฐ€๋Šฅ์„ฑ, ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ ๋ฐ ๋น„๊ต ๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ฐ™์€ ์ œ์•ฝ ์กฐ๊ฑด์€ ์„ค๊ณ„ ์ดˆ์•ˆ์—์„œ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์œ ํ˜•์˜ ํ˜•ํƒœ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ์†ก์‹  ๊ฐ€๋Šฅ ๋˜๋Š” ์ˆ˜์‹  ๊ฐ€๋Šฅ ์ฑ„๋„๊ณผ ๊ฐ™์€ ์ œ์•ฝ ์กฐ๊ฑด์€ chan T ํ˜•์‹์œผ๋กœ๋งŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ T ๋Š” ์„ค๊ณ„ ์ดˆ์•ˆ์—์„œ ์„ค๋ช…ํ•˜๋Š” ์ผ๋ถ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ํŠน์ • ์œ ํ˜•์— ์ง€์ •๋œ ํ•„๋“œ ์„ธํŠธ๊ฐ€ ์žˆ๋‹ค๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์ง€๋งŒ ๋งค์šฐ ์ž์ฃผ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

v.Foo()
Foo๊ฐ€ ํ•จ์ˆ˜ ์œ ํ˜•์˜ ๋ฉ”์†Œ๋“œ ๋˜๋Š” ํ•„๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ณ„์•ฝ์„ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜„์žฌ ๋””์ž์ธ ์ดˆ์•ˆ์—์„œ๋Š” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๊นŒ? (์ด์ „ ์„ค๊ณ„ ์ดˆ์•ˆ์ด ์ด๋ฅผ ์ง€์›ํ•œ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)

@griesemer ์œ ํ˜• ์‹œ์Šคํ…œ์— ์ข…์† ์œ ํ˜• ๋˜๋Š” ์‹ค์กด ์œ ํ˜•์„ ๋„์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์œ ํšจํ•˜๋‹ค๊ณ  ๋งํ•œ ์š”์ ์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ณ„์•ฝ์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„์— ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์„ ์•Œ ๋•Œ๊นŒ์ง€ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์—ฐ๊ธฐํ•ด์•ผ โ€‹โ€‹ํ•˜๊ณ  ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์œ ํ˜•์ด ์•ˆ์ „ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•˜์œ„ ์œ ํ˜•์œผ๋กœ ์„ค๋ช…๋˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์œผ๋ฏ€๋กœ ๋ฏธ๋ž˜์— ์œ ํ˜• ์ƒ์„ฑ์ž์— ๊ณต/๋ฐ˜๋Œ€ ๋ถ„์‚ฐ์„ ๋„์ž…ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒ€์ž…์œผ๋กœ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค๋ฉด, ๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ๋„ ์—†๊ณ , ์„œ๋ธŒํƒ€์ž…์ด ์•„๋‹Œ ๋””์ž์ด๋„ˆ์˜ ์˜๋„๋„ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ €์—๊ฒŒ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ณ„์•ฝ์„ ๋ณ‘ํ•ฉํ•˜๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์œ ํ˜• ์ œ์•ฝ ์กฐ๊ฑด(์œ ํ˜•์— ๋Œ€ํ•œ ์ˆ ์–ด)์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ๋””์ž์ธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ianlancetaylor

์–ด์จŒ๋“  ์‚ฌ๋žŒ๋“ค์ด ๋ชจ๋‘ ๋‹ค๋ฅธ ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๊ทนํžˆ ๋‚ฎ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ๋˜์—ˆ์„๊นŒ?

์™œ ๊ทธ๊ฒƒ์ด ๋น„์ •์ƒ์ ์ž…๋‹ˆ๊นŒ? 'T' ์œ ํ˜•์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด 'T'์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ณ„์•ฝ์— ์˜ํ•ด '์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•œ ์œ ํ˜•'์— ๋Œ€ํ•ด 'ํ•ฉ' ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ. ์ด์ œ sum์„ ํ˜ธ์ถœํ•˜๋Š” ์ผ๋ฐ˜ ๊ณฑํ•˜๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋งŽ์€ ๊ฒƒ๋“ค์ด ํ•ฉ/๊ณฑ ๊ตฌ์กฐ('๊ทธ๋ฃน'์ธ ๋ชจ๋“  ๊ฒƒ)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ„์•ฝ์ด ์–ธ์–ด์— ์ ์šฉ๋œ ํ›„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชฉ์ ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ณ„์•ฝ์ด ๋™์ผํ•œ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด ํ˜•์‹์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ ์ง‘ํ•ฉ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@keean ํŠน์ดํ•œ ๊ฒฝ์šฐ๋Š” ๋ชจ๋‘ ๋‹ค๋ฅธ ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ฐ˜๋ก€๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ๋งŒ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ const-poisoning๊ณผ์˜ ์œ ์‚ฌ์„ฑ์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜๊ณ  ์žˆ์Œ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค.

@mrkaspa ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๊ณ„์•ฝ์€ C++ ํ…œํ”Œ๋ฆฟ ๊ธฐ๋Šฅ๊ณผ ๊ฐ™๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋Š” C++ ๊ฐ€์ƒ ๋ฉ”์„œ๋“œ์™€ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์šฉ๋„์™€ ๋ชฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@ianlancetaylor ๊ฒฝํ—˜์ƒ const ์ค‘๋…๊ณผ ์œ ์‚ฌํ•œ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ค‘์ฒฉ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ํŠน์„ฑ๊ณผ ๊ฐ™์€ ํŠธ๋ฆฌ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ๊นŠ์ด ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜์— ๋””๋ฒ„๊น…์„ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ฆฌํ”„์—์„œ ๋ฃจํŠธ๊นŒ์ง€ ์ธ์‡„ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋ฉฐ, ์—ฌ๊ธฐ์—๋Š” ์—ฌ๋Ÿฌ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฑด๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ๋ฃจํŠธ์— ๋งŽ์€ ์ˆ˜์˜ ๊ณ„์•ฝ์„ ๋ˆ„์ ํ•˜์—ฌ ํ•จ์ˆ˜ ์„œ๋ช…์„ ์ฝ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜• ํด๋ž˜์Šค์—์„œ Haskell์ด ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๋ก ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข…์ข… ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

@ianlancetaylor ๋‚˜๋Š” C++์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋งŽ์ด ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. golang์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ๊ณ„์•ฝ์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์–ธ์ œ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@keean ์ด ํ•˜์œ„ ์Šค๋ ˆ๋“œ๋Š” Go ์–ธ์–ด์— ๋Œ€ํ•œ ํŠน์ • ๋””์ž์ธ ์ดˆ์•ˆ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Go์—์„œ๋Š” ๋ชจ๋“  ๊ฐ’์„ ์ธ์‡„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์•ฝ์„œ์— ๋ช…์‹œํ•ด์•ผ ํ•˜๋Š” ์‚ฌํ•ญ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹จ์ผ ์ œ๋„ค๋ฆญ ๊ธฐ๋Šฅ์ด๋‚˜ ์œ ํ˜•์— ๋Œ€ํ•ด ๋งŽ์€ ๊ณ„์•ฝ์ด ๋ˆ„์ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฆ๊ฑฐ๋ฅผ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ ๊ทธ๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๋Š” ์ฃผ์žฅ์€ ๋ฐ›์•„๋“ค์ด๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋””์ž์ธ ๋“œ๋ž˜ํ”„ํŠธ์˜ ์š”์ ์€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋””์ž์ธ ์ดˆ์•ˆ์€ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋Œ€๊ทœ๋ชจ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด ์„ค๊ณ„๋œ Go์™€ ๊ฐ™์€ ์–ธ์–ด์— ์ข‹์ง€ ์•Š์€ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

@mrkaspa ์˜ˆ๋ฅผ ๋“ค์–ด []io.Reader ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณ„์•ฝ์ด ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์•ฝ์—์„œ๋Š” ์Šฌ๋ผ์ด์Šค์˜ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ๋™์ผํ•œ ์œ ํ˜•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ชจ๋“  ์œ ํ˜•์ด io.Reader ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ•œ ๋‹ค๋ฅธ ์œ ํ˜•์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

@ianlancetaylor ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋Š” ํ•œ ์ƒˆ๋กœ์šด ์œ ํ˜•์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ˜๋ฉด ๊ณ„์•ฝ์€ ์œ ํ˜•์„ ์ œํ•œํ•˜์ง€๋งŒ no๋Š” ์ƒˆ๋กœ์šด ์œ ํ˜•์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@ianlancetailor :

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

contract Reader(T) {
  T Read([]byte) (int, error)
}

func ReadAll(type T Reader)(readers []T) ([]byte, error) {
  // Use the readers...
}

์ด์ œ ReadAll() ๋Š” []*os.File ๋ฅผ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ []io.Reader ๋ฅผ ์ˆ˜๋ฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‚˜์š”? io.Reader ๋Š” ๊ณ„์•ฝ์„ ๋งŒ์กฑ์‹œํ‚ค๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉฐ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ’์ด ํ˜•์‹ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‚ด์šฉ์ด ์ดˆ์•ˆ์—์„œ ๊ธฐ์–ต๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ์„ธ์š”. ๋‚ด๊ฐ€ ์ž˜๋ชป ์ดํ•ดํ–ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์ด๋ฏ€๋กœ @mrkaspa ์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์„œ๋ช…์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์ด ํ˜ธ์ถœ๋˜๋Š” ๊ณณ์—์„œ๋งŒ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@mrkaspa ๋„ค, ๋งž์Šต๋‹ˆ๋‹ค.

@ianlancetaylor []io.Reader ๋ชฉ๋ก๊ณผ ์ด ๊ณ„์•ฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ:

contract Reader(T) {
  T Read([]byte) (int, error)
}

func ReadAll(type T Reader)(readers []T) ([]byte, error) {
  // Use the readers...
}

๊ฐ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ณ„์•ฝ์„ ์ถฉ์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ReadAll์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

์ฝ”๋“œ๋Š” ์ •์ ์ด์ง€ ์•Š์œผ๋ฏ€๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋„ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ฝ”๋“œ๋Š” ์ฒ˜์Œ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๋ณด๋‹ค ํ›จ์”ฌ ๋” ์˜ค๋ž˜ '์œ ์ง€ ๊ด€๋ฆฌ' ์ƒํƒœ์ด๋ฏ€๋กœ ์œ ์ง€ ๊ด€๋ฆฌ, ๋ฆฌํŒฉํ† ๋ง, ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋“ฑ์„ ๋” ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์–ธ์–ด๋ฅผ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ข‹์€ ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์œ ์ง€ ๊ด€๋ฆฌ๋˜๋Š” ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ๋งŒ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” Ada์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ผ๋ฐ˜ ์–ธ์–ด์—๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” Go์˜ ๋Œ€ํ˜• Ada ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ด์‹ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Ada์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” Go์—์„œ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@mrkaspa ๋„ค.

์ด ์‹œ์ ์—์„œ ์ด ๋Œ€ํ™” ์Šค๋ ˆ๋“œ๊ฐ€ golang-nuts๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. GitHub ๋ฌธ์ œ ์ถ”์ ๊ธฐ๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํ† ๋ก ์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@keean ์•„๋งˆ๋„ ๋‹น์‹ ์ด ์˜ณ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ๋งํ•ด ์ค„๊ฑฐ์•ผ. ์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋””์ž์ธ ๋“œ๋ž˜ํ”„ํŠธ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋‹ฌ๋ผ๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆœ์ „ํžˆ ๊ฐ€์ƒ์ ์ธ ํ† ๋ก ์—๋Š” ๊ฐ€์น˜๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

@keean ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋กœ๊น… ์˜ˆ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์ œ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ œ๋„ค๋ฆญ์ด ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€์ž„์— ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@bserdar ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ํ•˜๋‚˜์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ์žˆ์œผ๋ฏ€๋กœ ํ•˜๋‚˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋กœ๊ทธ ๋Œ€์ƒ์ด๊ณ  ๋‘ ๋ฒˆ์งธ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋กœ๊ทธ ์œ ํ˜•์ธ ๊ฒฝ์šฐ์—๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@keean IMO ์ด ์˜ˆ์—์„œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด ์˜ค๋Š˜ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋กํ•  ํ•ญ๋ชฉ์„ ๊ฒ€์‚ฌํ•˜๊ณ  context.Context ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ ๊ฐ’์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ์•„์ด๋””์–ด๊ฐ€ ํƒ€์ดํ•‘ ์• ํ˜ธ๊ฐ€๋“ค์—๊ฒŒ ํ˜์˜ค๊ฐ์„ ์ค€๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ฝค ์‹ค์šฉ์ ์ธ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ œํ•œ๋œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ด ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„์ด ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋Š” ํ˜„์žฌ Go ์ฝ”๋“œ๋ฒ ์ด์Šค ์—์„œ ๋Œ€๊ทœ๋ชจ๋กœ ์ด๋ฏธ ๊ฝค ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. , ๊ทธ๋“ค์€ ์ถ”๊ฐ€์ ์ธ ์—„๊ฒฉํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ์˜ ์ง„์ •ํ•œ ์ด์ ์„ ์–ป๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Ians ํฌ์ธํŠธ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ œ์ธ์ง€ ์—ฌ๋ถ€๋Š” ์—ฌ์ „ํžˆ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

@merovius ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ ์ž…๋ ฅ ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฐ์†ก๋œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋Ÿฐํƒ€์ž„ ๋ฐ˜์˜์ด ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ •์  ๋ชจ๋ธ๊ณผ ์ •๋ ฌ๋˜๋Š” ๋Ÿฐํƒ€์ž„ ๋ชจ๋ธ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋‹ค ์ ๊ทน์ ์ธ ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ JavaScript์—์„œ TypeScript๋กœ ๋Œ€๊ทœ๋ชจ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์ผ์„ ์ฒ˜๋ฆฌํ•ด ๋ณธ ๊ฒฐ๊ณผ, ๋‚ด ๊ฒฝํ—˜์ƒ ์—„๊ฒฉํ•œ ํƒ€์ดํ•‘์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๊ณ  ์ž‘์—…ํ•˜๋Š” ํŒ€์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋”์šฑ ์ค‘์š”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ํŒ€๊ณผ ์ž‘์—…ํ•  ๋•Œ ํšจ์œจ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„์„ ๋ณผ ํ•„์š” ์—†์ด ์ฝ”๋“œ ๋ธ”๋ก์˜ ์ธํ„ฐํŽ˜์ด์Šค/๊ณ„์•ฝ์— ์˜์กดํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ œ์ณ๋‘๊ณ : ๋ฌผ๋ก  ํ™•์žฅ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ OpenAPI/Swagger JSON ํŒŒ์ผ๋กœ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„ ์Šคํ…๊ณผ ํด๋ผ์ด์–ธํŠธ SDK๋ฅผ ๋นŒ๋“œํ•˜๋Š” API ์šฐ์„  ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ OpenAPI๋Š” ์‹ค์ œ๋กœ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์˜ ์œ ํ˜• ์‹œ์Šคํ…œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

@ianlancetaylor

๋ณ€ํ™˜ ๊ฐ€๋Šฅ์„ฑ, ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ ๋ฐ ๋น„๊ต ๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ฐ™์€ ์ œ์•ฝ ์กฐ๊ฑด์€ ์œ ํ˜• ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

Go ์œ ํ˜• ๋ณ€ํ™˜ ๊ทœ์น™์— ๋„ˆ๋ฌด ๋งŽ์€ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๋•Œ ๋‹ค์Œ ์ผ๋ฐ˜ ์Šฌ๋ผ์ด์Šค ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ๊ณ„์•ฝ C ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

func ConvertSlice(type In, Out C(In, Out)) (x []In) []Out {
    o := make([]Out, len(x))
    for i := range x {
        o[i] = Out(x[i])
    }
    return o
}

์™„๋ฒฝํ•œ C ๋Š” ์ „ํ™˜์„ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ์ •์ˆ˜, ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž ์œ ํ˜• ์‚ฌ์ด
  • ๋ชจ๋“  ๋ณต์†Œ์ˆ˜ ์œ ํ˜• ์‚ฌ์ด
  • ๊ธฐ๋ณธ ์œ ํ˜•์ด ๋™์ผํ•œ ๋‘ ์œ ํ˜• ์‚ฌ์ด
  • In Out ์œ ํ˜•์—์„œ
  • ์ฑ„๋„ ์œ ํ˜•์—์„œ ์–‘๋ฐฉํ–ฅ ์ฑ„๋„ ์œ ํ˜•์œผ๋กœ ๋‘ ์ฑ„๋„ ์œ ํ˜•์€ ๋™์ผํ•œ ์š”์†Œ ์œ ํ˜•์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
  • ๊ตฌ์กฐ์ฒด ํƒœ๊ทธ ๊ด€๋ จ, ...
  • ...

๋‚ด ์ดํ•ด๋กœ๋Š” ๊ทธ๋Ÿฐ ๊ณ„์•ฝ์„œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‚ด์žฅ๋œ convertible ๊ณ„์•ฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

ํŠน์ • ์œ ํ˜•์— ์ง€์ •๋œ ํ•„๋“œ ์„ธํŠธ๊ฐ€ ์žˆ๋‹ค๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์ง€๋งŒ ๋งค์šฐ ์ž์ฃผ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํƒ€์ž… ์ž„๋ฒ ๋”ฉ์ด Go ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ํ•„์š”๊ฐ€ ๋“œ๋ฌผ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

@merovius ๋‚˜๋Š” Go์˜ ๋ณ€ํ™”๊ฐ€ ์ ์ง„์ ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ›์•„๋“ค์ผ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ๊ณ  ํ˜„์ƒ์„ ๋ฐ›์•„๋“ค์ผ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋Œ€ํ™”์˜ ์ผ๋ถ€๋กœ ๊ท€ํ•˜์˜ ๋Œ“๊ธ€์— ๋‹ต์žฅ์„ ํ•˜๊ณ  ์ œ๊ฐ€ ํƒ€์ดํ•‘ ์• ํ˜ธ๊ฐ€๋ผ๋Š” ๋ฐ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋Ÿฐํƒ€์ž„ ๋ฆฌํ”Œ๋ ‰์…˜์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๋ฐํ˜”์ง€๋งŒ Go๊ฐ€ ๋Ÿฐํƒ€์ž„ ๋ฆฌํ”Œ๋ ‰์…˜์„ ํฌ๊ธฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์—…ํ•˜๊ณ  ๋‚ด ์ž‘์—…์—์„œ ๋งŽ์€ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ์ž์‹ ์˜ ์–ธ์–ด๋ฅผ (์ฒœ์ฒœํžˆ) ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์ง€๋งŒ ํ•ญ์ƒ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์ด ์ด๊ฒƒ์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ด๋ผ๋Š” ํฌ๋ง์„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@dotaheor ์˜ค๋Š˜์€ ์ „ํ™˜์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ๊ณ„์•ฝ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ธ์ง€๋Š” ์ง€์ผœ๋ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ianlancetailor์— ์‘๋‹ต

์‚ฌ๋žŒ๋“ค์ด ์ƒ์ˆ˜ ๊ฐ’์— ๋Œ€ํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํ•จ์ˆ˜๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์›ํ• ์ง€ ์•„์ง ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋ช…๋ฐฑํ•œ ๊ฒฝ์šฐ๋Š” ๋ฐฐ์—ด ์ฐจ์›์— ๋Œ€ํ•œ ๊ฒƒ์ด์ง€๋งŒ ์›ํ•˜๋Š” ๋ฐฐ์—ด ์œ ํ˜•์„ ์œ ํ˜• ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜์—ฌ ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฝ์šฐ ์™ธ์— const๋ฅผ ๋Ÿฐํƒ€์ž„ ์ธ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜์—ฌ ์‹ค์ œ๋กœ ์–ป๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ (์ „์ฒด) ๋ฐฐ์—ด ์œ ํ˜•์„ ์œ ํ˜• ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ œํ•œ์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ณ„์•ฝ์ด ๋ฐฐ์—ด ์ฐจ์›์ด๋‚˜ ์š”์†Œ ์œ ํ˜•์„ ๋ถ„ํ•ดํ•  ์ˆ˜ ์—†๊ณ  ์ด์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ถ€๊ณผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "์ „์ฒด ๋ฐฐ์—ด ์œ ํ˜•"์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณ„์•ฝ์—์„œ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด ์œ ํ˜•์˜ ์š”์†Œ ์œ ํ˜•์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ ์œ ํ˜•์ด ์•„๋‹Œ ์ œ๋„ค๋ฆญ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์œ ์šฉํ•œ์ง€์— ๋Œ€ํ•œ ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์˜ˆ์— โ€‹โ€‹๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์š”์ฒญ์€ ์ž˜ ๋ฐ›์•„๋“ค์—ฌ์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ํ™•์žฅํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์˜ˆ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ํด๋ž˜์Šค์™€ ๊ฐ๊ฐ์˜ ๋ช‡ ๊ฐ€์ง€ ํŠน์ • ์˜ˆ๋ฅผ ๋‹ค๋ฃจ๋Š” ์„น์…˜์„ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉฐ์น ์ด ์ง€๋‚œ ํ›„ ๋‹ค์‹œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์ด ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

Go 2 Generics์— ๋Œ€ํ•ด Type ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ Generic์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๊นŒ?

์ƒˆ ์„น์…˜์˜ ์ œ๋ชฉ์€ "๋น„์œ ํ˜•์— ๋Œ€ํ•œ ์ œ๋„ค๋ฆญ์ด ์œ ์šฉํ•œ ์˜ˆ์‹œ ๋ฐฉ๋ฒ•"์ž…๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, ํ–‰๋ ฌ ๋ฐ ๋ฒกํ„ฐ ์—ฐ์‚ฐ์— ๋Œ€ํ•œ ๊ณ„์•ฝ์€ ๋ฐฐ์—ด์˜ ์ฐจ์›๊ณผ ์š”์†Œ ์œ ํ˜• ๋ชจ๋‘์— ์ ์ ˆํ•œ ์ œ์•ฝ์„ ๋ถ€๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ๊ฐ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ํ‘œํ˜„๋˜๋Š” nxm ํ–‰๋ ฌ๊ณผ mxp ํ–‰๋ ฌ์˜ ํ–‰๋ ฌ ๊ณฑ์€ ์ฒซ ๋ฒˆ์งธ ํ–‰๋ ฌ์˜ ํ–‰ ์ˆ˜๊ฐ€ ๋‘ ๋ฒˆ์งธ ํ–‰๋ ฌ์˜ ์—ด ๊ฐœ์ˆ˜์™€ ๊ฐ™๋„๋ก ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ๋„ค๋ฆญ์€ ์œ ํ˜•์ด ์•„๋‹Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ตฌ์„ฑ ๋ฐ ํŠน์ˆ˜ํ™”๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, math/big.Int์˜ ์ œ๋„ค๋ฆญ ๋ณ€ํ˜•์€ ์ปดํŒŒ์ผ ์‹œ ๋ฐ/๋˜๋Š” ๋ถ€ํ˜ธ๊ฐ€ ์žˆ๋Š” ํŠน์ • ๋น„ํŠธ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด 128๋น„ํŠธ ์ •์ˆ˜ ๋ฐ ๊ธฐํƒ€ ๊ธฐ๋ณธ์ด ์•„๋‹Œ ๊ณ ์ • ๋„ˆ๋น„ ์ •์ˆ˜์— ๋Œ€ํ•œ ์š”๊ตฌ๋ฅผ ํ•ฉ๋ฆฌ์ ์ธ ํšจ์œจ์„ฑ์œผ๋กœ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๋™์ ์ธ ๊ธฐ์กด์˜ big.Int๋ณด๋‹ค. big.Float์˜ ์ผ๋ฐ˜ ๋ณ€ํ˜•์€ ์˜ˆ๋ฅผ ๋“ค์–ด IEEE 754-2008์˜ binary16, binary128 ๋ฐ binary256 ํ˜•์‹ ์˜ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ํšจ์œจ์ ์ธ ์ผ๋ฐ˜ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํŠน์ • ์ •๋ฐ€๋„ ๋ฐ/๋˜๋Š” ๊ธฐํƒ€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์œ ์‚ฌํ•˜๊ฒŒ ํŠน์ˆ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ ๋˜๋Š” ์ฒ˜๋ฆฌ ์ค‘์ธ ๋ฐ์ดํ„ฐ์˜ ํŠน์ • ์ธก๋ฉด์— ๋Œ€ํ•œ ์ง€์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์—…์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์˜ˆ๋ฅผ ๋“ค์–ด, ์Œ์ด ์•„๋‹Œ ์—์ง€ ๊ฐ€์ค‘์น˜ ๋˜๋Š” DAG ๋˜๋Š” ํŠธ๋ฆฌ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ๊ทธ๋ž˜ํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์ ํ™” ๋˜๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ–‰๋ ฌ ์ฒ˜๋ฆฌ ์ตœ์ ํ™” ์œ„ ๋˜๋Š” ์•„๋ž˜ ์‚ผ๊ฐํ˜•, ๋˜๋Š” ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ ํฐ ์ •์ˆ˜ ์‚ฐ์ˆ ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ์ƒ์ˆ˜ ์‹œ๊ฐ„์— ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๊ณ  ๋•Œ๋กœ๋Š” ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ฒƒ์€ ๊ตฌํ˜„์—์„œ ์ด๋Ÿฌํ•œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์˜ต์…˜์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ง€์†์ ์ธ ์ „ํŒŒ๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@bford ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ƒ์ˆ˜์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒŒ ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด ์กฐ๊ฑด์ด ํ•„์š”ํ•œ ์ด์œ .
์ด๋ก ์ ์œผ๋กœ ์‹ ์ฒด์˜ ๋ณ€์ˆ˜/๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ง๊ด€์ ์œผ๋กœ, ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๋ฐœ์ƒํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ช…์‹œํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ์š”๊ตฌ ์‚ฌํ•ญ์—๋Š” comp ๋˜๋Š” comptime๊ณผ ๊ฐ™์€ ํ‚ค์›Œ๋“œ๊ฐ€ ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ golang์˜ ๋ฌธ๋ฒ•์ด ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์ตœ๋Œ€ 2๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํŠœํ”Œ๋งŒ ํ—ˆ์šฉํ•œ๋‹ค๋ฉด ์ด ํ‚ค์›Œ๋“œ ์ฃผ์„์€ ์œ ํ˜• ๋ฐ ํ•จ์ˆ˜(๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํŠœํ”Œ์˜ ๊ฒฝ์šฐ)์˜ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ ํŠœํ”Œ์ด ํ•ญ์ƒ ํ‰๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋žต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์‹œ๊ฐ„์—.

๋˜ ๋‹ค๋ฅธ ์š”์ : const๊ฐ€ ๋Ÿฐํƒ€์ž„ ํ‘œํ˜„์‹์„ ํ—ˆ์šฉํ•˜๋„๋ก ํ™•์žฅ๋˜๋ฉด(์ง„์ •ํ•œ ์‹ฑ๊ธ€ ์‚ฌ์ธ์˜จ) ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

ํฌ์ธํ„ฐ ๋Œ€ ๊ฐ’ ๋ฐฉ๋ฒ• :

*T #$ ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ T ๊ฐ€ ์žˆ๋Š” ๊ณ„์•ฝ์— ๋ฉ”์„œ๋“œ๊ฐ€ ๋‚˜์—ด๋˜์–ด ์žˆ์œผ๋ฉด ํฌ์ธํ„ฐ ๋ฉ”์„œ๋“œ ๋˜๋Š” T ์˜ ๊ฐ’ ๋ฉ”์„œ๋“œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ถ„์— ๋Œ€ํ•œ ๊ฑฑ์ •์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—์„œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์€ ํฌ์ธํ„ฐ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ๋ฉ๋‹ˆ๋‹ค. ...

์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„๊ณผ ํ•จ๊ป˜ ์ด ์‚ฌ๊ฐํ˜•์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? T ์— ๋ช‡ ๊ฐ€์ง€ ํฌ์ธํ„ฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ(์˜ˆ MyInt ) ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— $# Stringer T ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( ์˜ˆ์‹œ)?

์ด๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ์ˆจ๊ฒจ์ง„ ์ฃผ์†Œ ์ž‘์—… & ์„ ๊ฐ–๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ , ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ๊ณ„์•ฝ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ช…์‹œ์  ์œ ํ˜• ์ „ํ™˜์„ ํ†ตํ•ด์„œ๋งŒ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์†”๋ฃจ์…˜๋„ ๋‚˜์—๊ฒŒ ์ข‹์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

(์ฐธ๊ณ : ํ˜ผ๋ž€์ด๋‚˜ ์ž˜๋ชป๋œ ์ฝ”๋“œ๋กœ ์ด์–ด์งˆ ๊ฒฝ์šฐ ์ด ๊ฒฐ์ •์„ ๋‹ค์‹œ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

๋‚˜๋Š” ํŒ€์ด ์ด๋ฏธ ํฌ์ธํ„ฐ ๋ฉ”์„œ๋“œ ๊ตฌ๋ฌธ์˜ ์ด ๋ชจํ˜ธ์„ฑ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ์œ ๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจํ˜ธ์„ฑ์ด ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๊ณ  ๋ง๋ถ™์˜€์Šต๋‹ˆ๋‹ค.

@fJavierZunzunegui ๋งž์Šต๋‹ˆ๋‹ค . ํ˜„์žฌ ํ…์ŠคํŠธ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์— ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ ์•”์‹œ์  ์ฃผ์†Œ ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์•”์‹œ์  ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜• ์—์„œ, ํŠนํžˆ ๊ตฌ์กฐ์ฒด์˜ ํ•„๋“œ๋กœ ํฌํ•จ๋œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๊ด€๋ จํ•˜์—ฌ:

๊ณ ๋ คํ•˜๋‹ค

type Lockable(type T) struct {
    T
    sync.Locker
}

T ์— Lock ๋˜๋Š” Unlock ๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๊ตฌ์กฐ์ฒด๊ฐ€ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ X ์กฐ๊ฑด์ด ์—†๋Š” ๊ฒƒ์€ ๊ณ„์•ฝ์—์„œ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ณ„์•ฝ์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๊ณ„์•ฝ์˜ ์ „์ฒด ๋ชฉ์ ์„ ํ›ผ์†ํ•จ).

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ํฌํ•จ๋œ ๊ฒฝ์šฐ(์˜ˆ T1 ๋ฐ T2 ) ๊ณตํ†ต ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์–ด์•ผ ํ•˜๋ฏ€๋กœ(๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ๊ณ„์•ฝ์— ์˜ํ•ด ์ ์šฉ๋˜์ง€ ์•Š์Œ) ํ›จ์”ฌ ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ๋˜ํ•œ ํฌํ•จ๋œ ์œ ํ˜•์— ๋”ฐ๋ผ ์ž„์˜์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์›ํ•˜๋ฉด ํ•ด๋‹น ๊ตฌ์กฐ์ฒด์˜ ์œ ํ˜• ์Šค์œ„์น˜์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ œํ•œ์ด ๋งค์šฐ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค( ์œ ํ˜• ์ฃผ์žฅ ๋ฐ ์Šค์œ„์น˜์™€ ๋งค์šฐ ์œ ์‚ฌ).

๋‚ด๊ฐ€ ๋ณผ ๋•Œ ๋‘ ๊ฐ€์ง€ ์ข‹์€ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ตฌ์กฐ์ฒด๊ฐ€ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ์‹œ๋„ ํ•ด๋ด. ์ปดํŒŒ์ผ์— ์‹คํŒจํ•œ ๊ฒƒ์€ ๋ชจํ˜ธํ•œ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ท€ํ•˜์˜ ์ฃผ์žฅ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ„์•ฝ์— ์–ธ๊ธ‰๋œ ๊ฒƒ์œผ๋กœ ์ œํ•œํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ์†”๋ฃจ์…˜์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. T ์— ๋Œ€ํ•œ ๊ณ„์•ฝ์ด $ Lock ๋ฐ Unlock $ ๋ฅผ ์ง€์ •ํ•˜๋”๋ผ๋„ ์—ฌ์ „ํžˆ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Lockable ์—์„œ ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค.

@jba ์ปดํŒŒ์ผ์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์†”๋ฃจ์…˜์€ ์ž„๋ฒ ๋””๋“œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ˜„์žฌ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ณ„์•ฝ์— ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ž„๋ฒ ๋””๋“œ ํ›„ ์ฆ‰์‹œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ T ์—๋Š” ๊ณ„์•ฝ์ด ์—†์œผ๋ฏ€๋กœ ํšจ๊ณผ์ ์œผ๋กœ interface{} ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ T ๊ฐ€ ๋‹ค์Œ์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”๋˜๋”๋ผ๋„ sync.Locker ์™€ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š” ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ์š”์ ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

์–ด๋Š ์ชฝ์ด๋“  ๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ ์†”๋ฃจ์…˜(์ž„๋ฒ ๋”ฉ์„ ์™„์ „ํžˆ ๊ธˆ์ง€)์„ ์„ ํ˜ธํ•˜๋ฏ€๋กœ ์ด๊ฒƒ์ด ์„ ํ˜ธํ•œ๋‹ค๋ฉด ๋‘ ๋ฒˆ์งธ ์†”๋ฃจ์…˜์„ ๋…ผ์˜ํ•  ๋ชฉ์ ์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค! : ์Šค๋งˆ์ผ :

@JavierZunzunegui ๊ฐ€ ์ œ๊ณตํ•œ ์˜ˆ์ œ๋Š” ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. T ๊ฐ€ noCopy noCopy ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด๋ผ๋ฉด? ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด ๊ฒฝ์šฐ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ œ๋„ค๋ฆญ์ด ์—†๋Š” ์„ธ์ƒ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

import "math/bits"

// SigEl is the element type used in variable length bit vectors, 
// can be any unsigned integer type
type SigEl = uint

// SigElBits is the number of bits storable in each SigEl
const SigElBits = 8 << uint((^SigEl(0)>>32&1)+(^SigEl(0)>>16&1)+(^SigEl(0)>>8&1))

// HammingDist counts the number bitwise differences between two
// bit vectors b1 and b2. I want this to be generic
// Function will panic at runtime if b1 and b2 aren't of equal length.
func HammingDist(b1, b2 []SigEl) (sum int) {
    // Give the compiler a hint so it won't need to bounds check the slices in loops
    _ = b1[len(b2)-1]  
        // This switch is optimized away because SigElBits is const
    switch SigElBits {   // Yay no golang generics!
    case 64:
        _ = b2[len(b1)-1]
        for x := range b1 {
            sum += bits.OnesCount64(uint64(b1[x] ^ b2[x]))
        }
    case 32:
        _ = b2[len(b1)-1]
        for x := range b1 {
            sum += bits.OnesCount32(uint32(b1[x] ^ b2[x]))
        }
    case 16:
        _ = b2[len(b1)-1]
        for x := range b1 {
            sum += bits.OnesCount16(uint16(b1[x] ^ b2[x]))
        }
    case 8:
        _ = b2[len(b1)-1]
        for x := range b1 {
            sum += bits.OnesCount8(uint8(b1[x] ^ b2[x]))
        }
    }
    return sum
}

์ด๊ฒƒ์€ ํ•˜๋‚˜์˜ ์ฃผ๋ฆ„์œผ๋กœ ์ถฉ๋ถ„ํžˆ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ข…์ข… ์ˆ˜์–ต ๊ฐœ์˜ []SigEl ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๊ทธ ๊ธธ์ด๋Š” ์ข…์ข… ์ด 128-384 ๋น„ํŠธ์ž…๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด์Šค๋Š” ๊ธฐ๋ณธ ๋ฐฐ์—ด ํฌ๊ธฐ ์œ„์— ๊ณ ์ •๋œ 192๋น„ํŠธ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ถ€๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด ์ž์ฒด๊ฐ€ 384๋น„ํŠธ ์ดํ•˜์ผ ๋•Œ ๋ถˆํ•„์š”ํ•œ 50-150% ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ถ€๊ณผํ•˜๋ฉฐ ์ด๋Š” ๋ถ„๋ช…ํžˆ ๋”์ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์†”๋ฃจ์…˜์€ Sig _arrays_ ์กฐ๊ฐ์„ ํ• ๋‹นํ•œ ๋‹ค์Œ ์œ„์˜ HammingDist ์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฆ‰์„์—์„œ ์Šฌ๋ผ์ด์Šคํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const SigBits = 256  // Any multiple of SigElBits is valid

// Sig is the bit vector array type
type Sig [SigBits/SigElBits]SigEl

bitVects := make([]Sig, 100000000)
// stuff happens ... 

// Note slicing below, just to make the arrays "generic" for the call 
dist := HammingDist(bitVects[x][:], bitVects[y][:])

๊ทธ ๋ชจ๋“  ๊ฒƒ ๋Œ€์‹ ์— ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” _์ข‹์•„ํ•˜๋Š”_ ๊ฒƒ์€ ์ผ๋ฐ˜ ์„œ๋ช… ์œ ํ˜•์„ ์ •์˜ํ•˜๊ณ  ์œ„์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

contract UnsignedInteger(T) {
    T uint, uint8, uint16, uint32, uint64
}

type Signature (type Element UnsignedInteger, n int) [n]Element

// HammingDist counts the number bitwise differences between two bit vectors
func HammingDist(b1, b2 *Signature) (sum int) {
    for x := range *b1 {
        // Assuming the std lib bits.OnesCount becomes generic over 
        // all UnsignedInteger types
        sum += bits.OnesCount(*b1[x] ^ *b2[x])
    }
    return sum
}

๋”ฐ๋ผ์„œ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

type sigEl = uint   // Any unsigned int type
const sigElBits = 8 << uint((^SigEl(0)>>32&1)+(^SigEl(0)>>16&1)+(^SigEl(0)>>8&1))
const sigBits = 256  // Any multiple of SigElBits is valid
type sig Signature(sigEl, sigBits/sigElBits)

bitVects := make([]sig, 100000000)
// stuff happens ... 

dist := HammingDist(&bitVects[x], &bitVects[y])

์—”์ง€๋‹ˆ์–ด๋Š” ๊ฟˆ์„ ๊ฟ€ ์ˆ˜ ์žˆ๋‹ค... ๐Ÿค–

์ตœ๋Œ€ ๋น„ํŠธ ๊ธธ์ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ํฐ์ง€ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

contract uintArrayOfFixedLength(ElemType,ArrayType)
{
    ArrayType [1]ElemType,[2]ElemType,...,[maxBit]ElemType
    ElemType uint8,uint16,uint32,uint64
}

func HammingDist(type ElemType,ArrayType uintArrayOfFixedLength)(t1,t2 ArrayType) (sum int)
{

}

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

์†”์งํžˆ ๋งํ•ด์„œ IMO๋Š” ํ•„์š” ํ•˜์ง€ ์•Š์€ ์ œ๋„ค๋ฆญ์„ ๋‚จ์šฉํ•˜๋Š” ์•„์ฃผ ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค. "๋ถˆํ™•์ • ๊ธธ์ด์˜ ๋ฐฐ์—ด"์€ ์ •ํ™•ํžˆ ์Šฌ๋ผ์ด์Šค์˜ ์šฉ๋„์ž…๋‹ˆ๋‹ค.

@Merovius ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜๊ฒฌ์€ ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ํ† ๋ก  ํฌ์ธํŠธ๋ฅผ ๋“œ๋Ÿฌ๋‚ธ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

"์ •ํ™•ํ•˜์ง€ ์•Š์€ ๊ธธ์ด์˜ ๋ฐฐ์—ด"์€ ์ •ํ™•ํžˆ ์Šฌ๋ผ์ด์Šค์˜ ์šฉ๋„์ž…๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ ์˜ˆ์—๋Š” ๋ถˆํ™•์‹คํ•œ ๊ธธ์ด์˜ ๋ฐฐ์—ด์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด ๊ธธ์ด๋Š” _์ปดํŒŒ์ผ ์‹œ๊ฐ„_์— ์•Œ๋ ค์ง„ ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์–ด๋ ˆ์ด์˜ ์šฉ๋„์ด์ง€๋งŒ ๋„ˆ๋ฌด ์œ ์—ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— golang IMO์—์„œ ์ œ๋Œ€๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ๋งํ•ด์„œ, ๋‚˜๋Š” ์ œ์•ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

type Signature (type Element UnsignedInteger, n int) [n]Element

n ๊ฐ€ ๋Ÿฐํƒ€์ž„ ๋ณ€์ˆ˜์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ๊ณผ ๊ฐ™์€ ์˜๋ฏธ์—์„œ ์—ฌ์ „ํžˆ ์ƒ์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

const n = 10
type nArray [n]uint               // works
type nSigInt Signature(uint, n)   // works 

var m = int(n)
type mArray [m]uint               // error
type mSigInt Signature(uint, m)   // error 

์Šฌ๋ผ์ด์Šค ๊ธฐ๋ฐ˜ HammingDist ํ•จ์ˆ˜์˜ "๋น„์šฉ"์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. bitVects[x][:] ๋Œ€ &bitVects[x] ๋กœ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด๊ฐ€ ์ž‘๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค(-ish, ์ตœ๋Œ€ 3๋ฐฐ). ์‹ค์ œ ์ฐจ์ด์ ์€ ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ ๋ฐ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์Šฌ๋ผ์ด์Šค ๊ธฐ๋ฐ˜ ๋ฒ„์ „์—์„œ ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์Šฌ๋ผ์ด์Šค ์•ก์„ธ์Šค๋ฅผ ๊ฒฝ๊ณ„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด ๋ฒ„์ „์˜ ์ฝ”๋“œ๊ฐ€ ํŒจ๋‹‰์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ช…์‹œ์  ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ ๋ฐ ๋ฐ˜ํ™˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•จ). NOP ํ• ๋‹น( _ = b1[len(b2)-1] )์€ ๋ฃจํ”„์˜ ๋ชจ๋“  ์Šฌ๋ผ์ด์Šค ์•ก์„ธ์Šค๋ฅผ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ํžŒํŠธ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์— ์ œ๊ณตํ•˜์—ฌ ์˜๋ฏธ ์žˆ๋Š” ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „๋‹ฌ๋œ ๊ธฐ๋ณธ ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ํ•ญ์ƒ ๊ฐ™๋”๋ผ๋„ ์ด๋Ÿฌํ•œ ์ตœ์†Œ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋Š” ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” for/range ๋ฃจํ”„๋ฅผ ์ˆ˜์ต์„ฑ ์žˆ๊ฒŒ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: unrolling ์„ ํ†ตํ•ด).

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

๋˜ํ•œ, ์ž‘์€ ๋ฐฐ์—ด ์ฐจ์›(๋‚ด ๊ฒฝ์šฐ์— ์ค‘์š”)์˜ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ˆ˜์ต์„ฑ ์žˆ๊ฒŒ ํ’€๊ฑฐ๋‚˜ ์ ์ ˆํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด for/range ๋ฃจํ”„๋ฅผ ์™„์ „ํžˆ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ด๋Ÿฌํ•œ ์ฐจ์›์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. .

์ฝ”๋“œ์˜ ์ผ๋ฐ˜ ๋ฒ„์ „์˜ ๋˜ ๋‹ค๋ฅธ ํฐ ์ด์ ์€ HammingDist ๋ชจ๋“ˆ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์ฝ”๋“œ์—์„œ unsigned int ์œ ํ˜•์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๋ฒ„์ „์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์ •์˜๋œ ์œ ํ˜• SigEl ์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋ชจ๋“ˆ ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์œ ํ˜•์„ ๋ชจ๋“ˆ์— "์ „๋‹ฌ"ํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ์ฐจ์ด์˜ ๊ฒฐ๊ณผ๋Š” {8,16,32,64}๋น„ํŠธ ๋‹จ์œ„์˜ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ ๊ฑฐ๋ฆฌ ํ•จ์ˆ˜์˜ ๊ตฌํ˜„์ด ๋” ๊ฐ„๋‹จํ•ด์ง‘๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์˜ ์Šฌ๋ผ์ด์Šค ๊ธฐ๋ฐ˜ ๋ฒ„์ „ ๋น„์šฉ๊ณผ ์š”์†Œ ์œ ํ˜•์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๋น„์šฉ์€ ์ด ํ•จ์ˆ˜์˜ "NxM" ๋ฒ„์ „์„ ๊ตฌํ˜„ํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ฐจ์„ ์ฑ…์ž…๋‹ˆ๋‹ค. (์ƒ์ˆ˜) ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ๋ฐฐ์—ด ์œ ํ˜•์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ์ง€์›์€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

// With generics + parameterized constant array lengths:
type Signature (type Element UnsignedInteger, n int) [n]Element
func HammingDist(b1, b2 *Signature) (sum int) { ... }

// Without generics
func HammingDistL1Uint(b1, b2 [1]uint) (sum int) { ... }
func HammingDistL1Uint8(b1, b2 [1]uint8) (sum int) { ... }
func HammingDistL1Uint16(b1, b2 [1]uint16) (sum int) { ... }
func HammingDistL1Uint32(b1, b2 [1]uint32) (sum int) { ... }
func HammingDistL1Uint64(b1, b2 [1]uint64) (sum int) { ... }

func HammingDistL2Uint(b1, b2 [2]uint) (sum int) { ... }
func HammingDistL2Uint8(b1, b2 [2]uint8) (sum int) { ... }
func HammingDistL2Uint16(b1, b2 [2]uint16) (sum int) { ... }
func HammingDistL2Uint32(b1, b2 [2]uint32) (sum int) { ... }
func HammingDistL2Uint64(b1, b2 [2]uint64) (sum int) { ... }

func HammingDistL3Uint(b1, b2 [3]uint) (sum int) { ... }
func HammingDistL3Uint8(b1, b2 [3]uint8) (sum int) { ... }
func HammingDistL3Uint16(b1, b2 [3]uint16) (sum int) { ... }
func HammingDistL3Uint32(b1, b2 [3]uint32) (sum int) { ... }
func HammingDistL3Uint64(b1, b2 [3]uint64) (sum int) { ... }

// and L4, L5, L6 ... ad nauseum

์œ„์˜ ์•…๋ชฝ์ด๋‚˜ ํ˜„์žฌ ๋Œ€์•ˆ์˜ ์‹ค์ œ ๋น„์šฉ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์€ "์ผ๋ฐ˜์ ์ธ ๋‚จ์šฉ"์˜ _๋ฐ˜๋Œ€_์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” @sighoya ์™€ ๊ณ„์•ฝ์—์„œ ํ—ˆ์šฉ๋˜๋Š” ๋ชจ๋“  ๋ฐฐ์—ด ๊ธธ์ด๋ฅผ ์—ด๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ œํ•œ๋œ ๊ฒฝ์šฐ์— ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ, ๋‚ด ๊ฒฝ์šฐ์—๋„ ๋„ˆ๋ฌด ์ œํ•œ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ฎ์€ ์ด 384๋น„ํŠธ, uint8 ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ๊ณ„์•ฝ์˜ ArrayType [1]ElemType,[2]ElemType,...,[maxBit]ElemType ์กฐํ•ญ์— ๊ฑฐ์˜ 50๊ฐœ ์šฉ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ ์˜ˆ์—๋Š” ๋ถˆํ™•์‹คํ•œ ๊ธธ์ด์˜ ๋ฐฐ์—ด์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด ๊ธธ์ด๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ๋ ค์ง„ ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ "๋Ÿฐํƒ€์ž„์—"๋ผ๊ณ  ๋งํ•˜์ง€๋„ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๋ชจ๋ฅด๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด์Šค๋Š” ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋œ ์ œ๋„ค๋ฆญ ๋ฒ„์ „์˜ ํ•จ์ˆ˜๊ฐ€ ์ œ์•ˆํ•œ ๋Œ€๋กœ ๋ฐฐ์—ด ๊ธธ์ด๋ฅผ "์ „๋‹ฌ"ํ•ด์•ผ ํ•˜๋Š”์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ธ์Šคํ„ด์Šคํ™”๋œ ์œ ํ˜•์˜ ์ผ๋ถ€์ธ ์ƒ์ˆ˜ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์˜ ์ œ๋„ค๋ฆญ ๋ฒ„์ „์€ - ํ•ด๋‹น ์œ ํ˜•์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ๋‹ค๋ฅธ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ƒ์„ฑ๋œ ์ฝ”๋“œ ๊ฐ€ ์ผ๋ฐ˜์ ์ด์ง€ ์•Š๊ณ  ๋ชจ๋“  ์œ ํ˜•์— ๋Œ€ํ•ด ํ™•์žฅ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด [1]Element , [2]Element ๋“ฑ์— ๋Œ€ํ•ด ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ์ƒ์„ฑ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šฌ๋ผ์ด์Šค ๋ฒ„์ „๊ณผ ๋™์ผํ•œ ํ•˜๋‚˜์˜ ๋ฒ„์ „์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

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

์ฝ”๋“œ์˜ ์ œ๋„ค๋ฆญ ๋ฒ„์ „์˜ ๋˜ ๋‹ค๋ฅธ ํฐ ์ด์ 

๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด: "์ œ๋„ค๋ฆญ ๋ฒ„์ „"์ด๋ž€ ํ˜„์žฌ ๊ณ„์•ฝ ์„ค๊ณ„ ์ดˆ์•ˆ์—์„œ ๊ตฌํ˜„๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์˜ ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋…์„ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ์ œ๋„ค๋ฆญ์„ ๋ณด๋‹ค ๊ตฌ์ฒด์ ์œผ๋กœ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์ด ๋‹จ๋ฝ์—์„œ ์–ธ๊ธ‰ํ•œ ์ด์ ์€ ํ˜„์žฌ ๊ณ„์•ฝ ์„ค๊ณ„ ์ดˆ์•ˆ์—๋„ ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ๋„ค๋ฆญ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ์ฃผ์žฅ์„ ํ•˜๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ์˜ˆ๊ฐ€ ์œ ํ˜•์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ข…๋ฅ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

// With generics + parameterized constant array lengths:
// Without generics

์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ์ด๋ถ„๋ฒ•์ž…๋‹ˆ๋‹ค. "์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ •์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์—†์Œ"๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

contract Unsigned(T) {
    T uint, uint8, uint16, uint32, uint64
}
func HammingDist(type T Unsigned) (b1, b2 []T) (sum int) {
    if len(b1) != len(b2) {
        panic("slices of different lengths passed to HammingDist")
    }
    for i := range b1 {
        sum += bits.OnesCount(b1[i]^b2[i]) // Same assumption about OnesCount being generic you made above
    }
    return sum
}

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

์ปดํŒŒ์ผ๋œ ์ œ๋„ค๋ฆญ ๋ฒ„์ „์˜ ํ•จ์ˆ˜๊ฐ€ ์ œ์•ˆํ•œ ๋Œ€๋กœ ๋ฐฐ์—ด ๊ธธ์ด๋ฅผ "์ „๋‹ฌ"ํ•ด์•ผ ํ•˜๋Š”์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ธ์Šคํ„ด์Šคํ™”๋œ ์œ ํ˜•์˜ ์ผ๋ถ€์ธ ์ƒ์ˆ˜ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์ด C++ ํ…œํ”Œ๋ฆฟ๊ณผ ์ค‘๋ณต ํ•จ์ˆ˜ ๊ตฌํ˜„์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์˜ณ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ์€ ์ˆจ๊ฒจ์ง„ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๋‹จ์ผ ๊ตฌํ˜„์„ ๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

golang ์œ ์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ๊ถ๊ทน์ ์œผ๋กœ ์–ด๋–ค ๊ฒƒ์„ ๊ตฌํ˜„ํ• ์ง€ ํ™•์‹คํžˆ ์•Œ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๋” ๋งŽ์€ ์ถ”์ธก์„ ์ž์ œํ•˜๊ณ  ๋‚ด๋ถ€ ์ง€์‹์ด ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ธฐ๊บผ์ด ๋งก๊ธฐ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•„๋Š” ๊ฒƒ์€ ์œ„์—์„œ ๊ณต์œ ํ•œ ์‹ค์ œ ๋ฌธ์ œ์˜ ์˜ˆ์—์„œ ํ˜„์žฌ ์Šฌ๋ผ์ด์Šค ๊ธฐ๋ฐ˜ ๊ตฌํ˜„๊ณผ ์ž˜ ์ตœ์ ํ™”๋œ ์ผ๋ฐ˜ ์–ด๋ ˆ์ด ๊ธฐ๋ฐ˜ ๊ตฌํ˜„ ๊ฐ„์˜ ์ž ์žฌ์ ์ธ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ์ƒ๋‹นํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

BenchmarkHD/256-bit_unrolled_array_HD-20            2000000000           1.05 ns/op        0 B/op          0 allocs/op
BenchmarkHD/256-bit_slice_HD-20                     300000000            5.10 ns/op        0 B/op          0 allocs/op

์ฝ”๋“œ: https://github.com/vsivsi/hdtest

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

๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ, ์ด๋Ÿฌํ•œ ์ตœ์ ํ™”๊ฐ€ ์œ ์ง€ ๊ด€๋ฆฌ์ž์— ์˜ํ•ด ๊ตฌํ˜„๋˜์ง€ ์•Š์œผ๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ๋ฐฐ์—ด ๊ธธ์ด๋ฅผ ์ œ๋„ค๋ฆญ์— ์ถ”๊ฐ€ํ•˜๋Š” ์ „์ฒด ์—ฐ์Šต์ด ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ์ด ์˜ˆ์ œ ์‚ฌ๋ก€์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ํฅ๋ฏธ๋กœ์šด ํ† ๋ก ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹œ๋ฏผ์˜์‹์„ ์œ ์ง€ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@vsivsi FWIW, ๋ฃจํ”„๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ’€์ง€ ์•Š์œผ๋ฉด(๋˜๋Š” ์Šฌ๋ผ์ด์Šค ์œ„๋กœ ๋ฃจํ”„๋ฅผ ํ’€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ) ๊ด€์ฐฐ ์ค‘์ธ ์Šน๋ฆฌ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ •์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„์›€์ด ๋œ๋‹ค๋Š” ์ฃผ์žฅ์„ ์‹ค์ œ๋กœ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ธ๋กค๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ X์— ๋Œ€ํ•ด ์ž„์˜๋กœ ์˜๋ฆฌํ•ด์ง€๊ณ  Y์— ๋Œ€ํ•ด ์ž„์˜๋กœ ๋ฒ™์–ด๋ฆฌ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Y ๋Œ€์‹  X๋ฅผ ๋…ผํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋‚˜์œ ๊ณผํ•™์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํ’€๊ธฐ ํœด๋ฆฌ์Šคํ‹ฑ์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ์ด์œ ๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. , ๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ๋ ค์ง„ ๊ธธ์ด์˜ ์Šฌ๋ผ์ด์Šค๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํŠธ๋ฆฌ๊ฑฐ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ๋‹ค๋ฅธ ์ œ๋„ค๋ฆญ์— ๋น„ํ•ด ํŠน์ • ์ข…๋ฅ˜์˜ ์ œ๋„ค๋ฆญ์˜ ์ด์ ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์ „๊ฐœ ํœด๋ฆฌ์Šคํ‹ฑ์˜ ์ด์ ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@Merovius ๋‚˜๋Š” ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์˜ˆ์ œ์—์„œ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ฒฝ์šฐ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์žˆ๋Š” ์ „๋ฌธํ™”ํ•  ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ •๊ตํ™”(๊ฐ ์œ ํ˜• ์ˆ˜์ค€ ์ •์ˆ˜์— ๋Œ€ํ•ด ๊ณ ์œ ํ•œ ๊ธฐ๋Šฅ์„ ๋ฐฉ์ถœ)๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ œํ•œ๋œ ์ˆ˜์˜ ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ตœ์ ํ™”๋œ ๋ฒ„์ „์˜ ์ด์ ์„ ์–ป์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด ์ฝ”๋“œ๊ฐ€ ๊ธธ์ด 64์˜ ๋ฐฐ์—ด๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ธธ์ด 64์— ๋Œ€ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜์˜ ์ตœ์ ํ™”๋œ ์ •๊ตํ™”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŠน์ •ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋ฐฐ์—ด ๊ธธ์ด์˜ ๋นˆ๋„ ๋ถ„ํฌ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ๊ณผ ์ž‘์—…์„ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€ ์บ์‹œ ํŠธ๋ž˜์‹ฑ์œผ๋กœ ์ธํ•ด ์ˆ˜์ฒœ ๊ฐœ์˜ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ์ •๊ตํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž‘์€ ํฌ๊ธฐ๊ฐ€ ์ผ๋ฐ˜์ ์ด์ง€๋งŒ ๋” ํฐ ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด(ํฌ๊ธฐ์˜ ๋กฑํ…Œ์ผ ๋ถ„ํฌ) ํ’€๋ฆฐ ๋ฃจํ”„(์˜ˆ: 1์—์„œ 64)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์€ ์ •์ˆ˜์— ๋Œ€ํ•œ ํŠน์ˆ˜ ๊ธฐ๋Šฅ์„ ์ •๊ตํ•˜๊ฒŒ ๋งŒ๋“  ๋‹ค์Œ ์ˆจ๊ฒจ์ง„ ๋‹จ์ผ ์ผ๋ฐ˜ ๋ฒ„์ „์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜.

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

"์ผ๋ฐ˜์ ์ธ ๋”œ๋ ˆ๋งˆ"์™€ ๊ด€๋ จํ•˜์—ฌ ๊ฐœ์ธ์ ์œผ๋กœ "์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋Š๋ฆฌ๊ฒŒ/๋” ๋งŽ์ด ์ˆ˜ํ–‰"์œผ๋กœ ๊ฐˆ ๊ฒƒ์ด์ง€๋งŒ ์ข‹์€ ๊ตฌํ˜„๊ณผ ๋ณ„๋„์˜ ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ๋งŒ๋“ค๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค. Rust๋Š” ๊ฝค ์ž˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™๊ณ , Intel์˜ ์ตœ๊ทผ ๋ฐœํ‘œ ์ดํ›„์—๋Š” ๊ฒฐ๊ตญ ์ฃผ์š” ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ 'C'๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ๋ฉ”๋ชจ๋ฆฌ์™€ 'C'์™€ ๊ฐ™์€ ์†๋„์™€ ๊ฐ™์€ ๋™์‹œ์„ฑ ์•ˆ์ „์„ฑ์ด ํ•ต์‹ฌ์ ์ธ ์š”์†Œ์ธ ๊ฒƒ ๊ฐ™์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์‹œ๊ฐ„๋„ ์ธํ…”์˜ ๊ฒฐ์ •์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. Rust์˜ "ํŠน์„ฑ"์€ ์ œ๋„ค๋ฆญ ์œ ํ˜• ํด๋ž˜์Šค์˜ ํ•ฉ๋ฆฌ์ ์ธ ๊ตฌํ˜„์ด๋ฉฐ, ์œ ํ˜• ์‹œ์Šคํ…œ ์„ค๊ณ„์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋˜๋Š” ์„ฑ๊ฐ€์‹  ์ฝ”๋„ˆ ์ผ€์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋…ผ์˜๋ฅผ ๋‹ค์‹œ ์–ธ๊ธ‰ํ•˜๋ฉด โ€‹โ€‹์ผ๋ฐ˜์ ์œผ๋กœ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๋…ผ์˜์™€ ์ด๊ฒƒ์ด Go์— ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 'C'์— ์ œ๋„ค๋ฆญ์ด ์—†๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹จ์ˆœํ•˜๊ณ  ์šฐ์•„ํ•œ ์–ธ์–ด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ณต์žกํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— Go์— ์ œ๋„ค๋ฆญ์ด ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์œผ๋กœ ์ผ๋ฐ˜ ๊ตฌํ˜„์„ ํฌํ•จํ•˜์ง€๋งŒ ๋‹จ์ˆœํ•˜๊ณ  ์šฐ์•„ํ•˜๊ฒŒ ์œ ์ง€๋˜๋Š” ์–ธ์–ด ์‹œ์žฅ์—๋Š” ๊ฒฉ์ฐจ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ง„์ „์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์–ผ๋งˆ๋‚˜ ์˜ค๋žซ๋™์•ˆ ์ œ๋„ค๋ฆญ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚œ ์˜ค๋žซ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์™”์–ด

@Nsgj ์ด CL์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://go-review.googlesource.com/c/go/+/187317/

ํ˜„์žฌ ์‚ฌ์–‘์—์„œ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

contract Point(T) {
  T struct { X, Y float64 }
}

์ฆ‰, ์œ ํ˜•์€ float64 ์œ ํ˜•์˜ X ๋ฐ Y ํ•„๋“œ๊ฐ€ ๋‘ ๊ฐœ์ธ ๊ตฌ์กฐ์ฒด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์˜ˆ์ œ ์‚ฌ์šฉ

func generate(type T Point)() T {
  return T{X: randomFloat64(), Y: randomFloat64()}
}

@abuchanan-nr ์˜ˆ, ํ˜„์žฌ ์„ค๊ณ„ ์ดˆ์•ˆ์—์„œ๋Š” ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์œ ์šฉํ• ์ง€ ์•Œ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

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

FWIW, ๋‚˜๋Š” 2D ๊ทธ๋ž˜ํ”ฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์ƒํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ผญ์ง“์ ์— ์ƒ‰์ƒ, ํž˜ ๋“ฑ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๋ณ„ ํ•„๋“œ๊ฐ€ ์žˆ๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ๋Š” X, Y ์ขŒํ‘œ์—๋งŒ ์˜์กดํ•˜๋Š” ๊ธฐํ•˜ํ•™ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฉ”์„œ๋“œ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ผ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์›ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์ •์  ์œ ํ˜•์„ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด

type MyVertex struct {
  X, Y float64
  Color color.Color
  OtherAttr int
}
p := geo.RandomPolygon(MyVertex)()

for _, vert := range p.Vertices() {
  p.Color = randColor()
}

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ์ข‹์€ ๋””์ž์ธ์œผ๋กœ ํŒ๋ช…๋˜์—ˆ๋Š”์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ทธ ๋‹น์‹œ ๋‚ด ์ƒ์ƒ์ด ์žˆ์—ˆ๋˜ ๊ณณ์ž…๋‹ˆ๋‹ค. :)

์ด๊ฒƒ์ด ์˜ค๋Š˜๋‚  ํ‘œ์ค€ Go์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” https://godoc.org/image#Image ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ณ„์•ฝ์˜ ์šด์˜์ž/์œ ํ˜•์— ๊ด€ํ•˜์—ฌ :

์—ฐ์‚ฐ์ž ํ˜•์‹( + , == , < , ...) ๋ฐ ๋ฉ”์„œ๋“œ ํ˜•์‹( Plus(T) T , Equal(T) bool , LessThan(T) bool , ...).

์ €๋Š” ์ด ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ• ํ˜•์‹์œผ๋กœ ํ†ตํ•ฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๋ ค๋ฉด ๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ํ˜•์‹( int , int64 , string , ...)์„ ์ž„์˜์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜•์‹์œผ๋กœ ์บ์ŠคํŒ…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์‚ฌ์†Œํ•œ) ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ๋Š” ์ด๋ฏธ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ( type MyInt int; func (i MyInt) LessThan(o MyInt) bool {return int(i) < int(o)} ), ์‹ค์ œ ๊ฐ’์€ ๋ณตํ•ฉ ์œ ํ˜•์— ์žˆ์Šต๋‹ˆ๋‹ค( []int -> []MyInt , map[int]struct{} -> map[MyInt]struct{} ๋“ฑ ์ฑ„๋„, ํฌ์ธํ„ฐ, ...) ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( FAQ ์ฐธ์กฐ). ์ด ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ทธ ์ž์ฒด๋กœ ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ์ด๋ฏ€๋กœ ๋‚˜๋Š” Relaxed Type Conversion Proposal ์˜ ๊ธฐ์ˆ ์„ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๊ฐ€ ์—ฐ์‚ฐ์ž๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ์œ ํ˜•์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ์œ ํ˜•์„ ๊ณ„์† ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ฏธ๋ฆฌ ์„ ์–ธ๋˜์ง€ ์•Š์€ ํ˜•์‹์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ œ์•ˆ์— ๋”ฐ๋ฅด๋ฉด type X struct{S string} (์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณต๋˜๋ฏ€๋กœ ์—ฌ๊ธฐ์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Œ)์— []X ๊ฐ€ ์žˆ๊ณ  ์ด๋ฅผ ์ผ๋ฐ˜ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. Stringer T ์— ๋Œ€ํ•ด $ []T ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. type X2 X; func(x X2) String() string {return x.S} []X []X2 ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์— ๋Œ€ํ•ด ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ „์ฒด ์‚ฌ๋ณธ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์–ธ๊ธ‰๋œ ์™„ํ™”๋œ ์œ ํ˜• ๋ณ€ํ™˜ ์ œ์•ˆ ์—๋Š” ๋„์ „์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@JavierZunzunegui ๊ธฐ๋ณธ ๋‹จํ•ญ/์ด์ง„ ์—ฐ์‚ฐ์ž์— "๋ฉ”์„œ๋“œ ํ˜•์‹"(๋˜๋Š” ์—ฐ์‚ฐ์ž ํ˜•์‹)์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์—ฐ์‚ฐ์ž ๊ธฐํ˜ธ๋ฅผ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์œผ๋กœ ํ—ˆ์šฉํ•˜์—ฌ +(x int) int ์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ๋„์ž…ํ•˜๊ณ  ์ด๋ฅผ ๋‚ด์žฅ ์œ ํ˜•์œผ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ž„์˜์˜ ์ •์ˆ˜ ์œ ํ˜• - ํ˜„์žฌ๋กœ์„œ๋Š” ์ด๋ฅผ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ทธ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ„์•ฝ์„œ์—์„œ ํ‘œํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” X ์œ ํ˜•์˜ $ x ๊ฐ’์„ T(x) ์—์„œ์™€ ๊ฐ™์ด T ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. T(x) (๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€). ์ฆ‰, ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๋ณ€ํ™˜์— ๋Œ€ํ•œ "๋ฉ”์„œ๋“œ ํ˜•์‹"์„ ๋ฐœ๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜ c ๋ฅผ T ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์˜ ๋ณ€์ˆ˜์— ํ• ๋‹น(๋˜๋Š” ๋ณ€ํ™˜)ํ•  ์ˆ˜ ์žˆ์Œ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 256์—์„œ t T ? T ๊ฐ€ byte $ ์ด๋ฉด? ์ด๋Ÿฐ ๊ฒƒ๋“ค์ด ๋ช‡ ๊ฐ€์ง€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์— ๋Œ€ํ•œ "๋ฉ”์„œ๋“œ ํ˜•์‹" ํ‘œ๊ธฐ๋ฒ•์„ ๋งŒ๋“ค ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๋น ๋ฅด๊ฒŒ ๋ณต์žกํ•ด์ง€๊ณ  ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋ง์€ ์•„๋‹ˆ์ง€๋งŒ ๋งŒ์กฑ์Šค๋Ÿฝ๊ณ  ๋ช…ํ™•ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋‹จ์ˆœํžˆ ์œ ํ˜•์„ ์—ด๊ฑฐํ•˜๋Š” ํ˜„์žฌ ๋””์ž์ธ ์ดˆ์•ˆ์€ ์ดํ•ดํ•˜๊ธฐ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

@griesemer ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์šฐ์„  ์ˆœ์œ„๋กœ ์ธํ•ด Go์—์„œ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฝค ์ž˜ ํ•ด๊ฒฐ๋œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์•”์‹œ์  ๋ณ€ํ™˜์„ ๋‚˜์˜๊ฒŒ ๋ณด๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ๋ณด์ด์ง€ ์•Š๋Š” ๋งˆ์ˆ  ๊ฐ™์€ ๋‹ค๋ฅธ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜•์‹ ์‹œ์Šคํ…œ์— ์•”์‹œ์  ๋ณ€ํ™˜์ด ์—†์œผ๋ฉด ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ—ˆ์šฉ๋˜๋Š” ํ˜•์‹ ๋ฒ”์œ„๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• ๊ฐ„์˜ ์œ ์‚ฌ์„ฑ์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฏ€๋กœ '+'์™€ ๊ฐ™์€ ์ž‘์—…์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ํ˜•์ด ์•„๋‹Œ ์ˆซ์ž ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ž‘์—…์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜์™€ ๋ง์…ˆ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ชจ๋‘ ๋™์ผํ•œ ์œ ํ˜•์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ํ‘œํ˜„ํ•˜๋ ค๋ฉด ์œ ํ˜• ๋ณ€์ˆ˜์™€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์—์„œ ๋”ํ•˜๊ธฐ ์—ฐ์‚ฐ์ž๋Š” ์ˆซ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋Š” ์œ ํ˜•์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋„๋ก ์„ ์–ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด '์ •์ˆ˜'์™€ '๋ง์…ˆ'์ด "๊ทธ๋ฃน"์„ ํ˜•์„ฑํ•˜๋Š” ์ˆ˜ํ•™๊ณผ ์ž˜ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋๋‚ฉ๋‹ˆ๋‹ค.

+(T Addable)(x T, y T) T

์•”์‹œ์  ์ธํ„ฐํŽ˜์ด์Šค ์„ ํƒ์„ ํ—ˆ์šฉํ•˜๋ฉด '+' ์—ฐ์‚ฐ์ž๋Š” ์ˆซ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ Go์—์„œ ๋ฉ”์„œ๋“œ ์„ ํƒ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ „ํ™˜์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์š”์ ์— ๋Œ€ํ•ด @griesemer :

๊ณ„์•ฝ์—์„œ ํ‘œํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” X ํ˜•์‹์˜ ๊ฐ’ x๊ฐ€ T(x)์—์„œ์™€ ๊ฐ™์ด ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜ T์˜ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๋ณ€ํ™˜์— ๋Œ€ํ•œ "๋ฉ”์„œ๋“œ ํ˜•์‹"์„ ๋ฐœ๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ํ•ฉ๋ณ‘์ฆ์ด ๋ ์ง€ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณด๊ธฐ์— ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์€ ํ˜ธ์ถœ์ž์— ์˜ํ•ด ์ผ๋ฐ˜ ์ฝ”๋“œ ์™ธ๋ถ€์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ(์ดˆ์•ˆ ๋””์ž์ธ์— ๋”ฐ๋ผ Stringify ์‚ฌ์šฉ):

Stringify(int)([]int{1,2}) // does not compile
type MyInt int
func (i MyInt) String() string {...}
Stringify(MyInt)([]MyInt([]int{1,2})) // OK. Generic type MyInt could be inferred

์œ„์—์„œ Stringify ์— ๊ด€ํ•œ ํ•œ ์ธ์ˆ˜๋Š” []MyInt ์œ ํ˜•์ด๊ณ  ๊ณ„์•ฝ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ์ฝ”๋“œ๋Š” ์ œ๋„ค๋ฆญ ์œ ํ˜•์„ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๊ณ„์•ฝ์— ๋”ฐ๋ผ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ œ์™ธ). ์ •ํ™•ํžˆ๋Š” ํ•ด๋‹น โ€‹โ€‹๊ณ„์•ฝ์— ์ด์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@JavierZunzunegui ํ˜ธ์ถœ์ž๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค/๊ณ„์•ฝ์— ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์–‘ํ•œ ์ •์ˆ˜ ๋˜๋Š” ๋ถ€๋™ ์†Œ์ˆ˜์  ์œ ํ˜•์—์„œ ์ž‘๋™ํ•˜๋Š” ์ผ๋ฐ˜ ์ˆซ์ž ์•Œ๊ณ ๋ฆฌ์ฆ˜(๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํ•จ์ˆ˜)์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ผ๋ถ€๋กœ ํ•จ์ˆ˜ ์ฝ”๋“œ๋Š” c1 , c2 ๋“ฑ์˜ ์ƒ์ˆ˜ ๊ฐ’์„ T ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์˜ ๊ฐ’์— ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒ์ˆ˜๋ฅผ T ์œ ํ˜•์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์ง€ ๋ชปํ•œ ์ฑ„ ์ฝ”๋“œ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (๋ฌผ๋ก  ๊ทธ ์ƒ์ˆ˜๋ฅผ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

func NumericAlgorithm(type T SomeContract)(vector []T) T {
   ...
   vector[i] = 3.1415  // <<< how do we know this is valid without the contract telling us?
   ...
}

T ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์˜ ๊ฐ’์— ์ƒ์ˆ˜ ๊ฐ’ c1 , c2 ๋“ฑ์„ ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@griesemer ๋‚˜๋Š” (์ œ๋„ค๋ฆญ์ด ์–ด๋–ป๊ฒŒ ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ด€์ ์—์„œ) ์œ„์˜ ๋‚ด์šฉ์ด ์ž˜๋ชป๋œ ๋ฌธ์ œ ์ง„์ˆ ์ด๋ผ๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. T ๋ฅผ float32 ๋กœ ์ •์˜ํ•ด์•ผ ํ•˜์ง€๋งŒ ๊ณ„์•ฝ์—๋Š” ์ •์˜๋œ ๋‚ด์šฉ์ด ์•„๋‹ˆ๋ผ T ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋งŒ ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ•„์š”ํ•˜๋ฉด vector ๋ฅผ []T ๋กœ ์œ ์ง€ํ•˜๊ณ  func(float32) T ์ธ์ˆ˜( vector[i] = f(c1) )๋ฅผ ์š”๊ตฌํ•˜๊ฑฐ๋‚˜ vector ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค. []float32 DoSomething([]float32) T ํ•˜๊ณ  $# DoSomething(float32) T ๋ฐ float๋Š” ํŠน์ • ์ง€์ ์—์„œ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” T ๊ฐ€ type T float32 ๋กœ ์ •์˜๋˜๊ฑฐ๋‚˜ ์ •์˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๊ณ„์•ฝ์—์„œ ์š”๊ตฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

@JavierZunzunegui ์ €๋Š” T ๊ฐ€ float32 $๋กœ ์ •์˜๋œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. float32 , float64 ๋˜๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์œ ํ˜•. ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์ˆ˜๊ฐ€ ์ •์ˆ˜์ธ ๊ฒฝ์šฐ ์ด ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์œ ํšจํ•œ ๋‹ค์–‘ํ•œ ์ •์ˆ˜ ์œ ํ˜•๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ์œ ํ˜•์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ "์ž˜๋ชป๋œ ๋ฌธ์ œ ์ง„์ˆ "์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์‹ค์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์ „ํ˜€ ๊ณ ์•ˆ๋œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ๋Š” "์ž˜๋ชป"์ด๋ผ๊ณ  ์„ ์–ธํ•ด๋„ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@griesemer ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค . ๋ณ€ํ™˜์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ ํ˜•์‹์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ๋ฅผ ๋“ฑ๋กํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋‚ด ๋Œ€๋‹ต์— ๋”ฐ๋ผ T ๋ฉ”์„œ๋“œ๋Š” DoSomething(X) ์ด๊ณ  ํ•จ์ˆ˜๋Š” ์ถ”๊ฐ€ ์ธ์ˆ˜ func(float64) X ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜ ํ˜•์‹์€ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค( T,X ). X ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜์ ์œผ๋กœ float32 ๋˜๋Š” float64 ์ด๊ณ  ํ•จ์ˆ˜ ์ธ์ˆ˜๋Š” func(f float64) float32 {return float32(f)} ๋˜๋Š” func(f float64) float64 {return f} ์ž…๋‹ˆ๋‹ค.

๋” ์ค‘์š”ํ•˜๊ฒŒ ๊ฐ•์กฐํ–ˆ๋“ฏ์ด ์ •์ˆ˜์˜ ๊ฒฝ์šฐ ๋œ ์ •ํ™•ํ•œ ์ •์ˆ˜ ํ˜•์‹์ด ์ฃผ์–ด์ง„ ์ƒ์ˆ˜์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•( T,X ) ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ๋น„๊ณต๊ฐœ๋กœ ์œ ์ง€ํ•˜๊ณ  ๊ณต๊ฐœ์ ์œผ๋กœ MyFunc32 / MyFunc64 /etc๋งŒ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

MyFunc32(int32) / MyFunc64(int64) /etc๋ฅผ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ MyFunc(type T Numeric) ๋ณด๋‹ค ๋œ ์‹ค์šฉ์ ์ž…๋‹ˆ๋‹ค(๋ฐ˜๋Œ€๋Š” ๋ฐฉ์–ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!). ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ƒ์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ์ฃผ๋กœ ์ •์ˆ˜ ์ƒ์ˆ˜์— ์˜์กดํ•˜๋Š” ์ผ๋ฐ˜ ๊ตฌํ˜„์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐœ๋‚˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋จธ์ง€๋Š” T ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์ œ๊ณต ์œ ํ˜•์œผ๋กœ ์ œํ•œ๋˜์ง€ ์•Š๋Š” ์ถ”๊ฐ€์ ์ธ ์ž์œ ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก , ํ•จ์ˆ˜๊ฐ€ ๋น„์‹ธ์ง€ ์•Š๋‹ค๋ฉด int64 / float64 ๋กœ ๊ณ„์‚ฐํ•˜๊ณ  T ์—์„œ ๊ฐ„๋‹จํ•˜๊ณ  ๋ฌด์ œํ•œ์œผ๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ทธ๊ฒƒ๋งŒ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์™„๋ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ "๋ชจ๋“  ์œ ํ˜•์˜ T์— ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋Š” ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Go๋Š” ๋ฌด์—‡๋ณด๋‹ค ๋‹จ์ˆœํ•œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ธฐ์ดํ•œ ์ œํ•œ์ด ์žˆ๋Š” ์–ธ์–ด๋Š” ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด ์ œ์•ˆ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋ฉด ์–ธ์ œ๋“ ์ง€ ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด์— ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์–ธ์–ด๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

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

๊ฒŒ๋‹ค๊ฐ€, ๊ทธ๊ฒƒ์€ ํ”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” "ํฐ" ํ˜•์‹ํ™”๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๊ด€ํ•œ ๊ฒƒ๋งŒ์€ ์•„๋‹™๋‹ˆ๋‹ค. "๊ทธ ์ค‘ ๋ช‡ ๊ฐœ๋‚˜ ์กด์žฌํ•˜๋Š”์ง€"๋ผ๋Š” ์งˆ๋ฌธ๊ณผ ํ•จ๊ป˜ ๊ทธ๋Ÿฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์กด์žฌํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋น—๋‚˜๊ฐ€๊ธฐ ์œ„ํ•ด ์†์„ ํ”๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ ๋ ค ์‚ฌํ•ญ: ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด -1, 0, 1๊ณผ ๊ฐ™์€ ์ •์ˆ˜ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋น„ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ํ˜•์‹์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ •์ˆ˜์™€ ํ•จ๊ป˜ -1์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๊ณ„์•ฝ์„œ์— ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@ianlancetaylor @griesemer ํ”ผ๋“œ๋ฐฑ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜์™€ ์Œ์˜ ์ •์ˆ˜๋กœ ์ƒ๋‹นํ•œ ์ถฉ๋Œ์ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/golang/go/issues/15292#issuecomment -546313279์˜ ๋‘ ๋ฒˆ์งธ ์š”์ ์„ ์•Œ๋ ค๋“œ๋ฆด๊นŒ์š”?

์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ฏธ๋ฆฌ ์„ ์–ธ๋˜์ง€ ์•Š์€ ํ˜•์‹์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ œ์•ˆ์—์„œ ์ฃผ์–ด์ง„ ์œ ํ˜• X struct{S string}(์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณต๋˜๋ฏ€๋กœ ์—ฌ๊ธฐ์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Œ), []X๊ฐ€ ์žˆ๊ณ  []X๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ]T, ์ŠคํŠธ๋ง๊ฑฐ ๊ณ„์•ฝ์„ ๋งŒ์กฑํ•˜๋Š” T์— ๋Œ€ํ•œ. X2 X ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. func(x X2) String() string {return xS}, ๊ทธ๋ฆฌ๊ณ  []X๋ฅผ []X2๋กœ ๋”ฅ ์นดํ”ผํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์— ๋Œ€ํ•ด ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ „์ฒด ์‚ฌ๋ณธ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ณ€ํ™˜ ๊ทœ์น™์˜ ์™„ํ™”(๊ธฐ์ˆ ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ)๋Š” ์—ฌ์ „ํžˆ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@JavierZunzunegui B(a) a A []B([]A) ์ข…๋ฅ˜์˜ ๋ณ€ํ™˜์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ ์ผ๋ฐ˜ ๊ธฐ๋Šฅ๊ณผ ์ง๊ตํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๋กœ ๊ฐ€์ ธ์˜ฌ ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@ianlancetaylor ์ด๊ฒƒ์ด Go์™€ ์–ผ๋งˆ๋‚˜ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ƒ์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ธฐ๊ณ„ ํ‘œํ˜„์„ ์„ ํƒํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์œ ํ˜•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋‚˜์€ ์šฉ์–ด๋Š” ๋ถˆํ™•์ • ์œ ํ˜•์˜ ์ƒ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์€ 27 ์™€ ๊ฐ™์€ ์ƒ์ˆ˜๊ฐ€ int16|int32|float16|float32 ์™€ ๊ฐ™์€ ์œ ํ˜•์ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์œ ํ˜•์˜ ํ†ตํ•ฉ์„ ๊ฐ–๋„๋ก ๊ณต์šฉ์ฒด ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ œ๋„ค๋ฆญ ์œ ํ˜•์˜ T ๋Š” ์ด ๊ณต์šฉ์ฒด ์œ ํ˜•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์–ด๋Š ์‹œ์ ์—์„œ ์œ ๋‹ˆ์˜จ์„ ๋‹จ์ผ ์œ ํ˜•์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๋Š” print(27) ์™€ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ด๊ฒฐํ•  ๋‹จ์ผ ์œ ํ˜•์ด ์ ˆ๋Œ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” Union์˜ ๋ชจ๋“  ์œ ํ˜•์ด ์ˆ˜ํ–‰๋˜๋ฉฐ ๊ณต๊ฐ„/์†๋„ ๋“ฑ๊ณผ ๊ฐ™์€ ์ตœ์ ํ™” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

@keean ์‚ฌ์–‘์ด "ํ˜•์‹ํ™”๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜"๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์˜ ์ •ํ™•ํ•œ ์ด๋ฆ„๊ณผ ์ฒ˜๋ฆฌ๋Š” ์ด ๋ฌธ์ œ์—์„œ ์ฃผ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ ๋…ผ์˜๋ฅผ ๋‹ค๋ฅธ ๊ณณ์—์„œ ํ•ฉ์‹œ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

@ianlancetaylor ์ €๋Š” ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด Go๊ฐ€ ๊นจ๋—ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ์ œ๋„ค๋ฆญ ๊ตฌํ˜„์„ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ณ , ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ, Go์— ๋Œ€ํ•œ ์›๋ž˜ ์„ ํƒ์€ ์ œ๋„ค๋ฆญ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์—ผ๋‘์— ๋‘์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์„ค๊ณ„์ƒ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค๋„๋ก ์„ค๊ณ„๋œ ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Go์˜ ๊ฒฝ์šฐ ์ œ๋„ค๋ฆญ์€ ํ•ญ์ƒ ๋‚˜์ค‘์— ์–ธ์–ด์— ์ถ”๊ฐ€๋  ๊ฒƒ์ด๋ฉฐ ์–ธ์–ด๋ฅผ ๊นจ๋—ํ•˜๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ์˜ต์…˜์€ ์•„์˜ˆ ์—†๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ œ๋„ค๋ฆญ์„ ์„ ํƒํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ ์ œ์•ฝ ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋˜๋ฉด ๋ณต์žกํ•ด์ง€๋Š” ๋…ธ์ด์ฆˆ๊ฐ€ ๋” ๋งŽ์ด ๋ฐœ์ƒํ•˜์—ฌ ๋•Œ๋•Œ๋กœ ์ฝ”๋“œ๋ฅผ ๊ฑฐ์˜ ์ดํ•ดํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ์ œ๋„ค๋ฆญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ where ์ ˆ, ์ƒ์œ„ ์œ ํ˜• ์œ ํ˜• ๋˜๋Š” ์ƒ์œ„ ์œ ํ˜• ์œ ํ˜• ๋ฐ ์ข…์† ์œ ํ˜•๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ์ œ์•ฝ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์กฐ๋งŒ๊ฐ„ ์ œ๋„ค๋ฆญ์„ ์ฑ„ํƒํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์งˆ๋ฌธ์ด ์ œ๊ธฐ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ๋งํ•ด์„œ, ๋‚˜๋Š” ์ œ๋„ค๋ฆญ์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฐ”๋‘‘์˜ ๋‹จ์ˆœ์„ฑ์„ ๋ณด์กดํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ฐˆ ๊ธธ์ธ์ง€ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

go์—์„œ ์ œ๋„ค๋ฆญ์˜ ๋„์ž…์ด ๋ถˆ๊ฐ€ํ”ผํ•˜๋‹ค๋ฉด ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ๋‹จ์ผํ™”ํ•  ๋•Œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ชจ๋“  ์ž…๋ ฅ ์œ ํ˜•์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋ณต์‚ฌ๋ณธ์„ ํ•จ๊ป˜ ์ƒ์„ฑํ•˜๊ณ  ์ •์˜ ๋˜๋Š” ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ ์ผ๋ถ€ ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ „๋ฌธํ™”ํ•˜๋Š” ์ƒ์ž ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ข‹์€ ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹Œ๊ฐ€์š”?

๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์˜ํ–ฅ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด๊ฒƒ์€ boxing/unboxing ๋ฌธ์ œ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์บ์‹œ ๋ˆ„๋ฝ์„ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด java์™€ ๊ฐ™์€ boxing ์ œ๋„ค๋ฆญ์„ ๊ถŒ์žฅํ•˜๋Š” ์ „๋ฌธ๊ฐ€ ์ˆ˜์ค€์˜ C++ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@ianlancetaylor @griesemer ์œ ํ˜•ํ™” ๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜์™€ '๋น„์—ฐ์‚ฐ์ž' ์ œ๋„ค๋ฆญ(https://github.com/golang/go/issues/15292#issuecomment-547166519) ๋ฌธ์ œ๋ฅผ ์žฌ๊ณ ํ•˜๊ณ  ๋” ๋‚˜์€ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ.

nummetic ์œ ํ˜•( type MyInt32 int32 , type MyInt64 int64 , ...)์„ ์ง€์ •ํ•˜๋ฉด ๋™์ผํ•œ ๊ณ„์•ฝ( Add(T) T , ...)์„ ์ถฉ์กฑํ•˜๋Š” ๋งŽ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. func(MyInt64) FromI64(int64) MyInt64 ์˜ค๋ฒ„ํ”Œ๋กœ ์œ„ํ—˜์ด ์žˆ์ง€๋งŒ ~ func(MyInt32) FromI64(int64) MyInt32 ~๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‚ฎ์€ ์ •๋ฐ€๋„ ์ˆซ์ž ์œ ํ˜•์ด ํ•„์š”ํ•œ ๊ณ„์•ฝ์„ ์ถฉ์กฑํ•˜์ง€ ์•Š์ง€๋งŒ ๋” ๋†’์€ ๋ชจ๋“  ์œ ํ˜•์€ ์ถฉ์กฑํ•˜๋ฏ€๋กœ ์ˆซ์ž ์ƒ์ˆ˜(ํ•„์š”ํ•œ ๊ฐ€์žฅ ๋‚ฎ์€ ์ •๋ฐ€๋„ ๊ฐ’์— ๋ช…์‹œ์ ์œผ๋กœ ํ• ๋‹น๋จ ) ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ธฐ๋ณธ ์ œ๊ณต ์œ ํ˜•(์ด ์ตœ์‹  ๊ฐœ์ •ํŒ์— ๊ตญํ•œ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ง€๋‚œ ์ฃผ์— ๊ณต์œ ํ–ˆ์–ด์•ผ ํ•จ)์„ ๋„˜์–ด ์ˆซ์ž ์ œ๋„ค๋ฆญ์„ ์™„ํ™”ํ•˜๋Š” ์ด์ ์€ ์˜ค๋ฒ„ํ”Œ๋กœ ๊ฒ€์‚ฌ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋†€์ดํ„ฐ ์ฐธ์กฐ. ์˜ค๋ฒ„ํ”Œ๋กœ ๊ฒ€์‚ฌ๋Š” ๊ทธ ์ž์ฒด๋กœ ๋งค์šฐ ์ธ๊ธฐ ์žˆ๋Š” ์š”์ฒญ/์ œ์•ˆ์ž…๋‹ˆ๋‹ค(https://github.com/golang/go/issues/31500 ๋ฐ ๊ด€๋ จ ๋ฌธ์ œ).


(1) : ํ˜•์‹ํ™”๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜์— ๋Œ€ํ•œ ์˜ค๋ฒ„ํ”Œ๋กœ ๋ฐฉ์ง€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋ณด์žฅ์€ ๋™์ผํ•œ '๋ถ„๊ธฐ'( int[8/16/32/64] ๋ฐ uint[8/16/32/64] ) ๋‚ด์—์„œ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๊ธฐ๋ฅผ ๋„˜์–ด $ uint[X] ์ƒ์ˆ˜๋Š” int[2X+] int[X] ์ƒ์ˆ˜๋Š” uint[X] ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์„ ์™„ํ™”ํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ( int[X]<->uint[X] ํ—ˆ์šฉ) ์ตœ์†Œํ•œ์˜ ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋ฉด ๊ฐ„๋‹จํ•˜๊ณ  ์•ˆ์ „ํ•˜๋ฉฐ, ๊ฒฐ์ •์ ์œผ๋กœ ๋ชจ๋“  ๋ณต์žก์„ฑ์€ ์ œ๋„ค๋ฆญ ์‚ฌ์šฉ์ž(๊ณ„์•ฝ์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ์ œ๋„ค๋ฆญ ์ฝ”๋“œ ์ž‘์„ฑ์ž์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. , ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์ถฉ์กฑํ•˜๋Š” ๋ชจ๋“  ์ˆซ์ž ์œ ํ˜•์ด ์œ ํšจํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ - Java์˜ ๋ชฐ๋ฝ์ด์—ˆ์Šต๋‹ˆ๋‹ค!

@ianlancetaylor ์ €๋Š” ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด Go๊ฐ€ ๊นจ๋—ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ์ œ๋„ค๋ฆญ ๊ตฌํ˜„์„ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ณ , ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ, Go์— ๋Œ€ํ•œ ์›๋ž˜ ์„ ํƒ์€ ์ œ๋„ค๋ฆญ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์—ผ๋‘์— ๋‘์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์„ค๊ณ„์ƒ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค๋„๋ก ์„ค๊ณ„๋œ ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Go์˜ ๊ฒฝ์šฐ ์ œ๋„ค๋ฆญ์€ ํ•ญ์ƒ ๋‚˜์ค‘์— ์–ธ์–ด์— ์ถ”๊ฐ€๋  ๊ฒƒ์ด๋ฉฐ ์–ธ์–ด๋ฅผ ๊นจ๋—ํ•˜๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ์˜ต์…˜์€ ์•„์˜ˆ ์—†๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

100% ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ผ์ข…์˜ ์ œ๋„ค๋ฆญ์ด ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ ํ˜„์žฌ ์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ๊ฒƒ์ด Go ์–ธ์–ด์˜ ๋‹จ์ˆœ์„ฑ์„ ํŒŒ๊ดดํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ํ˜„์žฌ ์•„์ด๋””์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type I1(type P1) interface {
        m1(x P1)
}

type I2(type P1, P2) interface {
        m2(x P1) P2
        type int, float64
}

func f(type P1 I1(P1), P2 I2(P1, P2)) (x P1, y P2) P2

์—ฌ๋Ÿฌ๋ถ„ ์ฃ„์†กํ•˜์ง€๋งŒ ์ด๋Ÿฌ์ง€ ๋งˆ์„ธ์š”! ๋ฐ”๋‘‘์˜ ์•„๋ฆ„๋‹ค์›€์„ ํ„ํ•˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ ๊ฑฐ์˜ 100K ๋ผ์ธ์˜ Go ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ ์ œ๋„ค๋ฆญ์ด ์—†์–ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ง€์›๊ณผ ๊ฐ™์€ ์ž‘์€ ๊ฒƒ๋“ค์€

// Allow mulitple types in Slices and Maps declarations
func Reverse(s []<int,string>) {
    first := 0
    last := len(s) - 1
    for first < last {
        s[first], s[last] = s[last], s[first]
        first++
        last--
    }
}

//  Allow multiple types in variable declarations
func Index (s <string, []byte>, b byte) int {
    for i := 0; i < len(s); i++ {
        if s[i] == b {
            return i
        }
    }
    return -1
}

// Allow slices and maps declarations with interface values
func ToStrings (s []Stringer) []string {
    r := make([]string, len(s))
    for i, v := range s {
        r[i] = v.String()
    }
    return r
}

๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.

์ผ๋ฐ˜ Go ์ฝ”๋“œ์—์„œ ์ œ๋„ค๋ฆญ์„ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ ์ œ์•ˆ

package graph

// Example how you would define generics completely separat from Go 1 code
contract (Node, Edge)G {
    Node Edges() []Edge
    Edge Nodes() (from, to Node)
}

type (type Node, Edge G) ( Graph )
func (type Node, Edge G) ( New )
const _ = (Node, Edge) Graph

// Unmodified Go 1 code
type Graph struct { ... }
func New(nodes []Node) *Graph { ... }
func (g *Graph) ShortestPath(from, to Node) []Edge { ... }

@martinrode ๊ทธ๋Ÿฌ๋‚˜ ์ง€์›๊ณผ ๊ฐ™์€ ์ž‘์€ ๊ฒƒ๋“ค์€
... Slices ๋ฐ Maps ์„ ์–ธ์—์„œ ์—ฌ๋Ÿฌ ์œ ํ˜• ํ—ˆ์šฉ

์ด๊ฒƒ์€ head() , tail() , map(slice, func) , filter(slice, func) ์™€ ๊ฐ™์€ ์ผ๋ถ€ ๊ธฐ๋Šฅ์ ์ธ ์ผ๋ฐ˜ ์Šฌ๋ผ์ด์Šค ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์š”๊ตฌ์— ๋Œ€๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

์ผ๋ฐ˜์ ์ด์ง€ ์•Š์€ ํ˜„์žฌ go์—์„œ ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋‚ด๊ฐ€ ์ œ์–ดํ•˜์ง€ ์•Š๋Š” externallib ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์–ป์€ externallib.Foo ์œ ํ˜•์˜ x ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
SomeFunc(fmt.Stringer) ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์ง€๋งŒ externallib.Foo ์—๋Š” String() string ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type MyFoo externallib.Foo
func (mf MyFoo) String() string {...}
// ...
SomeFunc(MyFoo(x))

์ œ๋„ค๋ฆญ๊ณผ ๋™์ผํ•˜๊ฒŒ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

[]externallib.Foo ์œ ํ˜•์˜ x ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. AnotherFunc(type T Stringer)(s []T) ์— ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์กฐ๊ฐ์„ ์ƒˆ []MyFoo ์— ๊ฐ’๋น„์‹ผ ๋”ฅ ๋ณต์‚ฌ ์—†์ด๋Š” ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด์Šค ๋Œ€์‹  ๋” ๋ณต์žกํ•œ ์œ ํ˜•(์˜ˆ: chan ๋˜๋Š” map)์ด๊ฑฐ๋‚˜ ๋ฐฉ๋ฒ•์ด ์ˆ˜์‹ ๊ธฐ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค๋ฉด ๊ฐ€๋Šฅํ•˜๋ฉด ํ›จ์”ฌ ๋” ๋น„ํšจ์œจ์ ์ด๊ณ  ์ง€๋ฃจํ•ด์ง‘๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์—์„œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์ง€๋งŒ ์™ธ๋ถ€ ์ข…์†์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ์–ด๋–ค ํ”„๋กœ์ ํŠธ์—๋„ ์—†์„ ์‚ฌ์น˜์ž…๋‹ˆ๋‹ค.

์ œ ์ œ์•ˆ์€ type Foo Bar $ ๋กœ ์ •์˜๋œ ๋ชจ๋“  Foo $ ์— ๋Œ€ํ•ด []Foo([]Bar{}) ๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ๋ณ€ํ™˜์„ ์™„ํ™”ํ•˜๊ฑฐ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋ฉฐ ๋งต, ๋ฐฐ์—ด, ์ฑ„๋„ ๋ฐ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด์„œ๋„ ์žฌ๊ท€์ ์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๊ฐ’์‹ผ ์–•์€ ์‚ฌ๋ณธ์ž…๋‹ˆ๋‹ค. ํŽธ์•ˆํ•œ ์œ ํ˜• ๋ณ€ํ™˜ ์ œ์•ˆ ์—์„œ ๋” ๋งŽ์€ ๊ธฐ์ˆ ์ ์ธ ์„ธ๋ถ€ ์‚ฌํ•ญ.


์ด๊ฒƒ์€ https://github.com/golang/go/issues/15292#issuecomment -546313279์—์„œ ๋ณด์กฐ ๊ธฐ๋Šฅ์œผ๋กœ ์ฒ˜์Œ ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@JavierZunzunegui ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ œ๋„ค๋ฆญ๊ณผ ์ „ํ˜€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์œ ์‚ฌํ•œ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ณ„๋„๋กœ ๋…ผ์˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. https://golang.org/doc/faq#convert_slice_with_same_underlying_type๋„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ฐ์‚ฌ ํ•ด์š”.

์ œ๋„ค๋ฆญ์ด ์—†์œผ๋ฉด ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์€ ์ „ํ˜€ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ []Foo ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถฉ์กฑํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ์Šฌ๋ผ์ด์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋Š” ์Šฌ๋ผ์ด์Šค๋ฅผ ๋ณ€ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” sort.Interface ์™€ ๊ฐ™์ด ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ํŒจํ„ด์ด ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

์œ„์˜ ๋น„ ์ผ๋ฐ˜ ๋ฒ„์ „( func AnotherFunc(type T Stringer)(s []T) )์€

type SliceOfStringers interface {
  Len() int
  Get(int) fmt.Stringer
}
func AnotherFunc(s SliceOfStringers) {...}

์ผ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹๋ณด๋‹ค ๋œ ์‹ค์šฉ์ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ ์œ ํ˜•์ด ์‹ค์ œ๋กœ fmt.Stringer ์ธ ๊ฒƒ๊ณผ ์ƒ๊ด€์—†์ด ๋ชจ๋“  ์Šฌ๋ผ์ด์Šค๋ฅผ ์ž˜ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ ์ž‘์—…์— ํ›จ์”ฌ ๋” ์ ํ•ฉํ•œ ๋„๊ตฌ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ œ๋„ค๋ฆญ์€ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ™•์‹คํžˆ ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋ฉด API์—์„œ ์Šฌ๋ผ์ด์Šค, ๋งต ๋“ฑ์„ ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ๋” ์ ์€ ์ƒ์šฉ๊ตฌ๋กœ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์žˆ๋Š” ์„ธ๊ณ„์—์„œ ๋™๋“ฑํ•˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” _์–ด์ฉŒ๋ฉด_ ๋ถˆ๊ฐ€ํ”ผํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์–ธ์–ด์— ์˜ํ•ด ์ธ์œ„์ ์œผ๋กœ ๋ถ€๊ณผ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ธ๊ธ‰ํ•œ ์œ ํ˜• ๋ณ€ํ™˜์€ ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ(FAQ)์ด ๋  ์ •๋„๋กœ ๋น„์ œ๋„ค๋ฆญ ์ฝ”๋“œ์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ํ† ๋ก ์„ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์˜ฎ๊ธฐ๋„๋ก ํ•ฉ์‹œ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

์ƒํƒœ๊ฐ€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์—…๋ฐ์ดํŠธ๋œ ์ดˆ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ œ๋„ค๋ฆญ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ ์žˆ๋‹ค.
๊ฑฐ์˜ 2๋…„ ์ „. ์–ธ์ œ ์ œ๋„ค๋ฆญ์„ ๊ฐ–๊ฒŒ ๋ ๊นŒ์š”?

์—˜ 3์›” 4์ผ 2์›” de 2020 a la(s) 13:28, Ian Lance Taylor(
[email protected]) ์„ค๋ช…:

์–ธ๊ธ‰ํ•œ ์œ ํ˜• ๋ณ€ํ™˜์€ ์ œ๋„ค๋ฆญ์ด ์•„๋‹Œ ์ฝ”๋“œ์—์„œ ์ถฉ๋ถ„ํžˆ ์ž์ฃผ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ํ† ๋ก ์„ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์˜ฎ๊ธฐ๋„๋ก ํ•ฉ์‹œ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/15292?email_source=notifications&email_token=AJMFNBN3MFHDMENAFXIKBLDRBGXUTA5CNFSM4CA35RX2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LDNMVXHJ
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AJMFNBO5UTKNPL3MSA3NESLRBGXUTANCNFSM4CA35RXQ
.

--
TripleMint์—์„œ ์‚ฌ์šฉํ•  ๋ฉ”์ผ ์„œ๋ช… ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒƒ๋“ค์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ž‘์—…์€ ์˜คํ”„๋ผ์ธ์œผ๋กœ ํ•ฉ๋‹ˆ๊นŒ? ์ €์™€ ๊ฐ™์€ "์ผ๋ฐ˜ ๋Œ€์ค‘"์ด ์†Œ์Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์–ธ๊ธ‰ํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ฐœ์ „ํ•˜๋Š” ๋ชจ์Šต์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ทธ ์ดํ›„๋กœ ์ œ๋„ค๋ฆญ ํ† ๋ก ์„ ํ•œ ๊ณณ์—์„œ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ซํ˜”์ง€๋งŒ @Griesemer๊ฐ€ ์ž‘์—… ์ค‘์ธ ํ”„๋กœํ† ํƒ€์ž… ์— ๋งํฌํ•˜๊ณ  ์ง€๊ธˆ๊นŒ์ง€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ทธ์˜ ์ƒ๊ฐ์— ๋Œ€ํ•ด ํฅ๋ฏธ๋กœ์šด ์˜๊ฒฌ์„ ์ œ์‹œํ•˜๋Š” # 36177 ์„ ํ™•์ธํ•˜์„ธ์š”.

ํ”„๋กœํ† ํƒ€์ž…์ด ํ˜„์žฌ ์ดˆ์•ˆ '๊ณ„์•ฝ' ์ œ์•ˆ์„œ์˜ ์œ ํ˜• ๊ฒ€์‚ฌ ์ธก๋ฉด์„ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค๋Š” ๋ง์ด ์˜ณ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ ์ž‘์—…์€ ํ™•์‹คํžˆ ๋‚˜์—๊ฒŒ ์œ ๋งํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

@ianlancetaylor ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด ์ œ์•ˆ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋ฉด ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ฒ„๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด์— ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์–ธ์–ด๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋…ธ๋ ฅํ•ด์•ผ ํ•˜๋Š” ํ›Œ๋ฅญํ•œ ์ด์ƒ์ด์ง€๋งŒ ์‹ค์ œ๋กœ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์€ โ€‹โ€‹๋ณธ์งˆ์ ์œผ๋กœ _์„ค๋ช…ํ•˜๊ธฐ๊ฐ€ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Istio, Kubernetes, operator-sdk, ๊ทธ๋ฆฌ๊ณ  ์–ด๋Š ์ •๋„ Terraform, ์‹ฌ์ง€์–ด protobuf ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊นŒ์ง€ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ๊ทธ๋“ค์€ ๋ชจ๋‘ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Go ์œ„์— ์ƒˆ๋กœ์šด ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์ด๋“ค์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ Go ์œ ํ˜• ์‹œ์Šคํ…œ์„ ํƒˆ์ถœํ•ฉ๋‹ˆ๋‹ค.

@omeid

Istio, Kubernetes ์‚ดํŽด๋ณด๊ธฐ

๊ทธ๋“ค์ด ์ด ํ„ฐ๋ฌด๋‹ˆ์—†๋Š” ์ผ์„ ํ•˜๋Š” ์ด์œ ๋Š” ๊ทธ๋“ค์˜ ํ•ต์‹ฌ ๋””์ž์ธ์ด ์˜๋ฏธ๊ฐ€ ์—†๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ทธ๊ฒƒ์„ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด reflect ๊ฒŒ์ž„์„ ํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๋Š” ์ƒ๊ฐ์„ ํ•ด๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ?

๋‚˜๋Š” golang ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•œ ๋” ๋‚˜์€ ๋””์ž์ธ(๋””์ž์ธ ๋‹จ๊ณ„์™€ API ๋ชจ๋‘์—์„œ)์ด ์ œ๋„ค๋ฆญ์„ _ํ•„์š”๋กœ ํ•˜์ง€_ ์•Š๋Š”๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

golang์— ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ์„ธ์š”.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์–ด๋ ต๋‹ค. Kubelet์€ ์–ด๋‘์šด ๊ณณ์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์€ ๋ฏธ๊ตญ ์ •์น˜๋ณด๋‹ค ์‚ฌ๋žŒ๋“ค์„ ๋” ๋ถ„์—ด์‹œํ‚ต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฏฟ๊ณ  ์‹ถ์–ด.

์–ธ์–ด๊ฐ€ ํ‘œํ˜„ํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š์€ ์•„์ด๋””์–ด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ํ•œ๊ณ„๊ฐ€ ์žˆ์„ ๋•Œ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋Š” ๊ฒฐ๊ตญ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ณ„์†ํ•ด์„œ ์žฌ๋ฐœ๋ช…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ์•„์ด๋””์–ด๋Š” ๋•Œ๋•Œ๋กœ ํ”„๋กœ๊ทธ๋žจ ๋…ผ๋ฆฌ์— ํ•„์ˆ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Istio, Kubernetes, operator-sdk, ๊ทธ๋ฆฌ๊ณ  ์–ด๋Š ์ •๋„ Terraform, ์‹ฌ์ง€์–ด protobuf ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊นŒ์ง€ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ๊ทธ๋“ค์€ ๋ชจ๋‘ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Go ์œ„์— ์ƒˆ๋กœ์šด ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์ด๋“ค์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ Go ์œ ํ˜• ์‹œ์Šคํ…œ์„ ํƒˆ์ถœํ•ฉ๋‹ˆ๋‹ค.

์„ค๋“๋ ฅ ์žˆ๋Š” ์ฃผ์žฅ์€ ์•„๋‹ˆ๋ผ๊ณ  ๋ด…๋‹ˆ๋‹ค. Go ์–ธ์–ด๋Š” ์ด์ƒ์ ์œผ๋กœ ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์•ผ ํ•˜๋ฉฐ ์ž„์˜๋กœ ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์–ธ๊ธ‰ํ•œ ๋„๊ตฌ๋Š” ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ Go๋Š” ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Go ์–ธ์–ด๋Š” ์ด์ƒ์ ์œผ๋กœ ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์•ผ ํ•˜๋ฉฐ ์ž„์˜๋กœ ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ผ๋ฐ˜์ ์œผ๋กœ "์›ํ•˜๋Š”" ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฆฌํ”Œ๋ ‰์…˜๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ์— ์˜์กดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ณด๋‹ค ์ฝ๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ด ์ œ์•ˆ์ด ์—ด๋ ค ์žˆ๋Š” ์ด์œ ์™€ ์ œ๋„ค๋ฆญ ๊ตฌํ˜„ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•œ ์„ค๊ณ„ ์ดˆ์•ˆ์ด ์žˆ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค(https://blog.golang.org/why-generics).

... protobuf ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๋ณด์„ธ์š”. ๊ทธ๋“ค์€ ๋ชจ๋‘ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Go ์œ„์— ์ƒˆ๋กœ์šด ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์ด๋“ค์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ Go ์œ ํ˜• ์‹œ์Šคํ…œ์„ ํƒˆ์ถœํ•ฉ๋‹ˆ๋‹ค.

protobuf์— ๋Œ€ํ•œ ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ์ œ๋„ค๋ฆญ์ด API์˜ ์‚ฌ์šฉ์„ฑ ๋ฐ/๋˜๋Š” ๊ตฌํ˜„์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๋กœ์ง ์€ ์ œ๋„ค๋ฆญ์˜ ์ด์ ์„ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค . Generics๋Š” ๊ตฌ์ฒด์ ์ธ ์œ ํ˜• ์ •๋ณด๊ฐ€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์•Œ๋ ค์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. protobuf์˜ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์€ ํ˜•์‹ ์ •๋ณด๊ฐ€ ๋Ÿฐํƒ€์ž„์—๋งŒ ์•Œ๋ ค์ง„ ๊ฒฝ์šฐ์™€ ๊ด€๋ จ๋ฉ๋‹ˆ๋‹ค.

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

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

์–ธ๊ธ‰ํ•œ ๋„๊ตฌ๋Š” ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ Go๋Š” ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

Go๊ฐ€ ๋ณต์žกํ•œ ๋…ผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ์•„๋งˆ๋„ Reflection์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Go์˜ JSON ์ฒ˜๋ฆฌ๊ฐ€ ์›์‹œ์ ์ธ ๊ฒƒ๊ณผ ๊ฐ™์ด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—๋„ ์„ฑ๋Šฅ์— ์ค‘์š”ํ•œ ์ฝ”๋“œ๋Š” ๋งํ•  ๊ฒƒ๋„ ์—†๊ณ  ํ•œ๊ณ„๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ธฐ๊ปํ•ด์•ผ.

์ด๋ฏธ ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ…์ŠคํŠธ ํ…œํ”Œ๋ฆฟ์ด๋‚˜ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‹ค์Œ์˜ ์ด์ƒ์— ๋ถ€ํ•ฉํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

~generics~ something-complex์— ๋Œ€ํ•œ ์ œ์•ˆ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์œผ๋กœ ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋ฉด ์–ธ์ œ๋“ ์ง€ ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ธ๊ธ‰ํ•œ ํ”„๋กœ์ ํŠธ๋“ค์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ์†”๋ฃจ์…˜์ด ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋ฉด์—์„œ ๋ฐ”๋‘‘์€ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ณ  ์ง์ ‘์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•˜๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์ด ๋ฆฌํ”Œ๋ ‰์…˜ ์‚ฌ์šฉ์„ ์ง€์ ํ•˜๊ณ  ์ œ๋„ค๋ฆญ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•œ ์ฆ๊ฑฐ๋กœ ์ฃผ์žฅํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๊ทธ๋Ÿฐ ์ผ๋ฐ˜์ ์ธ ์˜คํ•ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ protobuf ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํŠนํžˆ ์ƒˆ API๋Š” _generics_ ๋˜๋Š” ์ผ์ข…์˜ _sum type_์„ ์‚ฌ์šฉํ•˜์—ฌ ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋„์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด protobuf API์˜ ์ž‘์„ฑ์ž ์ค‘ ํ•œ ๋ช…์ด ๋ฐฉ๊ธˆ "๋Œ€๋ถ€๋ถ„์˜ ๋กœ์ง์ด ์ œ๋„ค๋ฆญ์˜ ์ด์ ์„ ์–ป์ง€ ๋ชปํ•  ๊ฒƒ"์ด๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์œผ๋กœ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค." ์ด๊ฒƒ์€ ๋ฌด์—‡์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๊นŒ? ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•  ๊ฒƒ์ด๋ผ๋Š” ์ฆ๊ฑฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ œ๋„ค๋ฆญ(Java, C++)์„ ํฌํ•จํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์–ธ์–ด์—์„œ protobuf API๋ฅผ ์‚ฌ์šฉํ•ด ๋ณธ ์‚ฌ๋žŒ์œผ๋กœ์„œ ์ €๋Š” Go API์™€ ํ•ด๋‹น API์—์„œ ์‚ฌ์šฉ์„ฑ ์ฐจ์ด๋ฅผ ํฌ๊ฒŒ ๋Š๋ผ์ง€ ๋ชปํ–ˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ฃผ์žฅ์ด ์‚ฌ์‹ค์ด๋ผ๋ฉด ๊ทธ๋Ÿฌํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

@dsnet ์€ ๋˜ํ•œ "์ œ๋„ค๋ฆญ์ด API์˜ ์‚ฌ์šฉ์„ฑ ๋ฐ/๋˜๋Š” ๊ตฌํ˜„์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ƒํ™ฉ์ด ๋” ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ๋ฅผ ์›ํ•˜๋ฉด Value ์œ ํ˜•์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค. ๋Œ€๋ถ€๋ถ„ ์ž„์‹œ ํ•ฉ๊ณ„ ์œ ํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@omeid ์ด ๋ฌธ์ œ๋Š” ํ•ฉ๊ณ„ ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ ์ œ๋„ค๋ฆญ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ์˜ˆ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ์ œ ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ protobuf ๊ตฌํ˜„ ๋˜๋Š” API๊ฐ€ ์ƒˆ๋กœ์šด(๋˜๋Š” ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์˜ค๋ž˜๋œ) API๋ณด๋‹ค "ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋„์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?"

์ด๊ฒƒ์€ ์œ„์—์„œ @dsnet ์ด ๋งํ•œ ๊ฒƒ๊ณผ Java ๋ฐ C++ protobuf API์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ฒฝํ—˜๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Go์—์„œ ๊ธฐ๋ณธ JSON ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ๋„ ๋˜‘๊ฐ™์ด ์ด์ƒํ•˜๊ฒŒ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค. encoding/json ์˜ API๊ฐ€ ์ œ๋„ค๋ฆญ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”์ง€ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

AFAIK, Java์—์„œ JSON ๊ตฌ๋ฌธ ๋ถ„์„ ๊ตฌํ˜„์€ ๋ฆฌํ”Œ๋ ‰์…˜(์ œ๋„ค๋ฆญ ์•„๋‹˜)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ JSON ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ตœ์ƒ์œ„ API๋Š” ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ(์˜ˆ: Gson )๋ฅผ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์ง€๋งŒ ์ œ์•ฝ ์—†๋Š” ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ T ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  T ์œ ํ˜•์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. json.Unmarshal ๊ณผ ๋น„๊ตํ•  ๋•Œ ์ถ”๊ฐ€ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ๊ฑฐ์˜ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ปดํŒŒ์ผ ํƒ€์ž„์— json.Unmarshal ์— ์˜ํ•ด ์žกํžˆ์ง€ ์•Š๋Š” ์œ ์ผํ•œ ์ถ”๊ฐ€ ์˜ค๋ฅ˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๋˜ํ•œ Gson์˜ API ๋ฌธ์„œ์—์„œ ์ œ๋„ค๋ฆญ ๋Œ€ ์ œ๋„ค๋ฆญ์ด ์•„๋‹Œ ์œ ํ˜•์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ฃผ์˜ ์‚ฌํ•ญ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๊ฒƒ์€ ์ œ๋„ค๋ฆญ์ด API๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ์ œ๋„ค๋ฆญ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ˜•).

(C++์˜ JSON ์ง€์›์€ AFAICT๋ณด๋‹ค ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ƒ๋‹นํ•œ ์–‘์˜ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ˆ˜๋™์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„/์ง๋ ฌํ™” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

์ œ๋„ค๋ฆญ์ด JSON์— ๋Œ€ํ•œ Go์˜ ์ง€์›์— ๋งŽ์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•œ๋‹ค๋ฉด ์‹ค๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


@gertcuykens ๋‚ด๊ฐ€ ์•„๋Š” ๋ชจ๋“  ์–ธ์–ด์˜ ๋ชจ๋“  protobuf ๊ตฌํ˜„์€ ์ œ๋„ค๋ฆญ์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” Java, C++, Swift, Rust, JS(๋ฐ TS)๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์ด ์ž๋™์œผ๋กœ ์ฝ”๋“œ ์ƒ์„ฑ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์„ ์ œ๊ฑฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์กด์žฌ ์ฆ๋ช…์œผ๋กœ Java ์ฝ”๋“œ ๋ฐ C++ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค). ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์ด ๊ทธ ๊ธฐ์ค€์„ ์ถฉ์กฑํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์€ ๋น„๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.


์ ˆ๋Œ€์ ์œผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ: ์ €๋Š” Go์— ์ œ๋„ค๋ฆญ ์ถ”๊ฐ€๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ๋ฌด์—‡์„ ์–ป์„ ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•œ ์‹œ๊ฐ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. protobuf ๋˜๋Š” JSON API๊ฐ€ ํฌ๊ฒŒ ๊ฐœ์„ ๋  ๊ฒƒ์ด๋ผ๊ณ ๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” protobuf๊ฐ€ ์ œ๋„ค๋ฆญ์— ํŠนํžˆ ์ข‹์€ ๊ฒฝ์šฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠน์ˆ˜ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋Œ€์ƒ ์–ธ์–ด์˜ ์ œ๋„ค๋ฆญ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Swagger/OpenAPI์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ์‹œ์Šคํ…œ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์ด ๋‚˜์—๊ฒŒ ์œ ์šฉํ•˜๊ณ  ๋‹จ์ˆœํ™”์™€ ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ๋ชจ๋‘ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ protobuf ์ปดํŒŒ์ผ๋Ÿฌ ์ž์ฒด๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒƒ์€ ์ž์ฒด ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ์˜ ํ˜•์‹ ์•ˆ์ „ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ์ด๊ฒƒ์€ ์ตœ์†Œํ•œ ์ œ๋„ค๋ฆญ ๋ฐ ์ผ๋ฐ˜ํ™”๋œ ์ถ”์ƒ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์–ธ์–ด ์ž์ฒด์˜ ์–ธ์–ด์— ๋Œ€ํ•œ ์œ ํ˜• ์•ˆ์ „ protobuf ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์ด ๋‚˜์—๊ฒŒ ์œ ์šฉํ•˜๊ณ  ๋‹จ์ˆœํ™”์™€ ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ๋ชจ๋‘ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ protobuf ์ปดํŒŒ์ผ๋Ÿฌ ์ž์ฒด๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ •๋ง๋กœ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅธ๋‹ค. go/ast ํŒจํ‚ค์ง€๋Š” ์ด๋ฏธ Go์˜ AST ํ‘œํ˜„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Go protobuf ์ปดํŒŒ์ผ๋Ÿฌ๋Š” AST๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ํ˜•์‹์ด ๋” ์•ˆ์ „ํ•˜๋”๋ผ๋„ ๋ฌธ์ž์—ด์„ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ฒˆ๊ฑฐ๋กญ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋Œ€ํ•œ protobuf ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

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

go/ast ํŒจํ‚ค์ง€๋ฅผ ๋ณด๋ฉด ์ œ๋„ค๋ฆญ๊ณผ GADT๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— AST์˜ ํ˜•์‹ํ™”๋œ ํ‘œํ˜„์ด ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด '์ถ”๊ฐ€' ๋…ธ๋“œ๋Š” ์ถ”๊ฐ€๋˜๋Š” ์šฉ์–ด ์œ ํ˜•์—์„œ ์ผ๋ฐ˜์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ AST๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ์œ ํ˜• ๊ฒ€์‚ฌ ๋…ผ๋ฆฌ๋ฅผ ์†์œผ๋กœ ์ฝ”๋”ฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ๊ณผ ์œ ํ˜• ์•ˆ์ „ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ž์—ด์„ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ์œ ํ˜•์—๋„ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด (์ด๊ฒƒ์€ ๊ตฌ๋ฌธ ๋ถ„์„ ์ธก๋ฉด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค) https://stackoverflow.com/questions/11104536/how-to-parse-strings-to-syntax-tree-using-gadts ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์˜ˆ๋ฅผ ๋“ค์–ด JSX๋ฅผ JavaScript์˜ HTML Dom์— ๋Œ€ํ•œ ๋ฆฌํ„ฐ๋Ÿด ๊ตฌ๋ฌธ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  TSX๋ฅผ TypeScript์˜ Dom์— ๋Œ€ํ•œ ๋ฆฌํ„ฐ๋Ÿด ๊ตฌ๋ฌธ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ข… ์ฝ”๋“œ์— ํŠนํ™”๋œ ํ˜•์‹ํ™”๋œ ์ œ๋„ค๋ฆญ ํ‘œํ˜„์‹์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ์œ ํ˜•์ด ๊ฒ€์‚ฌ๋ฉ๋‹ˆ๋‹ค(์ผ๋ฐ˜ ํ˜•์‹์œผ๋กœ).

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

variadic ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ˜„์žฌ ๋””์ž์ธ์—์„œ ๋ˆ„๋ฝ๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” ์ œ๋„ค๋ฆญ์˜ ๊ธฐ๋Šฅ์ด ํฌ๊ฒŒ ๋ˆ„๋ฝ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋””์ž์ธ(์•„๋งˆ๋„)์€ ํ˜„์žฌ ๊ณ„์•ฝ ๋””์ž์ธ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

contract Comparables(Ts...) {
    if  len(Ts) > 0 {
        Comparables(Ts[1:]...)
    } else {
        Comparable(Ts[0])
    }
}

contract Comparable(T) {
    T int, int8, int16, int32, int64,
        uint, uint8, uint16, uint32, uint64, uintptr,
        float32, float64,
        string
}

type Keys(type Ts ...Comparables) struct {
    fs ...Ts
}

type Metric(type Ts ...Comparables) struct {
    mu sync.Mutex
    m  map[Keys(Ts...)]int
}

func (m *Metric(Ts...)) Add(vs ...Ts) {
    m.mu.Lock()
    defer m.mu.Unlock()
    if m.m == nil {
        m.m = make(map[Keys(Ts...))]int)
    }
    m[Keys(Ts...){vs...}]++
}


// To use the metric

m := Metric(int, float64, string){m: make(map[Keys(int, float64, string)]int}
m.Add(1, 2.0, "variadic")

์—ฌ๊ธฐ ์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ์˜ˆ.

interface{} ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์˜ ์•ˆ์ „์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๋น„๊ตํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์„ ๋ฉ”ํŠธ๋ฆญ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์‹ค์ œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

interface{} ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์˜ ์•ˆ์ „์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๋น„๊ตํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์„ ๋ฉ”ํŠธ๋ฆญ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์‹ค์ œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ์˜ˆ์—์„œ Comparables ๋Š” Keys ๊ฐ€ ์ผ๋ จ์˜ ์œ ์‚ฌํ•œ ์œ ํ˜•์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ์œ ํ˜• ์ž์ฒด์˜ ์˜๋ฏธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ€๋ณ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋””์ž์ธ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ ์˜ˆ์— ๋„ˆ๋ฌด ์–ฝ๋งค์ด๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ "์œ ํ˜• ํ™•์žฅ"์˜ ๋งŽ์€ ์˜ˆ๊ฐ€ ์‹ค์šฉ์ ์ธ ์•ˆ์ „์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ๋ถ€๊ธฐ๋ฅผ ๋ฐ€์–ด๋ถ™์ด๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„์— ๋˜๋Š” ์ž ์žฌ์ ์œผ๋กœ go vet์—์„œ ์ž˜๋ชป๋œ ์œ ํ˜•์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ๋ถˆ๋งŒ์„ ์ œ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ์ด์™€ ๊ฐ™์€ ๊ฐœ๋ฐฉํ˜• ์œ ํ˜•์„ ํ—ˆ์šฉํ•˜๋ฉด 2์ฐจ ๋…ผ๋ฆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—ญ์„ค์  ์ฐธ์กฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„๊นŒ ์กฐ๊ธˆ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค. C์— ์—†๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ๊ณ„์•ฝ์œผ๋กœ C๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ, ์ด์™€ ๊ฐ™์€ ๊ฐœ๋ฐฉํ˜• ์œ ํ˜•์„ ํ—ˆ์šฉํ•˜๋ฉด 2์ฐจ ๋…ผ๋ฆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—ญ์„ค์  ์ฐธ์กฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„๊นŒ ์กฐ๊ธˆ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค. C์— ์—†๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ๊ณ„์•ฝ์œผ๋กœ C๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ฃ„์†กํ•˜์ง€๋งŒ ์ด ์˜ˆ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฐœ๋ฐฉํ˜• ์œ ํ˜•์„ ํ—ˆ์šฉํ•˜๊ณ  Russell์˜ ์—ญ์„ค๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. Comparables ๋Š” Comparable ๋ชฉ๋ก์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ณ„์•ฝ์„œ ์•ˆ์— Go ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. if ๋ฌธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด for ๋ฌธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์™œ ์•ˆ ๋ผ?

๋˜ํ•œ ๋ถˆํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. func F(a ...int) ๋Š” a ๊ฐ€ []int ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋น„์œ ํ•˜์ž๋ฉด func F(type Ts ...comparable) ๋Š” ๋ชฉ๋ก์˜ ๊ฐ ์œ ํ˜•์ด comparable ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ผ์ธ์—์„œ

type Keys(type Ts ...Comparables) struct {
    fs ...Ts
}

fs ๋ผ๋Š” ์ด๋ฆ„์˜ ์—ฌ๋Ÿฌ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์™ธ์— ์ด ๊ตฌ์กฐ์ฒด์—์„œ ์ฐธ์กฐ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ž˜์„œ ์งˆ๋ฌธ์€: ๊ฐ€๋ณ€ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌด์—‡์„ ํ•˜๊ณ  ์‹ถ์€๊ฐ€?

์—ฌ๊ธฐ์—์„œ๋Š” ๊ฐ€๋ณ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž„์˜์˜ ์ˆ˜์˜ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ํŠœํ”Œ ์œ ํ˜•์„ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋ฌด์—‡์„ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ณ„์•ฝ์„œ ์•ˆ์— Go ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. if ๋ฌธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด for ๋ฌธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์™œ ์•ˆ ๋ผ?

๋˜ํ•œ ๋ถˆํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. func F(a ...int) ๋Š” a ๊ฐ€ []int ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋น„์œ ํ•˜์ž๋ฉด func F(type Ts ...comparable) ๋Š” ๋ชฉ๋ก์˜ ๊ฐ ์œ ํ˜•์ด comparable ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋ฃจ ํ›„์— ์˜ˆ์ œ๋ฅผ ๊ฒ€ํ† ํ•œ ๊ฒฐ๊ณผ, ๋‚˜๋Š” ๋‹น์‹ ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ์˜ณ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Comparables ๋Š” ์–ด๋ฆฌ์„์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ์ œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด len(args) ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋งŒ์„ ์ „๋‹ฌํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ func F(type Ts ...Comparable) ์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ž˜๋ฆฐ ์˜ˆ:

contract Comparable(T) {
    T int, int8, int16, int32, int64,
        uint, uint8, uint16, uint32, uint64, uintptr,
        float32, float64,
        string
}

type Keys(type Ts ...Comparable) struct {
    fs ...Ts
}

type Metric(type Ts ...Comparable) struct {
    mu sync.Mutex
    m  map[Keys(Ts...)]int
}

func (m *Metric(Ts...)) Add(vs ...Ts) {
    m.mu.Lock()
    defer m.mu.Unlock()
    if m.m == nil {
        m.m = make(map[Keys(Ts...))]int)
    }
    m[Keys(Ts...){vs...}]++
}


// To use the metric

m := Metric(int, float64, string){m: make(map[Keys(int, float64, string)]int}
m.Add(1, 2.0, "variadic")

fs ๋ผ๋Š” ์ด๋ฆ„์˜ ์—ฌ๋Ÿฌ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์™ธ์— ์ด ๊ตฌ์กฐ์ฒด์—์„œ ์ฐธ์กฐ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ž˜์„œ ์งˆ๋ฌธ์€: ๊ฐ€๋ณ€ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌด์—‡์„ ํ•˜๊ณ  ์‹ถ์€๊ฐ€?

์—ฌ๊ธฐ์—์„œ๋Š” ๊ฐ€๋ณ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž„์˜์˜ ์ˆ˜์˜ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ํŠœํ”Œ ์œ ํ˜•์„ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋ฌด์—‡์„ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?

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

๊ฐ€๋ณ€ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ํ‘œ์‹œ๋˜๋Š” ์œ„์น˜๋Š” ๊ตฌ์กฐ์ฒด ๋˜๋Š” ํ•จ์ˆ˜์˜ ๋‘ ๊ณณ๋ฟ์ด๋ฏ€๋กœ ์ด์ „์— ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋ช…ํ™•ํ–ˆ๋˜ ๋‚ด์šฉ์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func F(type Ts ...Comparable) (args ...Ts) {
    if len(args) > 1 {
        F(args[1:])
        return
    }
    // ... do stuff with args[0]
}

์˜ˆ๋ฅผ ๋“ค์–ด variadic Min ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ๋””์ž์ธ์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ variadic ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ๋Š” ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

func Min(type T ...Comparable)(p1 T, pn ...T) T {
    switch l := len(pn); {
    case l > 1:
        return Min(pn[0], pn[1:]...)
    case l == 1:
        if p1 >= pn[0] { return pn[0] }
        return p1
    case l < 1:
        return p1
    }
}

๊ฐ€๋ณ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Tuple ๋ฅผ ์ •์˜ํ•˜๋ ค๋ฉด:

type Tuple(type Ts ...Comparable) struct {
    fs ...Ts
}

์„ธ ๊ฐ€์ง€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 'Ts'๋กœ ์ธ์Šคํ„ด์Šคํ™”๋˜๋ฉด ๋‹ค์Œ์œผ๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type Tuple(type T1, T2, T3 Comparable) struct {
    fs_1 T1
    fs_2 T2
    fs_3 T3
}

์ค‘๊ฐ„ ํ‘œํ˜„์œผ๋กœ. fs ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋งค๊ฐœ๋ณ€์ˆ˜ ์••์ถ• ํ’€๊ธฐ
k := Tuple(int, float64, string){1, 2.0, "variadic"}
fs1, fs2, fs3 := k.fs // translated to fs1, fs2, fs3 := k.fs_1, k.fs_2, k.fs_3
println(fs1) // 1
println(fs2) // 2.0
println(fs3) // variadic
  1. for ๋ฃจํ”„ ์‚ฌ์šฉ
for idx, f := range k.fs {
    println(idx, ": ", f)
}
// Output:
// 0: 1
// 1: 2.0
// 2: variadic
  1. ์ธ๋ฑ์Šค ์‚ฌ์šฉ(์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์ด ๋ฐฐ์—ด/์Šฌ๋ผ์ด์Šค ๋˜๋Š” ๋งต์— ๋Œ€ํ•œ ๋ชจํ˜ธ์„ฑ์„ ์ธ์ง€ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ)
k.fs[0] = ... // translated to k.fs_1 = ...
f2 := k.fs[1] // translated to f2 := k.fs_2
  1. reflect ํŒจํ‚ค์ง€ ์‚ฌ์šฉ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ž‘๋™
t := Tuple(int, float64, string){1, 2.0, "variadic"}

fs := reflect.ValueOf(t).Elem().FieldByName("fs")
val := reflect.ValueOf(fs)
if val.Kind() == reflect.VariadicTypes {
    for i := 0; i < val.Len(); i++ {
        e := val.Index(i)
        switch e.Kind() {
        case reflect.Int:
            fmt.Printf("%v, ", e.Int())
        case reflect.Float64:
            fmt.Printf("%v, ", e.Float())
        case reflect.String:
            fmt.Printf("%v, ", e.String())
        }
    }
}

๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•  ๋•Œ ์‹ค์ œ๋กœ ์ƒˆ๋กœ์šด ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด variadic Min ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ๋””์ž์ธ์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ variadic ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ๋Š” ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

func Min(type T ...Comparable)(p1 T, pn ...T) T {
    switch l := len(pn); {
    case l > 1:
        return Min(pn[0], pn[1:]...)
    case l == 1:
        if p1 >= pn[0] { return pn[0] }
        return p1
    case l < 1:
        return p1
    }
}

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€๋ณ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์œ ํ˜•์ด ๋‹ค๋ฅธ ์œ ํ˜•์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋ชฉ๋ก์—์„œ Min ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Go๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ฐ’์— >= ์‚ฌ์šฉ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ๋“  ํ—ˆ์šฉํ•˜๋”๋ผ๋„ Min(int, string)(1, "a") ์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋Œ€๋‹ต์€ ์—†์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋””์ž์ธ์ด ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๊ฐ€๋ณ€ ์ˆ˜ Min ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ด์ง€๋งŒ ๋™์ผํ•œ ์œ ํ˜•์˜ ๊ฐ€๋ณ€ ์ˆ˜ ๊ฐ’์— ๋Œ€ํ•ด Min ํ˜ธ์ถœ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  Min ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ผํ•œ ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

func Min(type T comparable)(s ...T) T {
    if len(s) == 0 {
        panic("Min of no elements")
    }
    r := s[0]
    for _, v := range s[1:] {
        if v < r {
            r = v
        }
    }
    return r
}

https://github.com/golang/go/issues/15292#issuecomment -599040081์˜ ๋‹ค๋ฅธ ์˜ˆ ์ค‘ ์ผ๋ถ€์˜ ๊ฒฝ์šฐ Go์—์„œ ์Šฌ๋ผ์ด์Šค์™€ ๋ฐฐ์—ด์—๋Š” ๋ชจ๋‘ ๋™์ผํ•œ ์œ ํ˜•์˜ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋ณ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์š”์†Œ๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ ์Šฌ๋ผ์ด์Šค๋‚˜ ๋ฐฐ์—ด๊ณผ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋””์ž์ธ์ด ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๊ฐ€๋ณ€ ์ˆ˜ Min ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ด์ง€๋งŒ ๋™์ผํ•œ ์œ ํ˜•์˜ ๊ฐ€๋ณ€ ์ˆ˜ ๊ฐ’์— ๋Œ€ํ•ด Min ํ˜ธ์ถœ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  Min ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ผํ•œ ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

func Min(type T comparable)(s ...T) T {
    if len(s) == 0 {
        panic("Min of no elements")
    }
    r := s[0]
    for _, v := range s[1:] {
        if v < r {
            r = v
        }
    }
    return r
}

์ง„์‹ค. Min ๋Š” ๋‚˜์œ ์˜ˆ์˜€์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€ ์ˆ˜์ • ๋‚ด์—ญ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ ๋Šฆ๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ๊ณ  ๋ช…ํ™•ํ•œ ์ƒ๊ฐ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์˜ˆ๋Š” ๋ฌด์‹œํ–ˆ๋˜ Metric ์ž…๋‹ˆ๋‹ค.

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

๋ณด๋‹ค? ๋‹น์‹ ์€ ์ด๊ฒƒ์ด ๋ฐฐ์—ด/์Šฌ๋ผ์ด์Šค ๋˜๋Š” ๋งคํ•‘์— ๋ชจํ˜ธํ•จ์„ ์•„๋Š” ์‚ฌ๋žŒ๋“ค์ž…๋‹ˆ๋‹ค. https://github.com/golang/go/issues/15292#issuecomment -599040081์—์„œ ๋งํ–ˆ๋“ฏ์ด ๊ตฌ๋ฌธ์€ ๋ฐฐ์—ด/์Šฌ๋ผ์ด์Šค ๋ฐ ๋งต๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์š”์†Œ์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ์ค‘์š”ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด๊ฒƒ์ด ๋ชจํ˜ธํ•จ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Go 1์—์„œ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

m := map[interface{}]int{1: 2, "2": 3, 3.0: 4}
for i, e := range m {
    println(i, e)
}

i ๋Š” ๊ฐ™์€ ์œ ํ˜•์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๊นŒ? ๋ถ„๋ช…ํžˆ ์šฐ๋ฆฌ๋Š” i ๊ฐ€ interface{} , ๊ฐ™์€ ์œ ํ˜•์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์‹ค์ œ๋กœ ์œ ํ˜•์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๊นŒ? ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๊ฐ€๋Šฅํ•œ ์œ ํ˜•์ด ๋ฌด์—‡์ธ์ง€ ์ˆ˜๋™์œผ๋กœ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. for , [] ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์••์ถ•์„ ํ’€ ๋•Œ ๋™์ผํ•œ ์œ ํ˜•์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ •๋ง ์ค‘์š”ํ•ฉ๋‹ˆ๊นŒ? ์ด์— ๋Œ€ํ•œ ์ฃผ์žฅ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? fs ์— ๋Œ€ํ•ด ๋™์ผ:

for idx, f := range k.fs {
    switch f.(type) { // compare to interface{}, here is zero overhead.
    case int:
        // ...
    case float64:
        // ...
    case string:
        // ...
    }
}

๊ฐ€๋ณ€ ์ œ๋„ค๋ฆญ ์œ ํ˜•์˜ ์š”์†Œ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜• ์Šค์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ด์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ปดํŒŒ์ผ ๊ธฐ์ˆ ์„ ์„ ํƒํ•˜๋ฉด interface{} ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋Ÿฐํƒ€์ž„์— ์•ฝ๊ฐ„ ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ ์ฐจ์ด๊ฐ€ ์ƒ๋‹นํžˆ ์ž‘์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๋” ์ด์ƒ ์œ ํ˜• ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด๋ฅผ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ช…๋ฐฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Metric ์˜ˆ์ œ๋ฅผ ๋ฌด์‹œํ•  ์ƒ๊ฐ์€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋ณ€ ์ œ๋„ค๋ฆญ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„์ง ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. Metric ๋ณธ๋ฌธ์— ์œ ํ˜• ์Šค์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Metric2 ๋ฐ Metric3 ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

"์–ธ์–ด๋ฅผ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ"์˜ ์ •์˜๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์ œ๋„ค๋ฆญ์ด ๋ณต์žกํ•œ ๊ฒƒ์ด๊ณ  ๊ฒฐ์ฝ” Go 1๋ณด๋‹ค ์–ธ์–ด๋ฅผ ๋” ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ด๋ฏธ ๊ทธ๊ฒƒ์„ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์—„์ฒญ๋‚œ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์ง€๋งŒ Go ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋งค์šฐ ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์“ฐ๊ธฐ... ๊ฐ€"? ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋Ÿ‰ํ™”๋œ ์ง€ํ‘œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ธ์–ด ์ œ์•ˆ์ด ์–ธ์–ด๋ฅผ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ์–ด๋–ป๊ฒŒ ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Go 2 ์–ธ์–ด ์ œ์•ˆ ํ…œํ”Œ๋ฆฟ์—์„œ ๋ชฉํ‘œ๋Š” ์ฒซ์ธ์ƒ์—์„œ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

  1. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ,
  2. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ตœ์†Œํ•œ์˜ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ ,
  3. ๋ช…ํ™•ํ•˜๊ณ  ์ž˜ ์ดํ•ด๋œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์งˆ๋ฌธ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "๋‹ค์ˆ˜"๋Š” ๋ช‡ ๊ฐœ์ž…๋‹ˆ๊นŒ? "์ค‘์š”"๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์ธ๊ตฌ์— ๋Œ€ํ•œ ์˜ํ–ฅ์„ ์ธก์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ฌธ์ œ๊ฐ€ ์ž˜ ์ดํ•ด๋˜๋ฉด? ๋ฐ”๋‘‘์€ ํด๋ผ์šฐ๋“œ๋ฅผ ์ง€๋ฐฐํ•˜๊ณ  ์žˆ์ง€๋งŒ ๊ณผํ•™ ์ˆ˜์น˜ ์ปดํ“จํŒ…(์˜ˆ: ๋จธ์‹  ๋Ÿฌ๋‹), ๊ทธ๋ž˜ํ”ฝ ๋ Œ๋”๋ง(์˜ˆ: ๊ฑฐ๋Œ€ํ•œ 3D ์‹œ์žฅ)๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์˜์—ญ์„ ์ง€๋ฐฐํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋‘‘์˜ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ ๊นŒ์š”? ๋ฌธ์ œ๋Š” "๋‚˜๋Š” Go์—์„œ B๋ณด๋‹ค A๋ฅผ ํ•˜๊ณ  ์‹ถ๋‹ค & ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ทธ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์Šค ์ผ€์ด์Šค๊ฐ€ ์—†๋‹ค" ๋˜๋Š” "B๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ Go & ์œ ์Šค ์ผ€์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค"์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๊นŒ? ์–ธ์–ด๊ฐ€ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง ๊ฑฐ๊ธฐ์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?" ... ๋‚˜๋Š” ๊ทธ ์งˆ๋ฌธ์ด ๊ณ ํ†ต์Šค๋Ÿฝ๊ณ  ๋์ด ์—†์œผ๋ฉฐ ๋•Œ๋กœ๋Š” ๋Œ€๋‹ตํ•  ๊ฐ€์น˜์กฐ์ฐจ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

Metric ์˜ˆ์ œ๋กœ ๋Œ์•„๊ฐ€์„œ ๊ฐœ์ธ์— ์•ก์„ธ์Šคํ•  ํ•„์š”๊ฐ€ ์—†์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ธฐ์กด ์–ธ์–ด์™€ "์ผ์น˜"ํ•˜๋Š” ์†”๋ฃจ์…˜์ด [ ] ์ธ๋ฑ์‹ฑ ๋ฐ ์œ ํ˜• ์ถ”๋ก ์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• ์•ˆ์ „ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ธํŠธ์˜ ์••์ถ•์„ ํ’€ ํ•„์š”๋Š” ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

f2 := k.fs[1] // f2 is a float64

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

๊ฐœ์ธ์ ์œผ๋กœ FWIW์—์„œ๋Š” ๊ฐ€๋ณ€ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 3๊ฐœ ์ค‘ 2๊ฐœ์—์„œ ์‹คํŒจํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”ํŠธ๋ฆญ ์˜ˆ์ œ ๋Š” ๊ทธ๋“ค๋กœ๋ถ€ํ„ฐ ํ˜œํƒ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ IMO๋Š” ์•ฝ๊ฐ„๋งŒ ๊ทธ๋ฆฌ๊ณ  ๋งค์šฐ ์ „๋ฌธํ™”๋œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๊ทธ๋“ค์ด ๋ช…ํ™•ํ•˜๊ณ  ์ž˜ ์ดํ•ด๋œ ํ•ด๊ฒฐ์ฑ…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•˜๋Š” ์–ธ์–ด๋ฅผ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์„ ์ง€์›ํ•˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์˜ˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ํ™•์‹คํžˆ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋” ์ค‘์š”ํ•˜๊ฒŒ๋Š” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@Merovius Haskell์€ HList ๋ฌธ์„œ์—์„œ ์‹œ์—ฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋‹ค๋ณ€๋Ÿ‰ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. http://okmij.org/ftp/Haskell/polyvariadic.html#polyvar -fn
Haskell์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๋ณต์žกํ•˜์ง€๋งŒ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™๊ธฐ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ์˜ˆ๋Š” ์œ ํ˜• ์•ˆ์ „ ์กฐ์ธ ๋ฐ ํ”„๋กœ์ ์…˜๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜• ์•ˆ์ „ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์„ธ์Šค์™€ ์–ธ์–ด๋กœ ์„ ์–ธ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์ž…๋‹ˆ๋‹ค.

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

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

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ผ์€ LINQ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ C#์— ํ›จ์”ฌ ๋” ๊น”๋”ํ•˜๊ฒŒ ์ž„๋ฒ ๋”ฉ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ LINQ๋ฅผ C#์— ๋žŒ๋‹ค ํ•จ์ˆ˜์™€ ๋ชจ๋‚˜๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ ์—†์ด๋Š” ํ˜•์‹ ์•ˆ์ „ ์กฐ์ธ ์—ฐ์‚ฐ์ž๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ธฐ๋ณธ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ด€๊ณ„ ์—ฐ์‚ฐ์ž๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Boolean, binary, int, float ๋ฐ string ์œ ํ˜•์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์—ฐ์‚ฐ์ž ๋‹ค์Œ์œผ๋กœ ์ง‘ํ•ฉ์ด ๊ทธ ๋‹ค์Œ์— ์˜ค๊ณ  ๊ด€๊ณ„๊ฐ€ ๊ทธ ๋‹ค์Œ์— ์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

BTW, C++๋„ ์ œ๊ณตํ•˜์ง€๋งŒ XXX์— ์ด ๊ธฐ๋Šฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Go์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์›ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. :)

k.fs[0] ์™€ k.fs[1] ์˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋งค์šฐ ์ด์ƒํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ Go์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฉ”ํŠธ๋ฆญ ์˜ˆ์‹œ๋Š” https://medium.com/@sameer_74231/go -experience-report-for-generics-google-metrics-api-b019d597aaa4๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ฝ”๋“œ๋Š” ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํ”Œ๋ ‰์…˜์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Go์— ๊ฐ€๋ณ€ ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํ”Œ๋ ‰์…˜๋ณด๋‹ค ๋” ๋‚˜์€ ๊ฒƒ์„ ์–ป์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ทธ๋‹ค์ง€ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

k.fs[0] ์™€ k.fs[1] ์˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋งค์šฐ ์ด์ƒํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ธ๋ฑ์‹ฑ ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ Go์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฉ”ํŠธ๋ฆญ ์˜ˆ์‹œ๋Š” https://medium.com/@sameer_74231/go -experience-report-for-generics-google-metrics-api-b019d597aaa4๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ฝ”๋“œ๋Š” ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํ”Œ๋ ‰์…˜์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Go์— ๊ฐ€๋ณ€ ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํ”Œ๋ ‰์…˜๋ณด๋‹ค ๋” ๋‚˜์€ ๊ฒƒ์„ ์–ป์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ทธ๋‹ค์ง€ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ž˜. ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์„ ์š”์ฒญํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. [``] ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ( ) ๋˜๋Š” {``} ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์œผ๋ฉฐ ๊ด„ํ˜ธ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๊ฐ™๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ด„ํ˜ธ๋Š” ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. args.0 args.1 ๋Š” ๋ฐ”๋‘‘์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๋„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์ €๋Š” ์ฃผ๋ง ์‹œ๊ฐ„์— "C++์˜ ๋””์ž์ธ๊ณผ ์ง„ํ™”"๋ผ๋Š” ์ฑ…์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋น„๋ก 1994๋…„์— ์ž‘์„ฑ๋˜์—ˆ์ง€๋งŒ ๊ฒฐ์ •๊ณผ ๊ตํ›ˆ์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ํ†ต์ฐฐ๋ ฅ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

_"[...] ๋Œ์ด์ผœ๋ณด๋ฉด, ๋‚˜๋Š” ๊ฐ€๋…์„ฑ๊ณผ ์กฐ๊ธฐ ์˜ค๋ฅ˜ ๊ฐ์ง€์—์„œ ์ œ์•ฝ ์กฐ๊ฑด์˜ ์ค‘์š”์„ฑ์„ ๊ณผ์†Œ ํ‰๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค."_ ==> ํ›Œ๋ฅญํ•œ ๊ณ„์•ฝ ์„ค๊ณ„

"_์ฒซ๋ˆˆ์— ํ•จ์ˆ˜ ๊ตฌ๋ฌธ๋„ ์ถ”๊ฐ€ ํ‚ค์›Œ๋“œ ์—†์ด ๋” ๋ฉ‹์ง€๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค._

T& index<class T>(vector<T>& v, int i) { /*...*/ }
int i = index(v1, 10);

_์ด ๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ์—๋Š” ์ž”์†Œ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋˜‘๋˜‘ํ•˜๋‹ค. [...] <...> ๊ด„ํ˜ธ๊ฐ€ ๊ด„ํ˜ธ๋ณด๋‹ค ์šฐ์„ ์ ์œผ๋กœ ์„ ํƒ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ…œํ”Œ๋ฆฟ ์„ ์–ธ์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋” ์ฝ๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [...] Tom Pennello๋Š” ๊ด„ํ˜ธ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์› ์„ ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์ฆ๋ช…ํ–ˆ์ง€๋งŒ (์ธ๊ฐ„) ๋…์ž๊ฐ€ <...> ๋ฅผ ์„ ํ˜ธํ•œ๋‹ค๋Š” ์ฃผ์š” ๊ด€์ฐฐ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
" ==> func F(type T C)(v T) T ์™€ ๋น„์Šทํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

_"ํ•˜์ง€๋งŒ ํ…œํ”Œ๋ฆฟ ๊ธฐ๋Šฅ์„ ์ง€์ •ํ•  ๋•Œ ๋„ˆ๋ฌด ์‹ ์ค‘ํ•˜๊ณ  ๋ณด์ˆ˜์ ์ด์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. [...]์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ๊ตฌํ˜„์ž์˜ ๋ถ€๋‹ด์„ ํฌ๊ฒŒ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๋„์›€์„ ๋ฐ›์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค."_

์™œ ๊ทธ๋ ‡๊ฒŒ ์นœ์ˆ™ํ•˜๊ฒŒ ๋Š๊ปด์ง€์ง€?

์ธ๋ฑ์‹ฑ ๊ฐ€๋ณ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜(๋˜๋Š” ํŠœํ”Œ)๋Š” ๋Ÿฐํƒ€์ž„ ์ธ๋ฑ์‹ฑ ๋ฐ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ธ๋ฑ์‹ฑ๊ณผ ๋ณ„๋„๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์ธ๋ฑ์‹ฑ์— ๋Œ€ํ•œ ์ง€์›์ด ๋ถ€์กฑํ•˜๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„ ์ธ๋ฑ์‹ฑ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„ ์ธ๋ฑ์‹ฑ์˜ ๊ฒฝ์šฐ์—๋„ ํ˜„์žฌ ๋””์ž์ธ์—๋Š” ์œ ํ˜•์ด ์•„๋‹Œ "ํ…œํ”Œ๋ฆฟ" ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์ฆ๊ฑฐ์™€ ํ•จ๊ป˜ ์ œ์•ˆ(๊ฒฝํ—˜ ๋ณด๊ณ ์„œ ์ œ์™ธ)์€ ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋ฉฐ, Go์— variadic ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์˜๋„์ ์œผ๋กœ ์ œ๊ฑฐํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

Design and Evolution of C++๊ฐ€ ์ข‹์€ ์ฑ…์ด๋ผ๋Š” ์ ์—๋Š” ๋™์˜ํ•˜์ง€๋งŒ C++์™€ Go๋Š” ๋‹ค๋ฅธ ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ธ์šฉ๋ฌธ์€ ์ข‹์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Stroustrup์€ ์–ธ์–ด ์‚ฌ์šฉ์ž์˜ ์–ธ์–ด ๋ณต์žก์„ฑ ๋น„์šฉ์— ๋Œ€ํ•ด์„œ๋Š” ์–ธ๊ธ‰์กฐ์ฐจ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Go์—์„œ๋Š” ํ•ญ์ƒ ๊ทธ ๋น„์šฉ์„ ๊ณ ๋ คํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Go๋Š” ๋‹จ์ˆœํ•œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„์›€์ด ๋˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค๋ฉด ๊ฐ„๋‹จํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. C++์€ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ์ฆ๊ฑฐ์™€ ํ•จ๊ป˜ ์ œ์•ˆ(๊ฒฝํ—˜ ๋ณด๊ณ ์„œ ์ œ์™ธ)์€ ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋ฉฐ, Go์— variadic ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์˜๋„์ ์œผ๋กœ ์ œ๊ฑฐํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ๋ง์”€์ด์‹ ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ํ•ญ์ƒ ๊ฐ€๋ณ€ ์ œ๋„ค๋ฆญ ์œ ํ˜•์˜ ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ–ˆ์ง€๋งŒ ์ž‘๋™ ๋ฐฉ์‹์„ ์•Œ์•„๋‚ผ ์‹œ๊ฐ„์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. C++์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์€ ๋งค์šฐ ๋ฏธ๋ฌ˜ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € non-variadic ์ œ๋„ค๋ฆญ์ด ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋‚˜์ค‘์— ๊ฐ€๋ณ€ ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•  ์‹œ๊ฐ„์ด ๋ถ„๋ช…ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Stroustrup์€ ์–ธ์–ด ์‚ฌ์šฉ์ž์˜ ์–ธ์–ด ๋ณต์žก์„ฑ ๋น„์šฉ์— ๋Œ€ํ•ด์„œ๋Š” ์–ธ๊ธ‰์กฐ์ฐจ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Go์—์„œ๋Š” ํ•ญ์ƒ ๊ทธ ๋น„์šฉ์„ ๊ณ ๋ คํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Go๋Š” ๋‹จ์ˆœํ•œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„์›€์ด ๋˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค๋ฉด ๊ฐ„๋‹จํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. C++์€ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. C++๋Š” ์ œ๋„ค๋ฆญ์„ ์ „๋‹ฌํ•˜๋Š” ์ตœ์ดˆ์˜ ์‹ค๋ฌด์ž๋ผ๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(ML์ด ์ฒซ ๋ฒˆ์งธ ์–ธ์–ด์ž„). ๋‚ด๊ฐ€ ์ฑ…์—์„œ ์ฝ์€ ๊ฒƒ์—์„œ ๋‚˜๋Š” C++๊ฐ€ ๋‹จ์ˆœํ•œ ์–ธ์–ด๋กœ ์˜๋„๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. C++์—๋Š” Go "ํ˜ธํ™˜์„ฑ ์•ฝ์†"์— ์žˆ๋Š” ๊ธฐ๋Šฅ ๊ณ ์ • ๋‹จ๊ณ„๋„ ๋ช‡ ๋…„ ๋™์•ˆ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ํ•ฉ๋ฆฌ์ ์ธ ์ด์œ  ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ œ์–ดํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ๋ฆด๋ฆฌ์Šค ์ดํ›„์— C++์˜ ์ด์ „ ๊ฒฝ๋กœ๋ฅผ ํฌ์ฐฉํ•˜๋ฉด Go์— ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋‚˜์ค‘์— ๊ฐ€๋ณ€ ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•  ์‹œ๊ฐ„์ด ๋ถ„๋ช…ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์™€ ๊ฐ™์€ ๋Š๋‚Œ. Variadic ์ œ๋„ค๋ฆญ์€ ํ…œํ”Œ๋ฆฟ์˜ ์ฒซ ๋ฒˆ์งธ ํ‘œ์ค€ํ™” ๋ฒ„์ „์—์„œ๋„ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ๋ฅผ ์ง€์ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๊ฐ€๋ณ€ ์œ ํ˜•์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ๊ฑฑ์ •์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€๋งŒ Go๋กœ ์ œ๋Œ€๋กœ ๋ฒˆ์—ญ๋˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(์•„๋ฌด๋„ "๋ฒˆ์—ญ"์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค). ๋‹น์‹ ์˜ ์—ญ์‚ฌ์  ์ œ๋„ค๋ฆญ ์ œ์•ˆ์—์„œ ์ฝ์€ ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ C++์˜ ์ดˆ๊ธฐ ์ œ์•ˆ์—์„œ ์‹คํŒจํ•œ ๊ฒƒ์„ ๋”ฐ๋ฅด๊ณ  Stroustrup์ด ํ›„ํšŒํ•œ ๊ฒƒ์— ํƒ€ํ˜‘ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ๋ฐ˜๋ก ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” C++์˜ ๋ชฉํ‘œ์— ๋Œ€ํ•ด ๋™์˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›๋ž˜ ๋ชฉํ‘œ๊ฐ€ ๋” ๋น„์Šทํ–ˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์˜ค๋Š˜๋‚  C++๋ฅผ ๋ณด๋ฉด ๊ทธ๋“ค์˜ ๋ชฉํ‘œ๊ฐ€ ๋ฐ”๋‘‘์˜ ๋ชฉํ‘œ์™€ ๋งค์šฐ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ์ ์–ด๋„ 25๋…„ ๋™์•ˆ์€ ๊ทธ๋žฌ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

์•ฝ ํ•œ ๋‹ฌ ๋™์•ˆ ํ˜„์žฌ ๊ณ„์•ฝ ๊ตฌํ˜„์„ ์‹œ๋„ํ•œ ํ›„ ๊ธฐ์กด ๋‚ด์žฅ ๊ธฐ๋Šฅ์˜ ์šด๋ช…์ด ๋ฌด์—‡์ธ์ง€ ์กฐ๊ธˆ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func Append(type T)(slice []T, elems ...T) []T {...}
func Copy(type T)(dst, src []T) int {...}
func Delete(type K, V)(m map[K]V, k K) {...}
func Make(type T, I Integer(I))(siz ...I) T {...}
func New(type T)() *T {...}
func Close(type T)(c chan<- T) {...}
func Panic(type T)(v T) {...}
func Recover(type T)() T {...}
func Print(type ...T)(args ...T) {...}
func Println(type ...T)(args ...T) {...}

๊ทธ๋“ค์€ Go2์—์„œ ์‚ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๊นŒ? Go 2๊ฐ€ ๊ธฐ์กด Go 1 ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋ฏธ์น˜๋Š” ์—„์ฒญ๋‚œ ์˜ํ–ฅ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ด๊ฒƒ์€ ์—ด๋ฆฐ ์งˆ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ์ด ๋‘ ๊ฐ€์ง€๋Š” ์กฐ๊ธˆ ํŠน๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

func Len(type T C)(t T) int {...}
func Cap(type T C)(t T) int {...}

์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ผ๋ฐ˜ ์Šฌ๋ผ์ด์Šค []Ts , ๋งต map[Tk]Tv ๋ฐ ์ฑ„๋„ chan Tc ๋งŒ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ˜„์žฌ ๋””์ž์ธ์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ณ„์•ฝ C ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• T Ts Tk Tv Tc ๋Š” ์–ด๋””์—์„œ ๋‹ค๋ฅธ๊ฐ€์š”?

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

@changkun "์ œ๋„ค๋ฆญ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ"์ด ์ œ๊ฑฐํ•ด์•ผ ํ•  ์„ค๋“๋ ฅ ์žˆ๋Š” ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์ด ์ œ๊ฑฐ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ฝค ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ์ด์œ ๋ฅผ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

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

์ด ์งˆ๋ฌธ์„ ๋ฌด์‹œํ•˜์ง€ ์•Š๊ณ  ๊ณ„์•ฝ์˜ ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ ๊ฐ„์ฃผํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค. ๋น„์Šทํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ํ˜„์žฌ ๋””์ž์ธ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ถ„๋ช…ํžˆ ์šฐ๋ฆฌ๋Š” ๊ธฐ์กด์˜ ๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

delete , close , panic , recover , print ๋ฐ println ์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํ•จ์ˆ˜ ์„œ๋ช…์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ

https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-contracts.md#append ์— Append ๋ฐ Copy ์˜ ๋ถ€๋ถ„ ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค. append ๋ฐ copy ์—๋Š” ํ˜„์žฌ ๋””์ž์ธ ์ดˆ์•ˆ์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” string ์œ ํ˜•์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ„์˜ Make ์— ๋Œ€ํ•œ ์„œ๋ช…์€ ํ˜„์žฌ ๋””์ž์ธ ์ดˆ์•ˆ์— ๋”ฐ๋ฅด๋ฉด ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. New ๋Š” new ์™€ ์™„์ „ํžˆ ๊ฐ™์ง€๋Š” ์•Š์ง€๋งŒ ์ถฉ๋ถ„ํžˆ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋””์ž์ธ ์ดˆ์•ˆ์œผ๋กœ Len ๋ฐ Cap ๋Š” interface{} ์œ ํ˜•์˜ ์ธ์ˆ˜๋ฅผ ์ทจํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ปดํŒŒ์ผ ์‹œ ์œ ํ˜• ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://go-review.googlesource.com/c/go/+/187317

.go2 ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฒ„์ „ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ณ„์•ฝ์„ ์‹คํ—˜ํ•˜๋Š” ๋™์•ˆ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ž„์‹œ ์†”๋ฃจ์…˜์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ธ์ง€ ์ดํ•ดํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ go.mod ํŒŒ์ผ์ด go ํŒจํ‚ค์ง€๋ฅผ .go2 ํŒŒ์ผ ํ™•์žฅ์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์ด ๊ฐ€๋Šฅํ•œ ํ•œ ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•˜๋Š” ๋ชจ๋“ˆ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ํƒ€๊ฒฉ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. .go2 ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ 10๋…„ ๋œ ์‚ฌ์ „ ๋ชจ๋“ˆ ๊ณต๋ฃก go ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ณ ์žฅ๋‚˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ด์จŒ๋“  ๋‹น์‹ ์˜ ๋ชจ๋“ˆ์ด ๋‚ด ๋ฐฉ์‹๋Œ€๋กœ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. .

@gertcuykens .go2 ํŒŒ์ผ์€ ์‹คํ—˜์šฉ์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์ด ์ปดํŒŒ์ผ๋Ÿฌ์— ํฌํ•จ๋  ๋•Œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

(๋‚˜๋Š” ๊ทธ๋“ค์ด ํ† ๋ก ์— ์‹ค์ œ๋กœ ์ถ”๊ฐ€๋˜์ง€ ์•Š๊ณ  ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ถฉ๋ถ„ํžˆ ๊ธธ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ์˜ ์˜๊ฒฌ์„ ์ˆจ๊ธธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

์ตœ๊ทผ์— ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋””์ž์ธํ•œ K ์–ธ์–ด์˜ ์ƒˆ๋กœ์šด ์ผ๋ฐ˜ ๊ตฌ๋ฌธ์„ ํƒ์ƒ‰ํ–ˆ๋Š”๋ฐ, K๊ฐ€ Go์—์„œ ๋งŽ์€ ๋ฌธ๋ฒ•์„ ๋นŒ๋ ธ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ผ๋ฐ˜ ๋ฌธ๋ฒ•๋„ Go์— ๋Œ€ํ•œ ์ฐธ์กฐ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

identifier<T> ๋ฌธ์ œ๋Š” ๋น„๊ต ์—ฐ์‚ฐ์ž ๋ฐ ๋น„ํŠธ ์—ฐ์‚ฐ์ž์™€ ์ถฉ๋Œํ•˜๋ฏ€๋กœ ์ด ์„ค๊ณ„์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์Šค์นผ๋ผ์˜ identifier[T] ๋Š” ์ด์ „ ๋””์ž์ธ๋ณด๋‹ค ๋ชจ์–‘๊ณผ ๋Š๋‚Œ์ด ์ข‹์•„์กŒ์ง€๋งŒ ์œ„์˜ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•œ ํ›„ ์ธ๋ฑ์Šค ๋””์ž์ธ identifier[index] ๊ณผ ์ƒˆ๋กœ์šด ์ถฉ๋Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์Šค์นผ๋ผ์˜ ์ธ๋ฑ์Šค ๋””์ž์ธ์€ identifier(index) ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ [] ๋ฅผ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Go์˜ ์ดˆ์•ˆ์—์„œ ์ œ๋„ค๋ฆญ์€ (type T) ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์„ ์–ธํ–ˆ๋Š”๋ฐ, ์ด๋Š” type ๊ฐ€ ํ‚ค์›Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œ์„ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ identifier(type)(params) ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ๋  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ ๋” ๋งŽ์€ ํŒ๋‹จ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์šฐ์—ฐํžˆ ์ƒˆ๋กœ์šด ๋””์ž์ธ์— ๋Œ€ํ•œ ์˜๊ฐ์„ ์ค€ OC์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์˜ ํŠน๋ณ„ํ•œ ๋””์ž์ธ์ด ๋– ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค.

์‹๋ณ„์ž์™€ ์ œ๋„ค๋ฆญ์„ ์ „์ฒด์ ์œผ๋กœ ๋„ฃ๊ณ  [] ์— ๋„ฃ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
[identifier T] ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋””์ž์ธ์€ ์ธ๋ฑ์Šค์™€ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋‘ ๊ฐœ ์ด์ƒ์˜ ์š”์†Œ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ œ๋„ค๋ฆญ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๋•Œ ์ด๋ ‡๊ฒŒ [identifier T V] ๋ฅผ ์“ฐ๋ฉด ๊ธฐ์กด ๋””์ž์ธ๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋””์ž์ธ์„ Go์— ๋Œ€์ž…ํ•˜๋ฉด ๋‹ค์Œ ์˜ˆ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ

type [Item T] struct {
ย ย ย ย Value T
}

func (it [Item T]) Print() {
ย ย ย ย println(it.Value)
}

func [TestGenerics T V]() {
ย ย ย ย var a = [Item T]{}
ย ย ย ย a.Print()
ย ย ย ย var b = [Item V]{}
ย ย ย ย b.Print()
}

func main() {
ย ย ย ย [TestGenerics int string]()
}

์ด๊ฒƒ์€ ๋งค์šฐ ๋ช…ํ™•ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

[] ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์ ์€ Go์˜ ์›๋ž˜ Slice ๋ฐ Map ๋””์ž์ธ์—์„œ ์ผ๋ถ€ ์ƒ์†์„ ๋ฐ›์•˜๊ณ  ์กฐ๊ฐํ™” ๋Š๋‚Œ์„ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[]int  ->  [slice int]

map[string]int  ->  [map string int]

์šฐ๋ฆฌ๋Š” ๋” ๋ณต์žกํ•œ ์˜ˆ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

var a map[int][]map[string]map[string][]string

var b [map int [slice [map string [map string [slice string]]]]]

์ด ์˜ˆ์ œ๋Š” ์—ฌ์ „ํžˆ ๋น„๊ต์  ๋ช…ํ™•ํ•œ ํšจ๊ณผ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋™์‹œ์— ์ปดํŒŒ์ผ์— ์•ฝ๊ฐ„์˜ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

K์—์„œ ์ด ๋””์ž์ธ์„ ๊ตฌํ˜„ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋””์ž์ธ์€ ์–ด๋Š ์ •๋„ ์ฐธ๊ณ ํ•  ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ณ  ๋…ผ์˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ตœ๊ทผ์— ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋””์ž์ธํ•œ K ์–ธ์–ด์˜ ์ƒˆ๋กœ์šด ์ผ๋ฐ˜ ๊ตฌ๋ฌธ์„ ํƒ์ƒ‰ํ–ˆ๋Š”๋ฐ, K๊ฐ€ Go์—์„œ ๋งŽ์€ ๋ฌธ๋ฒ•์„ ๋นŒ๋ ธ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ผ๋ฐ˜ ๋ฌธ๋ฒ•๋„ Go์— ๋Œ€ํ•œ ์ฐธ์กฐ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

identifier<T> ๋ฌธ์ œ๋Š” ๋น„๊ต ์—ฐ์‚ฐ์ž ๋ฐ ๋น„ํŠธ ์—ฐ์‚ฐ์ž์™€ ์ถฉ๋Œํ•˜๋ฏ€๋กœ ์ด ์„ค๊ณ„์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์Šค์นผ๋ผ์˜ identifier[T] ๋Š” ์ด์ „ ๋””์ž์ธ๋ณด๋‹ค ๋ชจ์–‘๊ณผ ๋Š๋‚Œ์ด ์ข‹์•„์กŒ์ง€๋งŒ ์œ„์˜ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•œ ํ›„ ์ธ๋ฑ์Šค ๋””์ž์ธ identifier[index] ๊ณผ ์ƒˆ๋กœ์šด ์ถฉ๋Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์Šค์นผ๋ผ์˜ ์ธ๋ฑ์Šค ๋””์ž์ธ์€ identifier(index) ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ [] ๋ฅผ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Go์˜ ์ดˆ์•ˆ์—์„œ ์ œ๋„ค๋ฆญ์€ (type T) ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์„ ์–ธํ–ˆ๋Š”๋ฐ, ์ด๋Š” type ๊ฐ€ ํ‚ค์›Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œ์„ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ identifier(type)(params) ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ๋  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ ๋” ๋งŽ์€ ํŒ๋‹จ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์šฐ์—ฐํžˆ ์ƒˆ๋กœ์šด ๋””์ž์ธ์— ๋Œ€ํ•œ ์˜๊ฐ์„ ์ค€ OC์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์˜ ํŠน๋ณ„ํ•œ ๋””์ž์ธ์ด ๋– ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค.

์‹๋ณ„์ž์™€ ์ œ๋„ค๋ฆญ์„ ์ „์ฒด์ ์œผ๋กœ ๋„ฃ๊ณ  [] ์— ๋„ฃ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
[identifier T] ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋””์ž์ธ์€ ์ธ๋ฑ์Šค์™€ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋‘ ๊ฐœ ์ด์ƒ์˜ ์š”์†Œ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ œ๋„ค๋ฆญ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๋•Œ ์ด๋ ‡๊ฒŒ [identifier T V] ๋ฅผ ์“ฐ๋ฉด ๊ธฐ์กด ๋””์ž์ธ๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋””์ž์ธ์„ Go์— ๋Œ€์ž…ํ•˜๋ฉด ๋‹ค์Œ ์˜ˆ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ

type [Item T] struct {
ย ย ย ย Value T
}

func (it [Item T]) Print() {
ย ย ย ย println(it.Value)
}

func [TestGenerics T V]() {
ย ย ย ย var a = [Item T]{}
ย ย ย ย a.Print()
ย ย ย ย var b = [Item V]{}
ย ย ย ย b.Print()
}

func main() {
ย ย ย ย [TestGenerics int string]()
}

์ด๊ฒƒ์€ ๋งค์šฐ ๋ช…ํ™•ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

[] ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์ ์€ Go์˜ ์›๋ž˜ Slice ๋ฐ Map ๋””์ž์ธ์—์„œ ์ผ๋ถ€ ์ƒ์†์„ ๋ฐ›์•˜๊ณ  ์กฐ๊ฐํ™” ๋Š๋‚Œ์„ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[]int  ->  [slice int]

map[string]int  ->  [map string int]

์šฐ๋ฆฌ๋Š” ๋” ๋ณต์žกํ•œ ์˜ˆ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

var a map[int][]map[string]map[string][]string

var b [map int [slice [map string [map string [slice string]]]]]

์ด ์˜ˆ์ œ๋Š” ์—ฌ์ „ํžˆ ๋น„๊ต์  ๋ช…ํ™•ํ•œ ํšจ๊ณผ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋™์‹œ์— ์ปดํŒŒ์ผ์— ์•ฝ๊ฐ„์˜ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

K์—์„œ ์ด ๋””์ž์ธ์„ ๊ตฌํ˜„ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋””์ž์ธ์€ ์–ด๋Š ์ •๋„ ์ฐธ๊ณ ํ•  ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ณ  ๋…ผ์˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—„์ฒญ๋‚œ

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

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์š”์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ณ„์•ฝ ์„ ์–ธ์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ/์œ ํ˜•-์–ด์„คํŠธ ๊ตฌ๋ฌธ
  • "๋นˆ ๊ณ„์•ฝ"
  • ๊ด„ํ˜ธ ์•ˆ์˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ

์—์„ธ์ด๋ฅผ ์„ ์ ํ•˜๋Š” ์œ„ํ—˜์„ ๋ฌด๋ฆ…์“ฐ๊ณ  ๋‚˜๋Š” ํ˜„์žฌ Contracts ๋””์ž์ธ ์ดˆ์•ˆ์˜ ์ƒ˜ํ”Œ์—์„œ ๋ณ€ํ™˜๋œ ๋ช‡ ๊ฐ€์ง€ ๊ตฌ๋ฌธ ์—†์ด ์„ค๋ช…์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. FยซTยป ๊ตฌ๋ถ„ ๊ธฐํ˜ธ์˜ ํ˜•์‹์€ ๊ทœ์ •์ด ์•„๋‹ˆ๋ผ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ธฐ๋ก์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

type Listยซtype Element contract{}ยป struct {
    next *ListยซElementยป
    val  Element
}

๊ทธ๋ฆฌ๊ณ 

contract viaStringsยซTo, Fromยป {
    To.Set(string)
    From.String() string
}

func SetViaStringsยซtype To, From viaStringsยป(s []From) []To {
    r := make([]To, len(s))
    for i, v := range s {
        r[i].Set(v.String())
    }
    return r
}

๊ทธ๋ฆฌ๊ณ 

func Keysยซtype K comparable, V contract{}ยป(m map[K]V) []K {
    r := make([]K, 0, len(m))
    for k := range m {
        r = append(r, k)
    }
    return r
}

k := maps.Keys(map[int]int{1:2, 2:4})

๊ทธ๋ฆฌ๊ณ 

contract NumericยซTยป {
    T.(int, int8, int16, int32, int64,
        uint, uint8, uint16, uint32, uint64, uintptr,
        float32, float64,
        complex64, complex128)
}

func DotProductยซtype T Numericยป(s1, s2 []T) T {
    if len(s1) != len(s2) {
        panic("DotProduct: slices of unequal length")
    }
    var r T
    for i := range s1 {
        r += s1[i] * s2[i]
    }
    return r
}

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

@ianlancetaylor https://github.com/golang/go/issues/36533#issuecomment -579484523์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋Œ€์‹  ์ด ์Šค๋ ˆ๋“œ์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. Generics Feedback Page ์—๋„ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. "๊ณต์‹์ ์œผ๋กœ ๊ณ ๋ ค"(์ฆ‰, Go 2 ์ œ์•ˆ ๊ฒ€ํ†  ๊ทธ๋ฃน ?)ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ ํ•˜๋Š”์ง€ ๋˜๋Š” ํ”ผ๋“œ๋ฐฑ์ด ์—ฌ์ „ํžˆ ํ™œ๋ฐœํ•˜๊ฒŒ ์ˆ˜์ง‘๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณ„์•ฝ ์„ค๊ณ„ ์ดˆ์•ˆ์—์„œ:

C++ ๋ฐ Java์™€ ๊ฐ™์€ F<T> ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
v := F<T> ์™€ ๊ฐ™์€ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ๋•Œ < ๋ฅผ ๋ณด๋Š” ์‹œ์ ์—์„œ ์œ ํ˜• ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ณด๊ณ  ์žˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด < ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ‘œํ˜„์‹์„ ๋ณด๊ณ  ์žˆ๋Š”์ง€ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ํšจ๊ณผ์ ์œผ๋กœ ๋ฌดํ•œํ•œ ์˜ˆ์ธก์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” Go ํŒŒ์„œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋งˆ์ง€๋ง‰ ๊ฒŒ์‹œ๋ฌผ๊ณผ ํŠน๋ณ„ํžˆ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: Go Contracts๋ฅผ ์œ„ํ•œ Angle Brace Delimiters

ํŒŒ์„œ๊ฐ€ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง€๋Š” ์ด ์ง€์ ์„ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ƒ˜ํ”Œ:

// Lifted from the design draft
func New<type K, V>(compare func(K, K) int) *Map<K, V> {
    return &Map{<K, V> compare: compare}
}

// ...

func (m *Map<K, V>) InOrder() *Iterator<K, V> {
    sender, receiver := chans.Ranger(<keyValue<K, V>>)
    var f func(*node<K, V>) bool
    f = func(n *node<K, V>) bool {
        if n == nil {
            return true
        }
        // Stop sending values if sender.Send returns false,
        // meaning that nothing is listening at the receiver end.
        return f(n.left) &&
            sender.Send(keyValue{<K, V> n.key, n.val}) &&
            f(n.right)
    }
    go func() {
        f(m.root)
        sender.Close()
    }()
    return &Iterator{receiver}
}

// ...

๊ธฐ๋ณธ์ ์œผ๋กœ < ๊ฐ€ ๋ชจํ˜ธํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์œ„์น˜๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

@toolbox ๊บพ์‡  ๊ด„ํ˜ธ ์ฃผ์„์— ๊ด€ํ•˜์—ฌ. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ ์ด ๊ตฌ๋ฌธ์€ ๋จผ์ € ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์œ ํ˜• ์ธ์ˆ˜์— ๋Œ€ํ•ด ๊บพ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒฐ์ •์„ ๋‚ด๋ฆฐ ๋‹ค์Œ ์ด๋ฅผ ๋ง์น˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. Go์— ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์–ธ์–ด์— ๊น”๋”ํ•˜๊ณ  ์‰ฝ๊ฒŒ ๋งž๋Š” ๊ฒƒ์„ ์œ„ํ•ด. ์ค‘๊ด„ํ˜ธ ์•ˆ์—์„œ ๊บพ์‡  ๊ด„ํ˜ธ๋ฅผ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

์ผ๋ฐ˜ ์œ ํ˜•์—๋Š” [] ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ผ๋ฐ˜ ํ•จ์ˆ˜์—๋Š” () ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ํ˜„์žฌ์˜ ํ•ต์‹ฌ ์ œ๋„ค๋ฆญ๊ณผ ๋” ์ผ๊ด€์„ฑ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํˆฌํ‘œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๋” ๋งŽ์€ ๊ด„ํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค _anything_์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ํด๋กœ์ € ๋“ฑ์— ๋Œ€ํ•œ ์ผ๋ถ€ ๊ธฐ๋Šฅ ์ •์˜๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋” ๋งŽ์€ ํ˜ผ๋ž€์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค

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

๋‚˜๋Š” Go ๋””์ž์ด๋„ˆ์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ตœ๊ณ ์˜ ์†”๋ฃจ์…˜์— ์ˆ˜๋ ดํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ด ๋Œ€ํ™”์—์„œ ์–ด๋–ค ๊ฒƒ์—๋„ ๋ฌด๊ฒŒ๋ฅผ ๋‘˜ ํ•„์š”๋ฅผ ๋Š๋ผ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋‚ด๊ฐ€ ์˜ˆ์ƒ์™ธ๋กœ ์–ผ๋งˆ๋‚˜ ๊ธฐ๋ปค๋Š”์ง€ ๋งํ•ด์•ผ๋งŒ ํ–ˆ๋‹ค.
FยซTยป ๊ตฌ๋ฌธ์˜ ์ œ์•ˆ.

(๊ธฐํƒ€ ์œ ๋‹ˆ์ฝ”๋“œ ๋Œ€๊ด„ํ˜ธ:
https://unicode-search.net/unicode-namesearch.pl?term=BRACKET.)

๊ฑด๋ฐฐ,

  • ๋‹จ๋ฐœ

2020๋…„ 5์›” 1์ผ ๊ธˆ์š”์ผ ์˜คํ›„ 7์‹œ 43๋ถ„์— Matt Mc [email protected] ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

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

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์š”์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ณ„์•ฝ ์„ ์–ธ์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ/์œ ํ˜•-์–ด์„คํŠธ ๊ตฌ๋ฌธ
  • "๋นˆ ๊ณ„์•ฝ"
  • ๊ด„ํ˜ธ ์•ˆ์˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ

์—์„ธ์ด๋ฅผ ์„ ์ ํ•˜๋Š” ์œ„ํ—˜์„ ๋ฌด๋ฆ…์“ฐ๊ณ  ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ช‡ ๊ฐ€์ง€
ํ˜„์žฌ ๊ณ„์•ฝ ์„ค๊ณ„ ์ดˆ์•ˆ์˜ ์ƒ˜ํ”Œ์—์„œ ๋ณ€ํ™˜๋œ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ
๊ตฌ๋ถ„ ๊ธฐํ˜ธ์˜ FยซTยป ํ˜•์‹์€ ๊ทœ์ •์ ์ธ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์˜ˆ์‹œ์ ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณด๋‹ค
์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค.

์œ ํ˜• ๋ชฉ๋กยซ์œ ํ˜• ์š”์†Œ ๊ณ„์•ฝ{}ยป ๊ตฌ์กฐ์ฒด {
๋‹ค์Œ *๋ชฉ๋กยซ์š”์†Œยป
val ์š”์†Œ
}

๊ทธ๋ฆฌ๊ณ 

๊ณ„์•ฝ viaStringsยซTo, Fromยป {
To.Set(๋ฌธ์ž์—ด)
From.String() ๋ฌธ์ž์—ด
}
func SetViaStringsยซtype To, From viaStringsยป(s []From) []To {
r := make([]๊นŒ์ง€, len(s))
i, v := ๋ฒ”์œ„ s {
r[i].Set(v.String())
}
๋ฆฌํ„ด r
}

๊ทธ๋ฆฌ๊ณ 

func Keysยซ์œ ํ˜• K ๋น„๊ต ๊ฐ€๋Šฅ, V ๊ณ„์•ฝ{}ยป(m map[K]V) []K {
r := make([]K, 0, len(m))
k := ๋ฒ”์œ„ m {
r = ์ถ”๊ฐ€(r, k)
}
๋ฆฌํ„ด r
}
k := maps.Keys(์ง€๋„[int]int{1:2, 2:4})

๊ทธ๋ฆฌ๊ณ 

๊ณ„์•ฝ ์ˆซ์žยซTยป {
T.(int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64, uintptr,
float32, float64,
์ฝคํ”Œ๋ ‰์Šค64, ์ฝคํ”Œ๋ ‰์Šค128)
}
func DotProductยซ์œ ํ˜• T ์ˆซ์žยป(s1, s2 []T) T {
len(s1) != len(s2) {
ํŒจ๋‹‰("DotProduct: ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅธ ์Šฌ๋ผ์ด์Šค")
}
var r T
๋‚˜๋Š” := ๋ฒ”์œ„ s1 {
r += s1[i] * s2[i]
}
๋ฆฌํ„ด r
}

๋‚ด๋ถ€์—์„œ ๊ณ„์•ฝ์„ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋Š” ํ›จ์”ฌ ๋”
Go ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›จ์”ฌ ์ž์‹ ๊ฐ๋„ ์ƒ๊ฒผ์–ด์š”
๋ฐ”๋‘‘์„ ๋ฐฐ์šฐ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ด ์–‘์‹์„ ๊ฐ€๋ฅด์น˜ ์‹ญ์‹œ์˜ค(๋Šฆ์—ˆ์ง€๋งŒ
๊ณผ์ •).

@ianlancetaylor https://github.com/ianlancetaylor ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋ฐ”ํƒ•์œผ๋กœ
#36533์—์„œ (๋Œ“๊ธ€)
https://github.com/golang/go/issues/36533#issuecomment-579484523 ์ €๋Š”
์ƒˆ ๋ฌธ์ œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋Œ€์‹  ์ด ์Šค๋ ˆ๋“œ์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋„ ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค
์ œ๋„ค๋ฆญ ํ”ผ๋“œ๋ฐฑ ํŽ˜์ด์ง€์—์„œ
https://github.com/golang/go/wiki/Go2GenericsFeedback . ๋‚˜๋Š” ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค
"๊ณต์‹์ ์œผ๋กœ ๊ณ ๋ ค"ํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: Go 2
์ œ์•ˆ ๊ฒ€ํ†  ๊ทธ๋ฃน https://github.com/golang/go/issues/33892 ?) ๋˜๋Š” ๊ฒฝ์šฐ
ํ”ผ๋“œ๋ฐฑ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํ™œ๋ฐœํ•˜๊ฒŒ ์ˆ˜์ง‘๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/15292#issuecomment-622657596 ๋˜๋Š”
๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AACQ2NJRBNLLDGY2XGCCQCLRPOCEHANCNFSM4CA35RXQ
.

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

ํ•˜๋ฃจ๊ฐ€ ๋๋‚˜๋ฉด ํ›จ์”ฌ ๋” ๋‚˜์€ ํ‘œ๊ธฐ๋ฒ•์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ์ค€์ˆ˜ํ•  ํ˜ธํ™˜์„ฑ ๋ณด์žฅ์ด ์—†๋Š” ํ•œ ๋ณ€๊ฒฝํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค(ํŒŒ์„œ๋Š” ์•ฝ๊ฐ„ ์กฐ์ •๋˜๊ณ  ๋ชจ๋“  ์ฝ”๋“œ ๋ณธ๋ฌธ์€ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. gofmt๋กœ ์‰ฝ๊ฒŒ).

@ianlancetaylor ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์˜ณ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ตฌ๋ฌธ์€ "์œ ํ˜• ์ธ์ˆ˜์— ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ"์ด์—ˆ๊ณ  ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ์ตœ์ƒ์˜ ํ›„๋ณด๋ฅผ ์„ ํƒํ•œ ๋‹ค์Œ ํŒŒ์„œ์˜ ๊ตฌํ˜„ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ์ด ์ฝ๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ(๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํ•œ ๋ˆˆ์— ์•Œ๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ) ๊ธฐ์กด ์–ธ์–ด์— ์ •๋ง ์‰ฝ๊ฒŒ ๋งž์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ์ ์—์„œ ์Šคํƒ ์Šค๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

์–ด์ ฏ๋ฐค์— ์šฐ์—ฐํžˆ D์— ๋Œ€ํ•œ ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ์„ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์€ ๋ช‡ ๊ฐ€์ง€ ์ธก๋ฉด์—์„œ ๋†€๋ผ์šธ ์ •๋„๋กœ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

template Square(T) {
    T Square(T t) {
        return t * t;
    }
}

writefln("The square of %s is %s", 3, Square!(int)(3));

template TCopy(T) {
    void copy(out T to, T from) {
        to = from;
    }
}

int i;
TCopy!(int).copy(i, 3);

๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ธ์Šคํ„ด์Šคํ™” ์—ฐ์‚ฐ์ž

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

ํ•œ ๊ฐ€์ง€ ๊ณ ์•ˆ๋œ ์˜ˆ:

// Instantiation with unexported types and then function call,
// or chained method call?
a := draw(square, ellipse)(canvas, color)

์ œ์•ˆ: ์ธ์Šคํ„ด์Šคํ™” ์—ฐ์‚ฐ์ž ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค. D๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ! ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ƒ˜ํ”Œ ๊ตฌ๋ฌธ:

// Lifted from the design draft
func New(type K, V)(compare func(K, K) int) *Map!(K, V) {
    return &Map!(K, V){compare: compare}
}

// ...

func (m *Map(K, V)) InOrder() *Iterator!(K, V) {
    sender, receiver := chans.Ranger!(keyValue!(K, V))()
    var f func(*node!(K, V)) bool
    f = func(n *node!(K, V)) bool {
        if n == nil {
            return true
        }
        // Stop sending values if sender.Send returns false,
        // meaning that nothing is listening at the receiver end.
        return f(n.left) &&
            sender.Send(keyValue!(K, V){n.key, n.val}) &&
            f(n.right)
    }
    go func() {
        f(m.root)
        sender.Close()
    }()
    return &Iterator{receiver}
}

// ...

์ œ ๊ฐœ์ธ์ ์ธ ๊ด€์ ์—์„œ ๋ณด๋ฉด ์œ„์˜ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ์ ์œผ๋กœ๋‚˜ ํŒŒ์„œ์— ๋Œ€ํ•ด ๋ชจ๋“  ๋ชจํ˜ธ์„ฑ์ด ํ•ด์†Œ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๊ฒƒ์ด Contracts์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‹จ์ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์„ ์–ธ ์Šคํƒ€์ผ

์œ ํ˜•, ํ•จ์ˆ˜ ๋ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ๋•Œ "๋Ÿฐํƒ€์ž„ ๋˜๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„?"์ด ๋” ์ ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ. Gopher๋Š” type ๋˜๋Š” func ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ–‰์„ ๋ณด๊ณ  ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘์ด ์•„๋‹ˆ๋ผ ์„ ์–ธ์„ ๋ณด๊ณ  ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ๊ฐ€์ง€ ์‹œ๊ฐ์  ๋ชจํ˜ธ์„ฑ์ด ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

// Type-parameterized function,
// or function with multiple return values?
func Draw(cvs canvas, t tool)(canvas, tool) {
    // ...
}
func Draw(type canvas, tool)(cvs canvas, t tool) {
    // ...
}

// Type-parameterized struct, or function call?
func Set(elem constructible) rect {
    // ...
}
type Set(type Elem comparable) struct{
    // ...
}

// Method call, or type-parameterized function?
func Map(type Element)(s []Element, f func(Element) Element) (results []Element) {
    // ...
}
func (t Element) Map(s []Element, f func(Element) Element) (results []Element) {
    // ...
}

์ƒ๊ฐ:

  • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ์ธ์Šคํ„ด์Šคํ™” ๋ฌธ์ œ๋ณด๋‹ค ๋œ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ํ™•์‹คํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์œ ํ˜• ์ธ์ˆ˜์— ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์•„๋งˆ๋„ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์—ฐ์‚ฐ์ž๋‚˜ ๋ฌธ์ž๋ฅผ ๊ฑฐ๊ธฐ์— ๋„ฃ์œผ๋ฉด( ! ๋Š” ๊ธธ์„ ์žƒ์„ ์ˆ˜ ์žˆ๊ณ  # ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?) ์ƒํ™ฉ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: @griesemer ์ถ”๊ฐ€ ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

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

@toolbox

// Instantiation with unexported types and then function call,
// or chained method call?
a := draw(square, ellipse)(canvas, color)

์–ด๋Š ์ชฝ์ด๋“  ๊ทธ๊ฒƒ์ด ์™œ ์ค‘์š”ํ• ๊นŒ์š”? ์ผ๋ฐ˜ ๋…์ž์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋˜๋Š” ๋Ÿฐํƒ€์ž„ ์ค‘์— ์‹คํ–‰๋œ ์ฝ”๋“œ์ธ์ง€ ์—ฌ๋ถ€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜์˜ ์ •์˜๋ฅผ ํ•œ ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋‚˜์ค‘ ์˜ˆ๋Š” ์ „ํ˜€ ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— () ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋Š ์ •๋„ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๋ฌธ์ž์ด๊ฑฐ๋‚˜ ์ž˜ ์•Œ๋ ค์ง„ ์œ ํ˜•์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋‹จ๊ณ„์—์„œ๋Š” ์ƒ‰์ƒ์ด ์•„๋‹ˆ๋ผ ์ฐฝ๊ณ ์˜ ํฌ๊ธฐ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

@toolbox ๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์ด ์ปดํŒŒ์ผ ํƒ€์ž„๊ณผ ๋Ÿฐํƒ€์ž„์˜ ์ฐจ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ, ๊ทธ๊ฒƒ์€ ํ•˜๋‚˜์˜ ์ฐจ์ด์ ์ด์ง€๋งŒ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด๊ฒƒ์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์œ ํ˜• ์„ ์–ธ์ž…๋‹ˆ๊นŒ? ๋‹น์‹ ์€ ๊ทธ๋“ค์ด ๋‹ค๋ฅด๊ฒŒ ํ–‰๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•Œ๊ณ  ์‹ถ์–ด ํ•˜๊ณ  ์–ด๋–ค ํ‘œํ˜„์‹์ด ๋‘ ๊ฐœ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ•˜๋Š”์ง€ ํ•œ ๋ฒˆ ํ•˜๋Š”์ง€ ์ถ”๋ก ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ํฐ ์ฐจ์ด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰ a := draw(square, ellipse)(canvas, color) ์™€ ๊ฐ™์€ ํ‘œํ˜„์€ ์ฃผ๋ณ€ ํ™˜๊ฒฝ์„ ์กฐ์‚ฌํ•˜์ง€ ์•Š๊ณ  ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„์„ ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Go๊ฐ€ ์ด์— ๋Œ€ํ•œ ์ข‹์€ ์˜ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, ์ œ ํ†ต์‹ ์„ ๋ฐฉํ•ดํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ํ•ต์‹ฌ ์š”์ ์ž…๋‹ˆ๋‹ค.

์œ ํ˜•์ด๋‚˜ ํ”„๋กœ๊ทธ๋žจ ํ๋ฆ„์„๋ณด๊ณ  ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

(ํ˜„์žฌ ํ•˜๋‚˜๋Š” ์ปดํŒŒ์ผ ์ค‘์— ์ •๋ ฌ๋˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•˜์ง€๋งŒ ์ด๋Š” @infogulch ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง‘์–ด ๋“  ์š”์ ์ด ์•„๋‹ˆ๋ผ ํŠน์„ฑ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!)


๋‚˜๋Š” ์ดˆ์•ˆ์˜ ์ œ๋„ค๋ฆญ์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋น„์œ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๊ฒฌ์„ ๋ช‡ ๊ณณ์—์„œ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํ•จ์ˆ˜๋‚˜ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ผ์ข…์˜ ์ปดํŒŒ์ผ ํƒ€์ž„ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์ค‘์— ๋ฐœ์ƒํ•˜๋Š” ์ผ์— ๋Œ€ํ•œ ์ •์‹ ์  ๋ชจ๋ธ๋กœ ๋„์›€์ด ๋˜์ง€๋งŒ ๊ตฌ๋ฌธ์ ์œผ๋กœ๋Š” ๋ฒˆ์—ญ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์ ์œผ๋กœ๋Š” ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ด๋ฆ„ ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

// Example from the Contracts draft
Print(int)([]int{1, 2, 3})

// New naming that communicates behavior and intent
MakePrintFunc(int)([]int{1, 2, 3}) // Chained function call, great!

์‹ค์ œ๋กœ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค . ์ถฉ๋ถ„ํžˆ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ๊ฒƒ์— Type ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ด๋ฆ„์—์„œ ํ•จ์ˆ˜๋ฅผ "ํ˜ธ์ถœ"ํ•  ๋•Œ ์œ ํ˜•์„ ์–ป๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด (์˜ˆ๋ฅผ ๋“ค์–ด) Pair(...) ๊ฐ€ ๊ตฌ์กฐ์ฒด๊ฐ€ ์•„๋‹Œ ๊ตฌ์กฐ์ฒด ์œ ํ˜• ์„ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ๊ทœ์น™์ด ์ ์šฉ๋˜๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค. a := drawType(square, ellipse)(canvas, color)

(์„ ๋ก€๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ "-er" ๊ด€๋ก€๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)

์œ„์˜ ๋‚ด์šฉ์„ ์†”๋ฃจ์…˜์œผ๋กœ ํŠน๋ณ„ํžˆ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ์ €๋Š” "ํ•จ์ˆ˜๋กœ์„œ์˜ ์ œ๋„ค๋ฆญ"์ด ํ˜„์žฌ ๊ตฌ๋ฌธ์œผ๋กœ ์™„์ „ํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.


๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, @infogulch ๋Š” ๋‚ด ์š”์ ์„ ์•„์ฃผ ์ž˜ ์š”์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์‹œ๊ฐ์ ์œผ๋กœ ์œ ํ˜• ์ธ์ˆ˜๋ฅผ ๊ตฌ๋ณ„ํ•˜์—ฌ ๊ทธ๋“ค์ด type ์˜ ์ผ๋ถ€ ๋ผ๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆ ํ•˜๋Š” ๊ฒƒ์„ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘๊ธฐ์˜ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๋กœ ์‹œ๊ฐ์ ์ธ ๋ถ€๋ถ„์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ๋‚ด ์ฝ”๋“œ์—์„œ ๋‹ค๋ฅธ ๋ฌธ์ž๋ฅผ ๋ณด๊ณ  ์‹ถ์ง€ ์•Š์œผ๋ฏ€๋กœ ยซยป ๋Š” ์ง€์›์„ ๋ฐ›์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค(๋‚ด ํ‚ค๋ณด๋“œ์—์„œ ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค!).

๊ทธ๋Ÿฌ๋‚˜ ๋‘ฅ๊ทผ ๊ด„ํ˜ธ ๋’ค์— ๋‘ฅ๊ทผ ๊ด„ํ˜ธ๊ฐ€ ์˜ค๋Š” ๊ฒƒ๋„ ๋ณด๊ธฐ์— ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

a := draw{square, ellipse}(canvas, color)

Print(int)([]int{1,2,3}) ์—์„œ ์œ ์ผํ•œ ๋™์ž‘ ์ฐจ์ด์  ์€ "์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋Œ€ ๋Ÿฐํƒ€์ž„"์ž…๋‹ˆ๋‹ค. ์˜ˆ, MakePrintFunc ๋Œ€์‹  Print ๊ฐ€ ์ด ์œ ์‚ฌ์„ฑ์„ ๋” ๊ฐ•์กฐํ•˜์ง€๋งŒ... MakePrintFunc ๋ฅผ ์‚ฌ์šฉ ํ•˜์ง€ ๋ง๋ผ๋Š” ์ฃผ์žฅ์ด ์•„๋‹Œ๊ฐ€์š”? ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ์‹ค์ œ ํ–‰๋™ ์ฐจ์ด๋ฅผ ์ˆจ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

FWIW, ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜ ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ธ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Print(int) ๋Š” ์‹ค์ œ๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜(์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํ‰๊ฐ€๋จ)์™€ ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— $# Pair(int, string) ๋Š” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ ํ˜• ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. Print(int) ๋Š” ์‹ค์ œ๋กœ func -value๋กœ ํ‰๊ฐ€๋˜๋Š” ์œ ํšจํ•œ ํ‘œํ˜„์‹์ธ ๋ฐ˜๋ฉด Pair(int, string) ๋Š” ์œ ํšจํ•œ ํ‘œํ˜„์‹์ด ์•„๋‹ˆ๋ผ ์œ ํ˜• ์‚ฌ์–‘์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ๋ฒ•์˜ ์ง„์ •ํ•œ ์ฐจ์ด์ ์€ "์ œ๋„ค๋ฆญ ๋Œ€ ๋น„์ œ๋„ค๋ฆญ ํ•จ์ˆ˜"๊ฐ€ ์•„๋‹ˆ๋ผ "์ œ๋„ค๋ฆญ ํ•จ์ˆ˜ ๋Œ€ ์ œ๋„ค๋ฆญ ์œ ํ˜•"์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ POV์—์„œ, ์–ด์จŒ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜์— ๋Œ€ํ•ด () ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์‹ค์ œ๋กœ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜์˜ ํŠน์„ฑ์„ ๊ฐ•์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ <> ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์˜ ๊ฒฝ์šฐ

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

@toolbox ๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์ด ์ปดํŒŒ์ผ ํƒ€์ž„๊ณผ ๋Ÿฐํƒ€์ž„์˜ ์ฐจ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ, ๊ทธ๊ฒƒ์€ ํ•˜๋‚˜์˜ ์ฐจ์ด์ ์ด์ง€๋งŒ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด๊ฒƒ์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์œ ํ˜• ์„ ์–ธ์ž…๋‹ˆ๊นŒ? ๋‹น์‹ ์€ ๊ทธ๋“ค์ด ๋‹ค๋ฅด๊ฒŒ ํ–‰๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•Œ๊ณ  ์‹ถ์–ด _์›ํ•ฉ๋‹ˆ๋‹ค_ ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ํ‘œํ˜„์‹์ด ๋‘ ๊ฐœ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ•˜๋Š”์ง€ ํ•œ ๋ฒˆ ํ•˜๋Š”์ง€ ์ถ”๋ก ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ํฐ ์ฐจ์ด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰ a := draw(square, ellipse)(canvas, color) ์™€ ๊ฐ™์€ ํ‘œํ˜„์€ ์ฃผ๋ณ€ ํ™˜๊ฒฝ์„ ์กฐ์‚ฌํ•˜์ง€ ์•Š๊ณ  ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„์„ ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Go๊ฐ€ ์ด์— ๋Œ€ํ•œ ์ข‹์€ ์˜ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ์„ ์–ธ์€ ๋ชจ๋‘ type ํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์˜ˆ๋Š” ๋ถ„๋ช…ํžˆ ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

ํŽธ์ง‘๊ธฐ์˜ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๋กœ ์‹œ๊ฐ์ ์ธ ๋ถ€๋ถ„์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ๋Š” ๊ตฌ๋ฌธ์ด ์ƒ‰์ƒ์— ๊ด€๊ณ„์—†์ด ๋ช…ํ™•ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋‘‘์˜ ๊ฒฝ์šฐ๋„ ๊ทธ๋žฌ๊ณ  ๊ทธ ๊ธฐ์ค€์—์„œ ๋–จ์–ด์ง€๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์ด ๊ตฌ์กฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๊ณผ ์ถฉ๋Œํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Print(int)([]int{1,2,3}) ์—์„œ ์œ ์ผํ•œ ๋™์ž‘ ์ฐจ์ด์ ์€ "์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋Œ€ ๋Ÿฐํƒ€์ž„"์ž…๋‹ˆ๋‹ค. ์˜ˆ, MakePrintFunc ๋Œ€์‹  Print ๊ฐ€ ์ด ์œ ์‚ฌ์„ฑ์„ ๋” ๊ฐ•์กฐํ•˜์ง€๋งŒ... MakePrintFunc ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ๋Š” ์ฃผ์žฅ์ด ์•„๋‹Œ๊ฐ€์š”? ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ์‹ค์ œ ํ–‰๋™ ์ฐจ์ด๋ฅผ ์ˆจ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ์ด๊ฒƒ์ด ์ œ๊ฐ€ MakePrintFunc(int)([]int{1,2,3}) Print!(int)([]int{1,2,3}) ๋ฅผ ์ง€์ง€ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋…ํŠนํ•œ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ, @ianlancetaylor ๊ฐ€ ์ด์ „์— ๋˜์กŒ๋˜ ์งˆ๋ฌธ: ์ธ์Šคํ„ด์Šคํ™”/ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ธฐ๋Šฅ ์œ ํ˜•์ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„๊ณผ ๋Ÿฐํƒ€์ž„์ธ์ง€๊ฐ€ ์™œ ์ค‘์š”ํ•œ๊ฐ€์š”?

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

Print(...) ๋ฅผ ๋ณผ ๋•Œ ์ฒซ ๋ฒˆ์งธ ๋ณธ๋Šฅ์€ "์–ด๋”˜๊ฐ€์— ์“ฐ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค. "์ด๊ฒƒ์€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ํ†ต์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ–‰๋™๊ณผ ์˜๋„๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

  • MakePrintFunc(...)
  • Print!(...)
  • Print<...>

๋‹ค์‹œ ๋งํ•ด, ์ด ์ฝ”๋“œ ์กฐ๊ฐ์€ ์ด์ œ ๋‹ค์Œ ์ฝ”๋“œ ๋น„ํŠธ์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ "์ฐธ์กฐ"ํ•˜๊ฑฐ๋‚˜ ์–ด๋–ค ์‹์œผ๋กœ๋“  "์ œ๊ณต"ํ•ฉ๋‹ˆ๋‹ค.

FWIW, ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜ ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ธ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ...

์•„๋‹ˆ์š”, ๋งˆ์ง€๋ง‰ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ํ•จ์ˆ˜์— ๊ด€ํ•œ ๊ฒƒ์ž„์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜ ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•œ ์ผ๊ด€๋œ ๊ตฌ๋ฌธ์„ ์˜นํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์ด ํ†ตํ•ฉ๋œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ํ†ตํ•ฉ๋œ ๊ฐœ๋…์ด ์•„๋‹Œ ํ•œ Go ํŒ€์—์„œ Generics๋ฅผ Go์— ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Print(...) ๋ฅผ ๋ณผ ๋•Œ ์ฒซ ๋ฒˆ์งธ ๋ณธ๋Šฅ์€ "์–ด๋”˜๊ฐ€์— ์“ฐ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค. "์ด๊ฒƒ์€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ํ†ต์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์ด ์ผ๋ถ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ž‘์„ฑํ–ˆ๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ  ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

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

์ œ ์ƒ๊ฐ์—๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ–‰๋™๊ณผ ์˜๋„๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋Š” ์ตœ์†Œํ•œ ๋””์ž์ธ๊ณผ 100% ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‚ฌ์šฉ๋œ ์‹๋ณ„์ž์— ๋Œ€ํ•œ ์–ด๋–ค ํ˜•์‹๋„ ๊ทœ์ •ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฐฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค func ).

์•„๋‹ˆ์š”, ๋งˆ์ง€๋ง‰ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ํ•จ์ˆ˜์— ๊ด€ํ•œ ๊ฒƒ์ž„์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜ ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•œ ์ผ๊ด€๋œ ๊ตฌ๋ฌธ์„ ์˜นํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ์ œ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๋™์˜ํ•ฉ๋‹ˆ๋‹ค :) ์ค‘์š”ํ•œ ํ–‰๋™ ๋ณ€ํ™”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ท€ํ•˜๊ฐ€ ์ฃผ์žฅํ•˜๋Š” ์ฃผ์žฅ์ด "์ผ๋ฐ˜ ๋Œ€ ๋น„ ์ผ๋ฐ˜"์ถ•์„ ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘˜. ๊ทธ๊ฒƒ๋“ค ์€ "์œ ํ˜• ๋Œ€ ๊ธฐ๋Šฅ" ์ถ•์„ ๋”ฐ๋ผ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์–ด๋–ค ๊ฒƒ์ด ์œ ํ˜• ์‚ฌ์–‘์ด๋“  ํ‘œํ˜„์‹์ด๋“  ๊ทธ๊ฒƒ์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•ด ๋งค์šฐ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋™์˜ํ•˜์ง€ ์•Š์ง€๋งŒ ์ ์–ด๋„ ๋‚˜๋Š” ์ดํ•ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์„ :)

@Merovius ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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

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

Print(...)(...) ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ์ฒซ ๋ฒˆ์งธ () ๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ธ์‡„ํ–ˆ์œผ๋ฉฐ ํ•จ์ˆ˜๊ฐ€ ์ผ์ข…์˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์œผ๋ฉฐ ๋‘ ๋ฒˆ์งธ () ๊ฐ€ ํ•ด๋‹น ์ถ”๊ฐ€ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. .

(์ด๊ฒƒ์ด ๋น„์ •์ƒ์ ์ด๊ฑฐ๋‚˜ ๋“œ๋ฌธ ์˜๊ฒฌ์ด๋ผ๋ฉด ๋†€๋ผ๊ฒ ์ง€๋งŒ, ์ผ๋ถ€ ์„ค๋ฌธ์กฐ์‚ฌ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด์„œ๋Š” ์ด์˜๋ฅผ ์ œ๊ธฐํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.)

์ฒซ ๋ฒˆ์งธ๋Š” ์ตœ์†Œํ•œ ๋””์ž์ธ๊ณผ 100% ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‚ฌ์šฉ๋œ ์‹๋ณ„์ž์— ๋Œ€ํ•œ ์–ด๋–ค ํ˜•์‹๋„ ๊ทœ์ •ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฐฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์˜ณ์•˜์–ด. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ œ์•ˆํ–ˆ๋‹ค :)

๋ด, ๋‚˜๋Š” ํ•จ์ˆ˜์™€ ์œ ํ˜•์— ๋Œ€ํ•œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์‹œ๊ฐ์  ๋ชจํ˜ธ์„ฑ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋‚˜์—ดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจํ˜ธํ•จ์ด ์—†๋‹ค๋ฉด ์ œ์•ˆ ์‚ฌํ•ญ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

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

๋ชจํ˜ธ์„ฑ๊ณผ 3๊ฐ€์ง€ ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ์œ„์˜ ์‚ฌํ•ญ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

์ด์— ๋Œ€ํ•ด ๋ฐํž ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์กฐ์‚ฌ
  2. ์ง€๋„ ์‹œ๊ฐ„

1. ์„ค๋ฌธ์กฐ์‚ฌ

์„œ๋ฌธ: ์ด๊ฒƒ์€ ๋ฏผ์ฃผ์ฃผ์˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜์‚ฌ๊ฒฐ์ •์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ ๋ช…ํ™•ํ•œ ๋…ผ๋ฆฌ์™€ ๊ด‘๋ฒ”์œ„ํ•œ ์„ค๋ฌธ์กฐ์‚ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์˜์‚ฌ๊ฒฐ์ • ๊ณผ์ •์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋‹จ์ด ์—†์ง€๋งŒ "๋ช…ํ™•์„ฑ์œผ๋กœ ์ˆœ์œ„ ์ง€์ •"์— ๋Œ€ํ•ด ์ˆ˜์ฒœ ๋ช…์˜ Gopher๋ฅผ ์กฐ์‚ฌํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ธฐ์ค€:

// Lifted from the design draft
func New(type K, V)(compare func(K, K) int) *Map(K, V) {
    return &Map(K, V){compare: compare}
}

// ...

func (m *Map(K, V)) InOrder() *Iterator(K, V) {
    sender, receiver := chans.Ranger(keyValue(K, V))()
    var f func(*node(K, V)) bool
    f = func(n *node(K, V)) bool {
        if n == nil {
            return true
        }
        // Stop sending values if sender.Send returns false,
        // meaning that nothing is listening at the receiver end.
        return f(n.left) &&
            sender.Send(keyValue(K, V){n.key, n.val}) &&
            f(n.right)
    }
    go func() {
        f(m.root)
        sender.Close()
    }()
    return &Iterator{receiver}
}

// ...

์ธ์Šคํ„ด์Šคํ™” ์—ฐ์‚ฐ์ž:

// Lifted from the design draft
func New(type K, V)(compare func(K, K) int) *Map!(K, V) {
    return &Map!(K, V){compare: compare}
}

// ...

func (m *Map(K, V)) InOrder() *Iterator!(K, V) {
    sender, receiver := chans.Ranger!(keyValue!(K, V))()
    var f func(*node!(K, V)) bool
    f = func(n *node!(K, V)) bool {
        if n == nil {
            return true
        }
        // Stop sending values if sender.Send returns false,
        // meaning that nothing is listening at the receiver end.
        return f(n.left) &&
            sender.Send(keyValue!(K, V){n.key, n.val}) &&
            f(n.right)
    }
    go func() {
        f(m.root)
        sender.Close()
    }()
    return &Iterator{receiver}
}

// ...

์•ต๊ธ€ ์ค‘๊ด„ํ˜ธ: (๋˜๋Š” ์ด์ค‘ ์•ต๊ธ€ ์ค‘๊ด„ํ˜ธ, ์–ด๋Š ์ชฝ์ด๋“ )

// Lifted from the design draft
func New<type K, V>(compare func(K, K) int) *Map<K, V> {
    return &Map<K, V>{compare: compare}
}

// ...

func (m *Map<K, V>) InOrder() *Iterator<K, V> {
    sender, receiver := chans.Ranger<keyValue<K, V>>()
    var f func(*node<K, V>) bool
    f = func(n *node<K, V>) bool {
        if n == nil {
            return true
        }
        // Stop sending values if sender.Send returns false,
        // meaning that nothing is listening at the receiver end.
        return f(n.left) &&
            sender.Send(keyValue<K, V>{n.key, n.val}) &&
            f(n.right)
    }
    go func() {
        f(m.root)
        sender.Close()
    }()
    return &Iterator{receiver}
}

// ...

์ ์ ˆํ•˜๊ฒŒ ๋ช…๋ช…๋œ ํ•จ์ˆ˜:

// Lifted from the design draft
func NewConstructor(type K, V)(compare func(K, K) int) *MapType(K, V) {
    return &MapType(K, V){compare: compare}
}

// ...

func (m *MapType(K, V)) InOrder() *IteratorType(K, V) {
    sender, receiver := chans.RangerType(keyValueType(K, V))()
    var f func(*nodeType(K, V)) bool
    f = func(n *nodeType(K, V)) bool {
        if n == nil {
            return true
        }
        // Stop sending values if sender.Send returns false,
        // meaning that nothing is listening at the receiver end.
        return f(n.left) &&
            sender.Send(keyValueType(K, V){n.key, n.val}) &&
            f(n.right)
    }
    go func() {
        f(m.root)
        sender.Close()
    }()
    return &Iterator{receiver}
}

// ...

...์žฌ๋ฏธ์žˆ๊ฒŒ, ๋‚˜๋Š” ์‚ฌ์‹ค ๋งˆ์ง€๋ง‰ ๊ฒƒ์ด ๊ฝค ๋งˆ์Œ์— ๋“ ๋‹ค.

(์ด๊ฒƒ์ด ๊ด‘๋ฒ”์œ„ํ•œ Gophers @Merovius ์˜ ์„ธ๊ณ„์—์„œ ์–ด๋–ป๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?)

2. ํŠœํ† ๋ฆฌ์–ผ

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉํ•œ ์—ฐ์Šต์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ข‹์•„ํ•˜๋Š” ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์ดˆ๋ณด์ž์—๊ฒŒ ์นœ์ˆ™ํ•œ ํŠœํ† ๋ฆฌ์–ผ์„ ์ž‘์„ฑํ•˜๊ณ  ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ฝ๊ณ  ์ ์šฉํ•˜๊ฒŒ ํ•˜์‹ญ์‹œ์˜ค. ๊ฐœ๋…์ด ์–ผ๋งˆ๋‚˜ ์‰ฝ๊ฒŒ ์ „๋‹ฌ๋ฉ๋‹ˆ๊นŒ? FAQ๋Š” ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ป๊ฒŒ ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๊นŒ?

๋””์ž์ธ ์ดˆ์•ˆ์€ ๊ฒฝํ—˜ ๋งŽ์€ Gophers์—๊ฒŒ ๊ฐœ๋…์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์„ ์ฒœ์ฒœํžˆ ๋น ์ ธ๋“ค๊ฒŒ ํ•˜๋Š” ๋…ผ๋ฆฌ์˜ ์‚ฌ์Šฌ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ฐ„๊ฒฐํ•œ ๋ฒ„์ „์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‰ฝ๊ฒŒ ๋™ํ™”๋˜๋Š” ํ•˜๋‚˜์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๊ณ„์•ฝ์˜ ํ™ฉ๊ธˆ ๊ทœ์น™์„ ์–ด๋–ป๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ํ”ผ๋“œ๋ฐฑ ๋ณด๊ณ ์„œ์™€ ๋‹ค๋ฅธ ๊ฐ๋„ ๋˜๋Š” ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@toolbox ์•„์ง ๋Œ€๋‹ตํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์™œ ์ด๊ฒƒ์ด ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜์— ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ func ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์˜ค๋Š˜ ์“ธ ์ˆ˜ ์žˆ๋‹ค

func Print(a string) func(string) {
    return func(b string) {
        fmt.Println(a+b)
    }
}

func main() {
    Print("foo")("bar")
}

์ด๊ฒƒ์ด ๊ดœ์ฐฎ๊ณ  ๋ชจํ˜ธํ•จ์œผ๋กœ ์ธํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ•˜์ง€๋งŒ Print ๊ฐ€ ๊ฐ’ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋Œ€์‹  ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ทจํ•˜์ž๋งˆ์ž ์ด๊ฒƒ์ด ์ฐธ์„ ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  (๋ช…๋ฐฑํ•œ ํ˜ธํ™˜์„ฑ ์งˆ๋ฌธ์€ ์ œ์ณ๋‘๊ณ ) ๋˜ํ•œ Print ๊ฐ€ ์ผ๋ถ€ X ์— ๋Œ€ํ•ด MakeXFunc ๋กœ ์ด๋ฆ„์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ํ•œ ์ ์ ˆํ•˜๊ฒŒ ์ œํ•œ์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? X ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@toolbox ๋Š” ์œ ํ˜• ์ถ”๋ก ์ด ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์„ ์ง€์ •ํ•  ํ•„์š”๋ฅผ ๋งค์šฐ ์ž˜ ์ œ๊ฑฐํ•˜๊ณ  ๋‹จ์ˆœํ•ด ๋ณด์ด๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ๋งŒ ๋‚จ๊ฒจ๋‘”๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ์ด๊ฒƒ์ด ์ •๋ง ๋ฌธ์ œ๊ฐ€ ๋ ๊นŒ์š”?

@Merovius ๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ Print("foo")("bar") ๊ตฌ๋ฌธ ์ž์ฒด์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด Go 1์—์„œ ์ด๋ฏธ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ๊ฐ€๋Šฅํ•œ ํ•ด์„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š์€ ์ œ์•ˆ์—์„œ Foo(X)(Y) ํ‘œํ˜„์‹์ด ์ด์ œ ๋ชจํ˜ธํ•˜์—ฌ Go 1์—์„œ์™€ ๊ฐ™์ด ๋‘ ๊ฐœ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•˜๊ฑฐ๋‚˜ ์œ ํ˜• ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. . ๋ฌธ์ œ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ํ•˜๋Š” ์ผ์„ ๊ตญ๋ถ€์ ์œผ๋กœ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋ฉฐ, ๊ฐ€๋Šฅํ•œ ๋‘ ๊ฐ€์ง€ ์˜๋ฏธ๋ก ์  ํ•ด์„์€ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค .

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

@toolbox ์˜ ์ฃผ์žฅ์˜ ์ฃผ๋œ ์ทจ์ง€๋Š” ๋ฌธ๋งฅ์— ๋ฏผ๊ฐํ•œ ์˜๋ฏธ๋ก ์œผ๋กœ ๊ธฐ์กด ๊ตฌ๋ฌธ์„ ๊ฐ€๋ณ๊ฒŒ ์˜ค๋ฒ„๋กœ๋“œํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ๋Œ€์‹  ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Foo(X)!(Y) .) ๊ตฌ๋ฌธ ์˜ต์…˜์„ ๊ณ ๋ คํ•  ๋•Œ ์ด๊ฒƒ์ด ์ค‘์š”ํ•œ ์ฒ™๋„๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜ˆ์ „(~2008-2009๋…„)์— D ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ฝ์—ˆ์œผ๋ฉฐ ! ๊ฐ€ ํ•ญ์ƒ ๋‚˜๋ฅผ ๋„˜์–ด์ง€๊ฒŒ ํ–ˆ๋‹ค๊ณ  ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ฐฝ๊ณ ๋ฅผ # , $ ๋˜๋Š” @ ๋กœ ๋Œ€์‹  ์น ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค(Go ๋˜๋Š” C์—์„œ๋Š” ์˜๋ฏธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—).
๊ทธ๋Ÿฌ๋ฉด ์ง€๋„, ์กฐ๊ฐ ๋˜๋Š” ๊ตฌ์กฐ์ฒด์™€ ํ˜ผ๋™ํ•˜์ง€ ์•Š๊ณ  ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์—ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Foo@{X}(Y)
  • Foo${X}(Y)
  • Foo#{X}(Y)
    ๋˜๋Š” ๋Œ€๊ด„ํ˜ธ.

์ด์™€ ๊ฐ™์€ ํ† ๋ก ์—์„œ๋Š” ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Foo(X)(Y) ๋ฅผ ์“ฐ๋Š” ์‚ฌ๋žŒ์ด ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Go์—์„œ ์œ ํ˜• ์ด๋ฆ„, ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ฐ ํ•จ์ˆ˜ ์ด๋ฆ„์€ ์™„์ „ํžˆ ๋™์ผํ•ด ๋ณด์ด์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์€ ๋ณด๊ณ  ์žˆ๋Š” ๋‚ด์šฉ์— ๋Œ€ํ•ด ๊ฑฐ์˜ ํ˜ผ๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ int64(v) ๊ฐ€ ์œ ํ˜• ๋ณ€ํ™˜์ด๊ณ  F(v) ๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž„์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ์ธ์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ ์‹ค์ œ๋กœ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ตฌ๋ฌธ์„ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ฝ”๋“œ๊ฐ€ ์—†์œผ๋ฉด ๋‹จ์ˆœํžˆ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

2020๋…„ 5์›” 6์ผ ์ˆ˜์š”์ผ 13:00์— Ian Lance Taylor๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ int64(v) ๊ฐ€ ์œ ํ˜• ๋ณ€ํ™˜์ด๊ณ  F(v) ๊ฐ€
์™„์ „ํžˆ ๋˜‘๊ฐ™์•„ ๋ณด์—ฌ๋„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

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

โ€”์ƒ˜

--
์ƒ˜ ํ™”์ดํŠธ๋“œ

@ianlancetaylor ๊ท€ํ•˜์˜ ์˜ˆ์ œ์—์„œ ์•Œ์•„์ฐจ๋ฆฐ ํ•œ ๊ฐ€์ง€๋Š” ์œ ํ˜•์„ ์ทจํ•˜๊ณ  ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ๋‹ค๋ฅธ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ int64(v) ์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ์œ ํ˜• ๋ณ€ํ™˜์œผ๋กœ ์œ ํ˜•์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ strconv.Atoi(v) ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ UseConverter(strconv.Atoi) ๋Š” ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Go 1์—์„œ๋Š” UseConverter(int64) ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์บ์ŠคํŒ…์— ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์ด ์—ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func StrToNumber(type K)(s string) K {
  asInt := strconb.Atoi(s)
  return K(asInt)
}

์™œ ์ด๊ฒƒ์ด ๊ดœ์ฐฎ๊ณ  ๋ชจํ˜ธํ•จ์œผ๋กœ ์ธํ•ด ๋‹น์‹ ์„ ํฌ๊ฒŒ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‹น์‹ ์˜ ์˜ˆ๋Š” ๊ดœ์ฐฎ์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์ด ์ธ์ˆ˜๋ฅผ ์ทจํ•˜๋“  ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ทจํ•˜๋“  ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ฌด ๊ฒƒ๋„ ์ธ์‡„ํ•˜์ง€ ์•Š๋Š” Print ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‘ ๋ฒˆ์งธ ๊ด„ํ˜ธ ์„ธํŠธ๊ฐ€ ์ƒ๋žต๋œ Print("foo") ๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ ๋น„๋ฐ€๋ฆฌ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

PR์—์„œ ๊ทธ ์ฝ”๋“œ๋ฅผ ์ œ์ถœํ–ˆ๋‹ค๋ฉด ์ด๋ฆ„์„ PrintFunc ๋˜๋Š” MakePrintFunc ๋˜๋Š” PrintPlusFunc ๋˜๋Š” ๊ทธ ๋™์ž‘์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜›๋‚ (~2008-2009๋…„)์— ์•ฝ๊ฐ„์˜ D ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ๋‚˜๋ฅผ ๋„˜์–ด๋œจ๋ฆฌ๊ณ  ์žˆ์—ˆ๋‹ค.

ํ•˜, ํฅ๋ฏธ๋กญ๊ตฐ. ์ธ์Šคํ„ด์Šคํ™” ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ํŠน๋ณ„ํžˆ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์€ ์˜ต์…˜ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Go์—์„œ ์œ ํ˜• ์ด๋ฆ„, ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ฐ ํ•จ์ˆ˜ ์ด๋ฆ„์€ ์™„์ „ํžˆ ๋™์ผํ•ด ๋ณด์ด์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์€ ๋ณด๊ณ  ์žˆ๋Š” ๋‚ด์šฉ์— ๋Œ€ํ•ด ๊ฑฐ์˜ ํ˜ผ๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ int64(v)๊ฐ€ ์œ ํ˜• ๋ณ€ํ™˜์ด๊ณ  F(v)๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ํ˜• ๋ณ€ํ™˜๊ณผ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋น ๋ฅด๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ ๊ทธ๋ ‡๋‹ค๊ณ  ์ƒ๊ฐํ•˜์„ธ์š”?

๋‚ด ๊ฐœ์ธ์ ์ธ ์ด๋ก ์€ ์œ ํ˜•์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ช…์‚ฌ์ด๊ณ  ๊ธฐ๋Šฅ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์‚ฌ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Noun(...) ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ์œ ํ˜• ๋ณ€ํ™˜์ด๊ณ  Verb(...) ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค.

์œ ํ˜• ์ธ์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ ์‹ค์ œ๋กœ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ตฌ๋ฌธ์„ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ฝ”๋“œ๊ฐ€ ์—†์œผ๋ฉด ๋‹จ์ˆœํžˆ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” Contracts ์ดˆ์•ˆ์„ ์ฝ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—(์•„๋งˆ๋„ 5๋ฒˆ, ๋‚˜์ค‘์— ๋‹ค์‹œ ๋Œ์•„์˜ฌ ๋•Œ ๋” ๋ฉ€์–ด์กŒ๋‹ค๊ฐ€) ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ์ƒ์†Œํ•œ ๊ตฌ๋ฌธ์„ ๋ฐœ๊ฒฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์Šค๋ ˆ๋“œ์— ์™”์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งˆ์นจ๋‚ด ๊ทธ๊ฒƒ๋“ค์„ grokkedํ–ˆ์„ ๋•Œ ๊ฐœ๋… ์„ ์ข‹์•„ํ–ˆ์ง€๋งŒ ๋ชจํ˜ธํ•œ ๊ตฌ๋ฌธ์œผ๋กœ ์ธํ•ด ํฐ ์žฅ๋ฒฝ์ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ด ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

import "container/orderedmap"

var m = orderedmap.New(string, string)(strings.Compare)

func Add(a, b string) {
    m.Insert(a, b)
}

orderedmap.New( ๋ฅผ ์ฝ์„ ๋•Œ ๋‹ค์Œ์ด New ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ •๋ ฌ๋œ ๋งต์ด ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํ•ต์‹ฌ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์€ ์‹ค์ œ๋กœ ๋‘ ๋ฒˆ์งธ ๊ด„ํ˜ธ ์„ธํŠธ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์— ์˜ํ•ด ๋˜์ ธ์กŒ๋‹ค. ์ฝ”๋“œ๋ฅผ grokํ•˜๊ธฐ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

(์ด๊ฒƒ์€ ๋‹จ์ง€ ํ•˜๋‚˜์˜ ์˜ˆ์ผ ๋ฟ์ด๋ฉฐ, ๋‚ด๊ฐ€ ๋ณด๊ธฐ์— ๋ชจํ˜ธํ•œ ๊ฒƒ์ด ์ „๋ถ€ ๋Š” ์•„๋‹ˆ์ง€๋งŒ, ๊ด‘๋ฒ”์œ„ํ•œ ์š”์ ์— ๋Œ€ํ•ด ์ž์„ธํ•œ ๋…ผ์˜๋ฅผ ํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.)

์ œ๊ฐ€ ์ œ์•ˆํ•  ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// Instantiation operator
var m = orderedmap.New!(string, string)(strings.Compare)
// Alternate delimiters -- notice I don't insist on any particular kind
var m = orderedmap.New<|string, string|>(strings.Compare)
// Appropriately named function
var m = orderedmap.MakeConstructor(string, string)(strings.Compare)

์ฒ˜์Œ ๋‘ ์˜ˆ์—์„œ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์€ ์ฒซ ๋ฒˆ์งธ ๊ด„ํ˜ธ ์„ธํŠธ์— New() ์— ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฐ€์ •์„ ๊นจ๋Š” ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ๋œ ๋†€๋ž๊ณ  ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ํ๋ฆ„์„ ๋” ์ž˜ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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


ํ˜„์žฌ ์Šคํƒ€์ผ์˜ ์ฝ”๋“œ๋ฅผ ํ™•์‹คํžˆ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ„์•ฝ ์ดˆ์•ˆ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋Š๋ฆด ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์™œ ๊ทธ๋Ÿฐ์ง€ ๋ถ„์„ํ•˜๊ณ  ๋ณด๊ณ ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ–ˆ์Šต๋‹ˆ๋‹ค. orderedmap.New ์˜ˆ์ œ ์™ธ์—๋„ https://github.com/golang/go/issues/15292#issuecomment -623649521์— ์ข‹์€ ์š”์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. , ํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจํ˜ธ์„ฑ์˜ ์ •๋„๋Š” ๋‹ค์–‘ํ•œ ์˜ˆ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๊ฐ€๋…์„ฑ๊ณผ ๋ช…ํ™•์„ฑ์€ ๋‹ค์†Œ ์ฃผ๊ด€์ ์ด๊ณ  ์•„๋งˆ๋„ ๊ทธ ์‚ฌ๋žŒ์˜ ๋ฐฐ๊ฒฝ๊ณผ ์ข‹์•„ํ•˜๋Š” ์–ธ์–ด์˜ ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ๋™์˜๋ฅผ ์–ป์ง€ ๋ชปํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. 4๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋ชจํ˜ธํ•œ ๊ตฌ๋ฌธ ๋ถ„์„์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ข‹์€ ์ง€ํ‘œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

import "container/orderedmap"

var m = orderedmap.NewOf(string, string)(strings.Compare)

func Add(a, b string) {
    m.Insert(a, b)
}

New NewOf ๊ฐ€ New ๋ณด๋‹ค ๋” ์ฝ๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.


์•„๋ฌด ๊ฒƒ๋„ ์ธ์‡„ํ•˜์ง€ ์•Š๋Š” Print ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ํ•˜์ž๋ฉด, ์ผ๋ถ€ ์ž๋™ ์œ ํ˜• ์ถ”๋ก ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ Print(foo) ๋Š” ์ถ”๋ก  ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ํ†ตํ•œ ์‹ค์ œ ์ธ์‡„ ํ˜ธ์ถœ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  Go์—์„œ๋Š” ๋ฒ ์–ด ์‹๋ณ„์ž๊ฐ€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

package main

import (
    "fmt"
)

func main() {
    fmt.Println
}

./prog.go:8:5: fmt.Println evaluated but not used

์ผ๋ฐ˜ ์ถ”๋ก ์„ ๋œ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@toolbox

๋‹น์‹ ์˜ ์˜ˆ๋Š” ๊ดœ์ฐฎ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์ด ์ธ์ˆ˜๋ฅผ ์ทจํ•˜๋“  ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ทจํ•˜๋“  ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ฌด ๊ฒƒ๋„ ์ธ์‡„ํ•˜์ง€ ์•Š๋Š” ์ธ์‡„ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

๋‚ด ํ›„์† ์งˆ๋ฌธ์ด์—ˆ๋‹ค. Go๊ฐ€ func ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ด๋ฆ„ ์ œํ•œ์„ ๋‘์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋‚˜์œ ์–ธ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด, ๊ทธ๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ๊ฐ’ ์ธ์ˆ˜ ๋Œ€์‹  ์œ ํ˜• ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ทธ๋Ÿฌํ•œ ์ œํ•œ์„ ๋‘์ง€ ์•Š๋Š”๋‹ค๋ฉด ์™œ ๋” ๋‚˜์œ ์–ธ์–ด๊ฐ€ ๋ ๊นŒ์š”?

@๋ฉ”๋กœ๋น„์šฐ์Šค

๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ์ด ์ œ์•ฝ ์กฐ๊ฑด์˜ ์–ธ์–ด ์ˆ˜์ค€ ์‹œํ–‰์„ ์ฃผ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Š” ์ด ์†”๋ฃจ์…˜์ด ์–ธ์–ด์— ์˜ํ•ด ์‹œํ–‰ ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์–ด๋””์—๋„ ์•”์‹œํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์œ ์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ํ˜„์žฌ ์ œ์•ˆ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ • ํ•˜๋”๋ผ๋„ ๋ชจํ˜ธ์„ฑ ๋ฌธ์ œ์— ์ž ์žฌ์ ์ธ ์‹ค์šฉ์ ์ธ ์†”๋ฃจ์…˜์ด ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Š” ๋ชจํ˜ธ์„ฑ ๋ฌธ์ œ๊ฐ€ ํ˜„์‹ค์ ์ด๊ณ  ๊ณ ๋ คํ•ด์•ผ ํ•  ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ฝ”์Šค์—์„œ ์•ฝ๊ฐ„ ๋ฒ—์–ด๋‚˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ "์‹ค์ œ" ์˜ˆ์ œ ์ฝ”๋“œ๊ฐ€ ์ด ์‹œ์ ์—์„œ ๋Œ€ํ™”์— ๋งค์šฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ๊ทธ๋Š” ๋ช…๋ช… ํ‘œ์ค€์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž ์žฌ์ ์ธ ์œ ํšจํ•œ ํ•ด๊ฒฐ์ฑ…์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค์€์š”? ๋‚˜๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌป๊ณ ์ž ํ–ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋Š” ์ตœ์†Œํ•œ ๋””์ž์ธ๊ณผ 100% ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‚ฌ์šฉ๋œ ์‹๋ณ„์ž์— ๋Œ€ํ•œ ์–ด๋–ค ํ˜•์‹๋„ ๊ทœ์ •ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฐฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์˜ณ์•˜์–ด. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ œ์•ˆํ–ˆ๋‹ค :)

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

์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ตœ์‹  ์ผ๋ฐ˜ ์ œ์•ˆ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋„๋ก vgo ๊ฐ™์€ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฐฐ์šฐ๊ณ  ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค. ์ •๋ณด:
https://blog.tempus-ex.com/generics-in-go-how-they-work-and-how-to-play-with-them/

๊ณ„์•ฝ์ด ํ™œ์„ฑํ™”๋œ ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ๋กœ ์•ฝ๊ฐ„์˜ ํ”Œ๋ ˆ์ด๋ฅผ ํ•˜๊ณ  ๋‚˜๋ฉด ์œ ํ˜• ์ธ์ˆ˜์™€ ์ผ๋ฐ˜ ์ธ์ˆ˜๋ฅผ ๊ตฌ๋ณ„ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ๋ฌด์—‡์ธ์ง€ ์ „ํ˜€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋“  ํ•จ์ˆ˜์— ํ˜•์‹ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ๋‚จ๊ฒจ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๊ณ  ์—ฌ์ „ํžˆ ์ž˜ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทธ๋Ÿฌํ•œ ์ž ์žฌ์ ์ธ ์ฝ”๋“œ์˜ ๋Œ€๋‹ค์ˆ˜๊ฐ€ ๊ทธ๊ฒƒ๋“ค์„ ํฌํ•จํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ, ์ด๋Š” ์ฐจ๋ก€๋กœ ์–ด๋– ํ•œ ํ˜ผ๋ž€๋„ ์ผ์œผํ‚ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์†Œ๋ž€์€ https://play.golang.org/p/7BRdM2S5dwQ ๋ฐ StackString, StackInt, ...์™€ ๊ฐ™์ด ๊ฐ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์Šคํƒ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ์ด ์ฒ˜์Œ์ธ ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ์ œ๋„ค๋ฆญ ์—†์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ˜„์žฌ ์ผ๋ฐ˜ ๊ตฌ๋ฌธ ์ œ์•ˆ์˜ Stack(T)์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ œ์•ˆ์ด ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ž˜ ์ƒ๊ฐ๋˜์—ˆ์ง€๋งŒ ๋‹จ์ˆœํ•จ๊ณผ ๋ช…ํ™•์„ฑ์˜ ๊ฐ€์น˜๋Š” ํ• ๋‹น์— ์˜ํ•ด ๊ฐ์†Œ๋œ๋‹ค๋Š” ๋ฐ ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์šฐ์„  ์ˆœ์œ„๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ์ œ์•ˆ์ด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ๊ณ  ๊ธฐ์ˆ ์ ์ธ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜๋ฉด ๋” ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋Š” ํ•ญ์ƒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด์œ ์˜€๋˜ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ์„ฑ๊ณตํ•˜์„ธ์š”.

@Merovius ์•„๋‹ˆ์š”, @infogulch ๊ฐ€ ๋งํ•œ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์—์„œ -er ๊ทœ์น™์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋Š”๋ฐ ํ˜ผ์„ ์„ ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. (์ €๋Š” "๊ทธ"์ž…๋‹ˆ๋‹ค.)

์ด ์˜ˆ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋“  ํ•จ์ˆ˜์— ํ˜•์‹ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ๋‚จ๊ฒจ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๊ณ  ์—ฌ์ „ํžˆ ์ž˜ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทธ๋Ÿฌํ•œ ์ž ์žฌ์ ์ธ ์ฝ”๋“œ์˜ ๋Œ€๋‹ค์ˆ˜๊ฐ€ ๊ทธ๊ฒƒ๋“ค์„ ํฌํ•จํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ, ์ด๋Š” ์ฐจ๋ก€๋กœ ์–ด๋– ํ•œ ํ˜ผ๋ž€๋„ ์ผ์œผํ‚ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํฌํฌ๋œ ๋ฒ„์ „์˜ ์ œ๋„ค๋ฆญ ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ์—์„œ ๋™์ผํ•œ ์˜ˆ์ œ ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

type ๋งค๊ฐœ๋ณ€์ˆ˜ ์ ˆ์— ::<> ๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ, ๋‹จ์ผ ์œ ํ˜•์ด ์žˆ๋Š” ๊ฒฝ์šฐ <> ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ต๊ธ€ ์ค‘๊ด„ํ˜ธ์—์„œ ํŒŒ์„œ ๋ชจํ˜ธ์„ฑ์ด ์—†์–ด์•ผ ํ•˜๋ฉฐ ์ œ๋„ค๋ฆญ๊ณผ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ๋ชจ๋‘๋ฅผ ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์œ ์ถ”๋œ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.)

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

์ƒ˜ํ”Œ ๋ฐœ์ทŒ:

type Stack::<type E> []E

func (s Stack::E) Peek() E {
    return s[len(s)-1]
}

func (s *Stack::E) Pop() {
    *s = (*s)[:len(*s)-1]
}

func (s *Stack::E) Push(value E) {
    *s = append(*s, value)
}

type StackIterator::<type E> struct{
    stack Stack::E
    current int
}

func (s *Stack::E) Iter() Iterator::E {
    it := StackIterator::E{stack: *s, current: len(*s)}

    return &it
}

func (i *StackIterator::E) Next() (bool) { 
    i.current--

    if i.current < 0 { 
        return false
    }

    return true
}

func (i *StackIterator::E) Value() E { 
    if i.current < 0 {
        var zero E
        return zero
    }

    return i.stack[i.current]
}

// ...

var it Iterator::string = stack.Iter()

it = Filter::string(it, func(s string) bool {
    return s == "foo" || s == "beta" || s == "delta"
})

it = Map::<string, string>(it, func(s string) string {
    return s + ":1"
})

it = Distinct::string(it)

println(Reduce(it, "", func(a, b string) string {
    if a == "" {
        return b
    }
        return a + ":" + b
}))

์ด ์˜ˆ์—์„œ๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„๋„ ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. "์š”์†Œ"์— ๋Œ€ํ•œ E #$๊ฐ€ "์œ ํ˜•"์— ๋Œ€ํ•œ T ๋ณด๋‹ค ๋” ์ฝ๊ธฐ ์‰ฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด, ์ œ๋„ค๋ฆญ ํ•ญ๋ชฉ์„ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๊ฒŒ ํ•˜๋ฉด ๊ธฐ๋ณธ Go ์ฝ”๋“œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์ด๋ณด๊ณ ์žˆ๋Š” ๊ฒƒ์„ ์•Œ๊ณ , ์ œ์–ด ํ๋ฆ„์ด ๋ถ„๋ช…ํ•˜๊ณ , ๋ชจํ˜ธํ•จ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์œ ํ˜• ์ถ”๋ก ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

var it Iterator::string = stack.Iter()

it = Filter(it, func(s string) bool {
    return s == "foo" || s == "beta" || s == "delta"
})

it = Map::<string, string>(it, func(s string) string {
    return s + ":1"
})

it = Distinct(it)

println(Reduce(it, "", func(a, b string) string {
    if a == "" {
        return b
    }
        return a + ":" + b
}))

@toolbox ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค๋งŒ, ์šฐ๋ฆฌ๋Š” ๊ณผ๊ฑฐ์— ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค :)

StackString, StackInt, ...์™€ ๊ฐ™์ด ๊ฐ ์œ ํ˜•์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์Šคํƒ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ์ด ์ฒ˜์Œ์ธ ์‚ฌ๋žŒ์€ Stack(T)๋ณด๋‹ค ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ •๋ง ๊ทธ๋žฌ๋‹ค๋ฉด ์ •๋ง ๋†€๋ž์„ ๊ฒƒ ๊ฐ™์•„์š”. ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š” ์‚ฌ๋žŒ์€ ์—†์œผ๋ฉฐ, ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ์กฐ๊ฐ์—๋„ ์ž ์ž…ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฒ„๊ทธ๋Š” ์žฅ๊ธฐ์ ์œผ๋กœ ๊ทธ ๋ง์ด ์–ผ๋งˆ๋‚˜ ์ž˜๋ชป๋œ ๊ฒƒ์ธ์ง€๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

๋‚ด ์˜ˆ์ œ์˜ ์š”์ ์€ ์ƒ˜ํ”Œ Stack ๊ตฌํ˜„์ด ์ข‹์€์ง€ ์—ฌ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์„ ์‚ฌ์šฉํ•œ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด ๋…ผ์˜์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

๋‚ด ์˜ˆ์ œ์˜ ์š”์ ์€ ์ƒ˜ํ”Œ ์Šคํƒ ๊ตฌํ˜„์ด ์ข‹์€์ง€ ์—ฌ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ์ด ๋…ผ์˜์˜ ํ•ต์‹ฌ์ธ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ๊ณผ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

@gertcuykens ๊ฐ€ Stack ๊ตฌํ˜„์„ ๋…ธํฌํ•˜๋ ค๋Š” ์˜๋„๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ ๊ตฌ๋ฌธ์ด ๋‚ฏ์„ค๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ๋Š๋‚€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ํŠน์ • ๊ด€์ฐฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(a)...(b)...(c)...(d)...

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

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

๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ๋ณ‘๋ฆฌํ•™ ์  ์‚ฌ๋ก€์— ๋Œ€ํ•ด @infogulch ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž˜ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ œ ์ƒ๊ฐ์—๋Š” ์ด ์‹œ์ ์—์„œ ์ฃผ์ œ์˜ ์ด ํŠน์ • ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํ‘œํ˜„์˜ ํฌํ™” ์ƒํƒœ์— ๋„๋‹ฌํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์•„๋ฌด๋ฆฌ ๋งŽ์ด ์ด์•ผ๊ธฐํ•˜๋”๋ผ๋„ ์‚ฐ์„ฑ ํ…Œ์ŠคํŠธ๋Š” Go ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ทธ๊ฒƒ์„ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ๊ทธ๋ฆฌ๊ณ  ์–ผ๋งˆ๋‚˜ ์ž˜ ๋ฐฐ์šฐ๊ณ , ์ฝ๊ณ , ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€์ž…๋‹ˆ๋‹ค.

(๊ทธ๋ฆฌ๊ณ  ์˜ˆ, ์ง€์ ํ•˜๊ธฐ ์ „์— ๋ถ€๋‹ด์€ ํด๋ผ์ด์–ธํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž์—๊ฒŒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋“ค์„ ์ˆ˜ ์—†๋Š” ๋ถ€์ŠคํŠธ ํšจ๊ณผ๋ฅผ ์›ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ €๋„ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Go๊ฐ€ ์ผ๋ฐ˜ ์žผ๋ฒ„๋ฆฌ๋กœ ๋ฐ”๋€Œ๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ๋””์ž์ธ์˜ ๋ˆ„๋ฝ ์ด ๋ณด๊ธ‰ ์„ ์ œํ•œํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.)

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

์‚ฌ๋žŒ๋“ค ์ด ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณต ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ํ”ผ๋“œ๋ฐฑ์ด ํ•„์š”ํ•˜๊ณ  ๋” ๋‚ซ๊ฑฐ๋‚˜ ๋” ๊ฐ„์†Œํ™”๋œ ํ”ผ๋“œ๋ฐฑ ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@toolbox ์ด๋ ‡๊ฒŒ <> ์™€ type ๋ฅผ ํ•ญ์ƒ ์ƒ๋žตํ•˜๋ฉด ์ฝ”๋“œ ํŒŒ์‹ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”? ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์— ๋Œ€ํ•ด ๋” ์—„๊ฒฉํ•œ ์ œ์•ˆ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ตํ™˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

type Stack::E []E

func (s Stack::E) Peek() E {
    return s[len(s)-1]
}

func (s *Stack::E) Pop() {
    *s = (*s)[:len(*s)-1]
}

func (s *Stack::E) Push(value E) {
    *s = append(*s, value)
}

type StackIterator::E struct{
    stack Stack::E
    current int
}

func (s *Stack::E) Iter() Iterator::E {
    it := StackIterator::E{stack: *s, current: len(*s)}

    return &it
}

func (i *StackIterator::E) Next() (bool) { 
    i.current--

    if i.current < 0 { 
        return false
    }

    return true
}

func (i *StackIterator::E) Value() E { 
    if i.current < 0 {
        var zero E
        return zero
    }

    return i.stack[i.current]
}

// ...

var it Iterator::string = stack.Iter()

it = Filter::string(it, func(s string) bool {
    return s == "foo" || s == "beta" || s == "delta"
})

it = Map::string, string (it, func(s string) string {
    return s + ":1"
})

it = Distinct::string(it)

println(Reduce(it, "", func(a, b string) string {
    if a == "" {
        return b
    }
        return a + ":" + b
}))

์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ด Map::string, string (... ๋Š” ๊ธฐ๋ถ„์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ 2๊ฐœ์˜ ํ† ํฐ, Map::string ๋ฐ string ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ Go์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ "Identifier :: Identifier"๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฒ˜์Œ ์‚ฌ์šฉ์ž์—๊ฒŒ $#$ string ์— Filter ํด๋ž˜์Šค/๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์ž˜๋ชป๋œ ์ธ์ƒ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. string ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒƒ์„ ์œ„ํ•ด ๋„๋ฆฌ ์ฑ„ํƒ๋œ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ํ† ํฐ์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งŽ์€ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ญ์ƒ <>๋ฅผ ์ƒ๋žตํ•˜๊ณ  ๊ทธ๋ ‡๊ฒŒ ์ž…๋ ฅํ•  ๋•Œ ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์— ๋Œ€ํ•ด ๋” ์—„๊ฒฉํ•œ ์ œ์•ˆ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ตํ™˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

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

๋˜ํ•œ Go์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ "Identifier::Identifier"๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ž์—ด ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋œ Filter ํด๋ž˜์Šค/๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์ฒ˜์Œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž˜๋ชป๋œ ์ธ์ƒ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒƒ์„ ์œ„ํ•ด ๋„๋ฆฌ ์ฑ„ํƒ๋œ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ํ† ํฐ์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งŽ์€ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ :: ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์ฃผ๋ณ€์—์„œ ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. :: ๊ฐ€ ์‹œ๊ฐ์ ์œผ๋กœ ๋” ์ข‹์•„ ๋ณด์ด์ง€๋งŒ D์™€ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ! ๊ฐ€ ๋” ๋‚˜์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์–ด์šธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • identifier!(a, b) ( ๋†€์ดํ„ฐ )
  • identifier@(a, b)
  • identifier#(a, b)
  • identifier$(a, b)
  • identifier<:a, b:>
  • identifier.<a, b> ์œ ํ˜• ์ฃผ์žฅ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค!
  • identifier:<a, b>
  • ๋“ฑ.

๋ˆ„๊ตฌ๋“ ์ง€ ์ž ์žฌ๋ ฅ ์ง‘ํ•ฉ์„ ๋” ์ขํžˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์•„์ด๋””์–ด๋ฅผ ๊ณ ๋ คํ–ˆ์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•„์ด๋””์–ด๋„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค.

func F(T : a, b T) { }
func G() { F(int : 1, 2) }

ํ•˜์ง€๋งŒ ํ‘ธ๋”ฉ์˜ ์ฆ๊ฑฐ๋Š” ์—ญ์‹œ ๋จน๋Š” ๊ฒƒ์— ์žˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์—†๋Š” ์ถ”์ƒ์ ์ธ ํ† ๋ก ์€ ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ ๊ฒฐ์ •์ ์ธ ๊ฒฐ๋ก ์œผ๋กœ โ€‹โ€‹์ด์–ด์ง€์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

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

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ์ผ๋ฐ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ

func Repeat(v, n int) []int {
    var r []int
    for i := n; i > 0; i-- {
        r = append(r, v)
    }
    return r
}

Repeat(4, 4)

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func Repeat(type T)(v T, n int) []T {
    var r []T
    for i := n; i > 0; i-- {
        r = append(r, v)
    }
    return r
}

Repeat("a", 5)

๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜ struct ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ

type XY struct {
    X, Y int
}

func RangeRepeat(arr []XY) []int {
    var r []int
    for _, n := range arr {
        for i := n.Y; i > 0; i-- {
            r = append(r, n.X)
        }
    }
    return r
}

RangeRepeat([]XY{{1, 1}, {2, 2}, {3, 3}})

ํ˜ธ์ถœ ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

type XY(type T) struct {
    X T
    Y int
}

func RangeRepeat(type T)(arr []XY(T)) []T {
    var r []T
    for _, n := range arr {
        for i := n.Y; i > 0; i-- {
            r = append(r, n.X)
        }
    }
    return r
}

// error: cannot use generic type XY(type T any) without instantiation
// RangeRepeat([]XY{{1, 1}, {2, 2}, {3, 3}}) // error in old code
RangeRepeat([](XY(int)){{1, 1}, {2, 2}, {3, 3}}) // API changed
// RangeRepeat([]XY{{"1", 1}, {"2", 2}, {"3", 3}}) // error
RangeRepeat([](XY(string)){{"1", 1}, {"2", 2}, {"3", 3}}) // ok

๊ตฌ์กฐ์—์„œ ์œ ํ˜•์„ ํŒŒ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ianlancetaylor

๊ณ„์•ฝ ์ดˆ์•ˆ์— methods may not take additional type arguments ๊ฐ€ ์–ธ๊ธ‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ํŠน์ • ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ณ„์•ฝ ๋Œ€์ฒด์— ๋Œ€ํ•œ ์–ธ๊ธ‰์€ ์—†๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์ด ๋ฐ”์ธ๋”ฉ๋œ ๊ณ„์•ฝ์— ๋”ฐ๋ผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๊นŒ?

๊ณ„์•ฝ ์ดˆ์•ˆ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ˜•์‹ ๋ถ„๋ฆฌ๊ฐ€ ๋‚ด์žฅ ํ˜•์‹์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•, ํŠนํžˆ ๋ถ„๋ฆฌ ๋ชฉ๋ก์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ™์€ ๊ฒƒ

type Getter(T) interface {
    Get() T
}

contract(G, T) {
    G Getter(T)
}

์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ณ„์•ฝ์œผ๋กœ ๋ฉ”์†Œ๋“œ ์„ธํŠธ๋ฅผ ๋ณต์ œํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ํ˜• ์ถ”๋ก ์ด ์‹คํŒจํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋‚ด๋ณด๋‚ด์ง€ ์•Š์Œ)

@ianlancetaylor ์ด๊ฒƒ์ด ์ด์ „์— ๋…ผ์˜๋˜์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์œ ํ˜• ์ธ์ˆ˜ ๊ตฌ๋ฌธ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ธ์ˆ˜ ๋ชฉ๋ก์„ ์œ ํ˜• ์ธ์ˆ˜ ๋ชฉ๋ก์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋”ฐ๋ผ์„œ ๊ทธ๋ž˜ํ”„ ์˜ˆ์˜ ๊ฒฝ์šฐ ๋Œ€์‹ 

var g = graph.New(*Vertex, *FromTo)([]*Vertex{ ... })

๋‹น์‹ ์€ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

var g = graph.New(*Vertex, *FromTo, []*Vertex{ ... })

๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ์ˆ˜ ๋ชฉ๋ก์˜ ์ฒซ ๋ฒˆ์งธ K ์ธ์ˆ˜๋Š” ๊ธธ์ด๊ฐ€ K์ธ ์œ ํ˜• ์ธ์ˆ˜ ๋ชฉ๋ก์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์ธ์ˆ˜ ๋ชฉ๋ก์€ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ์ธ์ˆ˜์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌ๋ฌธ์„ ๋ฏธ๋Ÿฌ๋งํ•˜๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

make(Type, size)

Type์„ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

@smasher164 ๊ทธ๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ๋ คํ–ˆ๋‹ค๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‹ค์‹œ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค(์ด๋Š” ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ๋ฒ„๋ ธ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋งŒ, ์ด์œ ๋Š” ๊ถ๊ธˆํ•˜์ง€๋งŒ).

func F(T : a, b T) { }
func G() { F(int : 1, 2) }

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

@Inuart ๊ฐ€ ๋งํ•œ ๊ฒƒ์œผ๋กœ ๋Œ์•„๊ฐ€๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Go ํŒ€์€ Go 1 ํ˜ธํ™˜์„ฑ ๋ณด์žฅ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด strings.Repeat(s string, count int) string ๊ฐ€ Repeat(type S stringlike)(s S, count int) S ๋กœ ๋ฐ”๋€Œ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? //Deprecated ์ฃผ์„์„ bytes.Repeat ์— ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. Go ํŒ€์ด ๊ณ ๋ คํ•  ์‚ฌํ•ญ์ž…๋‹ˆ๊นŒ?

ํŽธ์ง‘: ๋ถ„๋ช…ํžˆ ๋งํ•ด์„œ, ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ Go1Compat ๋‚ด์—์„œ ๊ณ ๋ ค๋ฉ๋‹ˆ๊นŒ? ํŠน์ • ์˜ˆ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ๋ฌด์‹œํ•˜์‹ญ์‹œ์˜ค.

@carlmjohnson ์•„๋‹ˆ์š”. ์ด ์ฝ”๋“œ๋Š” f := strings.Repeat ๊นจ์ง‘๋‹ˆ๋‹ค. ๋‹คํ˜•์„ฑ ํ•จ์ˆ˜๋Š” ๋จผ์ € ์ธ์Šคํ„ด์Šคํ™”ํ•˜์ง€ ์•Š๊ณ ๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๊ธฐ์—์„œ ์œ ํ˜• ์ธ์ˆ˜์™€ ๊ฐ’ ์ธ์ˆ˜์˜ ์—ฐ๊ฒฐ์€ ์‹ค์ˆ˜๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šคํ™”๋œ ๋ฒ„์ „์˜ ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ตฌ๋ฌธ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ์นด๋ ˆ๋ฅผ ๋จน์—ˆ์œผ๋ฉด ๋” ์ž์—ฐ์Šค๋Ÿฌ์› ๊ฒ ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. foo(int, 42) ๋ฐ foo(int) ๊ฐ€ ํ‘œํ˜„์‹์ด๊ณ  ๋‘˜ ๋‹ค ๋งค์šฐ ๋‹ค๋ฅธ ์œ ํ˜•์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

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

ํ—ˆ์šฉ๋œ ์œ ํ˜• ๋ชฉ๋ก์— ์ •ํ™•ํžˆ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ์€ ๊ฐ€๋Šฅํ•œ ํ•œ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ณณ์—์„œ ํ•  ์ผ์ด ๋” ๋งŽ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ ํ˜• ๋ชฉ๋ก์— ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์„ ๋‚˜์—ดํ•˜๋Š” ํ˜„์žฌ ๋””์ž์ธ ์ดˆ์•ˆ์—์„œ ํ˜„์žฌ ์œ ํ˜• ์ธ์ˆ˜๊ฐ€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์ด ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ์ธ์ˆ˜๊ฐ€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์„ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์˜ ์ธ์Šคํ„ด์Šคํ™”๋œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํ˜„์žฌ ๋ถˆ๋ถ„๋ช…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

@smasher164 @toolbox ๋‹จ์ผ ๋ชฉ๋ก์—์„œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฒฐํ•ฉํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ฒฝ์šฐ๋Š” ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•(๋ถ„๋ฆฌ๋œ ๊ฒฝ์šฐ)๊ณผ ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•(์•„๋งˆ๋„ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ). ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜์ง€๋งŒ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ํ•จ์ˆ˜๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•ฉ๋‹ˆ๊นŒ? ๋ถ„๋ช…ํžˆ ํ›„์ž๊ฐ€ ๋” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์ด์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ์ „์ž์˜ ๊ฒฝ์šฐ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋™์ผํ•œ ๊ด„ํ˜ธ ์•ˆ์— ๋ฐฐ์น˜๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด @griesemer ๋Š” #36177(๊ทธ์˜ ๋‘ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ)์—์„œ ๊ตฌ๋ถ„์ž๋กœ ์ฝœ๋ก ๋ณด๋‹ค ์„ธ๋ฏธ์ฝœ๋ก ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋งค์šฐ ์ข‹์•„ํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ ์„ธ๋ฏธ์ฝœ๋ก  ์‚ฝ์ž…) ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ์ข‹์€ ๋ฐฉ์‹์œผ๋กœ ํผ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๋˜ํ•œ ๋‹ค๋ฅธ ์–ธ์–ด(Ruby, Crystal ๋“ฑ)์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ธ”๋ก์„ ๋‘˜๋Ÿฌ์‹ธ๊ธฐ ์œ„ํ•ด ๋•Œ๋•Œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ˆ˜์ง ๋ง‰๋Œ€( |..| )๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฌถ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค:

func F(|T| a, b T) { }
func G() { F(|int| 1, 2) }

์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ทธ๊ฒƒ๋“ค์€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์ด์— (์ ์–ด๋„ ๋‚ด ๋ˆˆ์—๋Š”) ๋ฉ‹์ง„ ์‹œ๊ฐ์  ๊ตฌ๋ถ„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • type ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์–ด๋„ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฌผ๋ก  ์„ธ๋กœ ๋ง‰๋Œ€ ๋ฌธ์ž๋Š” ASCII ์„ธํŠธ์— ์žˆ์œผ๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„์˜ ํ‚ค๋ณด๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ด„ํ˜ธ ๋ฐ–์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ <...> ๋˜๋Š” [...] ์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ ๋ถ„์„ ์–ด๋ ค์›€์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋ ค์›€์€ ๋œ ์‹ฌ๊ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ˆ˜์ง ๋ง‰๋Œ€๊ฐ€ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋Š”์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šคํ™”์™€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋ฏธ๋ฌ˜ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋…์ž์—๊ฒŒ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

@ianlancetaylor ์ž์ฒด์ ์œผ๋กœ ํฅ๋ฏธ๋กœ์šด ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์ œ์™ธํ•˜๊ณ  ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ์ปค๋ฎค๋‹ˆํ‹ฐ๋กœ์„œ ๊ท€ํ•˜์™€ ํŒ€์„ ๋•๊ธฐ ์œ„ํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

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

@toolbox ๋„ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๋ฅผ ์—ฐ๊ตฌํ•˜๊ณ  ์žˆ์ง€๋งŒ ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ง„์งœ ๊ณง ์ง€๊ธˆ.

๋„๊ตฌ์— ๋Œ€ํ•ด ๋” ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฝ”๋“œ ์‹คํ–‰์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ?

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

F(T:) / G() { F(T:)} ๊ตฌ๋ฌธ์ด ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•œ ๋…์ž์—๊ฒŒ๋Š” ์ง๊ด€์ ์ด์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

๋‚˜๋Š” ๋˜ํ•œ ๊ณ„์•ฝ์ด if err != nil ์žฅํ™ฉํ•œ ๋ง์„ ์ค„์ด๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋” ์ค‘์š”ํ•˜๊ฒŒ๋Š” ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์˜ˆ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. F() (X, error) {return IfError(foo(), func(i, j int) X { return X(i*j}), Identity )} ๊ฐ™์€ ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

๋˜ํ•œ Go ํŒ€์ด Map, Filter ๋ฐ ์นœ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ์•”์‹œ์  ํ•จ์ˆ˜ ์„œ๋ช…์ด ๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ์ฒ˜๋Ÿผ ๋Š๊ปด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์•”์‹œ์  ์ž…๋ ฅ ๊ธฐ๋Šฅ์ด ๊ณ„์•ฝ ์–ธ์–ด์— ์ถ”๊ฐ€๋˜๋Š” ๋™์•ˆ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‚˜์ค‘์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ์•„๋‹ˆ๋ฉด ๊ฒฐ์ฝ” ์–ธ์–ด์˜ ์ผ๋ถ€๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ์š”?

์ œ์•ˆ์„ ์‹œ๋„ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์ œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

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

์ œ๋„ค๋ฆญ์ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค(์ด๋ฏธ ๊ทธ ์ž์ฒด๋กœ ๋งค์šฐ ์žฅํ™ฉํ•œ ์ฃผ์ œ์ž„). ๋‚˜๋Š” ๋‹น์‹ ์˜ ์˜ˆ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์—๋„ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ๋” ์งง์€ ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด ๊ตฌ๋ฌธ์€ #21498์ž…๋‹ˆ๋‹ค.

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

์œ„์˜ ๋…ผ์˜๋ฅผ ๊ณ„์†...


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

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

(๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์—„๊ฒฉํ•œ go1 ํ˜ธํ™˜์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. [vs virtual
๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” 99.999% ํ˜ธํ™˜์„ฑ] ์ด๊ฒƒ์„ ๊ฒฐ์ •ํ•˜๋Š” ์š”์†Œ๋กœ
ํŠน์ง•.)


์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จํ•˜์—ฌ ์ œ๋„ค๋ฆญ์ด ์ถ”์ƒํ™”๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์˜์‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
(T1, T2, ..., error) ๋ฐ˜ํ™˜ ํŠœํ”Œ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š”ํ•˜์ง€ ์•Š๋Š”๋‹ค
์ž์„ธํ•œ ์‚ฌํ•ญ์„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค. type ErrPair(type T) struct{T T; Err Error} ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์€ Promise ์™€ ๊ฐ™์€ ์ž‘์—…์„ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ž๋ฐ”/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ. ์•„๋งˆ๋„ ๋ˆ„๊ตฐ๊ฐ€๋Š” ์ด๊ฒƒ์„ ๋” ์ƒ๊ฐํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ๋„
๋„์šฐ๋ฏธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ์ž‘์„ฑ์€ ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์‹ค์ œ ์‚ฌ์šฉ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด.

๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜์„ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์‹ถ๋‹ค
ErrPair(T) ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋„์›€์ด ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋” ํฐ ์˜ˆ์—์„œ ๊ธฐ์ˆ .

type result struct {min, max point}

// with a generic ErrPair type and generic function errMap2 (like Java's Optional#map() function).
func minMax2(msg *inputTimeSeries) (result, error) {
    return errMap2(
        MakeErrPair(time.Parse(layout, msg.start)).withMessage("bad start"),
        MakeErrPair(time.Parse(layout, msg.end)).withMessage("bad end"),
        func(start, end time.Time) (result, error) {
            min, max := argminmax(msg.inputPoints, func(p inputPoint) float64 {
                return float64(p.value)
            })
            mkPoint := func(ip inputPoint) point {
                return point{interpTime(start, end, ip.interp).Format(layout), ip.value}
            }
            return result{mkPoint(*min), mkPoint(*max)}, nil
        }).tuple()
}

// without generics, lots of if err != nil 
func minMax(msg *inputTimeSeries) (result, error) { 
    start, err := time.Parse(layout, msg.start)
    if err != nil {
        return result{}, fmt.Errorf("bad start: %w", err)
    }
    end, err := time.Parse(layout, msg.end)
    if err != nil {
        return result{}, fmt.Errorf("bad end: %w", err)
    }
    min, max := argminmax(msg.inputPoints, func(p inputPoint) float64 {
        return float64(p.value)
    })
    mkPoint := func(ip inputPoint) point {
        return point{interpTime(start, end, ip.interp).Format(layout), ip.value}
    }
    return result{mkPoint(*min), mkPoint(*max)}, nil
}

// Most languages look more like this.
func minMaxWithThrowing(msg *inputTimeSeries) result {
    start := time.Parse(layout, msg.start)) // might throw
    end := time.Parse(layout, msg.end)) // might throw
    min, max := argminmax(msg.inputPoints, func(p inputPoint) float64 {
        return float64(p.value)
    })
    mkPoint := func(ip inputPoint) point {
        return point{interpTime(start, end, ip.interp).Format(layout), ip.value}
    }
    return result{mkPoint(*min), mkPoint(*max)}
}

( ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ „์ฒด ์˜ˆ์ œ ์ฝ”๋“œ)


์ผ๋ฐ˜์ ์ธ ์‹คํ—˜์„ ์œ„ํ•ด S-Expression ํŒจํ‚ค์ง€๋ฅผ ์ž‘์„ฑํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ .
์‹œ๋„ํ•˜๋Š” ๋™์•ˆ ์‹คํ—˜์  ๊ตฌํ˜„์—์„œ ์•ฝ๊ฐ„์˜ ํŒจ๋‹‰์„ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
Form([]*Form(T)) ์™€ ๊ฐ™์€ ๋ณตํ•ฉ ์œ ํ˜•์œผ๋กœ ์ž‘์—…ํ•˜์‹ญ์‹œ์˜ค. ๋” ๋งŽ์€ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ํ›„ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์›์‹œ ์œ ํ˜• -> ๋ฌธ์ž์—ด ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค.

contract PrimitiveType(T) {
    T bool, int, int8, int16, int32, int64, string, uint, uint8, uint16, uint32, uint64, float32, float64, complex64, complex128
    // string(T) is not a contract
}

func primitiveString(type T PrimitiveType(T))(t T) string  {
    // I'm not sure if this is an artifact of the experimental implementation or not.
    return string(t) // error: `cannot convert t (variable of type T) to string`
}

๋‚ด๊ฐ€ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ์‹ค์ œ ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// basicFormAdapter implements FormAdapter() for the primitive types.
type basicFormAdapter(type T PrimitiveType) struct{}


func (a *basicFormAdapter(T)) Format(e T, fc *FormatContext) error {
    //This doesn't work: fc.Print(string(e)) -- cannot convert e (variable of type T) to string
    // This also doesn't work: cannot type switch on non-interface value e (type int)
    // switch ee := e.(type) {
    // case int: fc.Print(string(ee))
    // default: fc.Print(fmt.Sprintf("!!! unsupported type %v", e))
    // }
    // IMO, the proposal to allow switching on T is most natural:
    // switch T.(type) {
    //  case int: fc.Print(string(e))
    //  default: fc.Print(fmt.Sprintf("!!! unsupported type %v", e))
    // }

    // This can't be the only way, right?
    rv := reflect.ValueOf(e)
    switch rv.Kind() {
    case reflect.Bool: fc.Print(fmt.Sprintf("%v", e))
    case reflect.Int:fc.Print(fmt.Sprintf("%v", e))
    case reflect.Int8: fc.Print(fmt.Sprintf("int8:%v", e))
    case reflect.Int16: fc.Print(fmt.Sprintf("int16:%v", e))
    case reflect.Int32: fc.Print(fmt.Sprintf("int32:%v", e))
    case reflect.Int64: fc.Print(fmt.Sprintf("int64:%v", e))
    case reflect.Uint: fc.Print(fmt.Sprintf("uint:%v", e))
    case reflect.Uint8: fc.Print(fmt.Sprintf("uint8:%v", e))
    case reflect.Uint16: fc.Print(fmt.Sprintf("uint16:%v", e))
    case reflect.Uint32: fc.Print(fmt.Sprintf("uint32:%v", e))
    case reflect.Uint64: fc.Print(fmt.Sprintf("uint64:%v", e))
    case reflect.Uintptr: fc.Print(fmt.Sprintf("uintptr:%v", e))
    case reflect.Float32: fc.Print(fmt.Sprintf("float32:%v", e))
    case reflect.Float64: fc.Print(fmt.Sprintf("float64:%v", e))
    case reflect.Complex64: fc.Print(fmt.Sprintf("(complex64 %f %f)", real(rv.Complex()), imag(rv.Complex())))
    case reflect.Complex128:
         fc.Print(fmt.Sprintf("(complex128 %f %f)", real(rv.Complex()), imag(rv.Complex())))
    case reflect.String:
        fc.Print(fmt.Sprintf("%q", rv.String()))
    }
    return nil
}

๋‚˜๋Š” ๋˜ํ•œ ์ผ์ข…์˜ ์œ ํ˜•๊ณผ ๊ฐ™์€ '๊ฒฐ๊ณผ'๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

type Result(type T) struct {
    Value T
    Err error
}

func NewResult(type T)(value T, err error) Result(T) {
    return Result(T){
        Value: value,
        Err: err,
    }
}

func then(type T, R)(r Result(T), f func(T) R) Result(R) {
    if r.Err != nil {
        return Result(R){Err: r.Err}
    }

    v := f(r.Value)
    return  Result(R){
        Value: v,
        Err: nil,
    }
}

func thenTry(type T, R)(r Result(T), f func(T)(R, error)) Result(R) {
    if r.Err != nil {
        return Result(R){Err: r.Err}
    }

    v, err := f(r.Value)
    return  Result(R){
        Value: v,
        Err: err,
    }
}

์˜ˆ

    r := NewResult(GetInput())
    r2 := thenTry(r, UppercaseAndErr)
    r3 := thenTry(r2, strconv.Atoi)
    r4 := then(r3, Add5)
    if r4.Err != nil {
        // handle err
    }
    return r4.Value, nil

์ด์ƒ์ ์œผ๋กœ๋Š” then ํ•จ์ˆ˜๊ฐ€ ๊ฒฐ๊ณผ ์œ ํ˜•์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ดˆ์•ˆ์˜ ์ ˆ๋Œ€ ์ฐจ์ด ์˜ˆ์ œ๋Š” ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•œ๋‹ค.

func (a ComplexAbs(T)) Abs() T {
    r := float64(real(a))
    i := float64(imag(a))
    d := math.Sqrt(r * r + i * i)
    return T(complex(d, 0))
}

ํ•ด์•ผํ•œ๋‹ค:

func (a ComplexAbs(T)) Abs() ComplexAbs(T) {
    r := float64(real(a))
    i := float64(imag(a))
    d := math.Sqrt(r * r + i * i)
    return ComplexAbs(T)(complex(d, 0))
}

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

Scala์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

def compute[A: PointLike: HasTime: IsWGS](points: Vector[A]): Map[Int, A] = ???

PointLike , HasTime ๋ฐ IsWGS ๋Š” ์ž‘์€ contract ์ž…๋‹ˆ๋‹ค(์Šค์นผ๋ผ๋Š” type class ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค).

Rust์—๋„ ๋น„์Šทํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

fn f<F: A + B>(a F) {}

๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ์ต๋ช… ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type I1 interface {
    A()
}
type I2 interface {
    B()
}
func f(a interface{
    I1
    I2
})

IMO, ์ต๋ช… ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‚˜์œ ์Šต๊ด€์ž…๋‹ˆ๋‹ค. interface ๋Š” ์‹ค์ œ ์œ ํ˜• ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ž๋Š” ์ด ์œ ํ˜•์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ contract ๋Š” ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด ์ผ ๋ฟ์ด๋ฉฐ ํ˜ธ์ถœ์ž๋Š” ํ•ญ์ƒ ์‹ค์ œ ํ˜•์‹ ๋˜๋Š” ๋‹ค๋ฅธ ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ •์˜์—์„œ ์ต๋ช…์œผ๋กœ ๊ณ„์•ฝ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ƒˆ๋กœ์šด contract ์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ณ„์•ฝ์˜ ์กฐํ•ฉ์ด ๋ช‡ ๊ณณ์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์—‰๋ง์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‹ค์ œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์•Œ๊ธฐ ์œ„ํ•ด ์ •์˜๋ฅผ ํŒŒํ—ค์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋ช…๋ช…๋œ ๊ณ„์•ฝ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์ด ์œ ํšจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•  ๊ฒฝ์šฐ ์ด ์ƒˆ ๊ณ„์•ฝ์— ๋” ๋งŽ์€ ๊ณ„์•ฝ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

contract C1(T) {
    T A()
}
contract C2(T) {
    T B()
}
contract C3(T) {
    T C()
}

contract PART(T) {
    C1(T)
    C2(T)
}

contract ALL(T) {
    C1(T)
    C2(T)
    C3(T)
}

func f1(type A PART) (a A) {}

func f2(type A ALL) (a A) {
    f1(a)
}

์ดˆ์•ˆ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ด๊ฒƒ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ชจ๋“  ์œ ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

func f(type A C1, C2)(x A)

func f1(type A contract C(A1) {
    C1(A)
    C2(A)
}) (x A)

func f2(type A ((type A1) interface {
    I1(A1)
    I2(A1)
})(A)) (x A)

CL์˜ ๋ฉ”๋ชจ์— ๋”ฐ๋ฅด๋ฉด

์—ฌ๋Ÿฌ ๊ณ„์•ฝ์— ์˜ํ•ด ์ œ์•ฝ์„ ๋ฐ›๋Š” ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹ ๋ฐ”์ธ๋”ฉ์„ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ด ์ด์ƒํ•œ ์Šค๋‹ˆํŽซ์€ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ํ›„์— ์œ ํšจํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

func f1(type A C1, _ C2(A)) (x A)

๋‹ค์Œ์€ ์ œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

  • contract ๋ฅผ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ type a A <=> var a A ์˜ ์œ ํ˜•์œผ๋กœ ์ทจ๊ธ‰ํ•˜๋ฉด type a { A1(a); A2(a) } ์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ ์„คํƒ•์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ต๋ช…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นจ๋ฆฌ ๊ณ„์•ฝํ•˜์„ธ์š”.
  • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์œ ํ˜• ๋ชฉ๋ก์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์ด ์š”๊ตฌ ์‚ฌํ•ญ ๋ชฉ๋ก์ธ type a, b, A1(a), A2(a), A3(a, b) ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šคํƒ€์ผ์€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด interface ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@bobotu ์ž„๋ฒ ๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ Go์—์„œ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์•ฝ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@azunymous ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ์ „์ฒด Go ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋‹ค์ค‘ ์ˆ˜์ต์—์„œ Result ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ๋Š๋ผ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋น„๋ก Contracts ์ œ์•ˆ์ด ์ด๋ฅผ ์–ด๋Š ์ •๋„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฐ”๋‘‘ ํŒ€์€ ์–ธ์–ด์˜ "๋Š๋‚Œ"์„ ์†์ƒ์‹œํ‚ค๋Š” ์–ธ์–ด ๋ณ€๊ฒฝ์„ ํ”ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €๋„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๊ทธ๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์ค‘ ํ•˜๋‚˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ์ƒ๊ฐ; ์ด ์ ์— ๋Œ€ํ•œ ๊ฒฌํ•ด๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@toolbox ์ผ๋ฐ˜ Result ์˜ ๋ฉ์–ด๋ฆฌ๊ฐ€ ์—†๋Š” ํ•œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‹จ์ผ Result ์œ ํ˜•๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐœ์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜ ์œ ํ˜•์˜ ๊ฐ ์กฐํ•ฉ์— ๋Œ€ํ•œ s ๋ฐ ํ•จ์ˆ˜. ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„ ํ•จ์ˆ˜๊ฐ€ ๋งŽ๊ฑฐ๋‚˜ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ์„ ์žƒ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

errWriter ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž๊ฒŒ ์ด๋ฆ„์ด ์ง€์ •๋˜๋ฉด ๊ฐ€๋” ๊ทธ๋Ÿฐ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฐ˜ํ™˜์—์„œ ๊ฒฐ๊ณผ๋กœ ์ „ํ™˜ํ•˜๋Š” ์ „์ฒด Go ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ๋Š๋ผ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

๊ฐ์‚ฌ ํ•ด์š”! ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด, ๋‚ด๊ฐ€ ๊นŠ์ด ์ƒ๊ฐํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋‚ด ์šฐ๋ ค๊ฐ€ ์ž˜๋ชป๋œ ๊ณณ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์–ด ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

@toolbox ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ ๋ฌธ์ œ๋Š” ์ต๋ช… ์ธํ„ฐํŽ˜์ด์Šค์ฒ˜๋Ÿผ ์ต๋ช… ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ดˆ์•ˆ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ •์˜์—์„œ ์ต๋ช… ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์žฅํ™ฉํ•œ ์Šคํƒ€์ผ์—์„œ๋„ ๊ณ„์•ฝ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

func f1(type A, B, C, D contract {
    C1(A)
    C2(A, B)
    C3(A, C)
}) (a A, b B, c C, d D)

// Or a more verbose style

func f2(type A, B, C, D (contract (_A, _B, _C) {
    C1(_A)
    C2(_A, _B)
    C3(_A, _C)
})(A, B, C)) (a A, b B, c C, d D)

IMO, ์ด๊ฒƒ์€ ๊ธฐ์กด ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ž์—ฐ์Šค๋Ÿฌ์šด ํ™•์žฅ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์˜ ๋์— ์žˆ๋Š” ๊ณ„์•ฝ์ด๋ฉฐ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ž„๋ฒ ๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. Go๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์Šค๋‹ˆํŽซ์ฒ˜๋Ÿผ ์ž๋™์œผ๋กœ ๊ณ„์•ฝ์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์„คํƒ•์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์“ฐ๊ธฐ๊ฐ€ ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

func fff(type A C1(A), B C2(B, A), C C3(B, C, A)) (a A, b B, c C)

// is more verbose than

func fff(type A, B, C contract {
    C1(A)
    C2(B, A)
    C3(B, C, A)
}) (a A, b B, c C)

Rust์˜ Iterator์ฒ˜๋Ÿผ ๋™์  ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์—†์ด ์ง€์—ฐ ๋ฐ˜๋ณต๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ Iterator ๊ณ„์•ฝ์„ ์ •์˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

contract Iterator(T, E) {
    T Next() (E, bool)
}

Go์—๋Š” type member ๊ฐœ๋…์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— E ๋ฅผ ์ž…๋ ฅ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ํ•จ์ˆ˜

func Collect(type I, E Iterator) (input I) []E {
    var results []E
    for {
        e, ok := input.Next()
        if !ok {
            return results
        }
        results = append(results, e)
    }
}

์š”์†Œ๋ฅผ ๋งคํ•‘ํ•˜๋Š” ํ•จ์ˆ˜

contract MapIO(I, E, O, R) {
    Iterator(I, E)
    Iterator(O, R)
}

func Map(type I, E, O, R MapIO) (input I, f func (e E) R) O {
    return &lazyIterator(I, E, R){
        parent: input,
        f:      f,
    }
}

์—ฌ๊ธฐ์— ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์—ฌ๊ธฐ์„œ lazyIterator ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” cannot convert &(lazyIterator(I, E, R) literal) (value of type *lazyIterator(I, E, R)) to O ๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.
  2. Map ๋Š” 6์ค„์ด ํ•„์š”ํ•œ ๋ฐ˜๋ฉด MapIO ๋Š” 4์ค„์ด ํ•„์š”ํ•œ ์ƒˆ ๊ณ„์•ฝ์„ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

Map ๊ฐ€ ์œ ํ˜• ๊ฒ€์‚ฌ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

type staticIterator(type E) struct {
    elem []E
}

func (it *(staticIterator(E))) Next() (E, bool) { panic("todo") }

func main() {
    inpuit := &staticIterator{
        elem: []int{1, 2, 3, 4},
    }
    mapped := Map(input, func (i int) float32 { return float32(i + 1) })
    fmt.Printf("%v\n", Collect(mapped))
}

๋ถˆํ–‰ํžˆ๋„ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์œ ํ˜•์„ ์œ ์ถ”ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ถˆํ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

func main() {
    input := &staticIterator(int){
        elem: []int{1, 2, 3, 4},
    }
    mapped := Map(*staticIterator(int), int, *lazyIterator(*staticIterator(int), int, float32), float32)(input, func (i int) float32 { return float32(i + 1) })
    result := Collect(*lazyIterator(*staticIterator(int), int, float32), float32)(mapped)
    fmt.Printf("%v\n", result)
}

์ฝ”๋“œ๋Š” ์ฝ๊ณ  ์“ฐ๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ณ  ์ค‘๋ณต๋œ ์œ ํ˜• ํžŒํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค.

BTW, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŒจ๋‹‰ํ•ฉ๋‹ˆ๋‹ค.

panic: interface conversion: ast.Expr is *ast.ParenExpr, not *ast.CallExpr

goroutine 1 [running]:
go/go2go.(*translator).instantiateTypeDecl(0xc000251950, 0x0, 0xc0001af860, 0xc0001a5dd0, 0xc00018ac90, 0x1, 0x1, 0xc00018bca0, 0x1, 0x1, ...)
        /home/tuzi/go-tip/src/go/go2go/instantiate.go:191 +0xd49
go/go2go.(*translator).translateTypeInstantiation(0xc000251950, 0xc000189380)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:671 +0x3f3
go/go2go.(*translator).translateExpr(0xc000251950, 0xc000189380)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:518 +0x501
go/go2go.(*translator).translateExpr(0xc000251950, 0xc0001af990)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:496 +0xe3
go/go2go.(*translator).translateExpr(0xc000251950, 0xc00018ace0)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:524 +0x1c3
go/go2go.(*translator).translateExprList(0xc000251950, 0xc00018ace0, 0x1, 0x1)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:593 +0x45
go/go2go.(*translator).translateStmt(0xc000251950, 0xc000189840)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:419 +0x26a
go/go2go.(*translator).translateBlockStmt(0xc000251950, 0xc00018d830)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:380 +0x52
go/go2go.(*translator).translateFuncDecl(0xc000251950, 0xc0001c0390)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:373 +0xbc
go/go2go.(*translator).translate(0xc000251950, 0xc0001b0400)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:301 +0x35c
go/go2go.rewriteAST(0xc000188280, 0xc000188240, 0x0, 0x0, 0xc0001f6280, 0xc0001b0400, 0x1, 0xc000195360, 0xc0001f6280)
        /home/tuzi/go-tip/src/go/go2go/rewrite.go:122 +0x101
go/go2go.RewriteBuffer(0xc000188240, 0x7ffe07d6c027, 0xa, 0xc0001ec000, 0x4fe, 0x6fe, 0x0, 0xc00011ed58, 0x40d288, 0x30, ...)
        /home/tuzi/go-tip/src/go/go2go/go2go.go:132 +0x2c6
main.translateFile(0xc000188240, 0x7ffe07d6c027, 0xa)
        /home/tuzi/go-tip/src/cmd/go2go/translate.go:26 +0xa9
main.main()
        /home/tuzi/go-tip/src/cmd/go2go/main.go:64 +0x434

๋‚˜๋Š” ๋˜ํ•œ Iterator ๊ฐ€ ํŠน์ • ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

type User struct {}

func UpdateUsers(type A Iterator(A, User)) (it A) bool { 
    // Access `User`'s field.
}

// And I found this may be possible

contract checkInts(A, B) {
    Iterator(A, B)
    B int
}

func CheckInts(type A, B checkInts) (it A) bool { panic("todo") }

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

์‹ค์ œ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type Iterator(type E) interface {
    Next() (E, bool)
}

๋‚˜๋Š” ๋‹จ์ง€ Go์˜ ๋””์ž์ธ์ด ์–ผ๋งˆ๋‚˜ ํ‘œํ˜„๋ ฅ์ด ์žˆ๋Š”์ง€ ํƒ๊ตฌํ•˜๋ ค๊ณ  ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

BTW, ๋‚ด๊ฐ€ ์ฐธ์กฐํ•˜๋Š” Rust ์ฝ”๋“œ๋Š”

fn main() {
    let input = vec![1, 2, 3, 4];
    let mapped = input.iter().map(|x| x * 3);
    let result = f(mapped);
    println!("{:?}", result.collect::<Vec<_>>());
}

fn f<I: Iterator<Item = i32>>(it: I) -> impl Iterator<Item = f32> {
    it.map(|i| i as f32 * 2.0)
}

// The definition of `map` in stdlib is
pub struct Map<I, F> {
    iter: I,
    f: F,
}

fn map<B, F: FnMut(Self::Item) -> B>(self, f: F) -> Map<Self, F>

๋‹ค์Œ์€ https://github.com/golang/go/issues/15292#issuecomment -633233479์— ๋Œ€ํ•œ ์š”์•ฝ์ž…๋‹ˆ๋‹ค.

  1. func Collect(type I, E Iterator) (input I) []E existential type ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋ฒ”์šฉ ์ •๋Ÿ‰ํ™” ๋งค๊ฐœ๋ณ€์ˆ˜ E ์˜ ์‹ค์ œ ์œ ํ˜•์€ ๋ฐ˜ํ™˜ ๋ชฉ๋ก์—๋งŒ ๋‚˜ํƒ€๋‚˜๋ฏ€๋กœ ์œ ์ถ”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. E type member ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

    • Java์˜ ์™€์ผ๋“œ์นด๋“œ ? $ ์™€ ๊ฐ™์€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ existential type ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ func Consume(type I, E Iterator) (input I) ์˜ ์œ ํ˜• ์œ ์ถ”๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. _ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ E , func Consume(type I Iterator(I, _)) (input I) $ ๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ํ•˜์ง€๋งŒ Collect ์— ๋Œ€ํ•œ ์œ ํ˜• ์œ ์ถ” ๋ฌธ์ œ์—๋Š” ์—ฌ์ „ํžˆ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค E ๋ฅผ ์œ ์ถ”ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์šด์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Rust๋Š” ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • ๋˜๋Š” _ ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๋ˆ„๋ฝ๋œ ์œ ํ˜•์„ ์ˆ˜๋™์œผ๋กœ ์ฑ„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ Collect(_, float32) (...) ).

  1. existential type ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— func Map(type I, E, O, R MapIO) (input I, f func (e E) R) O ์™€ ๊ฐ™์€ ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    • Rust๋Š” impl Iterator<E> ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. Go๊ฐ€ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” boxing ์—†์ด ์ƒˆ๋กœ์šด iterator๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์ผ๋ถ€ ์ฝ”๋“œ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋˜๋Š” ๋‹จ์ˆœํžˆ boxed ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Rust๊ฐ€ ๋ฐ˜ํ™˜ ์œ„์น˜์—์„œ existential type ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์ „์— ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋Š” contract ์™€ interface ์‚ฌ์ด์˜ ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ์ผ๋ถ€ ๋ณ€ํ™˜ ๊ทœ์น™์„ ์ •์˜ํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋„๋ก ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ contract ๋ฐ interface ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฐ˜ํ™˜ ์œ„์น˜์—์„œ ์ž…๋ ฅ ๋ชฉ๋ก์œผ๋กœ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ด๋™ํ•˜๋Š” ๋ฐ์—๋งŒ CPS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: func Map(type I, E, O, R MapIO) (input I, f func (e E) R, f1 func (outout O)) . ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ Map ์— ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ๋•Œ O ์˜ ์‹ค์ œ ์œ ํ˜•์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

์˜๋ฏธ๋ก ์€ ๋ณ€๊ฒฝํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ฌธ์— ๊ด€๊ณ„์—†์ด ํ˜„์žฌ ์ œ์•ˆ์˜ ์˜๋ฏธ๋ก ์˜ ์ •ํ™•์„ฑ์— ํ˜„์žฌ ์ดˆ์ ์ด ๋งž์ถฐ์ ธ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฐฉ๊ธˆ Featherweight Go ์— ๋Œ€ํ•œ ๋…ผ๋ฌธ์ด Arxiv์— ๊ฒŒ์‹œ๋˜์—ˆ์œผ๋ฉฐ ๋ฐ”๋‘‘ ํŒ€๊ณผ ์œ ํ˜• ์ด๋ก ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์ „๋ฌธ๊ฐ€ ๊ฐ„์˜ ๊ณต๋™ ์ž‘์—…์ธ ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋งฅ๋ฝ์—์„œ ๊ณ„ํš๋œ ๋…ผ๋ฌธ์ด ๋” ๋งŽ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด ์ด์ „ ์˜๊ฒฌ์— ๋Œ€ํ•œ ํ›„์† ์กฐ์น˜๋กœ Haskell๋กœ ์œ ๋ช…ํ•œ Phil Wadler์™€ ํ•ด๋‹น ๋…ผ๋ฌธ์˜ ์ €์ž ์ค‘ ํ•œ ๋ช…์ด 6์›” 8์ผ ์›”์š”์ผ ์˜ค์ „ 7์‹œ PDT / ์˜ค์ „ 10์‹œ EDT: http://chalmersfp.org/ "Featherweight Go"์— ๋Œ€ํ•œ ๊ฐ•์—ฐ์ด ์˜ˆ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํŠœ๋ธŒ ๋งํฌ

@rcoreilly ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ž‘์„ฑ ๊ฒฝํ—˜์ด ๋” ๋งŽ๊ณ  ๋” ์ค‘์š”ํ•˜๊ฒŒ๋Š” ์„ค๊ณ„ ์ดˆ์•ˆ์— ๋”ฐ๋ผ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ "๊ตฌ๋ฌธ์  ์–ด๋ ค์›€"์ด ์ฃผ์š” ๋ฌธ์ œ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์—ฐ๊ตฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚ด ์ด์ „ ์˜๊ฒฌ์— ๋Œ€ํ•œ ํ›„์† ์กฐ์น˜๋กœ Haskell๋กœ ์œ ๋ช…ํ•œ Phil Wadler์™€ ํ•ด๋‹น ๋…ผ๋ฌธ์˜ ์ €์ž ์ค‘ ํ•œ ๋ช…์ด ์›”์š”์ผ์— "Featherweight Go"์— ๋Œ€ํ•œ ๊ฐ•์—ฐ์ด ์˜ˆ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Phil Wadler์˜ ์—ฐ์„ค ์€ ๋งค์šฐ ์นœ๊ทผํ•˜๊ณ  ํฅ๋ฏธ๋กœ์› ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฐ€ ๋‹จํ˜•ํ™”๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๋ฌด์˜๋ฏธํ•ด ๋ณด์ด๋Š” ํ•œ ์‹œ๊ฐ„์ด๋ผ๋Š” ์‹œ๊ฐ„ ์ œํ•œ์— ์งœ์ฆ์ด ๋‚ฌ๋‹ค.

Wadler๋Š” Pike์— ์˜ํ•ด ๋‚˜ํƒ€๋‚˜๋„๋ก ์š”์ฒญ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๊ทธ๋“ค์€ Bell Labs์—์„œ ์„œ๋กœ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ Haskell์€ ๋งค์šฐ ๋‹ค๋ฅธ ๊ฐ€์น˜์™€ ํŒจ๋Ÿฌ๋‹ค์ž„ ์„ธํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ (์ฐฝ์‹œ์ž? ์ˆ˜์„ ๋””์ž์ด๋„ˆ?) Go์™€ Go์˜ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ๋ณด๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋ถ„๋ช…ํžˆ Go ํŒ€์€ ์ด๊ฒƒ์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ์ž‘์—… ์ค‘์ด๊ฑฐ๋‚˜ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œํŽธ, ์ด๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ๋ณด์ผ๊นŒ์š”?

package graph

type Node(type e) interface{
    Edges() []e
}

type Edge(type n) interface{
    Nodes() (from n, to n)
}

type Graph(type n Node(e), e Edge(n)) struct { ... }
func New(type n Node(e), e Edge(n))(nodes []n) *Graph(n, e) { ... }
func (g *Graph(type n Node(e), e Edge(n))) ShortestPath(from, to n) []e { ... }

๋‚˜์—๊ฒŒ ๊ทธ๋Ÿฐ ๊ถŒ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋„ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•ด. ๋‚ด๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด ... ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ. ๋ง๋”๋“ฌ ๊ด„ํ˜ธ ๋ฌธ์ œ๊ฐ€ ์™„์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์–ด๋–ป๊ฒŒ ๋“  ๊ฐœ์„  ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ์•ˆ์˜ ์ด๋ฆ„ ๋ชจ๋ฅผ ํ˜ผ๋ž€์ด ์ง„์ •๋ฉ๋‹ˆ๋‹ค.

@urandom ์˜ ์Šคํƒ ์˜ˆ์ œ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ( interface{} ๋ฅผ Any ๋กœ ์•จ๋ฆฌ์–ด์‹ฑํ•˜๊ณ  ํŠน์ • ์–‘์˜ ์œ ํ˜• ์ถ”๋ก ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.)

package main

type Any interface{}

type Stack(type t Any) []t

func (s Stack(type t Any)) Peek() t {
    return s[len(s)-1]
}

func (s *Stack(type t Any)) Pop() {
    *s = (*s)[:len(*s)-1]
}

func (s *Stack(type t Any)) Push(value t) {
    *s = append(*s, value)
}

type StackIterator(type t Any) struct{
    stack Stack(t)
    current int
}

func (s *Stack(type t Any)) Iter() *StackIterator(t) {
    it := StackIterator(t){stack: *s, current: len(*s)}

    return &it
}

func (i *StackIterator(type t Any)) Next() (bool) { 
    i.current--

    if i.current < 0 { 
        return false
    }

    return true
}

func (i *StackIterator(type t Any)) Value() t {
    if i.current < 0 {
        var zero t
        return zero
    }

    return i.stack[i.current]
}

type Iterator(type t Any) interface {
    Next() bool
    Value() t
}

func Map(type t Any, u Any)(it Iterator(t), mapF func(t) u) Iterator(u) {
    return mapIt(t, u){it, mapF}
}

type mapIt(type t Any, u Any) struct {
    parent Iterator(t)
    mapF func(t) u
}

func (i mapIt(type t Any, u Any)) Next() bool {
    return i.parent.Next()
}

func (i mapIt(type t Any, u Any)) Value() u {
    return i.mapF(i.parent.Value())
}

func Filter(type t Any)(it Iterator(t), predicate func(t) bool) Iterator(t) {
    return filter(t){it, predicate}
}

type filter(type t Any) struct {
    parent Iterator(t)
    predicateF func(t) bool
}

func (i filter(type t Any)) Next() bool {
    if !i.parent.Next() {
        return false
    }

    n := true
    for n && !i.predicateF(i.parent.Value()) {
        n = i.parent.Next()
    }

    return n
}

func (i filter(type t Any)) Value() t {
    return i.parent.Value()
}

func Distinct(type t comparable)(it Iterator(t)) Iterator(t) {
    return distinct(t){it, map[t]struct{}{}}
}

type distinct(type t comparable) struct {
    parent Iterator(t)
    set map[t]struct{}
}

func (i distinct(type t Any)) Next() bool {
    if !i.parent.Next() {
        return false
    }

    n := true
    for n {
        _, ok := i.set[i.parent.Value()]
        if !ok {
            i.set[i.parent.Value()] = struct{}{}
            break
        }
        n = i.parent.Next()
    }


    return n
}

func (i distinct(type t Any)) Value() t {
    return i.parent.Value()
}

func ToSlice(type t Any)(it Iterator(t)) []t {
    var res []t

    for it.Next() {
        res = append(res, it.Value())
    }

    return res
}

func ToSet(type t comparable)(it Iterator(t)) map[t]struct{} {
    var res map[t]struct{}

    for it.Next() {
        res[it.Value()] = struct{}{}
    }

    return res
}

func Reduce(type t Any)(it Iterator(t), id t, acc func(a, b t) t) t {
    for it.Next() {
        id = acc(id, it.Value())
    }

    return id
}

func main() {
    var stack Stack(string)
    stack.Push("foo")
    stack.Push("bar")
    stack.Pop()
    stack.Push("alpha")
    stack.Push("beta")
    stack.Push("foo")
    stack.Push("gamma")
    stack.Push("beta")
    stack.Push("delta")


    var it Iterator(string) = stack.Iter()

    it = Filter(string)(it, func(s string) bool {
        return s == "foo" || s == "beta" || s == "delta"
    })

    it = Map(string, string)(it, func(s string) string {
        return s + ":1"
    })

    it = Distinct(string)(it)

    println(Reduce(it, "", func(a, b string) string {
        if a == "" {
            return b
        }
        return a + ":" + b
    }))


}

๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์•„์š”. ํ•ด๋‹น ์ฝ”๋“œ์—๋Š” ์‹ค์ œ๋กœ ๊ณ„์•ฝ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ FGG ์Šคํƒ€์ผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์„ ์ž˜ ๋‚˜ํƒ€๋‚ด์ง€๋Š” ์•Š์ง€๋งŒ ์ž ์‹œ ํ›„์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ์ถœ์ˆ˜:

  • ๋‚˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ์Šคํƒ€์ผ์ด ์œ ํ˜• ์„ ์–ธ์˜ ์Šคํƒ€์ผ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, "์œ ํ˜•"์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์œ ํ˜•์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. $#$1$ ("type" param paramType, param paramType...) (param, param) . ์‹œ๊ฐ์ ์œผ๋กœ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ๋” ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์†Œ๋ฌธ์ž๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Go์˜ ๋‹จ์ผ ๋ฌธ์ž ๋ณ€์ˆ˜๋Š” ๊ทน๋„๋กœ ์ง€์—ญ์ ์ธ ์‚ฌ์šฉ์„ ๋‚˜ํƒ€๋‚ด์ง€๋งŒ ๋Œ€๋ฌธ์ž๋Š” ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ ๊ฒฐํ•ฉํ•˜๋ฉด ๋ฐ˜๋Œ€์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„๊ฐ€ ํ•จ์ˆ˜/์œ ํ˜•์œผ๋กœ ์ง€์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ์†Œ๋ฌธ์ž๊ฐ€ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

์ข‹์•„์š”, ๊ณ„์•ฝ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๊ธ€์Ž„, ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ํ•œ ๊ฐ€์ง€๋Š” Stringer ๊ฐ€ ์†๋Œ€์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Stringer ์ธํ„ฐํŽ˜์ด์Šค์™€ Stringer ๊ณ„์•ฝ์ด ์—†์Šต๋‹ˆ๋‹ค.

type Stringer interface {
    String() string
}

func Stringify(type t Stringer)(s []t) (ret []string) {
    for _, v := range s {
        ret = append(ret, v.String())
    }
    return ret
}

viaStrings ์˜ˆ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

type ToString interface {
    Set(string)
}

type FromString interface {
    String() string
}

func SetViaStrings(type to ToString, from FromString)(s []from) []to {
    r := make([]to, len(s))
    for i, v := range s {
        r[i].Set(v.String())
    }
    return r
}

ํฅ๋ฏธ๋กœ์šด. ์ด ๊ฒฝ์šฐ ๊ณ„์•ฝ์ด ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌด์—‡์„ ์–ป์—ˆ๋Š”์ง€ ์‹ค์ œ๋กœ 100% ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ„์•ฝ์€ ํ•˜๋‚˜๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ทœ์น™์˜ ์ผ๋ถ€์˜€์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Equal์€ ๋…ผ๋ฌธ/ํ† ๋ก ์—์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

contract equal(T) {
    T Equal(T) bool
}

// becomes

type equal(type t equal(t)) interface{
    Equal(t) bool
}

๋“ฑ๋“ฑ. ๋‚˜๋Š” ์˜๋ฏธ๋ก ์— ๊ฝค ์‚ฌ๋กœ์žกํ˜€ ์žˆ๋‹ค. ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฏ€๋กœ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ์—๋„ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋™์ผํ•œ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š” ํ•œ ๋Ÿฐํƒ€์ž„์— "๋ฐ•์‹ฑ"๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

8 - ๊ฒฐ๋ก 

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

ํŽ˜๋”๊ธ‰ ๋ฐ”๋‘‘์€ ๋ฐ”๋‘‘์˜ ์ž‘์€ ๋ถ€๋ถ„์ง‘ํ•ฉ์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ํ• ๋‹น, ๋ฐฐ์—ด, ์Šฌ๋ผ์ด์Šค ๋ฐ ํŒจํ‚ค์ง€์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์˜ ๋ชจ๋ธ์„ ๊ณ„ํšํ•˜๊ณ  ์ด๋ฅผ Bantamweight Go๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "๊ณ ๋ฃจํ‹ด"๊ณผ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” Go์˜ ํ˜์‹ ์ ์ธ ๋™์‹œ์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋ชจ๋ธ์ด๋ฉฐ, ์ด๋ฅผ Cruiserweight Go๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Featherweight Go๋Š” ๋‚˜์—๊ฒŒ ๋ฉ‹์ง€๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์œ ํ˜• ์ด๋ก  ์ „๋ฌธ๊ฐ€๋ฅผ ์ฐธ์—ฌ์‹œํ‚ค๋Š” ํ›Œ๋ฅญํ•œ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ด ์ฃผ์ œ์—์„œ ๋” ๋‚˜์•„๊ฐ€ ์˜นํ˜ธํ–ˆ๋˜ ์ข…๋ฅ˜์™€ ํ›จ์”ฌ ๋” ๋น„์Šทํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์œ ํ˜• ์ด๋ก  ์ „๋ฌธ๊ฐ€๋“ค์ด ์ด์— ์ ๊ทน์ ์œผ๋กœ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์†Œ์‹์„ ๋“ฃ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค!

๋‚ด ์˜ค๋ž˜๋œ ์ œ์•ˆ "๊ณ„์•ฝ์€ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค"์™€ ๋น„์Šทํ•ด ๋ณด์ž…๋‹ˆ๋‹ค(์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ์ œ์™ธ) https://github.com/cosmos72/gomacro/blob/master/doc/generics-cti.md

@toolbox
์‹ค์ œ ์œ ํ˜•๊ณผ ๋‹ค๋ฅธ ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ—ˆ์šฉํ•จ์œผ๋กœ์จ FGG๋Š” ํ˜„์žฌ ๊ณ„์•ฝ ์ดˆ์•ˆ์—์„œ๋Š” ์‹คํ˜„ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, FGG๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Iterator์™€ ReversibleIterator๋ฅผ ๋ชจ๋‘ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์ค‘๊ฐ„ ๋ฐ ์ข…๋ฃŒ ๋ฐ˜๋ณต์ž(map, filter reduce)๊ฐ€ ๋‘˜ ๋‹ค๋ฅผ ์ง€์›ํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๊ฐ€์—ญ์— ๋Œ€ํ•ด Next() ๋ฐ NextFromBack() ์‚ฌ์šฉ) , ์ƒ์œ„ ๋ฐ˜๋ณต์ž๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

FGG๊ฐ€ Go์˜ ์ œ๋„ค๋ฆญ์ด ๋๋‚˜๋Š” ์œ„์น˜๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์™ธ๋ถ€์—์„œ ํ•˜๋‚˜์˜ ํ…Œ์ดํฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ์ข… ์ œํ’ˆ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋งŽ์€ ๊ฒƒ๋“ค์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚˜๋Š” ์‹ ๋ฌธ์„ ์ฝ์ง€ ์•Š๊ณ  ์—ฐ์„ค๋งŒ ๋ดค๋‹ค. ์ด๋ฅผ ์—ผ๋‘์— ๋‘๊ณ : ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ, FGG๊ฐ€ ๊ณ„์•ฝ ์ดˆ์•ˆ์— ๋Œ€ํ•ด ํ‘œํ˜„๋ ฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฉ”์„œ๋“œ์— ์ƒˆ๋กœ์šด ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ† ๋ก ์˜ "๋ชฉ๋ก ๋ฐ ์ง€๋„" ์˜ˆ์ œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Œ). AFAICT ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Functor (์‹ค์ œ๋กœ ๋‚ด๊ฐ€ ํ‹€๋ฆฌ์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ทธ์˜ List ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค), Monad ๋ฐ ๊ทธ ์นœ๊ตฌ๋“ค์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์ • ์œ ํ˜•์ด Gophers์—๊ฒŒ๋Š” ํฅ๋ฏธ๋กญ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: Flume ์˜ Go ํฌํŠธ ๋˜๋Š” ์œ ์‚ฌํ•œ ๊ฐœ๋…์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Œ). ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ๊ธ์ •์ ์ธ ๋ณ€ํ™”๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ๋ฐ˜์˜ ๋“ฑ์— ์–ด๋–ค ์˜ํ–ฅ์ด ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์„ ์–ธ์ด ์ฝ๊ธฐ ์–ด๋ ค์›Œ์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ œ๋„ค๋ฆญ ์œ ํ˜•์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์ˆ˜์‹ ์ž์— ๋‚˜์—ด๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
  2. ์ด๋ฅผ ํ†ตํ•ด ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ˜•์‹ ์ž์ฒด๋ณด๋‹ค ์ œ๋„ค๋ฆญ ํ˜•์‹์˜ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ๋” ์—„๊ฒฉํ•œ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ๋™์ผํ•œ ์ œ๋„ค๋ฆญ ์œ ํ˜•์ด ์–ด๋–ค ์œ ํ˜•์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”๋˜์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ข‹์€ ๋ณ€ํ™”์ธ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Map(int, T) ๊ฐ€ Map(string, T) ์— ์—†๋Š” ๋ฉ”์†Œ๋“œ๋กœ ๋๋‚˜๋Š” ๊ฒƒ์€ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด์™€ ๊ฐ™์€ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์šฐ์ˆ˜ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•œํŽธ, ์ด์ ์€ ๋น„๊ต์  ์ž‘์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด์•ผ๊ธฐ(๋ณ„๋„์˜ ์ปดํŒŒ์ผ)์˜ ๋™๊ธฐ ์š”์†Œ๊ฐ€ Go์™€ ๊ด€๋ จ์ด ์—†๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๋•Œ: ๋ฉ”์„œ๋“œ๋Š” ์ˆ˜์‹ ๊ธฐ ์œ ํ˜•๊ณผ ๋™์ผํ•œ ํŒจํ‚ค์ง€์—์„œ ์„ ์–ธ๋˜์–ด์•ผ ํ•˜๊ณ  ํŒจํ‚ค์ง€๊ฐ€ ๋‹จ์œ„๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ปดํŒŒ์ผ์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์œ ํ˜•์„ ๋ณ„๋„๋กœ ํ™•์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ์ถ”์ƒ์ ์ธ ์ด์ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ทธ ์ด์ ์ด Go์— ํฐ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. :)

FGG๊ฐ€ Go์˜ ์ œ๋„ค๋ฆญ์ด ๋๋‚˜๋Š” ์œ„์น˜๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@๋ฉ”๋กœ๋น„์šฐ์Šค ์™œ ๊ทธ๋ž˜์š”?

@arl
FG๋Š” ๋ฌด์—‡์„ _ํ•  ์ˆ˜ ์žˆ๋Š”์ง€_์— ๋Œ€ํ•œ ์—ฐ๊ตฌ ๋…ผ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฏธ๋ž˜์— Go์—์„œ ๋‹คํ˜•์„ฑ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ๋งํ•œ ์‚ฌ๋žŒ์€ ์•„๋ฌด๋„ ์—†์Šต๋‹ˆ๋‹ค. ๋น„๋ก 2๋ช…์˜ Go ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋…ผ๋ฌธ์˜ ์ €์ž๋กœ ๋‚˜์—ด๋˜์–ด ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด Go์—์„œ ๊ตฌํ˜„๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

FGG๊ฐ€ Go์˜ ์ œ๋„ค๋ฆญ์ด ๋๋‚˜๋Š” ์œ„์น˜๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์™ธ๋ถ€์—์„œ ํ•˜๋‚˜์˜ ํ…Œ์ดํฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ์ข… ์ œํ’ˆ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋งŽ์€ ๊ฒƒ๋“ค์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ์•„์ฃผ ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ Wadler๋Š” ํŒ€์˜ ์ผ์›์œผ๋กœ ์ผํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฒฐ๊ณผ ์ œํ’ˆ์€ ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋…„๊ฐ„ ์ž‘์—…ํ•œ ๊ฒฐ๊ณผ์ธ Contracts ์ œ์•ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ๋งค์šฐ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ์œ ํ˜•๊ณผ ๋‹ค๋ฅธ ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ—ˆ์šฉํ•จ์œผ๋กœ์จ FGG๋Š” ํ˜„์žฌ ๊ณ„์•ฝ ์ดˆ์•ˆ์—์„œ๋Š” ์‹คํ˜„ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค. ...

@urandom Iterator ์˜ˆ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํ•จ๊ป˜ ๋ญ”๊ฐ€๋ฅผ ๋˜์ง€์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด์™€ ๋ณ„๋„๋กœ ์ €๋Š” ์ œ๋„ค๋ฆญ์ด ๋งต๊ณผ ํ•„ํ„ฐ, ๊ธฐ๋Šฅ์ ์ธ ๊ฒƒ ์™ธ์— ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  k8๊ณผ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์— ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. (์ด ์‹œ์ ์—์„œ ๊ทธ๋“ค์ด ๊ฐ€์„œ ๋ฆฌํŒฉํ† ๋งํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ œ๋„ค๋ฆญ์ด ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ๋ฉ‹์ง„ ๋ฐœ๋†€๋ฆผ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ผํ™”๋ฅผ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Custom Resources๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ํ”„๋กœ์ ํŠธ์— ๋” ์ต์ˆ™ํ•œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ €๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์„ ์–ธ์ด ์ฝ๊ธฐ ์–ด๋ ค์›Œ์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ œ๋„ค๋ฆญ ์œ ํ˜•์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์ˆ˜์‹ ์ž์— ๋‚˜์—ด๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ gofmt ์ด(๊ฐ€) ์–ด๋–ค ์‹์œผ๋กœ๋“  ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด์ฉŒ๋ฉด ์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ์ค„๋กœ ๊ฐˆ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ฐ€์ง€๊ณ  ๋†€ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ๋™์ผํ•œ ์ œ๋„ค๋ฆญ ์œ ํ˜•์ด ์–ด๋–ค ์œ ํ˜•์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”๋˜์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์Šจ ๋ง์ธ์ง€ ์•Œ ๊ฒ ์–ด์š” @Merovius

Wadler๋Š” ์ด๋ฅผ ์ฐจ์ด์ ์œผ๋กœ ๋ถˆ๋ €๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๊ทธ์˜ ํ‘œํ˜„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ Go์˜ ์ผ์ข…์˜ ๋ฐ€ํ ํŒจํ‚ค์ง€๊ฐ€ ์ด๊ฒƒ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š”/ํ•ด์•ผ ํ•˜๋Š” ์ผ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋Š” ์ ์„ ์ž˜ ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์€ ์‹ค์ œ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ๋™์ผํ•œ ์ œ๋„ค๋ฆญ ์œ ํ˜•์ด ์–ด๋–ค ์œ ํ˜•์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”๋˜์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์Šจ ๋ง์ธ์ง€ ์•Œ๊ฒ ์–ด์š” @Merovius

Wadler๋Š” ์ด๋ฅผ ์ฐจ์ด์ ์œผ๋กœ ๋ถˆ๋ €๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๊ทธ์˜ ํ‘œํ˜„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ Go์˜ ์ผ์ข…์˜ ๋ฐ€ํ ํŒจํ‚ค์ง€๊ฐ€ ์ด๊ฒƒ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š”/ํ•ด์•ผ ํ•˜๋Š” ์ผ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋Š” ์ ์„ ์ž˜ ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์€ ์‹ค์ œ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ ๋‚ด ์ฒซ ๋ฒˆ์งธ ์ƒ๊ฐ์€ ์ด ๋ฌธ์„œ์— ์„ค๋ช…๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://blog.merovius.de/2017/07/30/the-trouble-with-optional-interfaces.html

@๊ณต๊ตฌ ์ƒ์ž

์ด์™€๋Š” ๋ณ„๋„๋กœ ์ œ๋„ค๋ฆญ์ด ๋งต๊ณผ ํ•„ํ„ฐ, ๊ธฐ๋Šฅ์ ์ธ ๊ฒƒ ์™ธ์— ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

FWIW, ์ด๊ฒƒ์€ "์ง€๋„, ํ•„ํ„ฐ ๋ฐ ๊ธฐ๋Šฅ์ ์ธ ๊ฒƒ"์„ ์งง๊ฒŒ ํŒ๋งคํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด ์ฝ”๋“œ์˜ ๋‚ด์žฅ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ณด๋‹ค map ๋ฐ filter ๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ €๋Š” for ๋ฃจํ”„๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ์˜๋ฏธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  1. ํƒ€์‚ฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ผ๋ฐ˜ํ™”๋œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด map ๋ฐ filter ๋Š” ์ œ๋„ค๋ฆญ ํŠธ๋ฆฌ ๋˜๋Š” ์ •๋ ฌ๋œ ๋งต์—์„œ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งคํ•‘๋œ ํ•ญ๋ชฉ์„ ๊ต์ฒดํ•˜์—ฌ ๋” ๋งŽ์€ ์ „๋ ฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€
  2. ๋งคํ•‘ ๋ฐฉ๋ฒ• ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ณ ๋ฃจํ‹ด์„ ์ƒ์„ฑํ•˜๊ณ  ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Compose ๋ฒ„์ „์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋™์‹œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•˜๊ณ  ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ž๋™์œผ๋กœ ํ™•์žฅํ•˜๋ฉด์„œ func(A) B ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ˆ˜์ฒœ ๊ฐœ์˜ ํ”„๋กœ๊ทธ๋žจ ๋ณต์‚ฌ๋ณธ์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์— ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๋„ฃ์–ด ๋ฐ์ดํ„ฐ ๋ฐฐ์น˜๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์œ„์—์„œ Flume ์— ์—ฐ๊ฒฐํ•  ๋•Œ ์–ธ๊ธ‰ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค).

๋”ฐ๋ผ์„œ Map ๋ฐ Filter ๋ฐ Reduce ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํ‘œ๋ฉด์ ์œผ๋กœ๋Š” ์ง€๋ฃจํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋™์ผํ•œ ๊ธฐ์ˆ ์€ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ปดํ“จํŒ…์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ •๋ง ํฅ๋ฏธ๋กœ์šด ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค.

@ChrisHines

์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ ๋‚ด ์ฒซ ๋ฒˆ์งธ ์ƒ๊ฐ์€ ์ด ๋ฌธ์„œ์— ์„ค๋ช…๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://blog.merovius.de/2017/07/30/the-trouble-with-optional-interfaces.html

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

type Middleware (type RW http.ResponseWriter) struct {
    RW
}

๊ด€์‹ฌ ์žˆ๋Š” ์„ ํƒ์  ๋ฐฉ๋ฒ•์„ ๋ฎ์–ด์“ฐ๊ณ  RW ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์Šน๊ฒฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ž˜ํผ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๋„ ์—†๊ณ  ์•Œ์ง€ ๋ชปํ•˜๋Š” ๋ฉ”์„œ๋“œ๋„ ํˆฌ๋ช…ํ•˜๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ผ๋ฐ˜ ๊ตฌ์กฐ์ฒด์— ํฌํ•จ๋œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์Šน๊ฒฉ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์–ป๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด(๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒ ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค) ๋ฌธ์ œ๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋กœ ๋” ์ž˜ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

http.ResponseWriter ์— ๋Œ€ํ•œ ํŠน์ • ์†”๋ฃจ์…˜์€ errors.Is/As ์™€ ๋น„์Šท ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด ๋ณ€๊ฒฝ์€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ResponseWriter ๋ž˜ํ•‘์˜ ํ‘œ์ค€ ๋ฐฉ๋ฒ•๊ณผ ์ฒด์ธ์˜ ResponseWriter๊ฐ€ egwPush๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ฟผ๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ œ๋„ค๋ฆญ์ด ์ด์™€ ๊ฐ™์€ ๊ฒƒ์— ์ ํ•ฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์š”์ ์€ ์„ ํƒ์  ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์ด์—์„œ ๋Ÿฐํƒ€์ž„ ์„ ํƒ์„ ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Push๋Š” http2์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  http1 ๋กœ์ปฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ๊ฐ€๋™ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Github์„ ์‚ดํŽด๋ณด๋‹ˆ ์ด ์•„์ด๋””์–ด์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“  ์ ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ์ง€๊ธˆ ๋‹น์žฅ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: #39558.

@toolbox
๋‚ด ์ƒ๊ฐ์— ๋‚ด๋ถ€ ๋‹จํ˜•์„ฑ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

package iter

type Any interface{}

type Iterator(type T Any) interface {
    Next() bool
    Value() T
}

type ReversibleIterator(type T Any) interface {
    Iterator(T)
    NextBack() bool
}

type mapIt(type I Iterator(T), T Any, U Any) struct {
    parent I
    mapF func(T) U
}

func (i mapIt(type I Iterator(T))) Next() bool {
    return i.parent.Next()
}

func (i mapIt(type I Iterator(T), T Any, U Any)) Value() U { 
    return i.mapF(i.parent.Value())
}

func (i mapIt(type I ReversibleIterator(T))) NextBack() bool { 
    return i.parent.NextBack()
}

// Monomorphisation
type mapIt<OnlyForward, int, float64> struct {
    parent OnlyForward,
    mapF func(int) float64
}

func (i mapIt<OnlyForward, int, float64>) Next() bool {
    return i.parent.Next()
}

func (i mapIt<OnlyForward, int, float64>) Value() float64 {
    return i.mapF(i.parent.Value())
}

type mapIt<Slice, int, string> struct {
    parent Slice,
    mapF func(int) string
}

func (i mapIt<Slice, int, string>) Next() bool {
    return i.parent.Next()
}

func (i mapIt<Slice, int, string>) Value() string {
    return i.mapF(i.parent.Value())
}

func (i mapIt<Slice, int, string>) NextBack() bool {
    return i.parent.NextBack()
}



๋‚ด ์ƒ๊ฐ์— ๋‚ด๋ถ€ ๋‹จํ˜•์„ฑ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

FWIW๋Š” ๋ช‡ ๋…„ ์ „ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ Go์—์„œ ๋ฐ˜๋ณต์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํƒ๊ตฌํ•œ ์ œ ํŠธ์œ—์ž…๋‹ˆ๋‹ค. <T> ๋ฅผ (type T) ๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์ „์—ญ ๋Œ€์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ˜„์žฌ ์ œ์•ˆ์—์„œ ๋ฉ€์ง€ ์•Š์€ ๊ฒƒ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. https://twitter.com/rogpeppe/status/425035488425037824

FWIW, ์ด๊ฒƒ์€ "์ง€๋„, ํ•„ํ„ฐ ๋ฐ ๊ธฐ๋Šฅ์ ์ธ ๊ฒƒ"์„ ์งง๊ฒŒ ํŒ๋งคํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋‚ด ์ฝ”๋“œ์˜ ๋‚ด์žฅ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋งต ๋ฐ ํ•„ํ„ฐ๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ €๋Š” for ๋ฃจํ”„๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ์˜๋ฏธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ...

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

k8๋ณด๋‹ค ๊ฐ„๋‹จํ•˜๊ณ  ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฒ”์ฃผ์— ๋งž๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ˆ„๊ตฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ญ๋‹ˆ๊นŒ?

@์šฐ๋Ÿฐ๋ค ์šฐ์™€. ๋”ฐ๋ผ์„œ $ ReversibleIterator parent ๋กœ mapIt mapIt ์— NextBack() ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ‹ฐ. ๋‚ด๊ฐ€ ์ฝ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๊นŒ?

์ƒ๊ฐํ•ด๋ณด๋ฉด ๋„์„œ๊ด€ ๊ด€์ ์—์„œ ๋ณด๋ฉด ์“ธ๋งŒํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฝค ๊ฐœ๋ฐฉ์ ์ธ( Any type params) ์ผ๋ฐ˜ ๊ตฌ์กฐ์ฒด ์œ ํ˜•์ด ์žˆ๊ณ  ๋‹ค์–‘ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜ํ•ด ์ œ์•ฝ์„ ๋ฐ›๋Š” ๋งŽ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž์‹ ์˜ ์ฝ”๋“œ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ตฌ์กฐ์ฒด์— ํฌํ•จ๋œ ์œ ํ˜•์€ ํŠน์ • ๋ฉ”์„œ๋“œ ์ง‘ํ•ฉ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํŠน์ • ๊ธฐ๋Šฅ ์ง‘ํ•ฉ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ธฐ๋Šฅ ์ง‘ํ•ฉ์ด ๋ฌด์—‡์ธ์ง€๋Š” ์œ ํ˜•์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํŒŒ์•…๋ฉ๋‹ˆ๋‹ค.

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

์–ด์จŒ๋“  ๋งค์šฐ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ํ•˜๋ ค๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

type OverrideX interface {
    GetX() int
}

type OverrideY interface {
    GetY() int
}

type Inheritor(type child Any) struct {
    Parent
    c child
}

func (i Inheritor(type child OverrideX)) GetX() int {
    return i.c.GetX()
}

func (i Inheritor(type child OverrideY)) GetY() int {
    return i.c.GetY()
}

type Parent struct {
    x, y int
}

func (p Parent) GetX() int {
    return p.x
}

func (p Parent) GetY() int {
    return p.y
}

type Child struct {
    x int
}

func (c Child) GetX() int {
    return c.x
}

func main() {
    i := Inheritor(Child){Parent{5, 6}, Child{3}}
    x, y := i.GetX(), i.GetY() // 3, 6
}

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„ ๋†๋‹ด์ด์ง€๋งŒ โ€‹โ€‹๊ฐ€๋Šฅํ•œ ๊ฒƒ์˜ ํ•œ๊ณ„๋ฅผ ํƒ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ํ , ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ ์„ธํŠธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ์ง€๋งŒ Child Parent ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ํšจ๊ณผ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ, ์–ด๋ฆฌ์„์€ ์˜ˆ ;)

์ €๋Š” ํŠน์ • ์œ ํ˜•์ด ์ฃผ์–ด์กŒ์„ ๋•Œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @toolbox ์˜ ์˜ˆ๋ฅผ ๋ณด๋ฉด ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋Š” ํŠน์ • ์ž์‹์ด ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ…Œ์Šคํ„ฐ๋Š” ์–ด๋–ค ๊ฒฝ์šฐ๋ฅผ ๋†“์น  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋„ ๋ถˆ๋ถ„๋ช…ํ•˜๊ณ  ์ œ์•ˆ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด IDE๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ Go๊ฐ€ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”์„œ๋“œ์—์„œ ํ˜•์‹ ์–ด์„ค์…˜์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ตฌ์กฐ์ฒด์—์„œ ์ œ๊ณตํ•œ ํ˜•์‹๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func (i Inheritor(type child Any)) GetX() int {
    if c, ok := i.c.(OverrideX); ok {
        return c.GetX()
    }
    return i.Parent.GetX()
}

func (i Inheritor(type child Any)) GetY() int {
    if c, ok := i.c.(OverrideY); ok {
        return c.GetY()
    }
    return i.Parent.GetY()
} 

์ด ์ฝ”๋“œ๋Š” ๋˜ํ•œ ํ˜•์‹์ด ์•ˆ์ „ํ•˜๊ณ  ๋ช…ํ™•ํ•˜๋ฉฐ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ ํ˜ผ๋™ ์—†์ด ์›๋ณธ๊ณผ ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

@TotallyGamerJet
๊ทธ ํŠน์ • ์˜ˆ๋Š” ์œ ํ˜• ์•ˆ์ „ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์˜ˆ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉฐ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ๋Ÿฐํƒ€์ž„ ํŒจ๋‹‰์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

@urandom ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ผ€์ด์Šค๋ฅผ ๋†“์น  ๊ฒƒ์ด๋ผ๋Š” ํŠน์ • ์˜ˆ๋ฅผ ๋ฐ˜๋“œ์‹œ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ์งง์Šต๋‹ˆ๋‹ค. ํŠน์ • ์œ ํ˜•์ด ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋งŽ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ ๋ง์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์„œ๋ธŒํƒ€์ดํ•‘์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž… ์–ด์„ค์…˜์ด๋‚˜ ์„œ๋ธŒํƒ€์ดํ•‘์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  "ํ‘œํ˜„ ๋ฌธ์ œ"๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type Any interface {}

type Evaler(type t Any) interface {
    Eval() t
}

type Num struct {
    value int
}

func (n Num) Eval() int {
    return n.value
}

type Plus(type a Evaler(type t Any)) struct {
    left a
    right a
}

func (p Plus(type a Evaler(type t Any)) Eval() t {
    return p.left.Eval() + p.right.Eval()
}

func (p Plus(type a Evaler(type t Any)) String() string {
    return fmt.Sprintf("(%s+%s)", p.left, p.right)
}

type Expr interface {
    Evaler
    fmt.Stringer
}

func main() {
    var e Expr = Plus(Num){Num{1}, Num{2}}
    var v int = e.Eval() // 3
    var s string = e.String() // "(1+2)"
}

Eval ๋ฉ”์„œ๋“œ์˜ ์˜ค์šฉ์€ ๋ง์…ˆ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ํ˜•์‹์œผ๋กœ Plus์—์„œ Eval์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์žก์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. String()์„ ๋ถ€์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(๊ตฌ์กฐ์ฒด ์ถ”๊ฐ€ ๊ฐ€๋Šฅ) ์ข‹์€ ํ…Œ์ŠคํŠธ๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ์žก์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Go๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ "์ •ํ™•ํ•จ"๋ณด๋‹ค ๋‹จ์ˆœํ•จ์„ ํฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ธŒํƒ€์ดํ•‘์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ๋ฌธ์„œ์™€ ์‚ฌ์šฉ๋ฒ•์—์„œ ๋” ๋งŽ์€ ํ˜ผ๋ž€์ž…๋‹ˆ๋‹ค. ํ•˜์œ„ ์ž…๋ ฅ์ด ํ•„์š”ํ•œ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒ ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํŽธ์ง‘: ์˜ค๋ฅ˜ ์ˆ˜์ • ๋ฐ ๊ฐœ์„ 

๊ท€ํ•˜์˜ ์˜ˆ์—์„œ @TotallyGamerJet , String ๋ฉ”์†Œ๋“œ๋Š” Eval์ด ์•„๋‹ˆ๋ผ ์žฌ๊ท€์ ์œผ๋กœ String์„ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ์—์„œ @TotallyGamerJet , String ๋ฉ”์†Œ๋“œ๋Š” Eval์ด ์•„๋‹ˆ๋ผ ์žฌ๊ท€์ ์œผ๋กœ String์„ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@๋งˆ๋ฒ• ๊ฐ™์€
๋ฌด์Šจ ๋ง์”€์ด์‹ ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Plus ๊ตฌ์กฐ์ฒด์˜ ์œ ํ˜•์€ fmt.Stringer๊ฐ€ ์ถฉ์กฑ๋˜๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š๋Š” Evaler์ž…๋‹ˆ๋‹ค. ๋‘ ํ‰๊ฐ€์ž ๋ชจ๋‘์—์„œ String()์„ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ํ˜•์‹ ์–ด์„ค์…˜์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ํ˜•์‹ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@TotallyGamerJet
๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์ด String ๋ฉ”์„œ๋“œ์˜ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๋ฉค๋ฒ„์— ๋Œ€ํ•ด ๋ชจ๋“  String ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Plug ์œ ํ˜•์˜ ๋ฉ”์†Œ๋“œ์— String ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋Š” a ์œ ํ˜•์ด ํ•„์š”ํ•œ์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์œ ํ˜• ์–ด์„ค์…˜๊ณผ ํŒจ๋‹‰์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@urandom
๋‹น์‹ ์ด ์˜ฌ๋ฐ”๋ฅธ์ง€! ๋†€๋ž๊ฒŒ๋„ Sprintf๊ฐ€ ํ•ด๋‹น ์œ ํ˜• ์–ด์„ค์…˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์™ผ์ชฝ ํ•„๋“œ์™€ ์˜ค๋ฅธ์ชฝ ํ•„๋“œ๋ฅผ ๋ชจ๋‘ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Plus์˜ ์œ ํ˜•์ด Stringer๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉด ์—ฌ์ „ํžˆ ๋‹นํ™ฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ %v ๋™์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์กฐ์ฒด๋ฅผ ์ธ์‡„ํ•˜๋ฉด ํŒจ๋‹‰์„ ํ”ผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค(String( ) ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ). ์ด ์†”๋ฃจ์…˜์€ ๋ช…ํ™•ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ๋ถˆํ™•์‹ค์„ฑ์€ ์ฝ”๋“œ์— ๋ฌธ์„œํ™”๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์„œ๋ธŒํƒ€์ดํ•‘์ด ์™œ ํ•„์š”ํ•œ์ง€ ์•„์ง ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@TotallyGamerJet
์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋‹ค๋ฅธ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ฐ€์ง„ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ์ „ํžˆ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋ฉฐ ์ฝ”๋“œ๋Š” ์–ด๋–ค ์ธ์ˆ˜(๋ฐ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ ์ˆ˜์‹ ์ž)๊ฐ€ ํ•„์š”ํ•œ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
string ์ธ์ˆ˜ ๋˜๋Š” MyType ์ˆ˜์‹ ์ž๋ฅผ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ  ๋ชจํ˜ธํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์Œ ์ •์˜๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

func (rec MyType(type T SomeInterface(T)) Foo() T

์š”๊ตฌ ์‚ฌํ•ญ์€ ์„œ๋ช… ์ž์ฒด์— ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. IE๋Š” MyType(type T SomeInterface(T)) ์ด๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

https://golang.org/cl/238003 ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰ํ•จ: design: add go2draft-type-parameters.md ๋ณ€๊ฒฝ

https://golang.org/cl/238241 ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰: content: add generics-next-step article ๋ณ€๊ฒฝ

ํฌ๋ฆฌ์Šค๋งˆ์Šค๋Š” ์ผ์ฐ!

  • ๋‚˜๋Š” ๋””์ž์ธ ๋ฌธ์„œ๋ฅผ ์ ‘๊ทผํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๊ฒƒ์€ ํ›Œ๋ฅญํ•˜๊ณ  ๋งค์šฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ฐ˜๋ณต์€ ๋‚ด ๋ˆˆ์— ํฐ ๊ฐœ์„ ์ด๋ฉฐ ์ด๊ฒƒ์ด ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฑฐ์˜ ๋ชจ๋“  ์ถ”๋ก ๊ณผ ๋…ผ๋ฆฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹จ์ผ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ง€์ •ํ•˜๋ฉด ๋ชจ๋‘์— ๋Œ€ํ•ด ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„๊ต๊ฐ€ ์ž˜ ๋ฉ๋‹ˆ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค์˜ ์œ ํ˜• ๋ชฉ๋ก์€ ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฐ์‚ฐ์ž ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋‚ซ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ๋‚ด ์ƒ๊ฐ์—๋Š” ์•„๋งˆ๋„ ์ถ”๊ฐ€ ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•œ ๊ฐ€์žฅ ํฐ ์˜์—ญ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์œ ํ˜• ์ถ”๋ก ์€ (์—ฌ์ „ํžˆ) ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ผ ์ธ์ˆ˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•œ ์ถ”๋ก ์€ ๋ช…ํ™•์„ฑ๋ณด๋‹ค ์˜๋ฆฌํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
  • ๋‚˜๋Š” ๊ทธ๋ž˜ํ”„ ์˜ˆ์ œ์—์„œ "์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค"๋ฅผ ์ข‹์•„ํ•œ๋‹ค. ๊ดœ์ฐฎ์•„.
  • (type *T constraint) ํฌ์ธํ„ฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
  • func(x(T)) ๋ณ€๊ฒฝ์— ์™„์ „ํžˆ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณตํ•ฉ ๋ฆฌํ„ฐ๋Ÿด์— ๋Œ€ํ•œ ์œ ํ˜• ์ถ”๋ก ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ๐Ÿ˜„

Go ํŒ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๐ŸŽ‰

https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-type-parameters.md#comparable -types-in-constraints

๋‚˜๋Š” ๋น„๊ต๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค ๋นŒ๋“œ ์œ ํ˜•์— ๊ฐ€๊น๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ œ์•ˆ ์ดˆ์•ˆ์˜ ์ž‘์€ ๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

type ComparableHasher interface {
    comparable
    Hash() uintptr
}

๋  ํ•„์š”๊ฐ€์žˆ๋‹ค

type ComparableHasher interface {
    type comparable
    Hash() uintptr
}

๋†€์ดํ„ฐ๋Š” ๋˜ํ•œ type comparable ์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://go2goplay.golang.org/p/mhrl0xYsMyj

ํŽธ์ง‘: Ian Lance Taylor์™€ Robert Griesemer๊ฐ€ go2go ๋„๊ตฌ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์ดˆ์•ˆ์ด ์•„๋‹ˆ๋ผ go2go ๋ฒˆ์—ญ๊ธฐ์˜ ์ž‘์€ ๋ฒ„๊ทธ์˜€์Šต๋‹ˆ๋‹ค. ๋””์ž์ธ ์ดˆ์•ˆ์ด ์ •ํ™•ํ•จ)

์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ๋งŒ์˜ ์ผ๋ฐ˜ ํ•ด์‹œ ํ…Œ์ด๋ธ” ๋“ฑ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ ๋งค์šฐ ์ œํ•œ์ ์ธ ISTM(ํŠนํžˆ ๋‚ด์žฅ ์ง€๋„์™€ ๋น„๊ต). ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ ๋งต์€ key-constraint๋กœ comparable ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ๋ฌผ๋ก  == ์™€ != ๋งŒ์œผ๋กœ๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ComparableHasher ์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ์ž์—๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ์ฑ…์ž„๋งŒ ์ „๋‹ฌํ•˜๋ฉฐ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์—๋Š” ๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋˜ํ•œ ํ˜ธ์ถœ์ž๋Š” ์ด์— ๋Œ€ํ•ด ์ฑ…์ž„์„ ์ง€์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค). ๋งˆ์ง€๋ง‰์œผ๋กœ ํฌ์ธํ„ฐ๋ฅผ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํฌ์ธํ„ฐ๋ฅผ uintptr ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด GC๊ฐ€ pointee๋ฅผ ์›€์ง์ด๊ณ  ๋ฒ„ํ‚ท์ด ๋ณ€๊ฒฝ๋  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค(์ด ๋ฌธ์ œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ฏธ๋ฆฌ ์„ ์–ธ๋œ func hash(type T comparable)(v T) uintptr ๋Š” ์•„๋งˆ๋„ ์ด์ƒ์ ์ด์ง€ ์•Š์€ ์†”๋ฃจ์…˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” "์‹ค์ œ๋กœ ์‹คํ˜„ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ๋Œ€๋‹ต์„ ์ž˜ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ–ˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. :)

@gertcuykens ์˜๋„ํ•œ ๋Œ€๋กœ comparable ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด go2go ๋„๊ตฌ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

@Merovius ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ํ•ด์‹œ ๊ธฐ๋Šฅ๊ณผ ์•„๋งˆ๋„ ์ž์‹ ์˜ ๋น„๊ต ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ๋งŒ์˜ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ https://golang.org/pkg/hash/maphash/ ํŒจํ‚ค์ง€๊ฐ€ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ ๊ฐ’์˜ ํ•ด์‹œ๋Š” ํ•ด๋‹น ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. uintptr ๋กœ ๋ณ€ํ™˜๋œ ํฌ์ธํ„ฐ์˜ ๊ฐ’์— ์˜์กดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ํ˜„์žฌ ๋„๊ตฌ ๊ตฌํ˜„์˜ ์ œํ•œ ์‚ฌํ•ญ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜ํ•ด ์ œ์•ฝ์„ ๋ฐ›๋Š” ์ œ๋„ค๋ฆญ ํ˜•์‹์„ ๋ฐ˜ํ™˜ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
https://go2goplay.golang.org/p/KYRFL-vrcUF

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

  • ๊ฝค ์žฌ๋ฏธ์žˆ์—ˆ์–ด์š”. ์ž‘๋™ํ•˜๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ๋””์ž์ธ์„ ๋ฐ˜๋ณตํ•  ๋•Œ ๋””์ž์ธ ๊ฒฐํ•จ์„ ์œ ํ˜• ์˜ค๋ฅ˜๋กœ ๋ณ€ํ™˜ํ•จ์œผ๋กœ์จ ์‹ค์ œ๋กœ ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ์ฃผ์„์„ ํฌํ•จํ•˜์—ฌ ~100 LOC์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ „๋ฐ˜์ ์œผ๋กœ ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝํ—˜์€ ๋งŒ์กฑ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. IMO.
  • ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ช…์‹œ์ ์ธ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ์ตœ์†Œํ•œ ํ˜•์‹ ์œ ์ถ”์™€ ํ•จ๊ป˜ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๋ก  ์„ค๊ณ„์— ์ข‹์€ ์ง•์กฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์˜ˆ์ œ๋Š” ์ถ”๊ฐ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Compose ์— ๋Œ€ํ•œ ์ตœ์ƒ์œ„ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ตฌ์„ฑ์ด ์—ญ์ˆœ์œผ๋กœ ์ผ์–ด๋‚œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ์— ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด Stage ๊ฐ€ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์ด ๋˜๋„๋ก ํ•˜๊ณ  func (s *Stage(A, B)) Compose(type C)(n int, f func(B) C) *Stage(A, C) ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์€ ๋ฐฐ๊ด€๋œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค(๋†€์ดํ„ฐ์˜ ์„ค๋ช… ์ฐธ์กฐ). ๋ฌผ๋ก  ๋‚ด๊ฐ€ ๋ณด์ง€ ๋ชปํ•œ ๊ธฐ์กด ์ดˆ์•ˆ์— ๋” ์šฐ์•„ํ•œ API๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€์ •์ ์ธ ๊ฒƒ์„ ์ฆ๋ช…ํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์ž‘์—… ์˜ˆ๋ฅผ ๋ณด๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ „๋ฐ˜์ ์œผ๋กœ, ๋‚˜๋Š” ์ƒˆ๋กœ์šด ์ดˆ์•ˆ, FWIW๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. :) IMO ๊ณ„์•ฝ ์ฒ ํšŒ๋Š” ๊ฐœ์„ ๋˜์—ˆ์œผ๋ฉฐ ์œ ํ˜• ๋ชฉ๋ก์„ ํ†ตํ•ด ํ•„์š”ํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์ •ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

[ํŽธ์ง‘: ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ์€ ์–ด๋ ต๋‹ค]

๋„๊ตฌ ๋ถ„๊ธฐ์— ๋Œ€ํ•œ ์งˆ๋ฌธ: ๋งˆ์ง€๋ง‰ go ๋ฆด๋ฆฌ์Šค(๊ทธ๋ž˜์„œ v1.15, v1.15.1, ...)๋ฅผ ๋”ฐ๋ผ๊ฐˆ ๊ฒƒ์ธ๊ฐ€?

@urandom : ์ฝ”๋“œ์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์€ Foo(T) ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ๊ฐ
์ด๋Ÿฌํ•œ ์œ ํ˜• ์ธ์Šคํ„ด์Šคํ™”๋Š” ์ƒˆ๋กœ์šด ์ •์˜ ์œ ํ˜•(์ด ๊ฒฝ์šฐ Foo(T))์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
(๋ฌผ๋ก  ์ฝ”๋“œ์— Foo(T)๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์œผ๋ฉด ๋ชจ๋‘ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
์ •์˜๋œ ์œ ํ˜•).

๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ ์œ ํ˜•์€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์ธ V์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ
์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” Valuer ์ธํ„ฐํŽ˜์ด์Šค์— ์˜ํ•ด ์ œํ•œ๋˜์ง€๋งŒ
_not_ ์ธํ„ฐํŽ˜์ด์Šค(๋˜๋Š” ์‹ฌ์ง€์–ด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค). V๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ๊ทธ ์ œ์•ฝ์— ์˜ํ•ด ๊ธฐ์ˆ ๋˜๋Š” ๊ฒƒ๋“ค์„ ์•Œ๊ณ  ์žˆ๋Š” ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ์œ ํ˜•.
ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ V๋ผ๋Š” ์ •์˜๋œ ์œ ํ˜•์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Foo(T) ์œ ํ˜•์˜ ๊ฐ’์„ V ์œ ํ˜•์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
(Foo(T)๋„ Valuer(T)๋„ ์•„๋‹ˆ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…๋œ ์†์„ฑ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ‰๊ฐ€์ž(T)). ๋”ฐ๋ผ์„œ ํ• ๋‹น์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

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

์•„๋งˆ๋„ ์ด๊ฒƒ์„ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค: https://go2goplay.golang.org/p/8Hz6eWSn8Ek?

@Inuart ๋„๊ตฌ ๋ถ„๊ธฐ๊ฐ€ dev.go2go ๋ถ„๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒฝ์šฐ: ์ด๊ฒƒ์€ ํ”„๋กœํ† ํƒ€์ž…์ด๋ฉฐ ํŽธ์˜๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ์‹คํ—˜ ๋ชฉ์ ์œผ๋กœ ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ๋†€๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ํ”„๋กœ๋•์…˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์œ„ํ•ด ๋ฒˆ์—ญ๊ธฐ์— _์‹ ๋ขฐํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฒƒ๋“ค์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ตฌ๋ฌธ๋„ ํฌํ•จ). ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋””์ž์ธ์„ ์กฐ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ตœ์‹  Go ๋ฆด๋ฆฌ์Šค๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๋œ ์ค‘์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

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

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

๊ฐ€๋…์„ฑ๊ณผ ๊ฒ€ํ† ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€๋Š” Go ๋„๊ตฌ์— ๋‹จ์ผ ํ˜•ํƒœ์˜ ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์„œ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ตœ์ข… ์ปดํŒŒ์ผ๋Ÿฌ ๊ตฌํ˜„์—์„œ ๋‹จ์ผํ™”๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ˜„ ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๋Š” ์ถ”๊ฐ€ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ๋†€์ดํ„ฐ์—์„œ๋„ ๊ทธ ๋Œ“๊ธ€์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๋Œ€์ฒด ํ˜ธ์ถœ ๊ตฌ๋ฌธ์ด ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ท€ํ•˜์˜ ์˜ˆ์ œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๊ฐ„์‹ ํžˆ ๋จธ๋ฆฌ๋ฅผ ๊ฐ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ํ”„ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. :)

๋”ฐ๋ผ์„œ Foo(T) ์œ ํ˜•์˜ ๊ฐ’์„ V ์œ ํ˜•์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
(Foo(T)๋„ Valuer(T)๋„ ์•„๋‹ˆ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…๋œ ์†์„ฑ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ‰๊ฐ€์ž(T)). ๋”ฐ๋ผ์„œ ํ• ๋‹น์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

ํ›Œ๋ฅญํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

...๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด HN ๊ฒŒ์‹œ๋ฌผ์ด Rust ๊ตฐ์ค‘์— ์˜ํ•ด ํ•˜์ด์žฌํ‚น๋˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. ์ œ์•ˆ์— ๋Œ€ํ•ด Gophers๋กœ๋ถ€ํ„ฐ ๋” ๋งŽ์€ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜๋”๋ผ๋ฉด ์ข‹์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ”๋‘‘ ํŒ€์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ์งˆ๋ฌธ:

  • ์ œ๋„ค๋ฆญ ํ”„๋กœํ† ํƒ€์ž…์˜ ์งˆ๋ฌธ/๋ฒ„๊ทธ์— ์ด github ๋ฌธ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์„ ํ˜ธํ•˜๋Š” ๋‹ค๋ฅธ ํฌ๋Ÿผ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
  • ์œ ํ˜• ๋ชฉ๋ก ์„ ๊ฐ€์ง€๊ณ  ๋†€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: https://go2goplay.golang.org/p/AAwSof_wT6t

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

type Addable interface {
    type int, float64
}

func Add(type T Addable)(a, b T) T {
  return a + b
}
type Addable interface {
    type int, float64, string
}

func Add(type T Addable)(a, b T) T {
  return a + b
}

์‹คํŒจ: invalid operation: operator + not defined for a (variable of type T)

๊ธ€์Ž„์š”, ์ด๊ฒƒ์€ ๊ฐ€์žฅ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ฆ๊ฑฐ์šด ๋†€๋ผ์›€์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€๋Š” ์‹ค์ œ๋กœ ์ด๊ฒƒ์„ ์‹œํ—˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๊ณง ๊ทธ๋ ‡๊ฒŒ ๋  ์ค„์€ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค.

์šฐ์„  ๋ฒ„๊ทธ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค: https://go2goplay.golang.org/p/1r0NQnJE-NZ

๋‘ ๋ฒˆ์งธ๋กœ, ์ €๋Š” iterator ์˜ˆ์ œ ๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ๊ทธ ์œ ํ˜• ์ถ”๋ก ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์— ์•ฝ๊ฐ„ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํ•„์š”ํ•œ ๋ชจ๋“  ์œ ํ˜• ์ •๋ณด๊ฐ€ ์ธ์ˆ˜๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์œ ํ˜•์„ ์œ ์ถ”ํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋˜ํ•œ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์ด ๋งํ–ˆ๋“ฏ์ด ๋ฉ”์„œ๋“œ ์„ ์–ธ ์ค‘์— ์ƒˆ ํ˜•์‹์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ด ์ง„ํ–‰๋˜๋Š” ํ•œ, ๋‹จ์ˆœํžˆ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ์ œ๋„ค๋ฆญ( type Example interface { Method(type T someConstraint)(v T) bool } )์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ตฌํ˜„์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์˜ ๋ณ€ํ˜•์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ํ˜ธ์ถœํ•˜๋„๋ก ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

```๊ฐ€๋‹ค
์œ ํ˜• ์ธํ„ฐํŽ˜์ด์Šค ์ธํ„ฐํŽ˜์ด์Šค {
Get(๋ฌธ์ž์—ด) ๋ฌธ์ž์—ด
}

์œ ํ˜• ์˜ˆ(์œ ํ˜• T) ๊ตฌ์กฐ์ฒด {
v T
}

// Interface.Get์ด Example.Get๋ณด๋‹ค ๋” ๊ตฌ์ฒด์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
func (e ์˜ˆ(T)) Get(์œ ํ˜• R)(v R) T {
๋ฐ˜ํ™˜ fmt.Sprintf("%v: %v", v, ev)
}

func DoSomething(์ธํ„ฐํŽ˜์ด์Šค ๊ฐ„) {
// ๊ธฐ๋ณธ์€ Example(string)์ด๊ณ  Example(string).Get(string)์€ ํ•„์ˆ˜์ด๋ฏ€๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
fmt.Println(inter.Get("์˜ˆ์ œ"))
}

ํ•จ์ˆ˜ ๋ฉ”์ธ() {
// Example(string).Get(string)์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ํ—ˆ์šฉ.
DoSomething(Example(string){v: "์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค."})
}

@DeedleFake ๊ฐ€์žฅ ๋จผ์ € ๋ณด๊ณ ํ•˜๋Š” ๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ˜„์žฌ https://go2goplay.golang.org/p/qo3hnviiN4k ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ค๊ณ„ ์ดˆ์•ˆ์— ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์—์„œ a(b) ์ž‘์„ฑ์€ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด a (b) ( a ๊ด„ํ˜ธ ํ˜•์‹ b )์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•ž์œผ๋กœ ๊ทธ๊ฒƒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Iterator ์˜ˆ์ œ๋Š” ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ์–ธ๋œป ๋ณด๊ธฐ์—๋Š” ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ (๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์˜ ์ง€์นจ)ํ•˜๊ณ  ๋‚˜์—๊ฒŒ ํ• ๋‹นํ•˜์‹ญ์‹œ์˜ค. ๊ฐ์‚ฌ ํ•ด์š”.

@Kashomon ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ(https://blog.golang.org/generics-next-step)์€ ํ† ๋ก ์„ ์œ„ํ•œ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์™€ ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๋ฌธ์ œ ์ œ์ถœ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

+ ์˜ ๋ฌธ์ œ๋Š” ์ด๋ฏธ ํ•ด๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@toolbox

๊ฐ€๋…์„ฑ๊ณผ ๊ฒ€ํ† ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€๋Š” Go ๋„๊ตฌ์— ๋‹จ์ผ ํ˜•ํƒœ์˜ ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์„œ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ตœ์ข… ์ปดํŒŒ์ผ๋Ÿฌ ๊ตฌํ˜„์—์„œ ๋‹จ์ผํ™”๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ˜„ ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

go2go ๋„๊ตฌ๊ฐ€ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. go tool go2go run x.go2 ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  go tool go2go translate x.go2 ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฒˆ์—ญ๋œ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ x.go ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ฝ๊ธฐ๊ฐ€ ์ƒ๋‹นํžˆ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์‰ฝ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

@griesemer

๋ฐ˜ํ™˜ ์ธ์ˆ˜๊ฐ€ ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ์™œ ๊ทธ๊ฒƒ์ด ์ œ๋„ค๋ฆญ ํ˜•์‹ ์ž์ฒด๊ฐ€ ๋  ์ˆ˜ ์—†๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋™์ผํ•œ ์ œ๋„ค๋ฆญ ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
https://go2goplay.golang.org/p/LuDrlT3zLRb
์œ ํ˜•์ด ์ด๋ฏธ ์ธ์Šคํ„ด์Šคํ™”๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

@urandom ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ ์ธ์ˆ˜๊ฐ€ ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ์™œ ๊ทธ๊ฒƒ์ด ์ œ๋„ค๋ฆญ ํ˜•์‹ ์ž์ฒด๊ฐ€ ๋  ์ˆ˜ ์—†๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ด๋ก ์ ์œผ๋กœ๋Š” ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ์ œ๋„ค๋ฆญ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์ œ๋„ค๋ฆญ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ํ•จ์ˆ˜ ๋ธ”๋ก, ์ฆ‰ ๋ฐ˜ํ™˜ ๊ฐ’์— ์˜ํ•ด ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’ ํŠœํ”Œ ๋˜๋Š” ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์˜ ํ•จ์ˆ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์œ ํ˜•(์ผ๋ฐ˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์˜ ์ธ์Šคํ„ด์Šคํ™” ๊ฒฐ์ •)์— ์˜ํ•ด ์™„์ „ํžˆ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

์ด๋ก ์ ์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’ ํŠœํ”Œ์— ์˜ํ•ด ๊ฒฐ์ •๋˜์ง€ ์•Š๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ณต๋˜์–ด์•ผ ํ•˜๋Š” ์ œ๋„ค๋ฆญ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

func f(type S)(i int) int
{
    s S =...
    return 2
}

์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

@urandom ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ผ€์ด์Šค๋ฅผ ๋†“์น  ๊ฒƒ์ด๋ผ๋Š” ํŠน์ • ์˜ˆ๋ฅผ ๋ฐ˜๋“œ์‹œ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ์งง์Šต๋‹ˆ๋‹ค. ํŠน์ • ์œ ํ˜•์ด ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋งŽ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ ๋ง์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์„œ๋ธŒํƒ€์ดํ•‘์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž… ์–ด์„ค์…˜์ด๋‚˜ ์„œ๋ธŒํƒ€์ดํ•‘์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  "ํ‘œํ˜„ ๋ฌธ์ œ"๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type Any interface {}

type Evaler(type t Any) interface {
  Eval() t
}

type Num struct {
  value int
}

func (n Num) Eval() int {
  return n.value
}

type Plus(type a Evaler(type t Any)) struct {
  left a
  right a
}

func (p Plus(type a Evaler(type t Any)) Eval() t {
  return p.left.Eval() + p.right.Eval()
}

func (p Plus(type a Evaler(type t Any)) String() string {
  return fmt.Sprintf("(%s+%s)", p.left, p.right)
}

type Expr interface {
  Evaler
  fmt.Stringer
}

func main() {
  var e Expr = Plus(Num){Num{1}, Num{2}}
  var v int = e.Eval() // 3
  var s string = e.String() // "(1+2)"
}

Eval ๋ฉ”์„œ๋“œ์˜ ์˜ค์šฉ์€ ๋ง์…ˆ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ํ˜•์‹์œผ๋กœ Plus์—์„œ Eval์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์žก์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. String()์„ ๋ถ€์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(๊ตฌ์กฐ์ฒด ์ถ”๊ฐ€ ๊ฐ€๋Šฅ) ์ข‹์€ ํ…Œ์ŠคํŠธ๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ์žก์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Go๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ "์ •ํ™•ํ•จ"๋ณด๋‹ค ๋‹จ์ˆœํ•จ์„ ํฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ธŒํƒ€์ดํ•‘์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ๋ฌธ์„œ์™€ ์‚ฌ์šฉ๋ฒ•์—์„œ ๋” ๋งŽ์€ ํ˜ผ๋ž€์ž…๋‹ˆ๋‹ค. ํ•˜์œ„ ์ž…๋ ฅ์ด ํ•„์š”ํ•œ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒ ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํŽธ์ง‘: ์˜ค๋ฅ˜ ์ˆ˜์ • ๋ฐ ๊ฐœ์„ 

์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ '<>'๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@99์œค
์—…๋ฐ์ดํŠธ๋œ ์ดˆ์•ˆ ์— ํฌํ•จ๋œ FAQ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๊ตฌ๋ฌธ F\๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ C++ ๋ฐ Java์ฒ˜๋Ÿผ?
v := F\์™€ ๊ฐ™์€ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ๋•Œ, <๋ฅผ ๋ณด๋Š” ์‹œ์ ์—์„œ ์œ ํ˜• ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ณด๊ณ  ์žˆ๋Š”์ง€ ๋˜๋Š” < ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ‘œํ˜„์‹์„ ๋ณด๊ณ  ์žˆ๋Š”์ง€ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ํšจ๊ณผ์ ์œผ๋กœ ๋ฌดํ•œํ•œ ์˜ˆ์ธก์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Go ํŒŒ์„œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

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

(*) ๋” ์ •ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด, ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋Š” ๊ณ ์œ ํ•œ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์‹ค์ œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๋“ค์˜ ์ œ์•ฝ์ด ์šฐ๋ฆฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ๋งŒํผ๋งŒ ๊ทธ๋“ค์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ ๊ตฌ์กฐ์ฒด์˜ 0 ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

func zero(type T)() T {
    var zero T
    return zero
}

๊ธฐ๋ณธ ์œ ํ˜•(int, float32 ๋“ฑ)์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด ์ƒํ™ฉ์ด ์ด์ƒํ•ด์ง‘๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type Opt(type T) struct {
    val T
}

func (o Opt(T)) Do() { /*stuff*/ }

๋ชจ๋‘ ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ:

opt := zero(Opt(int))
opt.Do() 

์ปดํŒŒ์ผ๋˜์ง€ ์•Š๊ณ  ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. opt.Do undefined (type func() Opt(int) has no field or method Do) ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ int๊ฐ€ Opt ์œ ํ˜•์˜ ์ผ๋ถ€์—ฌ์•ผ ํ•  ๋•Œ ํ•จ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ์ด์ƒํ•œ ๊ฒƒ์€ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

opt := zero(Opt)      //  But somehow this line compiles
opt(int).Do()         // This will panic

์–ด๋Š ๋ถ€๋ถ„์ด ๋ฒ„๊ทธ์ด๊ณ  ์–ด๋–ค ๋ถ€๋ถ„์ด ์˜๋„๋œ ๊ฒƒ์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ฝ”๋“œ: https://go2goplay.golang.org/p/M0VvyEYwbQU

@TotallyGamerJet

zero() ํ•จ์ˆ˜์—๋Š” ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์œ ํ˜• ์ถ”๋ก ์ด ์ง„ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. zero func๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•œ ๋‹ค์Œ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

opt := zero(Opt(int))()
opt.Do()

https://go2goplay.golang.org/p/N6ip-nm1BP-

@toolbox
์•„ ์˜ˆ. ๋‚˜๋Š” ๋‚ด๊ฐ€ ์œ ํ˜•์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๋ฒˆ์งธ ๊ด„ํ˜ธ ์„ธํŠธ๋ฅผ ์žŠ์–ด ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ด๋Ÿฌํ•œ ์ œ๋„ค๋ฆญ์— ์ต์ˆ™ํ•ด์ง€๊ณ  ์žˆ๋‹ค.

๋‚˜๋Š” ํ•ญ์ƒ Go์— ์ œ๋„ค๋ฆญ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์‹ค์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋””์ž์ธ ๊ฒฐ์ •์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ Go๋ฅผ ํ›จ์”ฌ ๋” ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๊ณ  ๋‚˜๋Š” ๋‹จ์ˆœํ•œ ๋ณต์‚ฌ ๋ณต์ œ์— ๋Œ€ํ•œ ๊ณผ๋„ํ•œ ํŽธ์ง‘์ฆ์„ ํ—ค์•„๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํšŒ์‚ฌ์—์„œ ์šฐ๋ฆฌ๋Š” ์ˆ˜๋งŽ์€ Go ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์ง€๋งŒ ์ œ๋„ค๋ฆญ์„ ์„ ํ˜ธํ•˜๋Š” ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋น„ํ•˜ํ•˜๋ ค๋Š” ์˜๋„๋Š” ์•„๋‹ˆ์ง€๋งŒ ์•„๋ฆ„๋‹ต๊ฒŒ ์„ค๊ณ„๋œ ์–ธ์–ด์˜ ํŒŒ๊ดด๋Š” ์ด๋ ‡๊ฒŒ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋ฌด์—‡ ํ–ฅํ›„ ๊ณ„ํš? ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ณ„์† ๋ณ€๊ฒฝํ•˜๋ฉด "C++" ๋˜๋Š” "JavaScript"๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์›๋ž˜๋Œ€๋กœ ๊ฐ€์‹ญ์‹œ์˜ค!

@iio7 ๋‚˜๋Š” ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ๋‚ฎ์€ IQ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋ฏธ๋ž˜๋Š” ๋‚ด๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๋Œ€ ๊ด‘๊ณ ๋Š” ๋‹จ์ง€ ์ œ๋„ค๋ฆญ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๋””์ž์ธ์ด ํ˜„์žฌ ์ œ์•ˆ์—์„œ ์–ธ์–ด ๋ณ€๊ฒฝ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ผ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์—ฌ์ „ํžˆ ์ผ๋ถ€ ์ผ๋ฐ˜ ๋ฐ ๊ธฐ๋Šฅ์  ์žฅ์ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ฐฝ์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ํฅ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์˜คํ•ดํ•˜์ง€ ๋งˆ์„ธ์š”. ํŒ€์—๋Š” ํ•ญ์ƒ ๋กœ์ผ“ ๊ณผํ•™์ž์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ๊ณ  ์ €์™€ ์›์ˆญ์ด๋Š” ๊ทธ๋ ‡๊ฒŒ ์ดํ•ดํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ž˜์„œ ์ง€๊ธˆ ๋ณด๊ณ  ์žˆ๋Š” ์˜ˆ๋Š” ๋กœ์ผ“ ๊ณผํ•™์ž๊ฐ€ ๋งŒ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ, ์ฝ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฌ์ง€๋งŒ ๊ฒฐ๊ตญ์—๋Š” ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฑฐ์ณ ๊ทธ๋“ค์ด ๋ฌด์—‡์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ ค๊ณ  ํ•˜๋Š”์ง€ ์••๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ Ian๊ณผ Robert ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ์‹ ๋ขฐํ•œ๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์•„์ง ๋””์ž์ธ์ด ๋๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์•„๋ฌด๋ฆฌ ์–ด๋ ค์šด ๋กœ์ผ“ ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ๋˜์ง€๋”๋ผ๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์™„๋ฒฝํ•˜๊ณ  ๋‹จ์ˆœํ•œ ์›์ˆญ์ด ์–ธ์–ด๋ฅผ ๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ๊ฐ€ 1๋…„ ์ •๋„ ์ง€๋‚˜๋ฉด ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ํ”ผ๋“œ๋ฐฑ์€ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ์–ด๋–ค ๊ฒƒ์ด ์ง€๋‚˜์น˜๊ฒŒ ์—”์ง€๋‹ˆ์–ด๋ง๋œ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ์ง€์ ํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์˜์‚ฌ ๋„๊ตฌ์™€ ๊ฐ™์€ ๋„๊ตฌ๋กœ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<> ์— ๊ด€ํ•œ FAQ๋ฅผ ์ฝ์—ˆ์ง€๋งŒ ๋‚˜ ๊ฐ™์€ ์–ด๋ฆฌ์„์€ ์‚ฌ๋žŒ์˜ ๊ฒฝ์šฐ v := F(T) ๊ฐ€ ์•„๋‹ˆ๋ผ v := F<T> ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒฝ์šฐ ํŒŒ์„œ๊ฐ€ ์ผ๋ฐ˜ ํ˜ธ์ถœ์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ค์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. v := F(T) ? T๋ฅผ ์ •๊ทœ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ธ์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๊ฒŒ๋‹ค๊ฐ€ ํŒŒ์„œ๋Š” ๋ฌผ๋ก  ๋น ๋ฅด๊ฒŒ ์œ ์ง€๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์–ด๋Š ๊ฒƒ์ด IMO์—์„œ ๋˜‘๊ฐ™์ด ์ค‘์š”ํ•œ์ง€๋ฅผ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋„ ์žŠ์ง€ ๋ง์ž. v := F(T) ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋ฐ”๋กœ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด v := F<T> ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๊นŒ? ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค :)

v := F<T> ์— ๋Œ€ํ•ด ์ฐฌ์„ฑ๋„ ๋ฐ˜๋Œ€๋„ ํ•˜์ง€ ์•Š๊ณ  ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ์ œ๊ธฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ํ•ฉ๋ฒ•์ ์ธ Go์ž…๋‹ˆ๋‹ค .

    f, c, d, e := 1, 2, 3, 4
    a, b := f < c, d > (e)
    fmt.Println(a, b) // true false

๊บพ์‡  ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ์ œ์•ˆ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ํ•œ ๊บพ์‡  ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(๋ณต๊ท€ ํ˜ธํ™˜์„ฑ?). ๊ทธ๊ฒƒ์€ ๋ชจ๋“  ์˜๋„์™€ ๋ชฉ์ ์„ ์œ„ํ•ด ์ฃฝ์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋ฐ”๋‘‘ ํŒ€์ด ๊บพ์‡  ๊ด„ํ˜ธ๋ฅผ ์ฑ„ํƒํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์‚ฌ์‹ค์ƒ 0์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌํ•ญ์„ ๋…ผ์˜ํ•˜์‹ญ์‹œ์˜ค.

์ถ”๊ฐ€ํ•  ํŽธ์ง‘: ์ด ๋Œ“๊ธ€์ด ๋„ˆ๋ฌด ์งค๋ง‰ํ–ˆ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. Reddit๊ณผ HN์—์„œ ๊บพ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ๋งŽ์ด ์žˆ๋Š”๋ฐ, ์ œ๋„ค๋ฆญ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์˜ค๋ž˜์ „๋ถ€ํ„ฐ ์—ญํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ์ž˜ ์•Œ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ €์—๊ฒŒ๋Š” ๋งค์šฐ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๊บพ์‡  ๊ด„ํ˜ธ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€๋งŒ ์ฃผ์š” ๋ณ€๊ฒฝ ์—†์ด๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@iio7์˜ ์˜๊ฒฌ์„ ๋ณด๋‚ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ผ์ด ์†์—์„œ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์ด ํ•ญ์ƒ 0์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ๊ทธ ๊ณผ์ •์—์„œ ์ตœ๋Œ€ํ•œ์˜ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ธ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์ง€๊ธˆ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์ž‘๋…„๋ณด๋‹ค ํ›จ์”ฌ ๊นจ๋—ํ•˜๊ณ  ์ง๊ต์ ์ธ ๋””์ž์ธ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ ํŠนํžˆ ์œ ํ˜• ๋ชฉ๋ก๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋” ๋ฐฐ์šฐ๋ฉด์„œ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๋‹ค์†Œ ์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ ๋””์ž์ธ์ด ๋” ์ง๊ตํ•˜๊ณ  ๊นจ๋—ํ• ์ˆ˜๋ก ๋” ๊ฐ•๋ ฅํ•ด์ง€๊ณ  ๋” ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ๋งˆ์ง€๋ง‰ ๋‹จ์–ด๋Š” ์•„์ง ๋‚˜์˜ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ž‘๋…„์— ์šฐ๋ฆฌ๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฒซ ๋ฒˆ์งธ ๋””์ž์ธ์„ ๊ฐ€์กŒ์„ ๋•Œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ๋ฐ˜์‘์€ "์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ์ด๊ฒƒ์„ ์›ํ•˜๋Š”๊ฐ€?"์™€ ๊ฐ™์€ ๋ฐ˜์‘์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•œ ์งˆ๋ฌธ์ด๋ฉฐ ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ์ž˜ ๋Œ€๋‹ตํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ผ๋ฐ˜ ์ฝ”๋“œ๊ฐ€ ๋ถ„๋ช…ํžˆ ์Šน๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ๋ฏธ๋ฌ˜ํ•œ ์ฝ”๋“œ๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ๋™์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹ค์–‘ํ•œ ์ปจํ…Œ์ด๋„ˆ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ์ •๋ ฌ ๋“ฑ๊ณผ โ€‹โ€‹๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋Œ€๋‹ค์ˆ˜์˜ ์ฝ”๋“œ์—๋Š” ์ œ๋„ค๋ฆญ์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๊ธฐ๋Šฅ์ด ์–ธ์–ด์˜ ๋งŽ์€ ๋ถ€๋ถ„์—์„œ ์ค‘์‹ฌ์ ์ธ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ Go์—์„œ ์ผ๋ฐ˜ ๊ธฐ๋Šฅ์€ Go ๋„๊ตฌ ์„ธํŠธ์˜ ๋˜ ๋‹ค๋ฅธ ๋„๊ตฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์ด ๊ทธ ์œ„์— ๊ตฌ์ถ•๋˜๋Š” ๊ธฐ๋ณธ ๋นŒ๋”ฉ ๋ธ”๋ก์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋น„๊ต๋ฅผ ์œ„ํ•ด: Go์˜ ์ดˆ๊ธฐ์— ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ๊ณ ๋ฃจํ‹ด๊ณผ ์ฑ„๋„์„ ๋‚จ์šฉํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์–ธ์ œ ์ ์ ˆํ•˜๊ณ  ์ ์ ˆํ•˜์ง€ ์•Š์€์ง€ ๋ฐฐ์šฐ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ์–ด๋Š ์ •๋„ ํ™•๋ฆฝ๋œ ์ง€์นจ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ •๋ง๋กœ ์ ์ ˆํ•œ ๊ฒฝ์šฐ์—๋งŒ ๊ทธ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”.

[T] ๊ธฐ๋ฐ˜ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ดˆ์•ˆ ๋””์ž์ธ ์„น์…˜์—์„œ:

์–ธ์–ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก์—์„œ ํ›„ํ–‰ ์‰ผํ‘œ๋ฅผ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ A๊ฐ€ ์ œ๋„ค๋ฆญ ์œ ํ˜•์ธ ๊ฒฝ์šฐ A[T,]๊ฐ€ ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ๋ฑ์Šค ํ‘œํ˜„์‹์—๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒŒ์„œ๋Š” A๊ฐ€ ์ œ๋„ค๋ฆญ ์œ ํ˜•์ธ์ง€ ์Šฌ๋ผ์ด์Šค, ๋ฐฐ์—ด ๋˜๋Š” ๋งต ์œ ํ˜•์˜ ๊ฐ’์ธ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ด ๊ตฌ๋ฌธ ๋ถ„์„ ์˜ค๋ฅ˜๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ณด๊ณ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ํ’€ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค ํ‘œํ˜„์‹์—์„œ ํ›„ํ–‰ ์‰ผํ‘œ๋ฅผ ์™„์ „ํžˆ ํ•ฉ๋ฒ•์ ์œผ๋กœ ๋งŒ๋“  ๋‹ค์Œ gofmt ์ œ๊ฑฐํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

@DeedleFake ์•„๋งˆ๋„. ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ์‰ฌ์šด ํƒˆ์ถœ๊ตฌ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ๊ตฌ๋ฌธ์ƒ ์•ฝ๊ฐ„ ์ถ”ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ชจ๋‘ ๊ธฐ์–ต๋‚˜์ง€ ์•Š์ง€๋งŒ ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” [type T] ์Šคํƒ€์ผ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค. dev.go2go ๋ถ„๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์ง€์›์ด ์ œ๊ฑฐ๋œ 3d4810b5ba๋ฅผ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๋‹ค์‹œ ํŒŒํ—ค์น˜๊ณ  ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ [] ๋ชฉ๋ก์— ์žˆ๋Š” ์ œ๋„ค๋ฆญ ์ธ์ˆ˜์˜ ๊ธธ์ด๋Š” ๋‚ด์žฅ ์ œ๋„ค๋ฆญ ์œ ํ˜•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๋ถ€๋ถ„์˜ ํ•˜๋‚˜๋กœ ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

  • [์—”]ํ‹ฐ
  • []ํ‹ฐ
  • ๋งต[K]T
  • ์ฐฌ ํ‹ฐ

๋‚ด์žฅ ์ œ๋„ค๋ฆญ ์œ ํ˜•์˜ ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋Š” ๋ชจ๋‘ [] ๋กœ ๋ฌถ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜ ์„ ์–ธ ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/dotaheor/unify-Go-builtin-and-custom-generics#the -generic-declaration-syntax

@dotaheor ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์š”๊ตฌํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ œ๋„ค๋ฆญ ์œ ํ˜•์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ์œ ํ˜• ์ธ์ˆ˜๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-type-parameters.md#containers .

@ianlancetaylor
๋‚ด ๋ง์€ ๊ฐ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ [] ๋กœ ๋ฌถ์—ฌ ์žˆ์œผ๋ฏ€๋กœ ๋งํฌ์˜ ์œ ํ˜•์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

type Map[type K][type V] struct

์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

var m Map[string]int

[] ๋กœ ๋ฌถ์ด์ง€ ์•Š์€ ํ˜•์‹ ์ธ์ˆ˜๋Š” ์ œ๋„ค๋ฆญ ํ˜•์‹ ์‚ฌ์šฉ์ด ์ข…๋ฃŒ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ๊ณผ ํ•จ๊ป˜ ๋ฐฐ์—ด #39355๋ฅผ ์ฃผ๋ฌธํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๋™์•ˆ ํ˜„์žฌ ์ œ๋„ค๋ฆญ ๋“œ๋ž˜ํ”„ํŠธ์—์„œ "๋น„๊ต ๊ฐ€๋Šฅํ•œ"์ด ํŠน๋ณ„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค(์•„๋งˆ๋„ ์œ ํ˜• ๋ชฉ๋ก์—์„œ ๋ชจ๋“  ๋น„๊ต ๊ฐ€๋Šฅํ•œ ์œ ํ˜•์„ ์‰ฝ๊ฒŒ ๋‚˜์—ดํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Œ). .

"comparable"์ด ๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ "ordered"/"orderable"๋„ ์ •์˜ํ•˜๋„๋ก ์ œ๋„ค๋ฆญ ์ดˆ์•ˆ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ ์œ ํ˜•์˜ ๊ฐ’์— ๋Œ€ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ด€๋ จ ๊ด€๊ณ„๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด go ์–ธ์–ด์˜ ํ–ฅํ›„ ํ™•์žฅ์„ ํ†ตํ•ด ๋” ๋งŽ์€ ์œ ํ˜•(๋ฐฐ์—ด, ๊ตฌ์กฐ์ฒด, ์Šฌ๋ผ์ด์Šค, ํ•ฉ๊ณ„ ์œ ํ˜•, ํ™•์ธ๋œ ์—ด๊ฑฐํ˜• ๋“ฑ)์— ๋Œ€ํ•œ ์ˆœ์„œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ •๋ ฌ๋œ ์œ ํ˜•์ด "๋น„๊ต ๊ฐ€๋Šฅ"๊ณผ ๊ฐ™์€ ์œ ํ˜• ๋ชฉ๋ก์— ๋‚˜์—ด๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

@martisch ๋‚ด ์ƒ๊ฐ์— ์ด๊ฒƒ์€ ์ •๋ ฌ๋œ ์œ ํ˜• ์ด ํ™•์žฅ๋œ ํ›„์—๋งŒ ๋ฐœ์ƒํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ constraints.Ordered ๋Š” ๋ชจ๋“  ์œ ํ˜•์„ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( $#$ ordered comparable ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ, ๊ตฌ์กฐ์ฒด, ๋ฐฐ์—ดโ€ฆ ordered ๋Š” ํ˜„์žฌ ๊ธฐ๋ณธ ์ œ๊ณต ์œ ํ˜•์˜ ์œ ํ•œ ์ง‘ํ•ฉ์œผ๋กœ ์ œํ•œ๋˜์–ด ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ์ด์— ์˜์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด) ์ˆœ์„œ๋ฅผ ๋ฐฐ์—ด๋กœ ํ™•์žฅํ•˜๋ฉด ์—ฌ์ „ํžˆ ์ƒˆ๋กœ์šด ๋งˆ๋ฒ•์˜ ordered ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜๊ณ  constraints.Ordered ์— ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” constraints.Ordered ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ ์ œ์•ฝ ์กฐ๊ฑด์˜ ํ˜œํƒ์„ ์ž๋™์œผ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ช…์‹œ์  ์œ ํ˜• ๋ชฉ๋ก์„ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” ์ด์ ์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ ordered ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ์ด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ์—๋Š” ๋™์ผ ํ•ฉ๋‹ˆ๋‹ค .

๋”ฐ๋ผ์„œ IMO๋Š” ์‹ค์ œ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ง€์—ฐํ•˜๋Š” ๋ฐ ์†์‹ค์ด ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „ ์„ ์–ธ๋œ ์‹๋ณ„์ž๋กœ ๊ฐ€๋Šฅํ•œ ์ œ์•ฝ ์กฐ๊ฑด ์„ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

(์˜ˆ๋ฅผ ๋“ค์–ด) ์ˆœ์„œ๋ฅผ ๋ฐฐ์—ด๋กœ ํ™•์žฅํ•˜๋ฉด ์—ฌ์ „ํžˆ ์ƒˆ๋กœ์šด ๋งˆ๋ฒ•์˜ ordered ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜๊ณ  constraints.Ordered ์— ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Merovius ์ƒ๊ฐ์ง€๋„ ๋ชปํ•œ ์ข‹์€ ์ง€์ ์ด๋„ค์š”. ์ด๋ฅผ ํ†ตํ•ด ํ–ฅํ›„ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ constraints.Ordered ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. constraints.Comparable ๋„ ์žˆ์œผ๋ฉด ์ „์ฒด ๊ตฌ์กฐ์— ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค.

@martisch , comparable ordered ๋Š” ๊ตฌ์ฒด์ ์ธ ์œ ํ˜• ๊ฐ„์˜ (์ „์—ญ) ์ด ์ˆœ์„œ๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์ผ๋ฐ˜ ์ฝ”๋“œ๊ฐ€ < ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์œผ๋กœ ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ordered ์œ ํ˜•์˜ ๋ณ€์ˆ˜์— < ๋˜๋Š” comparable ๋ฅผ ์ผ๋ฐ˜ ๋Ÿฐํƒ€์ž„ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด "๊ตฌํ˜„"์˜ ์ดํ–‰์„ฑ์ด ๋ฌด๋„ˆ์ง‘๋‹ˆ๋‹ค. ๋‹ค์Œ ํ”„๋กœ๊ทธ๋žจ ์กฐ๊ฐ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

    var x constraints.Ordered = int(0)
    var y constraints.Ordered = string("0")
    fmt.Println(x < y)

๋ฌด์—‡์„ ์ถœ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? (๋‹ต์€ ์ง๊ด€์ ์ธ๊ฐ€, ์ž„์˜์ ์ธ๊ฐ€?)

@bcmills
fun (<)(type T Ordered)(t1 T,t2 T) Bool? ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์‚ฐ์ˆ  ์œ ํ˜•์„ ๋น„๊ตํ•˜๋ ค๋ฉด:

S ์‚ฐ์ˆ ์ด $# S<:T Ordered(T) ๋งŒ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

//Isn't possible I think
interface SorT(S,T)
{ 
type S,T
}

fun (<)(type R SorT(S,T), S Ordered(R), T Ordered(R))(s S, t T) Bool

๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„ ๋‹คํ˜•์„ฑ์˜ ๊ฒฝ์šฐ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ๊ฐ€๋Šฅํ•˜๋„๋ก Ordered๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋˜๋Š”:
Ordered๋ฅผ ํŠœํ”Œ ์œ ํ˜•์œผ๋กœ ๋ถ„ํ• ํ•œ ๋‹ค์Œ (<) ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

//but isn't supported that either
fun(<)(type R Ordered)(s R.0,t R.1)

์•ˆ๋…•!
์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ํ˜•์‹ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์ œ๋„ค๋ฆญ ํ˜•์‹๋งŒ ์ „๋‹ฌํ•˜๋Š” ํ˜•์‹ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?
Result(T) / Option(T) /etc ๋งŒ ์ „๋‹ฌํ•˜์ง€๋งŒ T ๋งŒ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
๋‚˜๋Š” ์‹œ๋„ํ–ˆ๋‹ค

type Box(type T) interface {
    Val() (T, bool)
}

ํ•˜์ง€๋งŒ Val() ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

type Box(type T) interface{}

interface{} ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: Any ).

https://go2goplay.golang.org/p/lkbTI7ypmh๋„ ์‹œ๋„ -> ์ปดํŒŒ์ผ ์‹คํŒจ

type Box(type T) interface {
       type Box(T)
}

https://go2goplay.golang.org/p/5NsKWNa3E1k -> ์ปดํŒŒ์ผ ์‹คํŒจ

type Box(type T) interface{}

type Generic(type T) interface {
    type Box(T)
}

https://go2goplay.golang.org/p/CKzE2J-YOpD -> ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

type Box(type T) interface{}

type Generic(type T Box(T)) interface {}

์ด ๋™์ž‘์ด ์˜ˆ์ƒ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ์œ ํ˜• ๊ฒ€์‚ฌ ๋ฒ„๊ทธ์ž…๋‹ˆ๊นŒ?

@tdakkota ์ œ์•ฝ ์กฐ๊ฑด์€ ํ˜•์‹ ์ธ์ˆ˜์— ์ ์šฉ๋˜๋ฉฐ ์™„์ „ํžˆ ์ธ์Šคํ„ด์Šคํ™”๋œ ํ˜•์‹ ์ธ์ˆ˜ ํ˜•์‹์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ˜•์‹ ์ธ์ˆ˜์˜ ์ธ์Šคํ„ด์Šคํ™”๋˜์ง€ ์•Š์€ ํ˜•์‹์— ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋Š” ํ˜•์‹ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ž‘์„ฑํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ๋œ ์ดˆ์•ˆ ์— ํฌํ•จ๋œ FAQ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๊ตฌ๋ฌธ F๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ C++ ๋ฐ Java์ฒ˜๋Ÿผ?
v := F์™€ ๊ฐ™์€ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ๋•Œ, <๋ฅผ ๋ณด๋Š” ์‹œ์ ์—์„œ ์œ ํ˜• ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ณด๊ณ  ์žˆ๋Š”์ง€ ๋˜๋Š” < ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ‘œํ˜„์‹์„ ๋ณด๊ณ  ์žˆ๋Š”์ง€ ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ํšจ๊ณผ์ ์œผ๋กœ ๋ฌดํ•œํ•œ ์˜ˆ์ธก์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Go ํŒŒ์„œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

@TotallyGamerJet ๋ฌด์—‡์ด๋“ !

์ œ๋„ค๋ฆญ ์œ ํ˜•์˜ 0 ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? enum์ด ์—†์œผ๋ฉด ์„ ํƒ์  ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์˜ˆ๋ฅผ ๋“ค์–ด: vector First ๋ผ๋Š” ํ•จ์ˆ˜๋Š” ๊ธธ์ด > 0์ธ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ œ๋„ค๋ฆญ ์œ ํ˜•์˜ ๊ฐ’์ด 0์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๊นŒ? ๋ฒกํ„ฐ์˜ ์–ด๋–ค ์œ ํ˜•์ธ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— chan/slice/map ์ด๋ฉด return (nil, false) , if struct ๋˜๋Š” primitive type like string ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. , int , bool , ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?

@leaxoy

var zero T ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

@leaxoy

var zero T ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

nil ์™€ ๊ฐ™์€ ์ „์—ญ ๋งค์ง ๋ณ€์ˆ˜ ?

@leaxoy
var zero T ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

nil ์™€ ๊ฐ™์€ ์ „์—ญ ๋งค์ง ๋ณ€์ˆ˜ ?

์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๋…ผ์˜ ์ค‘์ธ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค . ์ œ์•ˆ: Go 2: ํ˜•์‹ ์œ ์ถ” #35966์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ”์šฉ 0 ๊ฐ’์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ•ญ์ƒ ํ˜•์‹์˜ 0 ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ‘œํ˜„์‹( var zero T ์™€ ๊ฐ™์€ ๋ฌธ์ด ์•„๋‹˜)์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๋Œ€์ฒด ๊ตฌ๋ฌธ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

0 ๊ฐ’์€ ํ˜„์žฌ ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์Šคํƒ์ด๋‚˜ ํž™์—์„œ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? enum Option ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ๋‹จ๊ณ„๋กœ ์™„๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0 ๊ฐ’์ด ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์ง€ ์•Š์œผ๋ฉด ๋” ์ข‹๊ณ  ์ถ”๊ฐ€ ์—ด๊ฑฐํ˜•์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

0 ๊ฐ’์€ ํ˜„์žฌ ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์Šคํƒ์ด๋‚˜ ํž™์—์„œ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ญ์‚ฌ์ ์œผ๋กœ Go ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ฒฝ์šฐ๋ฅผ ์ตœ์ ํ™”ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ณ„๋กœ ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ธฐ๋ณธ ์œ ํ˜• ๊ฐ’์€ C++ ํ…œํ”Œ๋ฆฟ์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. go ์ œ๋„ค๋ฆญ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๊ฐ€ ๊ณ ๋ ค๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์ž ์žฌ์ ์œผ๋กœ ์ด๊ฒƒ์€ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ๊ธฐ์กด ์œ ํ˜•์„ ๊ฐœ์กฐํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด $ []int ์ธ ๊ธฐ์กด asn1.ObjectIdentifier ์œ ํ˜•์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์ด ์œ ํ˜•์˜ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ASN.1 ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์‚ฌ์–‘์—์„œ๋Š” ๊ฐ ํ•˜์œ„ oid๊ฐ€ ์ž„์˜์˜ ๊ธธ์ด(์˜ˆ: *big.Int )์˜ INTEGER์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. ์ž ์žฌ์ ์œผ๋กœ ObjectIdentifier ๋Š” ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ์ˆ˜์ •๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. int ๋ฅผ ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ฐœ์กฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

type SignedInteger interface {
    type int, int32, int64, *big.Int
}
type ObjectIdentifier(type T SignedInteger) []T
// type ObjectIdentifier(type T SignedInteger=int) []T  // `int` would be the default instantiation type.

// New code with generic awareness would compile in go2.
var oid1 ObjectIdentifier(int) = ObjectIdentifier(int){1, 2, 3}

// But existing code would fail to compile:
var oid1 ObjectIdentifier = ObjectIdentifier{1, 2, 3}

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด ์œ„์˜ asn1.ObjectIdentifier ๋Š” ์˜ˆ์‹œ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ASN.1 ๊ทœ์ • ์ค€์ˆ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ• ๋˜๋Š” ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋˜ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ๊ฐ€๋Šฅํ•œ ์œ ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฒฝ๊ณ„๋ฅผ โ€‹โ€‹ํ—ˆ์šฉํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?:

type Ordable(type T, S) interface {
    type S, type T
}

์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์˜ where ์กฐ๊ฑด์„ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•.
๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

type Vector(type T) struct {
    vec []T
}

func (v Vector(T)) Sum() T where T: Summable {
      //
}

func (v Vector(T)) First()  (T, bool) {
     //
}

Sum ๋ฉ”์†Œ๋“œ๋Š” T ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ Summable ์ผ ๋•Œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Vector์—์„œ Sum ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @leaxoy

https://go2goplay.golang.org/p/pRznN30Qu8V ์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type Addable interface {
    type int, uint
}

type SummableVector(type T Addable) Vector(T)

func (v SummableVector(T)) Sum() T {
    var r T
    for _, i := range v.vec {
        r = r + i
    }
    return r
}

where ์ ˆ์ด Go์™€ ์œ ์‚ฌํ•˜์ง€ ์•Š๊ณ  ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

type Vector(type T) struct {
    vec []T
}

func (v Vector(T Summable)) Sum() T {
      //
}

func (v Vector(T)) First()  (T, bool) {
     //
}

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋ฐฉ๋ฒ• ์ „๋ฌธํ™”์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

@sebastien-rosset ์šฐ๋ฆฌ๋Š” ์ œ๋„ค๋ฆญ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์œ ํ˜•์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ์–ธ์–ด์—๋Š” ํ•จ์ˆ˜ ์ธ์ˆ˜์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ฐ’์ด ์—†์œผ๋ฉฐ ์ œ๋„ค๋ฆญ์ด ๋‹ค๋ฅธ ์ด์œ ๋„ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ํŒจํ‚ค์ง€์™€ ํ˜ธํ™˜๋˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์ด ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋„๋ก ์š”๊ตฌํ•˜๊ฑฐ๋‚˜ ๋‹จ์ˆœํžˆ ์ƒˆ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๋„ค๋ฆญ ์ฝ”๋“œ๋ฅผ ๋„์ž…ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

@์‹œ๊ณ ์•ผ

๋˜ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ๊ฐ€๋Šฅํ•œ ์œ ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฒฝ๊ณ„๋ฅผ โ€‹โ€‹ํ—ˆ์šฉํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์งˆ๋ฌธ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ(https://blog.golang.org/generics-next-step)์—์„œ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์ด์Šˆ ํŠธ๋ž˜์ปค๊ฐ€ ์•„๋‹ˆ๋ผ golang-nuts ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜๊ณ  ์žˆ์Œ์„ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ƒ๊ธฐ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๊ณ„์† ์ฝ์„ ๊ฒƒ์ด์ง€๋งŒ ๋Œ“๊ธ€ ์Šค๋ ˆ๋”ฉ์ด ์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ ์ถ”์ ๊ธฐ์˜ ๋‹ค๋ฅธ ์–ด๋ ค์›€ ์™ธ์— ๊ฑฐ์˜ 800๊ฐœ์˜ ๋Œ“๊ธ€์ด ์žˆ๊ณ  ์™„์ „ํžˆ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

ํ”ผ๋“œ๋ฐฑ: ์ €๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์˜ Go Time ํŒŸ์บ์ŠคํŠธ๋ฅผ ๋“ค์—ˆ๊ณ , ๊บพ์‡  ๊ด„ํ˜ธ ๋ฌธ์ œ์— ๋Œ€ํ•œ @griesemer ์˜ ์„ค๋ช…์ด ์ œ๊ฐ€ ์ฒ˜์Œ ์œผ๋กœ ๊ทธ๊ฒƒ์„ ์ดํ•ดํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ "ํŒŒ์„œ์— ๋Œ€ํ•œ ๋ฌดํ•œํ•œ ์˜ˆ์ธก"์ด ์‹ค์ œ๋กœ ์˜๋ฏธ ํ•˜๋Š” ๊ฒƒ์€ ์ด๋™์„ ์œ„ํ•ด? ๊ฑฐ๊ธฐ์— ์ถ”๊ฐ€ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ฃผ์…”์„œ ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ €๋Š” ๋Œ€๊ด„ํ˜ธ๋ฅผ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜„

@ianlancetaylor

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์€ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ํ† ๋ก ์ด ์ด์Šˆ ํŠธ๋ž˜์ปค๊ฐ€ ์•„๋‹Œ golang-nuts ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ตœ๊ทผ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ[1]์—์„œ @ddevault ๋Š” Google ๊ทธ๋ฃน(๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ๊ณณ)์— Google ๊ณ„์ •์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์‹œํ•˜๋ ค๋ฉด ๊ณ„์ •์ด ํ•„์š”ํ•˜๊ณ  ์ผ๋ถ€ ๊ทธ๋ฃน์€ ์ฝ๊ธฐ ์œ„ํ•ด ๊ณ„์ •์ด ํ•„์š”ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” Google ๊ณ„์ •์ด ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์€ ์ €์—๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋˜ํ•œ ํ•ด๋‹น ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์˜ ๋ชจ๋“  ๋‚ด์šฉ์— ๋™์˜ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๋„ ์•„๋‹™๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ๋ณด๋‹ค ์ •์˜๋กœ์šด golang ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์›ํ•˜๊ณ  ๋ฐ˜ํ–ฅ์‹ค์„ ํ”ผํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์—†๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฑด๋ฐฐ!

[1] https://drewdevault.com/2020/08/01/pkg-go-dev-sucks.html

@purpleidea ๋ชจ๋“  Google ๊ทธ๋ฃน์„ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๊ธ€ ๊ณ„์ • ์—†์ด๋„ ๊ฐ€์ž… ๋ฐ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ianlancetaylor

๋ชจ๋“  Google ๊ทธ๋ฃน์„ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๊ธ€ ๊ณ„์ • ์—†์ด๋„ ๊ฐ€์ž… ๋ฐ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ฐˆ ๋•Œ:

https://groups.google.com/forum/#!forum/golang -nuts

๊ฐœ์ธ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์—์„œ(๋‚ด๊ฐ€ ๋กœ๊ทธ์ธํ•œ Google ๊ณ„์ •์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด) "์ƒˆ ์ฃผ์ œ"๋ฅผ ํด๋ฆญํ•˜๋ฉด Google ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค. Google ๊ณ„์ • ์—†์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

@purpleidea [email protected] ์— ์ด๋ฉ”์ผ์„ ์ž‘์„ฑํ•˜์—ฌ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์›น ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ Google ๊ณ„์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ณตํ‰ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ์ด๋ฉ”์ผ ์ฃผ์†Œ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๊ทธ๋ฃน์Šค๋Š” ๋ถ„๋ช…ํžˆ Gmail ๊ณ„์ •์—์„œ๋งŒ ๋ฉ”์ผ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  https://www.mail-archive.com/[email protected]/ ๊ณผ ๊ฐ™์€ ๊ณต๊ฐœ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ ๋ฏธ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ชจ๋‘ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด
Google ๊ทธ๋ฃน์Šค์˜ ์Šค๋ ˆ๋“œ(์ž์ฃผ ๋ฐœ์ƒ). ๋ง๋„ ์•ˆ๋˜๊ฒŒ
URL์˜ ID์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ํ•˜๋ฉด ์งœ์ฆ์ด ๋‚ฉ๋‹ˆ๋‹ค.

โ€”์ƒ˜

2020๋…„ 8์›” 2์ผ ์ผ์š”์ผ 19:24์— Ahmed W.๊ฐ€ ์ผ์Šต๋‹ˆ๋‹ค.
>
>

๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๊ณต๊ฐœ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ ๋ฏธ๋Ÿฌ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด
https://www.mail-archive.com/[email protected]/

โ€” ์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/15292#issuecomment-667738419 ๋˜๋Š”
๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AAD5EPNQTEUF5SPT6GMM4JLR6XYUBANCNFSM4CA35RXQ
.

--
์ƒ˜ ํ™”์ดํŠธ๋“œ

์ด๊ณณ์€ ์‹ค์ œ๋กœ ์ด๋Ÿฐ ํ† ๋ก ์„ ํ•˜๋Š” ๊ณณ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๐Ÿค”

@Imperatorn ์ด ์žˆ์—ˆ์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ๋…ผ์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋Œ€๊ด„ํ˜ธ [ ] ๋ฅผ ์„ ํƒํ•œ ๊ตฌ๋ฌธ์œผ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ์ผ๋ฐ˜ ์œ ํ˜•/ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ "์œ ํ˜•"์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ƒˆ ๋ณ„์นญ "any"๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ์ œ๋„ค๋ฆญ ์ดˆ์•ˆ ๋””์ž์ธ์ด ์—ฌ๊ธฐ ์— ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋…ผํ‰ re: ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ํ† ๋ก ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๊ฐ์‚ฌ ํ•ด์š”.

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ(https://blog.golang.org/generics-next-step)์—์„œ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์ด์Šˆ ํŠธ๋ž˜์ปค๊ฐ€ ์•„๋‹ˆ๋ผ golang-nuts ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜๊ณ  ์žˆ์Œ์„ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ƒ๊ธฐ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๊ณ„์† ์ฝ์„ ๊ฒƒ์ด์ง€๋งŒ ๋Œ“๊ธ€ ์Šค๋ ˆ๋”ฉ์ด ์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ ์ถ”์ ๊ธฐ์˜ ๋‹ค๋ฅธ ์–ด๋ ค์›€ ์™ธ์— ๊ฑฐ์˜ 800๊ฐœ์˜ ๋Œ“๊ธ€์ด ์žˆ๊ณ  ์™„์ „ํžˆ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

์ด์— ๋Œ€ํ•ด Go ํŒ€์ด ์‹ค์šฉ์ ์ธ ์ด์œ ๋กœ ์ด๋Ÿฌํ•œ ํ† ๋ก ์„ ๋ฌธ์ œ์—์„œ ์ œ์™ธํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค๋Š” ์ ์€ ์กด์ค‘ํ•˜์ง€๋งŒ GitHub์—๋Š” golang-nuts์— ์žˆ์ง€ ์•Š์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›์ด ๋งŽ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. GitHub์˜ ์ƒˆ๋กœ์šด ํ† ๋ก  ๊ธฐ๋Šฅ์ด ์ž˜ ๋งž๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค” ํ™•์‹คํžˆ ์Šค๋ ˆ๋”ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@toolbox ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ๋„ ์ฃผ์žฅ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. github ๊ณ„์ •์ด ์—†๋Š”(๊ทธ๋ฆฌ๊ณ  ๋ฐ›๊ธฐ๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋Š”) ์‚ฌ๋žŒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ golang-nuts ์— ๊ฐ€์ž…ํ•˜์ง€ ์•Š์•„๋„ ๊ฒŒ์‹œ๋ฌผ์„ ์˜ฌ๋ฆฌ๊ณ  ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Merovius GitHub ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ์ •๋ง ์ข‹์•„ํ•˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋‚ด๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Google ๊ทธ๋ฃน์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

@toolbox ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ๋„ ์ฃผ์žฅ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. github ๊ณ„์ •์ด ์—†๋Š”(๊ทธ๋ฆฌ๊ณ  ๋ฐ›๊ธฐ๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋Š”) ์‚ฌ๋žŒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ golang-nuts์— ๊ฐ€์ž…ํ•˜์ง€ ์•Š์•„๋„ ๊ฒŒ์‹œ๋ฌผ์„ ์˜ฌ๋ฆฌ๊ณ  ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ด์ง€๋งŒ ๋‹น์‹ ์€ ์š”์ ์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. golang-nuts ์‚ฌ์šฉ์ž์—๊ฒŒ GitHub๋กœ ์ด๋™ํ•˜๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. (์ง€๊ธˆ์€ ์—ญ์ˆœ์œผ๋กœ ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค) GitHub ์‚ฌ์šฉ์ž๊ฐ€ ํ† ๋ก  ํฌ๋Ÿผ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฃผ์ œ์™€ ํฌ๊ฒŒ ๋‹ค๋ฅด๋‹ค๋Š” ์ ์— ๋™์˜ํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ์ œ๊ธฐํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ์‚ฌ๊ณผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„์ด๋Ÿฌ๋‹ˆ๋ฅผ ๋ณด๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@keean @Merovius @toolbox ์™€ ๋ฏธ๋ž˜์˜ ์‚ฌ๋žŒ๋“ค.

์ฐธ๊ณ : ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ํ† ๋ก ์— ๋Œ€ํ•œ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(#37469 ์ฐธ์กฐ).

์•ˆ๋…•ํ•˜์„ธ์š”,

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

์ œ๊ฐ€ ์ œ์‹œํ•˜๊ณ  ์‹ถ์€ ํ•œ ๊ฐ€์ง€ ํ”ผ๋“œ๋ฐฑ์€ ์ œ๋„ค๋ฆญ ์ œ์•ˆ์„œ์˜ ์ดˆ๊ธฐ ์Šค์บ”์—์„œ [T Constraint] ๊ฐ€ ์ œ๋„ค๋ฆญ์šฉ์œผ๋กœ ์ง€์ •๋œ ๋ฌธ์ž ์ง‘ํ•ฉ๋งŒํผ ์‰ฝ์ง€ ์•Š๊ณ  ๋น ๋ฅด๊ฒŒ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. . C++ ์Šคํƒ€์ผ์˜ F<T Constraint> ๋Š” go์˜ ๋‹ค์ค‘ ๋ฐ˜ํ™˜ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ์‹คํ˜„ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ASCII๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ๋ฌธ์ž๋Š” ์ ˆ๋Œ€์ ์ธ ์ผ์ด ๋  ๊ฒƒ์ด๋ฏ€๋กœ ๊ทธ ์ƒ๊ฐ์„ ์—†์• ์ฃผ์…”์„œ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ž ์กฐํ•ฉ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋น„ํŠธ ์—ฐ์‚ฐ์ด ์ž˜๋ชป ํ•ด์„๋˜๊ฑฐ๋‚˜ ํŒŒ์‹ฑ์— ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ์„์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ œ ์ƒ๊ฐ์—๋Š” F<<T Constraint>> ๊ฐ€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ธฐํ˜ธ ์กฐํ•ฉ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์•ฝ๊ฐ„์˜ ์ดˆ๊ธฐ ๋ˆˆ ๊ฒ€์‚ฌ ์„ธ๊ธˆ์ด ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์ง€๋งŒ FireCoda ๋ฐ Iosevka ์™€ ๊ฐ™์€ ๊ธ€๊ผด ํ•ฉ์ž๋กœ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Map[T Constraint] ์™€ map[string]T ์˜ ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ์‰ฝ๊ฒŒ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ [] ์˜ ๋‘ ๊ฐ€์ง€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ๋ณ„ํ•˜๋„๋ก ๋งˆ์Œ์„ ํ›ˆ๋ จ์‹œํ‚ฌ ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ•™์Šต ๊ณก์„ ์„ ๊ฐ€ํŒŒ๋ฅด๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹น์—ฐํ•˜์ง€๋งŒ map[T1]T2 ์™€ Map[T1 Constraint] ๋Š” ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ „์ž๋Š” ์ œ์•ฝ์ด ์—†๊ณ  ํ›„์ž๋Š” ํ•„์ˆ˜ ์ œ์•ฝ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ์€ golang-nuts์— ๋Œ€ํ•ด ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋…ผ์˜๋˜์—ˆ์œผ๋ฉฐ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ๋ถ„์„ ๋ชจํ˜ธ์„ฑ๊ณผ ๊ฐ™์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์˜๊ฒฌ์„ ๋“ฃ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ฐ์ •๊ณผ ์„ ํ˜ธ๋„์— ๊ธฐ๋ฐ˜ํ•œ ์˜๊ฒฌ์— ๋Œ€ํ•ด์„œ๋Š” ๋™์˜ํ•˜์ง€ ์•Š๊ณ  ์ปค๋ฐ‹ํ•  ๋•Œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@ianlancetailor ์ถฉ๋ถ„ํžˆ ๊ณต์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์—‰๋šฑํ•œ ์†Œ๋ฆฌ๋ฅผ ๋“ฃ๋Š” ๊ฒƒ์— ์ง€์ณค์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. :) ๊ฐ€์น˜๋ฅผ ์œ„ํ•ด, ๋‚˜๋Š” ํ˜„๋ช…ํ•˜๊ฒŒ ์Šค์บ๋‹์„ ์‰ฝ๊ฒŒ ๊ตฌ๋ณ„ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ณ ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

reflect.MakeFunc ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๋Œ€์•ˆ์€ Go ๊ณ„์ธก์— ์žˆ์–ด ์—„์ฒญ๋‚œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ์ œ์•ˆ์œผ๋กœ ํ•จ์ˆ˜ ์œ ํ˜•์„ ๋ถ„ํ•ดํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

@Julio-Guerra "ํ•จ์ˆ˜ ์œ ํ˜• ๋ถ„ํ•ด"๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜ ์œ ํ˜•์— ๋Œ€ํ•ด ์–ด๋Š ์ •๋„ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://go2goplay.golang.org/p/RwU11S4gC59

package main

import (
    "fmt"
)

func Call[In, Out any](f func(In) Out, v In) Out {
    return f(v)
}

func main() {
    triple := func(i int) int {
        return 3 * i
    }
    fmt.Println(Call(triple, 23))
}

์ด๊ฒƒ์€ ๋‘˜ ๋‹ค์˜ ์ˆ˜๊ฐ€ ์ผ์ •ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@Julio-Guerra "ํ•จ์ˆ˜ ์œ ํ˜• ๋ถ„ํ•ด"๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ธ์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜ ์œ ํ˜•์— ๋Œ€ํ•ด ์–ด๋Š ์ •๋„ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://go2goplay.golang.org/p/RwU11S4gC59

์‹ค์ œ๋กœ ๋‚˜๋Š” ๋‹น์‹ ์ด ํ•œ ์ผ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋ชจ๋“  ํ•จ์ˆ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜ ์œ ํ˜• ๋ชฉ๋ก์œผ๋กœ ์ผ๋ฐ˜ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค(reflect.MakeFunc์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜ ์œ ํ˜• ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌ). ๊ทธ๋Ÿฌ๋ฉด (๋„๊ตฌ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ ) ์ผ๋ฐ˜ํ™”๋œ ํ•จ์ˆ˜ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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