Go: all: ํŒจํ‚ค์ง€ ๊ฐ„์— ์œ ํ˜•์„ ์ด๋™ํ•˜๋Š” ๋™์•ˆ ์ ์ง„์ ์ธ ์ฝ”๋“œ ๋ณต๊ตฌ ์ง€์›

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

์›๋ž˜ ์ œ๋ชฉ: ์ œ์•ˆ: ํŒจํ‚ค์ง€ ๊ฐ„์— ์œ ํ˜•์„ ์ด๋™ํ•˜๋Š” ๋™์•ˆ ์ ์ง„์ ์ธ ์ฝ”๋“œ ๋ณต๊ตฌ ์ง€์›

Go๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฆฌํŒฉํ† ๋ง ์ค‘์— ์ ์ง„์ ์ธ ์ฝ”๋“œ ๋ณต๊ตฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜•์— ๋Œ€ํ•ด ๋Œ€์ฒด ์ด๋ฆ„์„ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ #16339์—์„œ ์ œ์•ˆ๋˜์—ˆ์ง€๋งŒ Go 1.8์—์„œ ๋ณด๋ฅ˜๋œ Go 1.8 ๋ณ„์นญ ๊ธฐ๋Šฅ์˜ ๋Œ€์ƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. Go 1.8์—์„œ๋Š” ๋ฌธ์ œ๋ฅผ ํ’€์ง€ ๋ชปํ•ด์„œ ๋ฌธ์ œ๋กœ ๋‚จ์•„์žˆ๊ณ , Go 1.9์—์„œ๋Š” ํ’€ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ณ„์นญ ์ œ์•ˆ์— ๋Œ€ํ•œ ๋…ผ์˜์—์„œ ํŠนํžˆ ์œ ํ˜•์— ๋Œ€ํ•œ ๋Œ€์ฒด ์ด๋ฆ„์„ ๋งŒ๋“œ๋Š” ์ด ๊ธฐ๋Šฅ์ด ์™œ ์ค‘์š”ํ•œ์ง€์— ๋Œ€ํ•œ ๋งŽ์€ ์งˆ๋ฌธ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์‹œ๋„๋กœ " ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฆฌํŒฉํ† ๋ง(Go์˜ ๋„์›€์œผ๋กœ) "์ด๋ผ๋Š” ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐ์— ๋Œ€ํ•ด ์งˆ๋ฌธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ธฐ์‚ฌ๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค. (๋‹ค๋ฅธ ์งง์€ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ๋ณด๋ ค๋ฉด Robert์˜ Gophercon ๋ผ์ดํŠธ๋‹ ํ† ํฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ๋ถˆํ–‰ํžˆ๋„ ํ•ด๋‹น ๋น„๋””์˜ค๋Š” 10์›” 9์ผ๊นŒ์ง€ ์˜จ๋ผ์ธ์—์„œ ๋ณผ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ, 12์›” 16์ผ: ๋ณธ์งˆ์ ์œผ๋กœ ๊ธฐ์‚ฌ์˜ ์ฒซ ๋ฒˆ์งธ ์ดˆ์•ˆ์ด์—ˆ๋˜ ๋‚ด GothamGo ํ† ํฌ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.)

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

์œ ํ˜• ๋ณ„์นญ ๋˜๋Š” ๊ธฐํƒ€ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ์ƒ๊ฐ์„ ์—ฌ๊ธฐ์— ์˜๊ฒฌ์œผ๋กœ ๊ฒŒ์‹œํ•˜์‹ญ์‹œ์˜ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ, 12์›” 16์ผ : ์œ ํ˜• ๋ณ„์นญ ์— ๋Œ€ํ•œ ๋””์ž์ธ ๋ฌธ์„œ๊ฐ€
์—…๋ฐ์ดํŠธ, 1์›” 9์ผ : ์ œ์•ˆ ์ˆ˜๋ฝ, dev.typealias ์ €์žฅ์†Œ ์ƒ์„ฑ, ์‹คํ—˜์„ ์œ„ํ•œ Go 1.9 ์ฃผ๊ธฐ ์‹œ์ž‘ ์‹œ ๊ตฌํ˜„ ์˜ˆ์ •.


ํ† ๋ก  ์š”์•ฝ(์ตœ์ข… ์—…๋ฐ์ดํŠธ 2017-02-02)

๋ชจ๋“  ์„ ์–ธ์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ• ๊นŒ์š”?

์œ ํ˜• ๋ณ„์นญ์ด 100% ํ•„์š”ํ•œ ๊ฒฝ์šฐ var ๋ณ„์นญ์€ 10%, func ๋ณ„์นญ์€ 1%, const ๋ณ„์นญ์€ 0% ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. const๋Š” ์ด๋ฏธ =๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  func๋Š” ๊ทธ๋Ÿด๋“ฏํ•˜๊ฒŒ =๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ต์‹ฌ ์งˆ๋ฌธ์€ var ๋ณ„์นญ์ด ๊ณ„ํšํ•˜๊ฑฐ๋‚˜ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์ค‘์š”ํ•œ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

@rogpeppe (https://github.com/golang/go/issues/16339#issuecomment-258771806) ๋ฐ @ianlancetaylor (https://github.com/golang/go/issues/16339#issuecomment-233644777)์˜ ์ฃผ์žฅ ์›๋ž˜ ๋ณ„์นญ ์ œ์•ˆ๊ณผ ๊ธฐ์‚ฌ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋ณ€๊ฒฝ ์ „์—ญ var๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ค์ˆ˜์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์šฉํ•˜๊ธฐ ์œ„ํ•ด ์†”๋ฃจ์…˜์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ด์น˜์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์‚ฌ์‹ค, ์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์žฅ๊ธฐ์ ์œผ๋กœ Go๊ฐ€ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ์š”๊ตฌํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€๋”๋ผ๋„ ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

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

์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ(= vs => vs export)?

์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์€ ํ˜„์žฌ ๋˜๋Š” ๋ฏธ๋ž˜์— var ๋ณ„์นญ์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(https://github.com/golang/go/issues/18130#issuecomment-264232763 by @Merovius). var ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(์ด์ „ ์„น์…˜ ์ฐธ์กฐ).

var ๋ณ„์นญ์ด ์—†์œผ๋ฉด =๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. => ๋ณ„์นญ ์ œ์•ˆ์—์„œ์™€ ๊ฐ™์ด ~ (https://github.com/golang/go/issues/18130#issuecomment-264185142 by @joegrasse) ๋˜๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ (https://github.com/golang/go/issues/18130#issuecomment-264152427 @cznic ์ž‘์„ฑ).

= in์„ ์‚ฌ์šฉํ•˜๋ฉด Pascal๊ณผ Rust์˜ ์œ ํ˜• ๋ณ„์นญ ๊ตฌ๋ฌธ๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ๊ฐ™์€ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•œ, ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ๋Š” func ๋ณ„์นญ๋„ ์กด์žฌํ•˜๋Š” ๋ฏธ๋ž˜์˜ Go๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ(@nigeltao์˜ https://github.com/golang/go/issues/18130#issuecomment-264324306 ์ฐธ์กฐ) ๋ชจ๋“  ์„ ์–ธ์—์„œ ๋™์ผํ•œ ํ˜•์‹์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. :

const C2 = C1
func F2 = F1
type T2 = T1
var V2 = V1

์ด๋“ค ์ค‘ ์ง„์ •ํ•œ ๋ณ„์นญ์„ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ var ์„ ์–ธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด V2์™€ V1์€ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ ๋…๋ฆฝ์ ์œผ๋กœ ์žฌ์ •์˜๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๋ถˆ๋ณ€์ธ const, func ๋ฐ type ์„ ์–ธ๊ณผ ๋‹ฌ๋ฆฌ). ๋ณ€์ˆ˜์˜ ์ฃผ๋œ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์˜ˆ์™ธ๋Š” ์ตœ์†Œํ•œ ์„ค๋ช…ํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Go๊ฐ€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์ด๋™ํ•˜๋ฉด ํ•ด๋‹น ์˜ˆ์™ธ๋„ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ํ•˜์ž๋ฉด, ์—ฌ๊ธฐ์„œ ํ•จ์ˆ˜ ๋ณ„์นญ์ด๋‚˜ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ด๋Ÿฌํ•œ ํ–ฅํ›„ ์ถ”๊ฐ€ ์‚ฌํ•ญ์˜ ์˜๋ฏธ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

@jimmyfrasche ๋Š” const๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๋ณ„์นญ์„ ์ œ์•ˆ(https://github.com/golang/go/issues/18130#issuecomment-264278398)ํ•˜์—ฌ var ๋Œ€์‹  const๊ฐ€ ์˜ˆ์™ธ๊ฐ€ ๋˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

const C2 = C1 // no => form
func F2 => F1
type T2 => T1
var V2 => V1
var V2 = V1 // different from => form

const์™€ var ๋‘˜ ๋‹ค์— ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ var์— ๋Œ€ํ•œ ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ์„ค๋ช…ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์–ธ์–ด ๋ณ€๊ฒฝ ๋Œ€์‹  ๋„๊ตฌ ๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ „์šฉ ๋ณ€๊ฒฝ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ปดํŒŒ์ผ๋Ÿฌ์— ์ œ๊ณต๋œ ๋ถ€๊ฐ€ ์ •๋ณด(์˜ˆ: https://github.com/golang/go/issues/18130#issuecomment-264205929 by @btracey)์— ์˜ํ•ด์„œ๋งŒ ์ ์ง„์  ์ฝ”๋“œ ๋ณต๊ตฌ๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํ™•์‹คํžˆ ๋ฌผ์–ด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ผ์ข…์˜ ๊ทœ์น™ ๊ธฐ๋ฐ˜ ์ „์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ ์ „์— ์ž…๋ ฅ ํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(์˜ˆ: https://github.com/golang/go/issues/18130#issuecomment-264329924 by @tux21b).

๋ถˆํ–‰ํžˆ๋„, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์‹ค์ œ๋กœ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ œํ•œ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ(gc ๋ฐ gccgo)๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ ์žˆ์ง€๋งŒ go vet, guru, goimports, gocode(์ฝ”๋“œ ์™„์„ฑ) ๋“ฑ๊ณผ ๊ฐ™์ด ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ„์„ํ•˜๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

@bcmills๊ฐ€ ๋งํ–ˆ๋“ฏ์ด(https://github.com/golang/go/issues/18130#issuecomment-264275574), โ€œ๋ชจ๋“  ๊ตฌํ˜„์—์„œ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” '๋น„์–ธ์–ด ๋ณ€๊ฒฝ' ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์‚ฌ์‹ค์ƒ์˜ ์–ธ์–ด ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ๊ฐ€ ์—ด์•…ํ•œ ๊ฒƒ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.โ€

๋ณ„์นญ์—๋Š” ์–ด๋–ค ๋‹ค๋ฅธ ์šฉ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์œ ํ˜• ๋ณ„์นญ์ด Pascal ๋ฐ Rust์— ํฌํ•จํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์ค‘์š”ํ•˜๋‹ค๊ณ  ๊ฐ„์ฃผ๋˜๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ณ„์นญ๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ณ„์นญ(๋˜๋Š” ๋ณ„์นญ๋งŒ ์ž…๋ ฅ)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋ฅผ ํ™•์žฅํ•˜๋Š” ๋“œ๋กญ์ธ ๊ต์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด https://go-review.googlesource.com/#/c/32145/ , ํŠนํžˆ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์˜ ์„ค๋ช…์„ ์ฐธ์กฐ

  2. ๋ณ„์นญ(๋˜๋Š” ๊ทธ๋ƒฅ ์œ ํ˜• ๋ณ„์นญ)์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์€ API ํ‘œ๋ฉด์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ๊ตฌ์กฐํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ๋‚˜์€ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด ํŒจํ‚ค์ง€ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋Œ€๊ทœ๋ชจ ๊ตฌํ˜„์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ฐ€์ ธ์˜ค๊ณ  ์‚ฌ์šฉํ•  ํŒจํ‚ค์ง€๋Š” ํ•˜๋‚˜๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. https://github.com/golang/go/issues/16339#issuecomment -232813695์— ์„ค๋ช…๋œ ๋‹ค์†Œ ์ถ”์ƒ์ ์ธ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ์—๋Š” ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ์ƒ์„ฑ๋œ C++ ์ฝ”๋“œ์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ์ƒ์„ฑ๋œ Go ์ฝ”๋“œ์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ๋ถˆ๊ฐ€๋Šฅํ•œ "๊ณต๊ฐœ ๊ฐ€์ ธ์˜ค๊ธฐ" ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ C++์™€ Go ํด๋ผ์ด์–ธํŠธ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ์ •์˜์˜ ์ž‘์„ฑ์ž์—๊ฒŒ ์ขŒ์ ˆ๊ฐ์„ ์ค๋‹ˆ๋‹ค. ์œ ํ˜• ๋ณ„์นญ์€ Go์—์„œ ์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค import public ์˜

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

์œ ํ˜• ๋ณ„์นญ์— ๋Œ€ํ•œ ์ œ์•ˆ์—์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

  1. godoc์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. (https://github.com/golang/go/issues/18130#issuecomment-264323137 @nigeltao ๋ฐ https://github.com/golang/go/issues/18130#issuecomment-264326437 @jimmyfrasche)

  2. ๋ณ„์นญ์œผ๋กœ ๋ช…๋ช…๋œ ํ˜•์‹์— ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (https://github.com/golang/go/issues/18130#issuecomment-265077877 @ulikunitz ์ž‘์„ฑ)

  3. ๋ณ„์นญ์— ๋Œ€ํ•œ ๋ณ„์นญ์ด ํ—ˆ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ๋ณ„์นญ ์ฃผ๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ? (https://github.com/golang/go/issues/18130#issuecomment-264494658 @thwd ์ž‘์„ฑ)

  4. ๋ณ„์นญ์ด ๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ ์‹๋ณ„์ž๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? (https://github.com/golang/go/issues/18130#issuecomment-264494658 @thwd ์ž‘์„ฑ)

  5. ๋ณ„์นญ์„ ํฌํ•จํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ(ํฌํ•จ๋œ โ€‹โ€‹ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•)? (https://github.com/golang/go/issues/18130#issuecomment-264494658 by @thwd , ์—ญ์‹œ #17746)

  6. ๋นŒ๋“œ๋œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ณ„์นญ์„ ๊ธฐํ˜ธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (https://github.com/golang/go/issues/18130#issuecomment-264494658 @thwd ์ž‘์„ฑ)

  7. Ldflags ๋ฌธ์ž์—ด ์ฃผ์ž…: ๋ณ„์นญ์„ ์ฐธ์กฐํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? (https://github.com/golang/go/issues/18130#issuecomment-264494658 by @thwd; ์ด๋Š” var ๋ณ„์นญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.)

๋ฒ„์ „ ๊ด€๋ฆฌ ์ž์ฒด๊ฐ€ ์†”๋ฃจ์…˜์ž…๋‹ˆ๊นŒ?

"์ด ๊ฒฝ์šฐ ์œ ํ˜• ๋ณ„์นญ์ด ์•„๋‹ˆ๋ผ ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ์ „์ฒด ๋‹ต์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."
(https://github.com/golang/go/issues/18130#issuecomment-264573088 @iainmerrick ์ž‘์„ฑ)

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

๋” ํฐ ๋ฆฌํŒฉํ† ๋ง ๋ฌธ์ œ๋ฅผ ๋Œ€์‹  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/golang/go/issues/18130#issuecomment -265052639์—์„œ @niemeyer ๋Š” os.Error๋ฅผ ์˜ค๋ฅ˜๋กœ ์ด๋™ํ•˜๋Š” ๋ฐ ์‹ค์ œ๋กœ ๋‘ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋‹ค๊ณ  ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ์ง€๋งŒ ์ •์˜๋„ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(ํ˜„์žฌ Error ๋ฉ”์„œ๋“œ๋Š” String ๋ฉ”์„œ๋“œ์˜€์Šต๋‹ˆ๋‹ค).

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

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

์–ด๋Œ‘ํ„ฐ๋Š” ์•„๋ž˜์— ์–ธ๊ธ‰๋œ ํ•˜์œ„ ์œ ํ˜• ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ผ๊ด€๋œ ์†”๋ฃจ์…˜๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ณ„์นญ ์œ ํ˜•์— ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ™•์‹คํžˆ ๋ณ„์นญ์€ ์ผ๋ฐ˜์ ์ธ ๋ฉ”์„œ๋“œ ์ •์˜ ์ œํ•œ์„ ์šฐํšŒํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๊ฐ€ ์œ ํ˜• T1 = otherpkg.T2๋ฅผ ์ •์˜ํ•˜๋ฉด otherpkg.T2์—์„œ ์ง์ ‘ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ T1์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์œ ํ˜• T1 = otherpkg.T2์ธ ๊ฒฝ์šฐ func(T1) M()์€ func(otherpkg.T2) M()๊ณผ ๋™์ผํ•˜๋ฉฐ ํ˜„์žฌ ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉฐ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒจํ‚ค์ง€๊ฐ€ ์œ ํ˜• T1 = T2(๋‘˜ ๋‹ค ๋™์ผํ•œ ํŒจํ‚ค์ง€์— ์žˆ์Œ)๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€๋‹ต์€ ๋œ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ func(T1) M()์€ func(T2) M()๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž๊ฐ€ ํ—ˆ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ž๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์„ค๊ณ„ ๋ฌธ์„œ๋Š” ์—ฌ๊ธฐ์— ์ œํ•œ์„ ๋‘์ง€ ์•Š๊ณ (์ผ๋ฐ˜์ ์ธ ์ œํ•œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด) func(T1) M()์ด ์ด ์ƒํ™ฉ์—์„œ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

https://github.com/golang/go/issues/18130#issuecomment -267694112์—์„œ @jimmyfrasche ๋Š” ๋Œ€์‹  "๋ฉ”์†Œ๋“œ ์ •์˜์— ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ"์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๋ช…ํ™•ํ•œ ๊ทœ์น™์ด ๋  ๊ฒƒ์ด๋ฉฐ T๊ฐ€ ์ •์˜๋œ ๋‚ด์šฉ์„ ์•Œ ํ•„์š”๊ฐ€ https://github.com/golang/go/issues/18130#issuecomment -267997124์—์„œ @rsc ๋Š” ์˜ค๋Š˜๋‚ ์—๋„ func (T) M()์ด ์œ ํšจํ•˜์ง€ ์•Š์€ ํŠน์ • T๊ฐ€ ์žˆ๋‹ค๊ณ  ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. https://play .golang.org/p/bci2qnldej. ์‹ค์ œ๋กœ ์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ํ•ฉ๋ฆฌ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด ๊ฐ€๋Šฅํ•œ ์ œํ•œ์„ ์—ผ๋‘์— ๋‘˜ ๊ฒƒ์ด์ง€๋งŒ ๊ทธ๊ฒƒ์„ ๋„์ž…ํ•˜๊ธฐ ์ „์— ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฐ•๋ ฅํ•œ ์ฆ๊ฑฐ๊ฐ€ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž„๋ฒ ๋”ฉ ๋ฐ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋” ๊นจ๋—ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/golang/go/issues/18130#issuecomment -267691816์—์„œ @Merovius ๋Š” ํŒจํ‚ค์ง€ ์ด๋™ ์ค‘์— ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ž„๋ฒ ๋””๋“œ ์œ ํ˜•์ด ๊ฒฐ๊ตญ ์ƒˆ ์ด๋ฆ„์„ ์ฑ„ํƒํ•ด์•ผ ํ•  ๋•Œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž ์œ ํ˜• U์— bytes.Buffer๋กœ ์ด๋™ํ•˜๋Š” ํฌํ•จ๋œ io.ByteBuffer๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ U๊ฐ€ io.ByteBuffer๋ฅผ ํฌํ•จํ•˜๋Š” ๋™์•ˆ ํ•„๋“œ ์ด๋ฆ„์€ U.ByteBuffer์ด์ง€๋งŒ U๊ฐ€ bytes.Buffer๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ๋  ๋•Œ ํ•„๋“œ ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ U.Buffer๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

https://github.com/golang/go/issues/18130#issuecomment -267710478์—์„œ @neild ๋Š” io.ByteBuffer์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ์†Œํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. U๋ฅผ ์ •์˜ํ•˜๋Š” ํŒจํ‚ค์ง€ P๋„ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 'type ByteBuffer = bytes.Buffer'๋ฅผ ์ •์˜ํ•˜๊ณ  ํ•ด๋‹น ์œ ํ˜•์„ U์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด io.ByteBuffer๊ฐ€ ์™„์ „ํžˆ ์‚ฌ๋ผ์ง„ ํ›„์—๋„ U์—๋Š” ์—ฌ์ „ํžˆ U.ByteBuffer๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/golang/go/issues/18130#issuecomment -267703067์—์„œ @bcmills ๋Š” ์ ์ง„์  ๋ณต๊ตฌ ์ค‘์— ํ•„๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•„๋“œ ๋ณ„์นญ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์ƒ์œ„ ์œ ํ˜• ๋ณ„์นญ์„ ๋งŒ๋“ค ํ•„์š” ์—†์ด type U struct { bytes.Buffer; ByteBuffer = Buffer } ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/golang/go/issues/18130#issuecomment -268001111์—์„œ @rsc๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. '์ด ์œ ํ˜•์„ ์ด ์ด๋ฆ„์œผ๋กœ ํฌํ•จ'์— ๋Œ€ํ•œ ์ผ๋ถ€ ๊ตฌ๋ฌธ์œผ๋กœ ๋ฐ”์ดํŠธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ƒ์œ„ ์œ ํ˜•์ด๋‚˜ ๋Œ€์ฒด ์ด๋ฆ„์ด ํ•„์š” ์—†๋Š” Buffer๋ฅผ ํ•„๋“œ ์ด๋ฆ„ ByteBuffer๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์œ ํ˜• ์ด๋ฆ„์€ ์›๋ž˜ ์ด๋ฆ„์„ ์œ ์ง€ํ•˜๋ฉด์„œ io.ByteBuffer์—์„œ bytes.Buffer๋กœ ์—…๋ฐ์ดํŠธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‘ ๋ฒˆ์งธ ๋˜๋Š” ์„œํˆฌ๋ฅธ ๋‚ด๋ณด๋‚ธ ์œ ํ˜•์„ ๋„์ž…ํ•˜์ง€ ์•Š์Œ).

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

ํฌํ•จ๋œ ํ•„๋“œ์—์„œ ๋ณ„์นญ ์‚ฌ์šฉ์„ ์ œํ•œํ•˜๊ฑฐ๋‚˜ ๋Œ€์ƒ ์œ ํ˜•์˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋„๋ก ํฌํ•จ๋œ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์ž๋Š” ์ œ์•ˆ์ด ์žˆ์—ˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋ณ„์นญ ๋„์ž…์œผ๋กœ ์ธํ•ด ์›์ž์ ์œผ๋กœ ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ์กด ์ •์˜๊ฐ€ ๊นจ์ ธ ๋ณธ์งˆ์ ์œผ๋กœ ์ ์ง„์ ์ธ ๋ณต๊ตฌ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @rsc : "์šฐ๋ฆฌ๋Š” #17746์—์„œ ์ด์— ๋Œ€ํ•ด ์–ด๋Š ์ •๋„ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์›๋ž˜ ๋‚ด์žฅ๋œ io.ByteBuffer ๋ณ„์นญ์˜ ์ด๋ฆ„์ด Buffer์ธ ํŽธ์— ์žˆ์—ˆ์ง€๋งŒ ์œ„์˜ ์ฃผ์žฅ์€ ์ œ๊ฐ€ ํ‹€๋ ธ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹ ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. @jimmyfrasche ๋Š” ํŠนํžˆ ์ผ๋ถ€ ์ข‹์€ "์ž„๋ฒ ๋””๋“œ ์‚ฌ๋ฌผ์˜ ์ •์˜์— ๋”ฐ๋ผ ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค๋Š” ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž„๋ฒ ๋””๋“œ ์•จ๋ฆฌ์–ด์Šค๋ฅผ ์™„์ „ํžˆ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ฒƒ์€ ํƒ€๋‹นํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค."

๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ๋ณ„์นญ์„ ํ†ตํ•ด ๋ด…๋‹ˆ๋‹ค. https://github.com/golang/go/issues/18130#issuecomment -267903649์—์„œ @atdiar ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ํ˜•์ด ์ •์˜๋œ ํŒจํ‚ค์ง€ ๋˜๋Š” ์ด๋ฆ„์„ ์ฐพ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์˜ ๊ฒฝ์šฐ ์ „๋‹ฌ ๋ณ„์นญ์ด ๋’ค์— ๋‚จ์•„ ์žˆ๋”๋ผ๋„ ์œ ํ˜•์ด ์ด๋™๋  ๋•Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€์ฐฐํ•ฉ๋‹ˆ๋‹ค. https://github.com/golang/go/issues/18130#issuecomment -268001410์—์„œ @rsc ๋Š” ์ด๋ฅผ ํ™•์ธํ•˜๊ณ  "์ž„๋ฒ ๋”ฉ ์ƒํ™ฉ์ฒ˜๋Ÿผ ์™„๋ฒฝํ•˜์ง€ ์•Š๋‹ค. ์ž„๋ฒ ๋”ฉ ์ƒํ™ฉ๊ณผ ๋‹ฌ๋ฆฌ ์•„๋งˆ๋„ ์ฝ”๋“œ๋Š” ๊ทธ๋Ÿฌํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋งค์šฐ ๋ฏผ๊ฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ  ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค."

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

ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋”ฐ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋‚˜์š”?

https://github.com/golang/go/issues/18130#issuecomment -268524504์—์„œ @atdiar ๋Š” ๊ฐœ์ฒด ํŒŒ์ผ ๋ฐ ๊ฐœ๋ณ„ ์ปดํŒŒ์ผ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. https://github.com/golang/go/issues/18130#issuecomment -268560180์—์„œ @rsc ๋Š” ์—ฌ๊ธฐ์„œ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ๋‹ตํ•ฉ๋‹ˆ๋‹ค. X๊ฐ€ Y ๋ฐ Y ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋‹ค์‹œ ์ปดํŒŒ์ผ๋˜๋ฉด X๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณ„์นญ ์—†์ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋ฉฐ ๋ณ„์นญ์ด ์žˆ์–ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์ปดํŒŒ์ผ์€ X์™€ Y๋ฅผ ๋ณ„๊ฐœ์˜ ๋‹จ๊ณ„๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ(์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋™์ผํ•œ ํ˜ธ์ถœ์—์„œ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Œ) X๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ  Y๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

ํ•ฉ๊ณ„ ์œ ํ˜• ๋˜๋Š” ์ผ์ข…์˜ ํ•˜์œ„ ์œ ํ˜•์ด ๋Œ€์ฒด ์†”๋ฃจ์…˜์ž…๋‹ˆ๊นŒ?

https://github.com/golang/go/issues/18130#issuecomment -264413439์—์„œ @iand ๋Š” "๋Œ€์ฒด ๊ฐ€๋Šฅํ•œ ์œ ํ˜•", "ํ•จ์ˆ˜ ์ธ์ˆ˜, ๋ฐ˜ํ™˜ ๊ฐ’ ๋“ฑ์—์„œ ๋ช…๋ช…๋œ ์œ ํ˜•์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜• ๋ชฉ๋ก์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ". https://github.com/golang/go/issues/18130#issuecomment -268072274์—์„œ @j7b ๋Š” ๋Œ€์ˆ˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. "๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์œ ํ˜• ๊ฒ€์‚ฌ์™€ ๋™๋“ฑํ•œ ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณด๋„ˆ์Šค๋กœ ์–ป์Šต๋‹ˆ๋‹ค." ์ด ๊ฐœ๋…์˜ ๋‹ค๋ฅธ ์ด๋ฆ„์€ ํ•ฉ๊ณ„ ์œ ํ˜• ๋ฐ ๋ณ€ํ˜• ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

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

https://github.com/golang/go/issues/18130#issuecomment -268075680์—์„œ @bcmills ๋Š” ๋Œ€์ˆ˜ ์œ ํ˜•์ด ์›๋ณธ๊ณผ ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„๋˜์–ด ํ•ฉ๊ณ„๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Œ์„ ์ง€์ ํ•˜๋ฉด์„œ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์„ ์ทจํ–ˆ์Šต๋‹ˆ๋‹ค. ์›๋ณธ์€ ์ƒํ˜ธ ๊ตํ™˜ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž๋Š” ์œ ํ˜• ํƒœ๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/golang/go/issues/18130#issuecomment -268585497์—์„œ @rsc ๋Š” ์ด๋ก ์ ์ธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ https://github.com/golang/go/issues/18130#issuecomment -265211655๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. @gri ๋Š” ์ ์ง„์  ์ฝ”๋“œ ๋ณต๊ตฌ์—์„œ ๋•Œ๋กœ๋Š” T1์ด T2์˜ ํ•˜์œ„ ์œ ํ˜•์ด ๋˜์–ด์•ผ ํ•˜๊ณ  ๋•Œ๋กœ๋Š” ๊ทธ ๋ฐ˜๋Œ€๊ฐ€ ๋˜์–ด์•ผ

๋ถ€์ฐจ์  ์ ‘์„ ์œผ๋กœ, ์ ์ง„์  ์ฝ”๋“œ ๋ณต๊ตฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ๋Œ€์ˆ˜ ์œ ํ˜•/ํ•ฉ ์œ ํ˜•/๊ณต์ง‘ํ•ฉ ์œ ํ˜•/๋ณ€ํ˜• ์œ ํ˜•์€ ๊ทธ ์ž์ฒด๋กœ Go์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค
์ž์„ธํ•œ ๋‚ด์šฉ์€ FAQ ๋‹ต๋ณ€ ๋ฐ Go 1.6 AMA ํ† ๋ก  ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

https://github.com/golang/go/issues/18130#issuecomment -265206780์—์„œ @thwd ๋Š” Go๊ฐ€ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•๊ณผ ์ธํ„ฐํŽ˜์ด์Šค(bytes.Buffer๋Š” io.Reader์˜ ํ•˜์œ„ ์œ ํ˜•์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Œ) ๊ฐ„์— ํ•˜์œ„ ์œ ํ˜• ์ง€์ • ๊ด€๊ณ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ) ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์ด(io.ReadWriter๋Š” ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ io.Reader์˜ ํ•˜์œ„ ์œ ํ˜•์ž„)์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ "์žฌ๊ท€์ ์œผ๋กœ ๊ณต๋ณ€(ํ˜„์žฌ ๋ถ„์‚ฐ ๊ทœ์น™์— ๋”ฐ๋ผ) ๋ฉ”์„œ๋“œ ์ธ์ˆ˜๊นŒ์ง€" ๋งŒ๋“ค๋ฉด ๋ชจ๋“  ํ–ฅํ›„ ํŒจํ‚ค์ง€๋งŒ ์ œ๊ณต๋˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ตฌ์กฐ์ฒด์™€ ๊ฐ™์€ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค("์ข‹์€ ๋””์ž์ธ๋„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค").

ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ์„ธ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, ์œ„์˜ ํ•˜์œ„ ์œ ํ˜• ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ ์ง„์ ์ธ ์ฝ”๋“œ ๋ณต๊ตฌ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‘˜์งธ, @thwd ๊ฐ€ ์ด ์ œ์•ˆ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊ธฐ์กด ์ฝ”๋“œ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์…‹์งธ, ๋ชจ๋“  ๊ณณ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ•์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ข‹์€ ๋””์ž์ธ์ด ์•„๋‹ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: @Merovius ๋ฐ https://github์˜ https://github.com/golang/go/issues/18130#issuecomment-265211726 ์ฐธ์กฐ). .com/golang/go/issues/18130#issuecomment-265224652 @zombiezen).

์ œํ•œ

์ด ์„น์…˜์—์„œ๋Š” ์ฐธ์กฐ์šฉ์œผ๋กœ ์ œ์•ˆ๋œ ์ œํ•œ ์‚ฌํ•ญ์„ ์ˆ˜์ง‘ํ•˜์ง€๋งŒ ์ œํ•œ ์‚ฌํ•ญ์€ ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ๋‚ด๊ฐ€ https://github.com/golang/go/issues/18130#issuecomment -264195616์— ์ผ๋“ฏ์ด, "์ œํ•œ์ด ์—†๋Š” ๋‹จ์ˆœํ•œ ๋””์ž์ธ์„ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•œ ํ›„์—๋งŒ ์ด๋Ÿฌํ•œ ์ œํ•œ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„์šฉ์„ ์ง€๋ถˆํ•  ์ˆ˜ ์žˆ๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค."

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

์ œํ•œ? ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ํ˜•์˜ ๋ณ„์นญ์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋งŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(https://github.com/golang/go/issues/18130#issuecomment-264165833 ๋ฐ https://github.com/golang/go/issues/18130#issuecomment-264171370 @iand)

๋ฌธ์ œ๋Š” "์‚ฌ์šฉ์ž ์ง€์ • ๋ช…๋ช… ๊ทœ์น™์— ๋งž๊ฒŒ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋…์˜ ์ด๋ฆ„์„ ๋ฐ”๊พผ ์ฝ”๋“œ", "ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋˜๋Œ์•„๊ฐ€๋Š” ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€์— ๊ฑธ์นœ ๊ธด ์ŠคํŒŒ๊ฒŒํ‹ฐ ๋ณ„์นญ ์ฒด์ธ" ๋˜๋Š” "์ธํ„ฐํŽ˜์ด์Šค{} ๋ฐ ์˜ค๋ฅ˜์™€ ๊ฐ™์€ ๋ณ„์นญ ์ง€์ •"์ž…๋‹ˆ๋‹ค. .

์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์ œํ•œ์€ x/image/draw์™€ ๊ด€๋ จ๋œ ์œ„์—์„œ ์„ค๋ช…ํ•œ "ํ™•์žฅ ํŒจํ‚ค์ง€"์˜ ๊ฒฝ์šฐ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์™œ ํŠน๋ณ„ํ•ด์•ผ ํ•˜๋Š”์ง€๋Š” ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋ชจ๋“  ์ฝ”๋“œ์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค{}๋„ ์˜ค๋ฅ˜๋„ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์œ ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ œํ•œ ์‚ฌํ•ญ์„ "๋ฏธ๋ฆฌ ์ •์˜๋œ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ณ„์นญ ์ง€์ •"์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๋ณ„์นญ ์ง€์ • ์˜ค๋ฅ˜๊ฐ€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ๋ณ„์นญ ์˜ค๋ฅ˜์˜ ํ•„์š”์„ฑ์€ ๊ธฐ์‚ฌ์—์„œ ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ์˜ˆ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค.

์ œํ•œ? ๋ณ„์นญ ๋Œ€์ƒ์€ ํŒจํ‚ค์ง€ ํ•œ์ • ์‹๋ณ„์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(https://github.com/golang/go/issues/18130#issuecomment-264188282 @jba ์ž‘์„ฑ)

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŒจํ‚ค์ง€ ๋‚ด์—์„œ ์œ ํ˜•์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ณ„์นญ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ด๋Š” ์ ์ง„์ ์ธ ๋ณต๊ตฌ๊ฐ€ ํ•„์š”ํ•  ์ •๋„๋กœ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(https://github.com/golang/go/issues/18130#issuecomment-264274714 by @ ๋น„์”จ๋ฐ€์Šค).

๋˜ํ•œ ๊ธฐ์‚ฌ์—์„œ์™€ ๊ฐ™์ด ์•จ๋ฆฌ์–ด์‹ฑ ์˜ค๋ฅ˜๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œํ•œ? ๋ณ„์นญ ๋Œ€์ƒ์€ ๋ณ„์นญ๊ณผ ์ด๋ฆ„์ด ๊ฐ™์€ ํŒจํ‚ค์ง€ ํ•œ์ • ์‹๋ณ„์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(Go 1.8์˜ ๋ณ„์นญ ํ† ๋ก  ์ค‘์— ์ œ์•ˆ๋จ)

ํŒจํ‚ค์ง€ ์ˆ˜์‹ ์‹๋ณ„์ž๋กœ ์ œํ•œํ•˜๋Š” ์ด์ „ ์„น์…˜์˜ ๋ฌธ์ œ ์™ธ์—๋„ ์ด๋ฆ„์„ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด ๊ธฐ์‚ฌ์—์„œ io.ByteBuffer์—์„œ bytes.Buffer๋กœ์˜ ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œํ•œ? ์–ด๋–ค ์‹์œผ๋กœ๋“  ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

""C" ๋ฐ "unsafe"์™€ ๊ฐ™์ด ๊ฐ€์ ธ์˜ค๊ธฐ ๋’ค์— ๋ณ„์นญ์„ ์ˆจ๊ฒจ์„œ ์‚ฌ์šฉ์„ ๋”์šฑ ์–ต์ œํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ฐ™์€ ๋งฅ๋ฝ์—์„œ ๋ณ„์นญ ๊ตฌ๋ฌธ์ด ์žฅํ™ฉํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋ง ์ง„ํ–‰ ์‹œ ์Šค์บํด๋“œ๋กœ ๋‹๋ณด์ด๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ." - https://github.com/golang/go/issues/18130#issuecomment -264289940 @xiegeo

"๋˜ํ•œ ์•จ๋ฆฌ์–ด์‹ฑ๋œ ์œ ํ˜•์ด ๋ ˆ๊ฑฐ์‹œ์ด๊ณ  ์ƒˆ ์œ ํ˜•์œผ๋กœ ๋Œ€์ฒด๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ž๋™์œผ๋กœ ์ถ”๋ก ํ•ด์•ผ ํ•˜๋‚˜์š”? golint, godoc ๋ฐ ์œ ์‚ฌํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ „ ์œ ํ˜•์„ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์‹œ๊ฐํ™”ํ•˜๋ฉด ์œ ํ˜• ์•จ๋ฆฌ์–ด์‹ฑ์˜ ๋‚จ์šฉ์„ ๋งค์šฐ ํฌ๊ฒŒ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•จ๋ฆฌ์–ด์‹ฑ ๊ธฐ๋Šฅ์ด ๋‚จ์šฉ๋˜๋Š” ์ตœ์ข… ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค." - https://github.com/golang/go/issues/18130#issuecomment -265062154 @rakyll ์ž‘์„ฑ

๊ทธ๊ฒƒ๋“ค์ด ์ž˜๋ชป ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ ์ „๊นŒ์ง€๋Š” ์‚ฌ์šฉ์„ ์ž์ œํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ธฐ์ƒ์กฐ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ์‹œ์ ์ด ์•„๋‹Œ ์ข‹์€ ์šฉ๋„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์œ„ ์ฐธ์กฐ).

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

ํŠน์ • ์„ ์–ธ์„ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค(@jimmyfrasche์˜ https://github.com/golang/go/issues/18130#issuecomment-265294564 ์ฐธ์กฐ).

์ œํ•œ? ๋ณ„์นญ์€ ๋ช…๋ช…๋œ ํ˜•์‹์„ ๋Œ€์ƒ์œผ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

"๋ณ„์นญ์€ ๋ช…๋ช…๋˜์ง€ ์•Š์€ ์œ ํ˜•์— ์ ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ช…๋˜์ง€ ์•Š์€ ์œ ํ˜•์—์„œ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ์ด๋™ํ•˜๋Š” "์ฝ”๋“œ ๋ณต๊ตฌ" ์ด์•ผ๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ช…๋ช…๋˜์ง€ ์•Š์€ ์œ ํ˜•์— ๋ณ„์นญ์„ ํ—ˆ์šฉํ•˜๋ฉด ๋” ์ด์ƒ Go๋ฅผ ๋‹จ์ˆœํžˆ ๋ช…๋ช…๋œ ์œ ํ˜•๊ณผ ๋ช…๋ช…๋˜์ง€ ์•Š์€ ์œ ํ˜•์œผ๋กœ ๊ฐ€๋ฅด์น  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค." - https://github.com/golang/go/issues/18130#issuecomment -276864903 @davecheney ์ž‘์„ฑ

๊ทธ๊ฒƒ๋“ค์ด ์ž˜๋ชป ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ ์ „๊นŒ์ง€๋Š” ์‚ฌ์šฉ์„ ์ž์ œํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ธฐ์ƒ์กฐ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๋Œ€์ƒ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์œ„ ์ฐธ์กฐ).

๋””์ž์ธ ๋ฌธ์„œ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ƒํ™ฉ์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์šฉ์–ด๋ฅผ ๋ณ€๊ฒฝํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

FrozenDueToAge Proposal Proposal-Accepted

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

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

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

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ, ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹Œ ์ˆ˜์‹ ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ตฌ์กฐ์ฒด๊ฐ€ ์•„๋‹Œ ์œ ํ˜•์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์˜ค์šฉ ์ธ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด ์Šค์Šค๋กœ ์ธ์‡„ํ•˜๊ธฐ ์œ„ํ•ด String() ๋ฉ”์„œ๋“œ๋กœ ์—ด๊ฑฐํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์—†์—ˆ๊ณ  http.Headers ๋ชจ๋‘ ์ผ๋ฐ˜ ๋งต์ด ๋˜๊ณ  ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ค์šฉ์„ ์ƒ์ƒํ•˜๊ธฐ ์‰ฌ์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์„ค๋“๋ ฅ ์žˆ๋Š” ๊ธ์ •์ ์ธ ์‚ฌ์šฉ์€ ํ‘œ์‹œ๋˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹คํ—˜์„ ์œ„ํ•œ ๊ณต๊ฐ„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

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

var buf bytes.Buffer
io.Copy(buf, reader)

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

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

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

๋‚˜๋Š” ์ด๊ฒƒ์ด ์‹œ๊ฐ์ ์œผ๋กœ ์–ผ๋งˆ๋‚˜ ๊ท ์ผํ•˜๊ฒŒ ๋ณด์ด๋Š”์ง€ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

const OldAPI => NewPackage.API
func  OldAPI => NewPackage.API
var   OldAPI => NewPackage.API
type  OldAPI => NewPackage.API

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

const OldAPI = NewPackage.API
func  OldAPI() { NewPackage.API() }
var   OldAPI = NewPackage.API
type  OldAPI = NewPackage.API

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

Russ์˜ ๊ธฐ์‚ฌ๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ๋ชจ๋“  ๋ณ„์นญ๊ณผ ๊ฐ™์€ ์†”๋ฃจ์…˜์€ https://github.com/golang/go/issues/17746 ๋ฐ https://github.com/golang/go/issues/17784 ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๊ธฐ์‚ฌ๋ฅผ ์จ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํ• ๋‹น ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์œ ํ˜• ์ „์šฉ ๋ณ„์นญ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

type OldAPI = NewPackage.API

๋‚ด ์ด์œ :

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

์œ„์˜ ๋ชจ๋“  ๊ฒƒ: ๊ฒฐ๊ณผ๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์ง‘์ค‘์ ์ด๋ฉฐ ๋ณด์ˆ˜์ ์ด๋ฉฐ ๋ฏธํ•™์ ์ด๋ฏ€๋กœ ๋ฐ”๋‘‘์˜ ์ผ๋ถ€์ธ ๊ฒƒ์œผ๋กœ ์‰ฝ๊ฒŒ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜์ด ์œ ํ˜•์œผ๋กœ๋งŒ ์ œํ•œ๋˜๋Š” ๊ฒฝ์šฐ ๊ตฌ๋ฌธ

type NewFoo = old.Foo

@rsc ์˜ ๊ธฐ์‚ฌ์—์„œ ๋…ผ์˜๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ด๋ฏธ ์ด์ „์— ๊ณ ๋ คํ•œ ๊ฒƒ์ด ๋‚˜์—๊ฒŒ ๋งค์šฐ ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

์ƒ์ˆ˜, ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด ๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๊ตฌ๋ฌธ์€ (์ด์ „์— ์ œ์•ˆ๋œ ๋Œ€๋กœ)

package newfmt

import (
    "fmt"
)

// No renaming.
export fmt.Printf // Note: Same as `export Printf fmt.Printf`.

export (
        fmt.Sprintf
        fmt.Formatter
)

// Renaming.
export Foo fmt.Errorf // Foo must be exported, ie. `export foo fmt.Errorf` would be invalid.

export (
    Bar fmt.Fprintf
    Qux fmt.State
)

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

์ด๋ฆ„ ๋ณ€๊ฒฝ ์‹๋ณ„์ž๋Š” ํŒจํ‚ค์ง€ ๋ฒ”์œ„์—์„œ ์„ ์–ธ๋˜์ง€๋งŒ ์ƒˆ ์ด๋ฆ„ ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์žฌ์„ ์–ธ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์œ„์—์„œ ์„ ์–ธํ•œ ํŒจํ‚ค์ง€์—์„œ

var v = Printf // undefined: Printf.
var Printf int // Printf redeclared, previous declaration at newfmt.go:8.

๊ฐ€์ ธ์˜ค๊ธฐ ํŒจํ‚ค์ง€์—์„œ ์ด๋ฆ„ ๋ณ€๊ฒฝ ์‹๋ณ„์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ (newftm์˜) ํŒจํ‚ค์ง€ ๋ธ”๋ก์˜ ๋‹ค๋ฅธ ๋‚ด๋ณด๋‚ธ ์‹๋ณ„์ž๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package foo

import "newfmt"

type bar interface {
    baz(qux newfmt.Qux) // qux type is identical to fmt.State.
}

๊ฒฐ๋ก ์ ์œผ๋กœ, ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ newfmt์— ์ƒˆ๋กœ์šด ๋กœ์ปฌ ์ด๋ฆ„ ๋ฐ”์ธ๋”ฉ์„ ๋„์ž…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ #17746์—์„œ ๋…ผ์˜๋œ ๋ฌธ์ œ ์ค‘ ์ ์–ด๋„ ์ผ๋ถ€๋ฅผ ํ”ผํ•˜๊ณ  #17784๋ฅผ ์™„์ „ํžˆ ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฒซ ๋ฒˆ์งธ ๊ธฐ๋ณธ ์„ค์ •์€ ์œ ํ˜• ์ „์šฉ type NewFoo = old.Foo ์ž…๋‹ˆ๋‹ค.

๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ „์šฉ ํ‚ค์›Œ๋“œ๊ฐ€ ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ์ž(ํŠนํžˆ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ฐฉํ–ฅ์„ฑ์„ ๊ฐ€์ง„ ๋น„๋Œ€์นญ ์—ฐ์‚ฐ์ž[1])๋ณด๋‹ค ๋‚ซ๋‹ค๋Š” @cznic์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, export ํ‚ค์›Œ๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์˜๋ฏธ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ๋„ ์˜๋ฏธ๋„ import ๋ฐ˜์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. alias ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

@cznic ์ด ์ƒˆ ์ด๋ฆ„์„ ์„ ์–ธํ•˜๋Š” ํŒจํ‚ค์ง€์—์„œ ์ƒˆ ์ด๋ฆ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€๋งŒ, ์ ์–ด๋„ ์ €์—๊ฒŒ๋Š” ๊ทธ ์ œํ•œ์ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ธ์œ„์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค(๋น„๋ก ์ด์œ ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•˜์ง€๋งŒ).

[1] ์ €๋Š” ์œ ๋‹‰์Šค๋ฅผ ๊ฑฐ์˜ 20๋…„ ๋™์•ˆ ์‚ฌ์šฉํ•ด ์™”์ง€๋งŒ ์—ฌ์ „ํžˆ ์ฒซ ๋ฒˆ์งธ ์‹œ๋„์—์„œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งค๋‰ด์–ผ์„ ์ฝ๊ณ  ๋‚˜์„œ ๋‘ ๋ฒˆ์งธ ์‹œ๋„์—๋„ ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ํ˜•์— ๋Œ€ํ•œ ์œ ํ˜• ๋ณ„์นญ์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋งŒ ์„ ์–ธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@iand : ์ด ์ œ์•ฝ ์กฐ๊ฑด์€ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ฌด์—‡์ด๋“  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ Context ๋ฅผ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. Context ์˜ ์ด์ „ ํ™ˆ์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ Context ์˜ ๋ณ„์นญ์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@quentinmit ๋ถˆํ–‰ํžˆ๋„ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด CL https://go-review.googlesource.com/#/c/32145/ ์—์„œ golang.org/x/image/draw์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ง„์งœ ๊ด€์‹ฌ์‚ฌ๋Š” interface{} ๋ฐ error ์™€ ๊ฐ™์€ ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ~ ๋ฅผ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์˜์–ด์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ "~์™€ ๋น„์Šทํ•œ", "๋Œ€๋žต", "์•ฝ" ๋˜๋Š” "์ฃผ๋ณ€"์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ด๋ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ @4ad๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด => ๋Š” ๋ฐฉํ–ฅ์„ฑ์ด ํ˜ผ๋™๋˜๋Š” ๋น„๋Œ€์นญ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

const OldAPI ~ NewPackage.API
func  OldAPI ~ NewPackage.API
var   OldAPI ~ NewPackage.API
type  OldAPI ~ NewPackage.API

@and ์˜ค๋ฅธ์ชฝ์„ ํŒจํ‚ค์ง€ ํ•œ์ • ์‹๋ณ„์ž๋กœ ์ œํ•œํ•˜๋ฉด ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ˜„์žฌ ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ์œ ํ˜• ๋˜๋Š” map[string]map[int]interface{} ์™€ ๊ฐ™์€ ๊ธด ์œ ํ˜• ํ‘œํ˜„์‹์— ๋Œ€ํ•œ ๋ณ„์นญ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์šฉ๋„๋Š” ์ ์ง„์  ์ฝ”๋“œ ๋ณต๊ตฌ์˜ ์ฃผ์š” ๋ชฉํ‘œ์™€ ๊ด€๋ จ์ด ์—†์œผ๋ฏ€๋กœ ํฐ ์†์‹ค์€ ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ, ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹Œ ์ˆ˜์‹ ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ตฌ์กฐ์ฒด๊ฐ€ ์•„๋‹Œ ์œ ํ˜•์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์˜ค์šฉ ์ธ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด ์Šค์Šค๋กœ ์ธ์‡„ํ•˜๊ธฐ ์œ„ํ•ด String() ๋ฉ”์„œ๋“œ๋กœ ์—ด๊ฑฐํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์—†์—ˆ๊ณ  http.Headers ๋ชจ๋‘ ์ผ๋ฐ˜ ๋งต์ด ๋˜๊ณ  ๋„์šฐ๋ฏธ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ค์šฉ์„ ์ƒ์ƒํ•˜๊ธฐ ์‰ฌ์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์„ค๋“๋ ฅ ์žˆ๋Š” ๊ธ์ •์ ์ธ ์‚ฌ์šฉ์€ ํ‘œ์‹œ๋˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹คํ—˜์„ ์œ„ํ•œ ๊ณต๊ฐ„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

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

var buf bytes.Buffer
io.Copy(buf, reader)

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

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

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

์›๋ž˜ ๋ณ„์นญ ์ œ์•ˆ์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€๋Š” ์˜๋„๋œ ์‚ฌ์šฉ ์‚ฌ๋ก€(๋ฆฌํŒฉํ† ๋ง ํ™œ์„ฑํ™”)์—์„œ ๋ณ„์นญ ์œ ํ˜•์˜ ์‹ค์ œ ์‚ฌ์šฉ์ด ์ผ์‹œ์ ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. protobuffer ์˜ˆ์ œ์—์„œ io.BytesBuffer ์Šคํ…์€ ์ ์ง„์  ๋ณต๊ตฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ํ•œ ๊ฐ€์ง€ ์˜ˆ์™ธ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋ฐ”์ดํฌ์‰๋”ฉ์— ์ฐธ์—ฌํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ๋ณ„์นญ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ๋ณ„์นญ์„ ์œ ํ˜•์œผ๋กœ ์ œํ•œํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ์ ์–ด๋„ var ๊นŒ์ง€ ์ผ๊ด€๋˜๊ฒŒ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค func ๋ฐ const (์ œ์•ˆ๋œ ๋ชจ๋“  ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋Š” type Foo = pkg.Bar ์ œ์™ธํ•˜๊ณ  ๋ชจ๋‘ ํ—ˆ์šฉ). ๊ทธ ์ด์œ ๋Š” var ๋Œ€ํ•œ ๋ณ„์นญ์ด ์ฐจ์ด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋“œ๋ฌผ๋‹ค๋Š” ์ ์—๋Š” ๋™์˜ํ•˜์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๋ณ„์นญ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์  ๊ฐ€๋Š” ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค๋„. ๊ทธ ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๋ณ„์นญ ์„ ์–ธ์ด ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€๋˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. type Foo = pkg.Bar ๋ฐ var Foo => pkg.Bar ์ด๋ฉด ์ข‹์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ 4๊ฐ€์ง€ ๋ชจ๋‘๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ๋…ผ์Ÿํ•  ๊ฒƒ์ด๋‹ค. ์ด์œ ๋Š”

1) ๊ฑฐ๊ธฐ์— ๋Œ€ํ•œ ๊ตฌ๋ถ„์ด๋‹ค var ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉ ๋•Œ๋กœ๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚˜๋Š” ์ข…์ข… ๊ธ€๋กœ๋ฒŒ var Debug *log.Logger ๋…ธ์ถœํ•˜๊ฑฐ๋‚˜ http.DefaultServeMux ์™€ ๊ฐ™์€ ๊ธ€๋กœ๋ฒŒ ์‹ฑ๊ธ€ํ†ค์„ ์žฌํ• ๋‹นํ•˜์—ฌ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํŒจํ‚ค์ง€์˜ ๋“ฑ๋ก์„ ๊ฐ€๋กœ์ฑ„๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

2) ๋‚˜๋Š” ๋˜ํ•œ func Foo() { pkg.Bar() } ๊ฐ€ func Foo => pkg.Bar ์™€ ๊ฐ™์€ ์ผ์„ ํ•˜์ง€๋งŒ ํ›„์ž์˜ ์˜๋„๊ฐ€ ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(ํŠนํžˆ ์ด๋ฏธ ๋ณ„์นญ์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ). "์ด๊ฒƒ์€ ์ •๋ง๋กœ ์—ฌ๊ธฐ์—์„œ ์˜๋„๋œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค"๋ผ๊ณ  ๋ถ„๋ช…ํžˆ ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์ˆ ์ ์œผ๋กœ ๋™์ผํ•˜์ง€๋งŒ ๋ณ„์นญ ๊ตฌ๋ฌธ์ด ๋ฌธ์„œ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ฃฝ์„ ์–ธ๋•์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ๋Š” ํ•œ ์ง€๊ธˆ์€ type-alias๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์„œ์™€ ๋‹ค๋ฅธ ๋ณ„์นญ์ด ํฌํ•จ๋œ ์ถ”๊ฐ€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  AIUI๋Š” ์ด ๋ฌธ์ œ์˜ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์˜๋„๋กœ, ์ ์ง„์ ์ธ ๋ณต๊ตฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๋งค์šฐ ๊ธฐ์˜์ง€๋งŒ, ๊ฐ€๋ช…๊ณผ ๋‹ค๋ฅธ ๊ฒฐ์ •์ด ๋„๋‹ฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •๋œ๋‹ค๋ฉด ๊ทธ ๊ฒฝ์šฐ์—๋„ ์ง€์› ์—ฌ๋ถ€์™€ ์ง€์› ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋™์‹œ์— ๋…ผ์˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. protobuf public imports ๋˜๋Š” x/image/draw ๋“œ๋กญ์ธ ๊ต์ฒด ํŒจํ‚ค์ง€์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€(๋‘˜ ๋‹ค ์ œ ๋งˆ์Œ์— ์กฐ๊ธˆ ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค)์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. @btracey ์˜ ๋ณ„์นญ์— ๋Œ€ํ•œ go-tool/gc ํ”Œ๋ž˜๊ทธ ์ œ์•ˆ์€ ์ ์ง„์  ๋ณต๊ตฌ๋ฅผ ๋น„๊ต์  ์ž˜ ๋‹ค๋ฃจ์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ์‹ค์ œ๋กœ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ •๋ง ์‚ฌ์šฉ ๋ญ”๊ฐ€ ์ปดํŒŒ์ผํ•˜๊ณ ์žํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์—†๋‹ค x/image/draw ๊ทธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด, ๊ทธ๋“ค์€ ๋‹จ์ง€ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ go get .

@jba

@and ์˜ค๋ฅธ์ชฝ์„ ํŒจํ‚ค์ง€ ํ•œ์ • ์‹๋ณ„์ž๋กœ ์ œํ•œํ•˜๋ฉด ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ˜„์žฌ ํŒจํ‚ค์ง€์˜ ์–ด๋–ค ์œ ํ˜•์—๋„ ๋ณ„์นญ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. [...]. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์šฉ๋„๋Š” ์ ์ง„์  ์ฝ”๋“œ ๋ณต๊ตฌ์˜ ์ฃผ์š” ๋ชฉํ‘œ์™€ ๊ด€๋ จ์ด ์—†์œผ๋ฏ€๋กœ ํฐ ์†์‹ค์€ ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

@btracey

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

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

@btracey ๋ฐ @bcmills , ๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ: ์ „๋ฌธ๊ฐ€ ๋˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ตฌ์ถ•ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๊ณผ ๊ฐ™์ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ชจ๋“  ๋„๊ตฌ. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์Šฌ๋ผ์ด์Šคํ•˜๋“ ๊ฐ„์— ํ™•์‹คํžˆ ์–ธ์–ด ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.

๊ดœ์ฐฎ ๊ฐ์‚ฌ.

๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅ์„ฑ์€ const ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๋ณ„์นญ์ž…๋‹ˆ๋‹ค(

const์˜ ๊ฒฝ์šฐ => ๋Š” ์‹ค์ œ๋กœ = ๋ฅผ ์“ฐ๋Š” ๋” ๊ธด ๋ฐฉ๋ฒ•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ๋ฐ var์™€ ๊ฐ™์ด ์ƒˆ๋กœ์šด ์˜๋ฏธ ์ฒด๊ณ„๋Š” ์—†์Šต๋‹ˆ๋‹ค. funcs์™€ ๊ฐ™์ด ์ €์žฅ๋œ ํ‚ค ์ž…๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ ์–ด๋„ # 17784๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ฆ‰, ์ง€๊ธˆ์€ ์œ ํ˜• ๋ณ„์นญ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ณ„์นญ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” @Merovius์˜ ์˜๊ฒฌ์— ํ™•์‹คํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ var ๋ฐ func ๋ณ„์นญ ์ถ”๊ฐ€ ์˜ต์…˜์„

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

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

(1)๊ณผ (2)์— ๋Œ€ํ•œ ๋™๊ธฐ ๋ถ€์—ฌ ์•„์ด๋””์–ด๋Š” ๋ณ„์นญ ๋Œ€์‹  ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. #17746์—์„œ ๋ณ„์นญ์€ ๊ฐ™์€ ์œ ํ˜•์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ์ด๋ฆ„์„ ๊ฐ–๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค(๋˜๋Š” ๋ณ„์นญ์„ #define ๋˜๋Š” ํ•˜๋“œ ๋งํฌ์™€ ๊ฐ™์ด ์ƒ๊ฐํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋™์ผํ•œ ์ด๋ฆ„์˜ ์ฒ ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€). ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ ํ˜•์„ ๊ตฌ๋ณ„ํ•จ์œผ๋กœ์จ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋” ๋งŽ์€ ์ž๋™ ๋ณ€ํ™˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

fmt.Println("abc") ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ var e interface{} = "abc" ํ•˜๋ฉด "abc" ๊ฐ€ ์ž๋™์œผ๋กœ interface{} ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. type T struct { S } ์„ ์–ธํ•˜๊ณ  T์— ์Šน๊ฒฉ๋˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค๋ฅธ ๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€์—์„œ ์žฌ๊ท€์ ์œผ๋กœ ํฌํ•จํ•˜์—ฌ ํ•„์š”์— ๋”ฐ๋ผ S์™€ T ๊ฐ„์— ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋„๋ก ์–ธ์–ด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ T๋Š” ์ ์ง„์  ๋ฆฌํŒฉํ† ๋ง ๋ชฉ์ ์„ ์œ„ํ•ด S์˜ ์‚ฌ์‹ค์ƒ ๋ณ„์นญ(๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€)์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ƒˆ๋กœ์šด "๋ชจ์–‘" ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

type T ~S ๊ฐ€ "S์ฒ˜๋Ÿผ ๋ณด์ด๋Š”" ์œ ํ˜•์ธ ์ƒˆ๋กœ์šด ์œ ํ˜• T๋ฅผ ์„ ์–ธํ•˜๋„๋ก ํ•˜์‹ญ์‹œ์˜ค. ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ๋Š” T๋Š” "์œ ํ˜• S๋กœ ๋ฐ ์œ ํ˜• S์—์„œ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์œ ํ˜•"์ž…๋‹ˆ๋‹ค. (ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด ๊ตฌ๋ฌธ์€ ๋‚˜์ค‘์— ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ T๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ T๋กœ ๋ฌด์—‡์ด๋“  ํ•˜๋ ค๋ฉด T๋ฅผ S(๋˜๋Š” S๋กœ/์—์„œ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•œ ์œ ํ˜•)๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•๊ณผ ๋‹ฌ๋ฆฌ "๊ตฌ์ฒด์ ์ธ ์œ ํ˜•"์ด ์—†์œผ๋ฉฐ S์—์„œ T๋กœ, T์—์„œ S๋กœ์˜ ๋ณ€ํ™˜์—๋Š” ํ‘œํ˜„ ๋ณ€๊ฒฝ์ด ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ์ง„์  ๋ฆฌํŒฉํ† ๋ง์˜ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ "๋ชจ์–‘" ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์„ฑ์ž๊ฐ€ ์ด์ „ ์œ ํ˜•๊ณผ ์ƒˆ ์œ ํ˜•์„ ๋ชจ๋‘ ํ—ˆ์šฉํ•˜๋Š” API๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ("look like" ์œ ํ˜•์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณ ๋„๋กœ ์ œํ•œ๋˜๊ณ  ๋‹จ์ˆœํ™”๋œ ๊ณต์šฉ์ฒด ์œ ํ˜•์ž…๋‹ˆ๋‹ค.)

  1. ์œ ํ˜• ํƒœ๊ทธ

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

๋ณ„์นญ์„ ๋‹ค์‹œ ์‹œ๋„ํ•˜๋ฉด "iota๊ฐ€ ํ•˜๋Š” ์ผ" ๋ฐ "์ž„๋ฒ ๋”ฉ์ด ํ•˜๋Š” ์ผ" ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•œ "godoc์ด ํ•˜๋Š” ์ผ"์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ, ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ

type  OldAPI => NewPackage.API

NewPackage.API์— ๋ฌธ์„œ ์ฃผ์„์ด ์žˆ๋Š” ๊ฒฝ์šฐ "Type OldAPI" ์˜†์— ํ•ด๋‹น ์ฃผ์„์„ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ, ์ฃผ์„์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ(godoc์ด ์ž๋™์œผ๋กœ ๋งํฌ๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์ž๋™์œผ๋กœ ๋ณต์‚ฌ/๋ถ™์—ฌ๋„ฃ๊ธฐ ์‚ฌ์šฉ), ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ํ˜‘์•ฝ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์†Œ ์ ‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฃผ์š” ๋™๊ธฐ๋Š” ์ ์ง„์ ์ธ ์ฝ”๋“œ ๋ณต๊ตฌ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด๊ณ  ์ง€์›ํ•ด์•ผ ํ•˜์ง€๋งŒ, ์‚ฌ์†Œํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€(๊ตฌ์ฒด์ ์ธ ์ œ์•ˆ์ด๋ฏ€๋กœ ๋ณ„์นญ ์ œ์•ˆ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ)๋Š” ๋‹จ์ผ ํ•จ์ˆ˜๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ์ด์ค‘ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋นŒ๋“œ ํƒœ๊ทธ ์ข…์† ๊ตฌํ˜„์œผ๋กœ ๋’ท๋ฐ›์นจ๋ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์†์„ ํ”๋“ค๊ณ  ์žˆ์ง€๋งŒ ์ตœ๊ทผ https://groups.google.com/d/topic/golang-nuts/wb5I2tjrwoc/discussion "ํŒจํ‚ค์ง€์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐฉ์ง€ go+asm ๊ตฌํ˜„" ํ† ๋ก .

@nigeltao re godoc, ์ œ ์ƒ๊ฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ์›๋ณธ์— ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณ„์นญ์— ๋ฌธ์„œ๊ฐ€ ์žˆ์œผ๋ฉด ์ƒ๊ด€์—†์ด ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณ„์นญ์— ๋ฌธ์„œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ godoc์— ์›๋ž˜ ๋ฌธ์„œ๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋ณ„์นญ๋„ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์œ ํ˜• ์ด๋ฆ„์ด ์ž˜๋ชป๋˜๊ณ  ๋ฌธ์„œ๊ฐ€ ํ˜„์žฌ ํŒจํ‚ค์ง€์— ์—†๋Š” ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ณ , ์ ์ง„์  ๋ฆฌํŒฉํ† ๋ง์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ X๋ฅผ ๋ณผ ๋•Œ "Deprecated: use X"๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹ค์Œ ์•„์ด๋””์–ด๊ฐ€ ์ด์ „์— ๊ฒŒ์‹œ๋˜์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ๋„๊ตฌ ๊ธฐ๋ฐ˜์˜ "gofix" / "gorename"๊ณผ ๊ฐ™์€ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋ ค๋ฉด:

  • ๋ชจ๋“  ํŒจํ‚ค์ง€์—๋Š” ์žฌ์ž‘์„ฑ ๊ทœ์น™ ์„ธํŠธ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: pkg.Ident => otherpkg.Ident ๋งคํ•‘).
  • ์ด๋Ÿฌํ•œ ์žฌ์ž‘์„ฑ ๊ทœ์น™์€ ์ž„์˜์˜ go ํŒŒ์ผ ๋‚ด๋ถ€์— //+rewrite ... ํƒœ๊ทธ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์žฌ์ž‘์„ฑ ๊ทœ์น™์€ ABI ํ˜ธํ™˜ ๋ณ€๊ฒฝ์— ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: pkg.MyFunc(a) => pkg.MyFunc(context.Contex(), a) ).
  • gofix์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์ €์žฅ์†Œ์— ๋ชจ๋“  ๋ณ€ํ™˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŒจํ‚ค์ง€ ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ฑ๊ณต์ ์œผ๋กœ ์ปดํŒŒ์ผํ•˜๊ธฐ ์œ„ํ•ด gofix ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ข…์†์„ฑ X์˜ ์ด์ „ API๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(X์˜ ์ด์ „ ๋ฐ ์ƒˆ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด)๋Š” ์—ฌ์ „ํžˆ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. go build ๋ช…๋ น์€ ๋””์Šคํฌ์˜ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์„์—์„œ ๋ณ€ํ™˜(ํŒจํ‚ค์ง€ X์˜ ๋‹ค์‹œ ์“ฐ๊ธฐ ํƒœ๊ทธ์— ์ง€์ •๋จ)์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

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

@josharian ์™„์ „ํ•œ ์ œ์•ˆ์œผ๋กœ ์˜๋„ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋‹ต๋ณ€์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์ „ํ™˜์ด ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. x/net/context.Context ์— ํ• ๋‹น / convertable / whateverable์ž…๋‹ˆ๋‹ค context.Context . ๋ฌธ์ œ๋Š” ๊ณ ์ฐจ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ฆ‰ func (ctx x/net/context.Context) ๋ฐ func (ctx context.Context) ์€ ์ธ์ˆ˜๊ฐ€ ํ• ๋‹น ๊ฐ€๋Šฅํ•˜๋”๋ผ๋„ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด type T struct { S } ๊ฐ€ T ์™€ S ๊ฐ€ ๋™์ผํ•œ ์œ ํ˜•์ž„์„ ์˜๋ฏธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ณ„์นญ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค(์ด ๊ตฌ๋ฌธ์—๋Š” ์ด๋ฏธ ๋‹ค๋ฅธ ์˜๋ฏธ๊ฐ€ ์žˆ์Œ).

  2. ํ• ๋‹น ๊ฐ€๋Šฅ/๋ณ€ํ™˜ ๊ฐ€๋Šฅ ์œ ํ˜•์ด ๋ฐ˜๋“œ์‹œ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ฐจ ์œ ํ˜•์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด์„์ด ํฌ๊ฒŒ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ). ์˜ˆ๋ฅผ ๋“ค์–ด, uint8 ๋Š” uint64 ๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด type T ~uint8 ์˜ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ func(T) ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ์—์„œ 1, 2,4 ๋˜๋Š” 8๋ฐ”์ดํŠธ๋ฅผ ํ‘ธ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚˜์—๊ฒŒ๋Š” ๊ฝค ๋ณต์žกํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค(๋ณ„์นญ๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค).

@Merovius๋‹˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  1. ์˜ˆ, ์—ฌ๊ธฐ์„œ ์ธํ„ฐํŽ˜์ด์Šค ๋งŒ์กฑ๋„๋ฅผ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ๋‹น์‹  ๋ง์ด ๋งž์•„, ์ด๊ฒƒ์€ ์ผ์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

@uluyol ์˜ˆ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์žŽ์ด ์•„๋‹Œ ํ•จ์ˆ˜๋ฅผ ์ธ๋ผ์ธํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์ด์ง€๋งŒ, ์žŽ์ด ์•„๋‹Œ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ธ๋ผ์ธ ํ˜ธ์ถœ์ด ์Šคํƒ ์ถ”์ , runtime.Callers ๋“ฑ์— ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์™€ ๊ด€๋ จํ•˜์—ฌ ๋ช…์‹œ์  ์•จ๋ฆฌ์–ด์‹ฑ์€ ๊ทธ๋‹ค์ง€ ๋†€๋ž์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด, ๊ทธ๊ฒƒ์€ ์‚ฌ์†Œํ•œ ์ ‘์„ ์ž…๋‹ˆ๋‹ค.

@josharian ๋น„์Šทํ•œ ๋ฌธ์ œ: [2]uintptr ๋ฐ interface{} ๋Š” ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„์—๋งŒ ์˜์กดํ•˜๋ฉด ํ˜•์‹ ์•ˆ์ „์„ฑ์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. uint64 ๋ฐ float64 ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์ปจ๋ฒ„ํ„ฐ๋ธ” ์•ž๋’ค๋กœ,ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ์–ด๋Š ๊ฒƒ์ด ์–ด๋Š ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ์ ์–ด๋„ ์ •๋ง ์ด์ƒํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ "๋™์ผํ•œ ๊ธฐ๋ณธ ์œ ํ˜•"์œผ๋กœ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ํ˜•์ด ํ•„๋“œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์ž˜๋ชป๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. type S1 struct { T1 } ๋ฐ type S2 struct { T2 } ( T1 ๋ฐ T2 ๊ฐ€ ๋™์ผํ•œ ๊ธฐ๋ณธ ์œ ํ˜• ํฌํ•จ)๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ type L1 ~T1 ๋‘˜ ๋‹ค ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. type S struct { L1 } , ํ•˜์ง€๋งŒ T1 ๋ฐ T2 ์—ฌ์ „ํžˆ ๋‹ค๋ฅธ(๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ) ๊ธฐ๋ณธ ์œ ํ˜•์ด ์žˆ์œผ๋ฏ€๋กœ type L2 ~S1 ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด S2 ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. S1 ์•„๋‹Œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ L2 .

๋”ฐ๋ผ์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์‚ฌ์–‘์˜ ์—ฌ๋Ÿฌ ์œ„์น˜์—์„œ "๋™์ผํ•œ ์œ ํ˜•"์„ "๋™์ผํ•œ ๊ธฐ๋ณธ ์œ ํ˜•"์œผ๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฃจ๊ธฐ ํž˜๋“ค๊ณ  ์œ ํ˜• ์•ˆ์ „์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. "์œ ์‚ฌํ•œ" ์œ ํ˜•์€ ๋˜ํ•œ ๋ณ„์นญ์— ๋Œ€ํ•œ ์ฃผ์š” ์ฃผ์žฅ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋ณ„์นญ์ธ IMHO๋ณด๋‹ค ๋‚จ์šฉ๊ณผ ํ˜ผ๋™ ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ๋” ํฐ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋‚˜ ๊ฐ„๋‹จํ•œ ๊ทœ์น™์„ ์ƒ๊ฐํ•ด ๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด ๋ถ„๋ช…ํžˆ ๋Œ€์•ˆ์œผ๋กœ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. :)

@josharian ์˜ ์•„์ด๋””์–ด์— ๋”ฐ๋ผ ๋‹ค์Œ์€ ๊ทธ์˜ ์ˆซ์ž 2์˜ ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค.

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

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

์ด์™€ ๋ฐ˜๋Œ€๋กœ ๋ฐฉํ–ฅ์„ฑ์˜ ๋ฐ˜์ „์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์„ ์ปจํ…์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง์— ์ ์šฉํ•˜๋ฉด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ปจํ…์ŠคํŠธ ํŒจํ‚ค์ง€๋Š” context.Context ๊ฐ€ golang.org/x/net/context.Context ๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ context.Context๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ชจ๋“  ์‚ฌ์šฉ๋ฒ•์ด ๊ทธ ์ž๋ฆฌ์— golang.org/x/net/context.Context ๋„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Context๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปจํ…์ŠคํŠธ ํŒจํ‚ค์ง€์˜ ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ context.Context ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์€ ํฌํ•จ๋œ ์œ ํ˜•์˜ ์ด๋ฆ„์ด ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํฌํ•จ ๋ฌธ์ œ(#17746)๋ฅผ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํฌํ•จ๋œ ์œ ํ˜•์€ ๋Œ€์ฒด ์œ ํ˜•์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ian๊ณผ @josharian ์€ ๊ณต๋ณ€ ์œ ํ˜•์˜ ํŠน์ • ๋ณ€ํ˜•์„ ์š”๊ตฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@josharian , ์ œ์•ˆ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

type T struct { S } , ๋ณ„์นญ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๋” ๋ช…ํ™•ํ•œ ๊ตฌ๋ฌธ์€ ์•„๋‹™๋‹ˆ๋‹ค.

Re type T ~S , ๋ณ„์นญ๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฑฐ๋‚˜ ๋ฆฌํŒฉํ† ๋ง์— ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋ง(์˜ˆ: io.ByteBuffer -> bytes.Buffer)์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

package io
type ByteBuffer ~bytes.Buffer

๊ทธ๋Ÿฌ๋‚˜ "๊ธฐ๋ณธ์ ์œผ๋กœ T๋กœ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด S๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋ฉด io.ByteBuffer๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์—ฌ์ „ํžˆ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

Re type T S "alias" : ์œ„์—์„œ ์ž‘์„ฑํ•œ @bcmills์˜ ์š”์ ์€ ์œ ํ˜•์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ด๋ฆ„์„ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ–๋Š” ๊ฒƒ์€ ์ฒ ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ๋˜๋“  ์–ธ์–ด ๋ณ€๊ฒฝ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด io.ByteBuffer ๋ฐ bytes.Buffer๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ฑฐ๋‚˜ ์œ ํ˜• ๊ฒ€์‚ฌํ•˜๋Š” ๋„๊ตฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ œ์•ˆ์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์€ "์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์ถ”๊ฐ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ๊ณ„ํšํ•ด์•ผ ํ•  ๊ฒƒ"๊ณผ ๊ฐ™์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„, ํ•˜์ง€๋งŒ ๋ฌธ์ž์—ด์ด ๊ทธ๊ฒƒ๋“ค์„ ์„ค๋ช…ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ธ์ง€๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์šฐ๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•œ ํ•„์š” ์—†์ด ๊ตฌ๋ฌธ(Java ์ผ๋ฐ˜ํ™” ์ฃผ์„๊ณผ ๊ฐ™์€)์„ ์„ค๊ณ„ํ•˜๊ณ  ์‹ถ์€์ง€๋„ ๋ถˆ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ํ˜•์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๋”๋ผ๋„ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์šฐ๋ฆฌ๊ฐ€ ๋„์ž…ํ•œ ์ƒˆ๋กœ์šด ์˜๋ฏธ๋ก ์˜ ๋ชจ๋“  ์˜๋ฏธ๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋ฉฐ ๋Œ€๋ถ€๋ถ„์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ชจ๋“  ๋„๊ตฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ์–ธ์–ด ๋ณ€๊ฒฝ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋ฌผ๋ก  gofmt ์ œ์™ธ). ์ด๋Ÿฐ์ €๋Ÿฐ ๋ฉ”ํƒ€ ์–ธ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ํ•„์š”ํ•œ ์–‘์‹์„ ํ•˜๋‚˜์”ฉ ์ž‘์„ฑํ•˜๋Š” ๊ฐ€์žฅ ๋ช…ํ™•ํ•œ ๋ฐฉ๋ฒ•์„ ๊ณ„์† ์ฐพ๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

@Merovius FWIW, [2]uintptr๊ณผ ์ธํ„ฐํŽ˜์ด์Šค{}์˜ ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„์ด ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค{}๋Š” [2]uintptr์ด ์•„๋‹ˆ๋ผ [2]unsafe.Pointer์ž…๋‹ˆ๋‹ค. uintptr๊ณผ ํฌ์ธํ„ฐ๋Š” ๋‹ค๋ฅธ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ง์ ‘์ ์ธ ๋ณ€ํ™˜์„ ๋ฐ˜๋“œ์‹œ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š๋‹ค๋Š” ๋‹น์‹ ์˜ ์ผ๋ฐ˜์ ์ธ ์š”์ ์ด ์˜ณ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ์ธํ„ฐํŽ˜์ด์Šค{}์—์„œ [2]*byte๋กœ๋„ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ์—ฌ๊ธฐ์— ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์Šต๋‹ˆ๋‹ค.

@jimmyfrasche ๋ฐ @nigeltao , re godoc: ์ €๋„ ์ผ์ฐ ์ž‘์—…ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ "์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ๋ฌด์—‡์ด๋“  ๊ฐ„์— - ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฆฌํŒฉํ† ๋ง์—๋งŒ ์‚ฌ์šฉ๋  ๊ฒƒ"์ด๋ผ๋Š” ๊ฐ€์ •์„ ํ•˜๋“œ ์ฝ”๋”ฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. Nigel์ด ๋ณ„์นญ์œผ๋กœ ๊ทธ๋ฆฌ๊ธฐ ํ™•์žฅ ํŒจํ‚ค์ง€๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค€ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์šฉ๋„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Jimmy๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์€ ๋ฌธ์„œ ์ฃผ์„์— ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ ์ฃผ์„์ด ์—†๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ๋ฌธ์„œ ์ฃผ์„์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๊ตฌ๋ฌธ(์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•จ)์—์„œ ์ด๋ฏธ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋งํ•  ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ๋ณด๋ ค๋ฉด ์ด์ „ Go 1.8 ๋ณ„์นญ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์ฃผ์–ด์ง„

type ByteBuffer => bytes.Buffer

"ByteBuffer๋Š” bytes.Buffer์˜ ๋ณ„์นญ์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฌธ์„œ ์ฃผ์„์„ ํ•ฉ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ •์˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์ค‘๋ณต๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์˜ค๋Š˜ "์œ ํ˜• X struct{}"๋ฅผ ์“ด๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” "X๋Š” struct{}์˜ ๋ช…๋ช…๋œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ํ•ฉ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

package old
type T { x int }

package new
import "old"
type T1 { x int }
substitutable T1 <- old.T

๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ˜์ „์ด ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ๊ทธ ์ž์ฒด๋กœ ์‡ผ ์Šคํ† ํผ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ๊ฑด๋„ˆ๋›ฐ๋„๋ก ํ•ฉ์‹œ๋‹ค. ์ด ์‹œ์ ์—์„œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ์ทจ์•ฝํ•œ ์ƒํƒœ์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด์ œ ํŒจํ‚ค์ง€ new๋Š” ํŒจํ‚ค์ง€ old์— struct ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์ฒด ๊ฐ€๋Šฅํ•œ ๋ผ์ธ์ด ์ฃผ์–ด์ง€๋ฉด T1์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ์ •์˜๋Š” ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค. ๋ฐ”๋กœ old.T์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์œ ํ˜•์ด ์—ฌ์ „ํžˆ ๋ณ„๊ฐœ์˜ ์ •์˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด์„œ๋„ ๊ฑฑ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„๋„ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ, T๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค์— ๋„ฃ์€ ๋‹ค์Œ{} ์œ ํ˜• ์–ด์„ค์…˜์„ T1์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋นผ๋‚ด๊ณ  M()์„ ํ˜ธ์ถœํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ๋‹น์‹ ์€ T1.M์„ ์–ป์„? T1์˜ ์ด๋ฆ„์„ ์ง์ ‘ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค { M() }๋กœ ๊บผ๋‚ด์„œ M()์„ ํ˜ธ์ถœํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋‹น์‹ ์€ TM์„ ์–ป์„? ์†Œ์Šค ํŠธ๋ฆฌ์— ๋‘ ์ •์˜๊ฐ€ ๋ชจ๋‘ ์žˆ๋‹ค๋Š” ๋ชจํ˜ธ์„ฑ์œผ๋กœ ์ธํ•ด ๋ณต์žก์„ฑ์ด ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก , ๋Œ€์ฒด ๊ฐ€๋Šฅํ•œ ๋ผ์ธ์€ ๋‚˜๋จธ์ง€๋ฅผ ์ค‘๋ณต์œผ๋กœ ๋งŒ๋“ค๊ณ  T1 ์œ ํ˜•์ด๋‚˜ ์–ด๋–ค ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ์ •์˜๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ (์ด์ „ ๋ณ„์นญ ๊ตฌ๋ฌธ์—์„œ) type T1 => old.T ๋ฅผ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

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

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

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

@iand ์ •์˜๊ฐ€

#13467์—์„œ @joegrasse ๋Š” ์ด ์ œ์•ˆ์ด ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€์—์„œ cgo๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋™์ผํ•œ C ์œ ํ˜•์ด ๋™์ผํ•œ Go ์œ ํ˜•์ด ๋˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜๋ฉด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ด ๋ฌธ์ œ์™€ ์ „ํ˜€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ๋‘ ๋ฌธ์ œ ๋ชจ๋‘ ์œ ํ˜• ์•จ๋ฆฌ์–ด์‹ฑ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ„์นญ์— ๋Œ€ํ•œ ์ œ์•ˆ/์ˆ˜๋ฝ/๊ฑฐ๋ถ€ ์ œํ•œ/์ œํ•œ์— ๋Œ€ํ•œ ์š”์•ฝ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋– ์˜ค๋ฅด๋Š” ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

@rsc ๋Œ€ํ™”๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๋Œ๋ฆฌ๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ ๋ณ„์นญ ์ œ์•ˆ์—์„œ "new"๊ฐ€ "old"๊ฐ€ ์˜์กดํ•˜๋Š” ํ•„๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด "old"์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด์ œ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

@thwd ์•„์ง ์ข‹์€ ๊ธ€์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ๋‚ด ๋ฉ”๋ชจ:

  • ๋ณ„์นญ ์ฃผ๊ธฐ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ๊ต์ฐจ ๋ณ„์นญ์˜ ๊ฒฝ์šฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์ฃผ๊ธฐ๋กœ ์ธํ•ด ์ฃผ๊ธฐ๊ฐ€ ์ด๋ฏธ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ๊ต์ฐจ๊ฐ€ ์•„๋‹Œ ๋ณ„์นญ์˜ ๊ฒฝ์šฐ ๋ถ„๋ช…ํžˆ ํ—ˆ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ ์ด๋Š” ์ดˆ๊ธฐํ™” ์ˆœ์„œ์˜ ์ฃผ๊ธฐ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” ๋ณ„์นญ์— ๋Œ€ํ•œ ๋ณ„์นญ์„ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ ์ง„์ ์ธ ๋ณต๊ตฌ ์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ ์ œํ•œ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ (์œ„์˜ ๋‚ด ์„ค๋ช… ์ฐธ์กฐ) ํŒจํ‚ค์ง€ A๊ฐ€ ์œ ํ˜•์„ ์˜ฎ๊ธฐ๋Š” ์‚ฌ๋žŒ์— ์˜ํ•ด ์†์ƒ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์Šฌํ”Œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณ„์นญ์ด ์žˆ๋Š” ํŒจํ‚ค์ง€ B( x/image/draw.Image ์•จ๋ฆฌ์–ด์‹ฑ draw.Image ๋‹ค์Œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋ณ„์นญ์„ ํ†ตํ•ด draw.Image ๋ฅผ image.Draw ๋กœ ์ด๋™ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ๊ฐ‘์ž๊ธฐ x/image/draw ๋Š” ๋ณ„์นญ์— ๋Œ€ํ•œ ๋ณ„์นญ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.
  • ์ด์ „์— ๋ณ„์นญ์„ ์ง€์ง€ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ ์‹๋ณ„์ž๋ฅผ ๋ณ„์นญ์œผ๋กœ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์ด์ƒํ•จ ๋•Œ๋ฌธ์— ๋‚˜์œ ์ƒ๊ฐ์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค์ƒ ์ด๋Š” ๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ ์‹๋ณ„์ž์— ๋Œ€ํ•œ ๋ณ„์นญ์ด ์“ธ๋ชจ๊ฐ€ ์—†์œผ๋ฉฐ ์™„์ „ํžˆ ํ—ˆ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์ž„๋ฒ ๋”ฉ ๋ฌธ์ œ์ธ AFAIK๋Š” ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. #17746์— ์ „์ฒด ํ† ๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„์นญ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •๋œ ๊ฒฝ์šฐ/์–ธ์ œ/์ „์— ์ด ํ† ๋ก ์ด ๊ณ„์†๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๋Œ€์ฒด ์†”๋ฃจ์…˜์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ฑฐ๋‚˜ ์ ์ง„์ ์ธ ์ˆ˜๋ฆฌ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ๋„)

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

์•„์ง ๋‹ค๋ฅธ ๊ณณ์—์„œ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๊ฐ€ ์—†๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†Œ์œ ์ž๊ฐ€ ๋ฆฌํŒฉํ† ๋ง์„ ์™„๋ฃŒํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ•œ ๊ฐ€์ง€ ๋Œ€๋‹ต์€ ์ผ์ข…์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ์ฒด๊ณ„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์ƒˆ๋กœ์šด API๊ฐ€ ํฌํ•จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ƒˆ ๋ฆด๋ฆฌ์Šค์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์œ ํ˜• ๋ณ„์นญ์ด ์•„๋‹ˆ๋ผ ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ์ „์ฒด ๋‹ต์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Error: os.time is obsolete, use time.time instead. Run "go upgrade" to fix this.

์œ ํ˜• ๋ณ„์นญ์˜ ๊ฒฝ์šฐ ๋ฆฌํŒฉํ† ๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด "OldType์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ NewType์œผ๋กœ ๋ฐ”๊พธ๊ธฐ"๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ฏธ๋ฌ˜ํ•œ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๊ฐ€ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ฝ”๋“œ๊ฐ€ ์ค‘๋‹จ๋  ๊ฒƒ์ž„์„ ๊ฒฝ๊ณ ํ•˜๊ณ  ์ด์ „ API๋ฅผ ์™„์ „ํžˆ ์‚ญ์ œํ•˜๊ธฐ ์ „์— ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@iainmerrick golang/lint#238 ๋ฐ golang/gddo#456์— ๋Œ€ํ•œ ๋ฒ„๊ทธ๊ฐ€ ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

@rsc ์˜ ๊ธฐ์‚ฌ์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์ ์ง„์  ์ฝ”๋“œ ๋ณต๊ตฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์„ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(vars, funcs ๋ฐ consts์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•จ).

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋„๊ตฌ๋‚˜ ์–ธ์–ด ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ์œ ํ˜•์„ ์ƒํ˜ธ ๊ตํ™˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ •์˜์— ๋”ฐ๋ผ ์–ธ์–ด ์ž‘๋™ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋„๊ตฌ๋Š” ์ด์ „ ์œ ํ˜•์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ ์œ ํ˜•์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ ์™ธ๋ถ€์—์„œ ๋™๋“ฑ์„ฑ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ด๋Ÿฌํ•œ ๋„๊ตฌ๊ฐ€ stdlib ์ปจํ…์ŠคํŠธ ํŒจํ‚ค์ง€ ๋Œ€์‹  golang.org/x/net/context๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณต๊ธ‰์—…์ฒด ํŒจํ‚ค์ง€์™€ ๊ฐ™์ด ์†Œ์œ ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์‚ฌ์–‘์€ ๋ณ„๋„์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์ด๋‚˜ ๊ธฐ๊ณ„๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ฃผ์„์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ๋นŒ๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋ชจ๋“  ๊ฒƒ์ด ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ๋„๊ตฌ๋Š” ํ•ด๊ฒฐํ•˜๋Š” ๋งŒํผ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์ผ๋ถ€๊ฐ€ ์ž๋™ํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์†Œ ๋‚ซ์Šต๋‹ˆ๋‹ค.

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

@griesemer๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด (์–ด๋””์„œ ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋งŽ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค) Go์—๋Š” byte โ†” uint8 ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ด๋ฏธ ์•จ๋ฆฌ์–ด์‹ฑ์ด ์žˆ์œผ๋ฉฐ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋‹ค๋ฅธ ๋กœ์ปฌ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์†Œ์Šค ํŒŒ์ผ์— ๋‘ ๋ฒˆ.

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

์–ธ์–ด ๋ณ€๊ฒฝ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํฐ ์ผ์ด๊ณ  ํ•ด๊ฒฐํ•ด์•ผ ํ•  ์ผ๋„ ๋งŽ์ง€๋งŒ ๊ฒฐ๊ตญ ์—ฌ๊ธฐ์—์„œ ํ•˜๋Š” ๊ฒƒ์ด ์˜ณ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

์ถ”๊ฐ€ ์งˆ๋ฌธ: ์œ ํ˜• ๋ณ„์นญ์ด ์ƒˆ ํŒจํ‚ค์ง€์˜ ์œ ํ˜•์— ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€(์•„๋งˆ๋„ ์บก์Šํ™” ํ•ด์ œ) ์—ฌ๋ถ€๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์ฃผ์‹ญ์‹œ์˜ค. ๋˜ํ•œ ์ƒˆ ํŒจํ‚ค์ง€๊ฐ€ ์ด์ „ ๊ตฌ์กฐ์ฒด์˜ ๊ฐœ์ธ ํ•„๋“œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ถ”๊ฐ€ ์งˆ๋ฌธ: ์œ ํ˜• ๋ณ„์นญ์ด ์ƒˆ ํŒจํ‚ค์ง€์˜ ์œ ํ˜•์— ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€(์•„๋งˆ๋„ ์บก์Šํ™” ํ•ด์ œ) ์—ฌ๋ถ€๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์ฃผ์‹ญ์‹œ์˜ค. ๋˜ํ•œ ์ƒˆ ํŒจํ‚ค์ง€๊ฐ€ ์ด์ „ ๊ตฌ์กฐ์ฒด์˜ ๊ฐœ์ธ ํ•„๋“œ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ณ„์นญ์€ ์œ ํ˜•์˜ ๋˜ ๋‹ค๋ฅธ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์œ ํ˜•์˜ ํŒจํ‚ค์ง€๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ์งˆ๋ฌธ์— ๋ชจ๋‘ ์•„๋‹ˆ์˜ค์ž…๋‹ˆ๋‹ค(์ƒˆ ํŒจํ‚ค์ง€ == ์ด์ „ ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ).

@akavel ํ˜„์žฌ๋กœ์„œ๋Š” ์ œ์•ˆ์ด ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” Go 1.8 ๋ณ„์นญ ์‹œํ—˜ ์ค‘์— ๋‚˜ํƒ€๋‚œ ๋‘ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๊ฐ€๋Šฅ์„ฑ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ณ„์นญ(๋˜๋Š” ๋ณ„์นญ๋งŒ ์ž…๋ ฅ)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋ฅผ ํ™•์žฅํ•˜๋Š” ๋“œ๋กญ์ธ ๊ต์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด https://go-review.googlesource.com/#/c/32145/ , ํŠนํžˆ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์˜ ์„ค๋ช…์„ ์ฐธ์กฐ

  2. ๋ณ„์นญ(๋˜๋Š” ๊ทธ๋ƒฅ ์œ ํ˜• ๋ณ„์นญ)์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์€ API ํ‘œ๋ฉด์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ๊ตฌ์กฐํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ๋‚˜์€ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด ํŒจํ‚ค์ง€ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋Œ€๊ทœ๋ชจ ๊ตฌํ˜„์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ฐ€์ ธ์˜ค๊ณ  ์‚ฌ์šฉํ•  ํŒจํ‚ค์ง€๋Š” ํ•˜๋‚˜๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. https://github.com/golang/go/issues/16339#issuecomment -232813695์— ์„ค๋ช…๋œ ๋‹ค์†Œ ์ถ”์ƒ์ ์ธ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋„์›€์„ ์ฃผ๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์”จ์•— ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„์นญ ๋Œ€์‹  ์–ด๋Œ‘ํ„ฐ ์ธก๋ฉด์—์„œ ๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”? ์–ด๋Œ‘ํ„ฐ๋Š” ๊ธฐ์กด ์œ ํ˜•์— ๋Œ€์ฒด ์ด๋ฆ„ _๋ฐ ์ธํ„ฐํŽ˜์ด์Šค_๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ์ด์ „์— ์›๋ž˜ ์œ ํ˜•์ด ๋ณด์˜€๋˜ ๊ณณ์—์„œ ๊พธ๋ฏธ์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Œ‘ํ„ฐ๋Š” ๊ธฐ๋ณธ ์ ์‘ ์œ ํ˜•์˜ ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ง€์›ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ์กด type foo bar ๋™์ž‘๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

io.ByteBuffer

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์€ ๋‹น๋ถ„๊ฐ„ ์ž„์‹œ "adapts" ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ io.ByteBuffer ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์˜ˆ์ œ ์Šค์ผˆ๋ ˆํ†ค์ž…๋‹ˆ๋‹ค.

type ByteBuffer adapts bytes.Buffer

func (old *ByteBuffer) Write(b []byte) (n int, err error) {
        buf := (*bytes.Buffer)(old)
        return buf.Write(b)
}

(... etc ...)

๋”ฐ๋ผ์„œ ํ•ด๋‹น ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์ด ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

func newfunc(b *bytes.Buffer) { ... }
func oldfunc(b *io.ByteBuffer) { ... }

func main() {
        var newvar bytes.Buffer
        var oldvar io.BytesBuffer

        // New code using the new type obviously just works.
        newfunc(&newvar)

        // New code using the old type receive the underlying value that was adapted.
        newfunc(&oldvar)

        // Old code using the old type receive the adapted value unchanged.
        oldfunc(&oldvar)

        // Old code gets new variable adapted on the way in. 
        oldfunc(&newvar)
}

newfunc ๋ฐ oldfunc ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์‹ค์ œ๋กœ *bytes.Buffer ์ˆ˜๋ฝํ•˜๊ณ  oldfunc ๋“ค์–ด์˜ค๋Š” ๋„์ค‘์— *io.BytesBuffer ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ• ๋‹น, ๊ฒฐ๊ณผ ๋“ฑ์— ๋™์ผํ•œ ๊ฐœ๋…์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

os.์˜ค๋ฅ˜

์ธํ„ฐํŽ˜์ด์Šค์˜ ์ปดํŒŒ์ผ๋Ÿฌ ๊ตฌํ˜„์ด ์กฐ๊ธˆ ๋” ๊นŒ๋‹ค๋กญ์ง€๋งŒ ๋™์ผํ•œ ๋…ผ๋ฆฌ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ๋„ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋œ ์‚ฌ์‹ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” os.Error => error ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

package os

type Error adapts error

func (e Error) String() string { return error(e).Error() }

๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ• ๋•Œ๋ฌธ์— ๋” ์ƒ๊ฐํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

func (v *T) Read(b []byte) (int, os.Error) { ... }`

String ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์กฐ์ •ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

_์—…๋ฐ์ดํŠธ๋จ: ๋” ๋งŽ์€ ์ƒ๊ฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค._

์ž„๋ฒ ๋”ฉ ๋ฌธ์ œ

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

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค, ๋„์ปค

๊ฒŒ์‹œ๋ฌผ์— ์–ธ๊ธ‰๋œ ๋ฌธ์ œ๋Š” ์œ„ ๋ฌธ์ œ์˜ ๋ณ€ํ˜•์œผ๋กœ ๋ณด์ด๋ฉฐ ์ œ์•ˆ์œผ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜, ์ƒ์ˆ˜

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

๊ณ ๋…

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋Œ‘ํ„ฐ๋ผ๋Š” ์‚ฌ์‹ค์— ๋Œ€ํ•ด ๋ช…์‹œํ•˜๊ณ , ์ ์‘๋œ ๊ฒƒ๊ณผ ๋…๋ฆฝ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ‰์†Œ์™€ ๊ฐ™์ด ์ด์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ๋ณด์—ฌ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ†ต์‚ฌ๋ก 

์ข‹์€๊ฑฐ ๊ณจ๋ผ์ฃผ์„ธ์š”. ;)

@iainmerrick @zombiezen

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

๋‘ ๊ฐ€์ง€ ๊ด€์ฐฐ:

1. ์œ ํ˜• ์ฐธ์กฐ์˜ ์˜๋ฏธ๋Š” ์ง€์›๋˜๋Š” ๋ฆฌํŒฉํ† ๋ง ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Gustavo์˜ ์ œ์•ˆ์€ ์œ ํ˜• ์ฐธ์กฐ ๋ฐ ๊ฒฐ๊ณผ ์˜๋ฏธ๋ก ์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Ross์˜ ์ƒˆ๋กœ์šด ์ œ์•ˆ์—๋Š” ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ type OldAPI = newpkg.newAPI ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜๋ฏธ๋ก ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ ˆ๊ฑฐ์‹œ ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ ๋˜๋Š” ํ•„๋“œ๋กœ OldAPI๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? newAPI๊ฐ€ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด OldAPI์˜ ๋ชจ๋“  ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ์™€ ํ•„๋“œ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ๋Œ€๋‹ต์œผ๋กœ ์˜ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ณต๊ฐœ ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜๋Š” OldAPI๊ฐ€ ์žˆ๋Š” ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ์ฝ”๋“œ๋Š” ํŒจํ‚ค์ง€์˜ ๊ฐ€์‹œ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ํ…Œ์ด๋ธ”์„ ๋ฒ—์–ด๋‚œ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ๊ณต๊ฐœ newAPI๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

2. NewAPI๊ฐ€ ํฌํ•จ๋œ ํŒจํ‚ค์ง€๋Š” OldAPI๊ฐ€ ํฌํ•จ๋œ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

์—…๋ฐ์ดํŠธ: ํŒจํ‚ค์ง€ N์€ ํŒจํ‚ค์ง€ O์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด O๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@niemeyer ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ๊ณผ ๊ฐ™์€ ๋ณ€๊ฒฝ์€ ์ด๋ฏธ ์ ์ง„์ ์œผ๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. a) ์ƒˆ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋‚ด๋ถ€์—์„œ ์ด์ „ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ (๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€๋กœ), b) ๋ชจ๋“  ์‚ฌ์šฉ์ž๋ฅผ ์ƒˆ ๋ฉ”์„œ๋“œ๋กœ ์ ์ง„์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , c) ์ด์ „ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ ํ˜• ๋ณ„์นญ๊ณผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด type-moving์— ์ดˆ์ ์„ ๋งž์ถ˜ ์ด์œ ๋Š” ์ด๊ฒƒ์ด ํ™•์ธ๋œ ์œ ์ผํ•œ ๊ฒƒ์ด๋ฉฐ ์•„์ง ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‹๋ณ„๋œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋ณ€๊ฒฝ์€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  ์ธ์ˆ˜ ์ง‘ํ•ฉ ๋ณ€๊ฒฝ). ํ‘œ๋ฉด์ ์ด ๋” ์ ์€(์ดํ•ดํ•  ์‚ฌํ•ญ์ด ์ ์€) ์ˆ˜์ • ์‚ฌํ•ญ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

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

๋ชจ๋“  ์œ ํ˜•์˜ ๋ณ„์นญ ์ œ์•ˆ์ด ๊ฐœ๋ฐœ๋  ๋•Œ๋งˆ๋‹ค ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์—์„œ ๋…ผ์˜ํ•˜๋Š” ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” _replacement_ ์œ ํ˜•์ด์ง€๋งŒ ์œ ํ˜• ๋ณ„์นญ์€ ์œ ํ˜•์— ๋Œ€ํ•œ ์ข…์†์„ฑ์—์„œ ์ฝ”๋“œ ๋ณธ๋ฌธ์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ์—๋„ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

๋‹ค๋ฅธ ์˜ˆ๋Š” ๋‹จ์ผ ์œ ํ˜•์ด ํฌ๊ฑฐ๋‚˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ์œ ์ผํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค(์˜ˆ: ๋ผ์ด์„ผ์Šค ๋น„ํ˜ธํ™˜์„ฑ์ด ๋ฐœ๊ฒฌ๋œ ๊ฒฝ์šฐ).

๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์˜ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์œ ํ˜• ๋ณ„์นญ ์ •์˜
  2. ์œ ํ˜• ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ด€๋ จ ์ฝ”๋“œ ๋ณธ๋ฌธ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  3. ์œ ํ˜• ๋ณ„์นญ์„ ์œ ํ˜• ์ •์˜๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์ด ๋๋‚˜๋ฉด ์ž์‹ ์˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ž์œ ๋กญ๊ฒŒ ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋…๋ฆฝ์ ์ธ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ:

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

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

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

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

  1. ์ƒˆ API ์ถ”๊ฐ€, ์ด์ „ API์™€ ๊ตํ™˜ ๊ฐ€๋Šฅ
  2. ์ ์ฐจ์ ์œผ๋กœ ์†Œ๋น„์ž๋ฅผ ์ƒˆ๋กœ์šด API๋กœ ๋ณ€๊ฒฝ
    3a. ๋ชจ๋“  ๊ฒƒ์ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜๊ฑฐ๋‚˜ ์ง€์› ์ค‘๋‹จ ๊ธฐ๊ฐ„์ด ๋๋‚˜๋ฉด ์ด์ „ API๋ฅผ ์‚ญ์ œํ•˜์‹ญ์‹œ์˜ค.
    3b. ๋‘ API๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์œ ์ง€ํ•˜์—ฌ ๋ฌด๊ธฐํ•œ ์•ˆ์ •์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๊ธฐ์‚ฌ์˜ ์ด ๋ถ€๋ถ„ ์ฐธ์กฐ ).

๋‹น์‹ ์€ 3a ๋Œ€ 3b๋ฅผ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์ง€์ ํ•œ ๊ฒƒ์€ 1. ์ด๋ฏธ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋‹น์‹ ์˜ ์–ด๋Œ‘ํ„ฐ ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ์ €๋ฅผ ์œ„ํ•ด ๋ช…ํ™•ํžˆ ํ•ด ์ฃผ์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด, os.Error์˜ ๊ฒฝ์šฐ) fmt.Stringer๋ฅผ os.Error๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

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

@niemeyer ์˜ˆ, ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ์ข‹์€ ์ง€์ ์„

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

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

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

@niemeyer ๊ทธ๊ฒƒ์€ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. .(interface{String() string}) ๋Œ€ .(interface{Error() string}) ๋˜๋Š” ๋ณ€๊ฒฝ๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ • ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํ˜•์‹ ์ฃผ์žฅ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ฒ€์‚ฌ์—์„œ ๋‘ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋ณธ ์œ ํ˜•์„ ์–ด๋–ป๊ฒŒ๋“  ๋ชจ๋‘ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@niemeyer ์•„๋‹ˆ์š”. ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ A.Foo ์—์„œ A.Bar ๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด๋™ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  1. A.Foo ์ฃผ์œ„์— ๋ž˜ํผ๋กœ A.Bar ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
  2. ์ž„์˜์˜ ๋งŽ์€ ์ปค๋ฐ‹์„ ํ†ตํ•ด A.Bar ๋งŒ ํ˜ธ์ถœํ•˜๋„๋ก ์‚ฌ์šฉ์ž ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
  3. ์ง€์› ์ค‘๋‹จ์„ ์‹œํ–‰ํ•  ์˜ํ–ฅ์ด ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ A.Foo ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

ํ•จ์ˆ˜ ์ธ์ˆ˜ ๋ณ€๊ฒฝ์€ ๋น„์›์ž์ ์œผ๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด x int ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ func Foo() ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  1. func FooWithInt(x int) { Foo(); // use x somehow; }
  2. ์ž„์˜์˜ ๋งŽ์€ ์ปค๋ฐ‹์„ ํ†ตํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ์‚ฌ์šฉ์ž ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
  3. ์ง€์› ์ค‘๋‹จ์„ ์‹œํ–‰ํ•  ์˜์‚ฌ๊ฐ€ ์—†๋‹ค๋ฉด(๋˜๋Š” WithInt๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ท€์ฐฎ์ง€ ์•Š๋‹ค๋ฉด) ๋์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Foo ๋ฅผ func Foo(x int) { FooWithInt(x) } .
  4. ์ž„์˜์˜ ๋งŽ์€ ์ปค๋ฐ‹์„ ํ†ตํ•ด s/FooWithInt/Foo/g ์‚ฌ์šฉ์ž๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.
  5. FooWithInt ์‚ญ์ œ

์œ ํ˜• ์ด๋™ (์—„๊ฒฉํžˆ ๋งํ•ด์„œ vars)์„ ์ด๋™ ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ง€์› ์ค‘๋‹จ์„ ์‹œํ–‰ํ•  ์˜์ง€๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ์ž ์žฌ์ ์œผ๋กœ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์ฝ”๋“œ ๋นŒ๋“œ๋ฅผ ๊นจ๋Š” ๊ฒƒ์€ ๊ด‘๋ฒ”์œ„ํ•˜๊ณ  ์‹œ๊ธฐ์ ์ ˆํ•œ ๋ฐœํ‘œ๊ฐ€ ํ•„์š”ํ•จ์„ ์˜๋ฏธํ•จ). ๋‹น์‹ ์ด์—†๋Š” ๊ฒฝ์šฐ์—๋„ํ•˜์ง€๋งŒ, ๋” ํŽธ๋ฆฌํ•œ ์ด๋ฆ„์ด๋‚˜ ๊ธฐํƒ€ ์œ ์šฉํ•œ ๋ฐฐ์น˜์™€ ๊ธฐ๋Šฅ ๋ณด๊ฐ• API์— ๋Œ€ํ•œ ๋Šฅ๋ ฅ ๋˜ํ•œ ์ƒˆ๋กœ์šด ์ด๋ฆ„๊ณผ ๊ทธ ๋ฐ˜๋Œ€ํ•˜์—ฌ ์˜ค๋ž˜๋œ ๋ฌผ๊ฑด์„ ์ฐธ์กฐ ํ•  ์ˆ˜์žˆ๋Š” ๋Šฅ๋ ฅ์— ๋‹ฌ๋ ค์žˆ๋‹ค (X / ์ด๋ฏธ์ง€ / ๊ทธ๋ฆด ์ฐธ์กฐ).

์˜ค๋Š˜๋‚  ์œ ํ˜•์„ ์ด๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ์˜ค๋Š˜๋‚  ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์˜ ์ฐจ์ด์ ์€ ์ „์ž์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์›์ž์  ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€๋งŒ ํ›„์ž์˜ ๊ฒฝ์šฐ ๋…๋ฆฝ์ ์ธ ์ €์žฅ์†Œ ๋ฐ ์ปค๋ฐ‹์„ ํ†ตํ•ด ์ ์ง„์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. "I'll make commit that do s/Foo/Bar/"๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“ . ์šฐ๋ฆฌ๊ฐ€ ์–ด๋”” ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์–ด, ๋ถ„๋ช…ํžˆ ์„œ๋กœ๋ฅผ ์ง€๋‚˜์ณ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์–ด. ๋‚˜๋Š” @rsc ์˜ ๋ฌธ์„œ๊ฐ€ ๋‚ด POV๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ๊ฝค ๋ช…ํ™•ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๋‹น์‹ ์˜ ๊ฒƒ์„ ์–ป์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์„

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

@Merovius ๋ฌผ๋ก , _์‹ค์ œ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ _ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ ์ƒˆ API๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ํ•œ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์œ ํ˜•์„ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ _์‹ค์ œ๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ณ _ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์—์„œ ์ƒˆ API๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ํ•œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์˜ค๋ž˜๋œ ์ฝ”๋“œ ์ž‘์—…์„ ๋ณด์กดํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋…„ ๋™์•ˆ ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ํ•ด์™”์Šต๋‹ˆ๋‹ค.

@niemeyer ํ•˜์ง€๋งŒ ๋‹ค์‹œ: ์œ ํ˜•์˜ ๊ฒฝ์šฐ ์ ์ ˆํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. x/image/draw๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์•ˆ์ •์„ฑ์— ๋Œ€ํ•ด ๊ทธ๋ ‡๊ฒŒ ์ ˆ๋Œ€์ ์ธ ๊ฒฌํ•ด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜ ์ž์‹ ์€ "6,12,... ๋ช‡ ๊ฐœ์›” ํ›„ $function,$type,...์ด(๊ฐ€) ์‚ฌ๋ผ์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์—์„œ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค"๋ผ๊ณ  ๋งํ•œ ๋‹ค์Œ ์œ ์ง€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ง€์› ์ค‘๋‹จ ํ†ต์ง€๋ฅผ ๋”ฐ๋ฅด๋„๋ก ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค(๋ˆ„๊ตฐ๊ฐ€ API์— ๋Œ€ํ•œ ์žฅ๊ธฐ ์ง€์›์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋น„์šฉ์„ ์ง€๋ถˆํ•  ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์•ˆ์ •์„ฑ์— ๋Œ€ํ•œ ์ ˆ๋Œ€์ ์ธ ๊ฒฌํ•ด๋ฅผ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜๋ฏธ๋ก ์  ๋ฒ„์ „์— ๋Œ€ํ•œ ์ตœ๊ทผ ํ‘ธ์‹œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ํ˜ธํ™˜์„ฑ์„ ๊นจ๋Š” ์˜ต์…˜์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ •๋ง ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์˜์‚ฌ๋Š” ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋„ ์ ์ง„์ ์ธ ์ˆ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์—ฌ์ „ํžˆ ์ด์ต์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋ณธ์งˆ์ ์œผ๋กœ ๋‹ค์ด์•„๋ชฌ๋“œ ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š๋”๋ผ๋„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋งค์šฐ ์ž˜ ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

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

@niemeyer @rsc @Merovius ์ €๋Š” ๊ท€ํ•˜์˜ ํ† ๋ก (๋ฐ ์ „์ฒด ํ† ๋ก )์„

๋ฌธ์ œ๋ฅผ ๋” ๋งŽ์ด ๋ฐ˜๋ณตํ• ์ˆ˜๋ก ํ™•์žฅ๋œ ๊ณต๋ถ„์‚ฐ ์˜๋ฏธ ์ฒด๊ณ„์— ๋” ๊ฐ€๊นŒ์›Œ์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ์—ฌ๊ธฐ์—์„œ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค: ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ๊ทธ๋ฆฌ๊ณ  ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์ด์—์„œ ์ •์˜๋œ ํ•˜์œ„ ์œ ํ˜• ์˜๋ฏธ๋ก ("is-a")์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฉ”์„œ๋“œ ์ธ์ˆ˜๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ๊ณต๋ณ€ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(ํ˜„์žฌ ๋ถ„์‚ฐ ๊ทœ์น™์— ๋”ฐ๋ผ).

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

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ (ab) ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์š”๊ตฌ ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Go 1.0์„ ๊นจ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„์š”.

@thwd "์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๊ณต๋ณ€ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ"์ด โ€‹โ€‹์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์—์„œ ๋ฉ”์„œ๋“œ ์ธ์ˆ˜๋Š” ๋ฐ˜๊ณต๋ณ€ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ฒฐ๊ณผ๋Š” ๊ณต๋ณ€ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์—์„œ ์ด๊ฒƒ์€ ๊ตฌ์ฒด์ ์ธ (์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ) ์œ ํ˜•์˜ ๊ธฐ์กด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@thwd ๋‚˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค(์‹ฌ์ง€์–ด ๊ณต๋ณ€์ธ ์ธํ„ฐํŽ˜์ด์Šค)๊ฐ€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ์†”๋ฃจ์…˜์ด๋ผ๋Š” ์ ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋งค์šฐ ํŠน์ •ํ•œ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น). ๊ทธ๊ฒƒ๋“ค์„ ํ•˜๋‚˜๋กœ ๋งŒ๋“ค๋ ค๋ฉด vars/consts/funcs/...๋ฅผ ํฌํ•จํ•˜์—ฌ API์˜ ๋ชจ๋“  ๊ฒƒ์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘, ๊ทธ๊ฒƒ์€ ์ข‹์€ ๋””์ž์ธ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒƒ์ด ๊ตฌ์กฐ์ฒด๋ผ๋ฉด ๊ทธ๋ƒฅ ๊ตฌ์กฐ์ฒด๋กœ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ํŒจํ‚ค์ง€์— ์ด์ƒํ•œ ๊ตฌ๋ฌธ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฑฐ์˜ ์ด์ ์ด ์—†๋Š” ๋ชจ๋“  ์—ญ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹œ์ž‘ํ•  ๋•Œ ์ œ์ •์‹ ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹œ์ž‘ํ•˜๊ณ  ๋‚˜์ค‘์— ๋” ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์œผ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค. ๋‚ด๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋ณธ API์˜ ๋งŽ์€ ๋ณต์žก์„ฑ์€ API ๋””์ž์ธ์„ ์ง€๋‚˜์น˜๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์ผ๋ฐ˜์„ฑ์„ ๊ณ„ํšํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—์„œ ๋น„๋กฏ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  80%์˜ ๊ฒฝ์šฐ(๊ทธ ์ˆซ์ž๋Š” ๋ช…๋ฐฑํ•œ ๊ฑฐ์ง“๋ง)์—์„œ๋Š” "๊นจ๋—ํ•œ API ๋””์ž์ธ"์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

(๋ถ„๋ช…ํžˆ: ๊ณต๋ณ€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹จ์ง€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค)

@Merovius ์˜ ์š”์ ์— ์ถ”๊ฐ€

package foo

type Authority struct {
  Host string
  Port int
}

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

@Merovius ๊ท€ํ•˜์˜ ๋งˆ์ง€๋ง‰ ์˜๊ฒฌ์€ ์ „์ ์œผ๋กœ ์ฃผ๊ด€์ ์ด๋ฉฐ ์ œ ์ œ์•ˆ ๋Œ€์‹  ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋ฅผ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ข‹๊ฒŒ ๋๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ๋…ผ์˜๋ฅผ ์ค‘๋‹จํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@griesemer @Merovius ๋‘˜ ๋‹ค ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„๋ฅผ ๋‹ซ์œผ๋ ค๋ฉด ์ง€๊ธˆ๊นŒ์ง€์˜ ๋…ผ์˜๊ฐ€ ํ•˜์œ„ ์œ ํ˜•/๊ณต๋ถ„์‚ฐ์˜ ์ผ๋ถ€ ๊ฐœ๋…์„ ์ด๋Œ์–ด ๋ƒˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ตฌํ˜„ ์‹œ ๋Ÿฐํƒ€์ž„ ๊ฐ„์ ‘ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด @niemeyer ๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋‚ด๊ฐ€ ๊ทธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค๋ฉด). ํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ์•„์ด๋””์–ด๋ฅผ ์ฝ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋„ ์ƒ๊ฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@niemeyer @Merovius ๋‹˜์˜ ๋Œ“๊ธ€์— ์•„๋ฌด๊ฒƒ๋„ _ad์˜ hominem_๊ฐ€ ์žˆ์—ˆ๋‹ค. "์•ˆ์ •์„ฑ์— ๋Œ€ํ•œ ๋‹น์‹ ์˜ ์ž…์žฅ์€ ์ ˆ๋Œ€์ "์ด๋ผ๋Š” ๊ทธ์˜ ์ฃผ์žฅ์€ ๋‹น์‹ ์ด ์•„๋‹ˆ๋ผ ๋‹น์‹ ์˜ ์ž…์žฅ์— ๋Œ€ํ•œ ๊ด€์ฐฐ์ด๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹น์‹ ์˜ ์ง„์ˆ  ์ค‘ ์ผ๋ถ€์—์„œ ํ•ฉ๋ฆฌ์ ์ธ ์ถ”๋ก ์ž…๋‹ˆ๋‹ค.

์ด์ „ ๋ฐฉ๋ฒ•์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ์ˆœ๊ฐ„ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ์ฃฝ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ 

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

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

@niemeyer adapts ์„ ์–ธ์€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค ์ œ์•ˆํ•˜๊ณ  instance ํ•˜์Šค์ผˆ typeclasses์—์„œ. ์ด๊ฒƒ์„ Go๋กœ ๋Š์Šจํ•˜๊ฒŒ ๋ฒˆ์—ญํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package os

type Error interface {
  String() string
}

instance error Error (
  func (e error) String() string { return e.Error() }
)

๋ถˆํ–‰ํžˆ๋„ ( @zombiezen์ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ) ์ด๊ฒƒ์ด ๋น„์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์— ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ•จ์ˆ˜ ์œ ํ˜•(์ธ์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜ ๊ฐ’)๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹๋„ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด adapts ์˜ ์˜๋ฏธ๋Š” Context ๋ฅผ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋ ๊นŒ์š”?

๋‚˜๋Š” ๊ทธ ๋ง์—์„œ Merovius์™€ ๊ฐ™์€ ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

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

@๋ฉ”๋กœ๋น„์šฐ์Šค

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

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

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

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

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

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

@rakyll ์ปดํ“จํ„ฐ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ ์ค‘๋‹จ ์•Œ๋ฆผ์ด ์žˆ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๊ณต๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ a) ๋ณ„์นญ์ด ๊ทธ๋Ÿฐ ๊ฒƒ์ด๊ณ  b) ๊ทธ๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๋กœ ๋‚ด๋ณด๋‚ธ๋‹ค๋Š” ๊ฐœ๋…์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

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

์ง€์› ์ค‘๋‹จ ์•Œ๋ฆผ์— ๋Œ€ํ•ด ๋ง์”€ํ•˜์‹  ๋ชจ๋“  ๋‚ด์šฉ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ #10909์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ์ด ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ๋ณด๋‹ค ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋Š” godoc์—์„œ ๋„๊ตฌ ์ง€์›์„ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜๊ณ  ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜๋Š” ๊ฒ€์‚ฌ๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: go vet, golint ๋˜๋Š” ๋ณ„๋„์˜ ๋„๊ตฌ๋ฅผ ํ†ตํ‹€์–ด).

@rakyll stdlib๊ฐ€ ๋„์ž…๋˜๋Š” ๊ฒฝ์šฐ ์œ ํ˜• ๋ณ„์นญ์„ ๋ณด์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.


์‚ฌ์ด๋“œ๋ฐ”:

Go ๋ฐ ๊ด€๋ จ ๋„๊ตฌ์˜ ๋น„์ถ”์ฒœ ์ฃผ์„ ์ƒํƒœ๋ฅผ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๋ฐฐ๊ฒฝ:

@Merovius๊ฐ€ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ•ญ๋ชฉ์„ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ํ‘œ์ค€ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค. #10909, https://blog.golang.org/godoc-documenting-go-code ์ฐธ์กฐ

TL;DR: ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์˜ ๋ฌธ์„œ์—์„œ "Deprecated: "๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ๋ฝ์„ ๋งŒ๋“ค๊ณ  ๋Œ€์ฒด ํ•ญ๋ชฉ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋” ์œ ์šฉํ•œ ๋ฐฉ์‹์œผ๋กœ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์„ ํ‘œ์‹œํ•˜๋Š” godoc์— ๋Œ€ํ•œ ์Šน์ธ๋œ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค: #17056.

@rakyll ์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ์ด ์‚ฌ์šฉ๋  ๋•Œ golint๊ฐ€ ๊ฒฝ๊ณ 


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

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

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

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์ผ๋ฐ˜ํ™”๋˜์–ด ๋” ๋‚˜์€ ๋„๊ตฌ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์œ ํ˜• ๋ณ„์นญ์— ๋Œ€ํ•ด์„œ๋„ ์•Œ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ ์ฃผ์„์—์„œ "Deprecated:"์™€ ์ผ์น˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

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

@niemeyer ๋‚ด ์ด์ „ ๋‹ต๋ณ€์€ ์ •์ „์œผ๋กœ ์ธํ•ด ์†์‹ค๋˜์—ˆ์Šต๋‹ˆ๋‹ค :( ์ˆœ์„œ๊ฐ€

๊ทธ๋Ÿฐ๋ฐ ๋ฐ˜๋ณตํ•˜๋„ค์š”..

FWIW, ๊ท€ํ•˜์˜ ๋งˆ์ง€๋ง‰ ๋‹ต๋ณ€์ด ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ด์ „์— ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค (๊ทธ๋ฆฌ๊ณ  ์—ฌ์ „ํžˆ ๋‹น์‹ ์ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค) ๋” ๋งŽ์€ ๋™์˜๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ํ™•์‹ ์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์–ด๋”˜๊ฐ€์— ์—ฌ์ „ํžˆ ์ž˜๋ชป๋œ ์˜์‚ฌ ์†Œํ†ต์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ์ œ์•ˆ์€ ์ฝ”๋“œ์˜ ์ ์ง„์ ์ธ ๋ฆฌํŒฉํ† ๋ง์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋ฉ”์†Œ๋“œ๋‚˜ ์œ ํ˜•์„ ์‚ญ์ œํ•˜๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Go ์ฝ”๋“œ๊ฐ€ ์ค‘๋‹จ๋˜๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์„ ์›์ž์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ๊ณตํ‰ํ•˜๊ฒŒ ๋งํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์žฅ์€ ํ˜ผ๋ž€์„ ํฌ๊ฒŒ ๋„์™€์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , ๋‹น์‹ ์ด ๋ฒฝ์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ์ •์›์— ์‚ด๊ณ  ์žˆ๊ณ  ๋ชจ๋“  ์ „ํ™” ์‚ฌ์ดํŠธ์— ์—ฐ๋ฝํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•œ ๊ฒƒ์ด ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ฃผ์žฅํ•˜๋Š” ์š”์ ์ด๋ผ๋Š” ์ธ์ƒ์„ ์ฃผ์—ˆ๋‹ค๋ฉด ํ•œ ๊ฑธ์Œ ๋ฌผ๋Ÿฌ์„œ์„œ ๋‚ด๊ฐ€ ์˜คํ”ˆ ์†Œ์Šค์˜ ์ž…์žฅ์—์„œ ์™„์ „ํžˆ ๋…ผ์Ÿํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ๋‹ค์‹œ ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ (์ €๋ฅผ ๋ฏฟ์ง€ ๋ชปํ•˜์‹ ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์ €์˜ ์ด์ „ ๊ธฐ์—ฌ๋ฅผ ์ฐพ์•„๋ณด์‹ญ์‹œ์˜ค. ์ €๋Š” ์ด๊ฒƒ์ด monorepo ๋ฌธ์ œ๋ณด๋‹ค ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฌธ์ œ์— ๋” ๊ฐ€๊น๋‹ค๋Š” ์ ์„ ํ•ญ์ƒ ์ฒ˜์Œ์œผ๋กœ ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. Monorepos์—๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. , ์ง€์ ํ•œ ๋Œ€๋กœ).

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

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

nit: protobuf public imports๊ฐ€ ํŠน๋ณ„ํ•œ ๋ณด์กฐ ์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ ์–ธ๊ธ‰๋  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ์„ค๊ณ„ ๋ฌธ์„œ์™€ ๊ณต๊ฐœ ๋ฌธ์„œ ๋ชจ๋‘์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ ์ง„์ ์ธ ์ฝ”๋“œ ๋ณต๊ตฌ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด๋ฏธ ์ด ๋ฌธ์ œ์—์„œ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์ œ์˜ ๋ฒ”์ฃผ์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ protobuf ๊ณต๊ฐœ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์œ ํ˜• ๋ณ„์นญ์ด ์ถฉ๋ถ„ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (proto ์ปดํŒŒ์ผ๋Ÿฌ๋Š” vars๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ ๋…ผ๋ฆฌ์ ์œผ๋กœ const์ด๋ฏ€๋กœ "var Enum_name = import.Enum_name"์œผ๋กœ ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

@Merovius ์ƒ์‚ฐ์ ์ธ ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„์ง๋„ ์—ฌ๊ธฐ์—์„œ ๋‹น์‹ ์˜ ์ถ”๋ก ์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์›์ž์„ฑ ๋‹จ์œ„๋ฅผ ๋‹จ์ผ ์ปค๋ฐ‹์œผ๋กœ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฐ€์ •์œผ๋กœ, ๋‚˜๋Š” ๋‹น์‹ ์ด ์™œ ๋ฉ”์†Œ๋“œ ๋˜๋Š” ์œ ํ˜•์˜ ์‚ญ์ œ๊ฐ€ ๋จผ์ € ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํ™•์‹ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ผ์–ด๋‚  ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฐœ ๋ฌผ๋Ÿฌ์„œ์„œ ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋‹ค์‹œ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

@niemeyer ๊ท€ํ•˜์˜ ์ œ์•ˆ์ด Go ์œ ํ˜• ์‹œ์Šคํ…œ์— ์‹ฌ๊ฐํ•œ ์ง€์žฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๊ฐ€ ์ œ์‹œํ•˜๋Š” ๋”œ๋ ˆ๋งˆ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

package old
import "new"
type A adapts new.A
func (a A) NewA() {}

package new
type A struct{}
func (a A) OldA() {}

package main
import (
    "new"
    "old"
    "reflect"
)
func main() {
    oldv := reflect.ValueOf(old.A{})
    newv := reflect.ValueOf(new.A{})
    if oldv.Type() == newv.Type() {
        // The two types are equal, therefore they must
        // have exactly the same method set, so either
        // oldv doesn't have the OldA method or newv doesn't
        // have the NewA method - both of which imply a contradiction
        // in the type system.
    } else {
         // The two types are not equal, which means that the
         // old adapted type is not fully compatible with the old
         // one. Any type that includes either new.A or new.B will
         // be incompatible as one of its components will likewise be
         // unequal, so any code that relies on dynamic type checking
         // will fail when presented with the type that's not using the
         // expected version.
    }
 }

๋ฆฌํ”Œ๋ ‰ํŠธ ํŒจํ‚ค์ง€์˜ ํ˜„์žฌ ๊ณต๋ฆฌ ์ค‘ ํ•˜๋‚˜๋Š” ๋‘ ์œ ํ˜•์ด ๋™์ผํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น reflect.Type ๊ฐ’์ด ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Go์˜ ๋Ÿฐํƒ€์ž„ ์œ ํ˜• ๋ณ€ํ™˜ ํšจ์œจ์„ฑ์˜ ๊ธฐ์ดˆ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ํ•œ ์ด๊ฒƒ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  "adapts"ํ‚ค์›Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

@rogpeppe ์œ„์˜ ๋ฐ˜์˜์— ๋Œ€ํ•œ @rsc์™€์˜ ๋Œ€ํ™”๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋‘ ์œ ํ˜•์€ ๋™์ผํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Reflect๋Š” ์ง„์‹ค์„ ๋งํ•˜๊ณ  ์–ด๋Œ‘ํ„ฐ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ์žˆ์„ ๋•Œ ์–ด๋Œ‘ํ„ฐ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@niemeyer ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์ด ๊ฐ™์ง€ ์•Š์œผ๋ฉด ํŒจํ‚ค์ง€ ๊ฐ„์— ์œ ํ˜•์„ ์ด๋™ํ•˜๋ฉด์„œ ์ ์ง„์ ์ธ ์ฝ”๋“œ ๋ณต๊ตฌ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ ํ˜• ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ์ƒˆ ์ด๋ฏธ์ง€ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

package newimage
import "image"
type RGBA adapts image.RGB
func (r *RGBA) At(x, y) color.Color {
    return (*image.Buffer)(r).At(x, y)
}
etc for all the methods

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

image/png ํŒจํ‚ค์ง€๊ฐ€
newimage๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€ํ™˜๋˜์—ˆ์ง€๋งŒ image/jpeg๋Š” ๋ณ€ํ™˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค:

img, err := png.Decode(r)
if err != nil { ... }
err = jpeg.Encode(w, img, nil)

๊ทธ๋Ÿฌ๋‚˜ *newimage.RGBA๊ฐ€ ์•„๋‹Œ *image.RGBA์— ๋Œ€ํ•ด ํ˜•์‹ ์–ด์„ค์…˜์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
์œ ํ˜•์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— AFAICS์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜•์ด *image.RGBA์ธ์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์œ„์˜ ์œ ํ˜• ์ฃผ์žฅ์„ ์„ฑ๊ณต์‹œ์ผฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์•„๋‹ˆ๋ฉด. ๊ทธ๊ฒƒ์€ ํ˜„์žฌ ๋ถˆ๋ณ€์„ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค :

๋ฐ˜์‚ฌ.TypeOf(x) == ๋ฐ˜์‚ฌ.TypeOf(x.(anyStaticType))

์ฆ‰, ์ •์  ์œ ํ˜• ์–ด์„ค์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด
๊ฐ’์ด์ง€๋งŒ ๋•Œ๋กœ๋Š” ์‹ค์ œ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ดœ์ฐฎ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋„ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ ์‘๋œ ์œ ํ˜•์„ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
์ ์‘ ์œ ํ˜• ์ง€์›, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒˆ ์ฝ”๋“œ ๋˜๋Š” ์ด์ „ ์ฝ”๋“œ๊ฐ€ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค.
ํ˜ธํ™˜๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์ž‘๋™
๊ทธ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์œ ํ˜•.

์ด๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ๋ชจ์ˆœ์ ์ธ ์ƒํ™ฉ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

// oldInterface is some interface with methods that
// are only supported by the old type.
type oldInterface interface {
    OldMethod()
}
var x = interface{} = newpackage.Type{}
switch x.(type) {
case oldInterface:
    // This would fail because the newpackage.Type
    // does not implement OldMethod, even though we
    // we just supposedly checked that x implements OldMethod.
    reflect.TypeOf(x).Method("OldMethod")
}

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

๋‚˜๋Š” "X = Y ์œ ํ˜•" ์ œ์•ˆ์„ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. ์„ค๋ช…์ด ๊ฐ„๋‹จํ•˜๊ณ  ํ•˜์ง€ ์•Š๋Š”๋‹ค.
์œ ํ˜• ์‹œ์Šคํ…œ์„ ๋„ˆ๋ฌด ๋งŽ์ด ๋ฐฉํ•ดํ•˜์‹ญ์‹œ์˜ค.

@rogpeppe : @niemeyer ์˜ ์ œ์•ˆ์€ @josharian ์˜ ์ด์ „ ์ œ์•ˆ ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ ์‘๋œ ์œ ํ˜•์„ ๊ธฐ๋ณธ ์œ ํ˜•์œผ๋กœ ์•”์‹œ์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ๊ทน๋‹จ์  ์ธ ๊ฒฝ์šฐ๋กœ ์ด์–ด์ง€์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๊ทธ ์ž์ฒด๋กœ "๋ชจ์ˆœ์ "์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

type oldInterface interface {
    OldMethod()
}
var x = interface{} = newpackage.Type{}
switch y := x.(type) {
case oldInterface:
    reflect.TypeOf(y).Method("OldMethod")  // ok
    reflect.TypeOf(x).Method("NewMethod")  // ok

    // This would fail because y has been implicitly converted to oldInterface.
    reflect.TypeOf(y).Method("NewMethod")

    // This would fail because accessing OldMethod on newpackage.Type requires
    // a conversion to oldInterface.
    reflect.TypeOf(x).Method("OldMethod")
}
// This would fail because accessing OldMethod on newpackage.Type requires
// a conversion to oldInterface.

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

์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๊ฐ€ ๋งˆ๋ฌด๋ฆฌ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/golang/go/issues/16339#issuecomment -247536289 ์—์„œ

์ „๋ฐ˜์ ์œผ๋กœ ์—ฌ๊ธฐ์˜ ๊ฐ์ •์€ ์ผ๋ฐ˜ํ™”๋œ ๋ณ„์นญ์ด ์•„๋‹Œ ์œ ํ˜• ๋ณ„์นญ์— ๋Œ€ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Gustavo์˜ ์–ด๋Œ‘ํ„ฐ ์•„์ด๋””์–ด๊ฐ€ ์œ ํ˜• ๋ณ„์นญ์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ผ์˜๊ฐ€ ๋๋‚˜๋ฉด ๋” ๊ฐ„๋‹จํ•œ ํ˜•์‹์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ์•ฝ๊ฐ„ ๋ณต์žกํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋…ผ์˜๊ฐ€ ์กฐ๊ธˆ ๋” ์˜ค๋ž˜ ๊ณ„์†๋  ๊ฒƒ์„ ์ œ์•ˆํ•œ๋‹ค.

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

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

Re "์ œํ•œ? ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ํ˜•์˜ ๋ณ„์นญ์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋งŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค." -- ํŠนํžˆ, ๋ณ„์นญ ์‚ฌ์šฉ์— ๊ด€์‹ฌ์„ ํ‘œ๋ช…ํ•œ ๊ธฐ์กด ํŒจํ‚ค์ง€ x/image/draw ๋Œ€ํ•œ ๋“œ๋กญ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ผ์šฐํ„ฐ ํŒจํ‚ค์ง€ ๋“ฑ์ด ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ net/http ์— ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์•„์ฃผ ์ž˜ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( ์†์„ ํ”๋“œ๋Š” ๊ฒƒ ).

๋‚˜๋Š” ๋˜ํ•œ ๋ฐ˜๋Œ€ ์ฃผ์žฅ Re ๋ชจ๋“  ์ œํ•œ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ์ œํ•œ์„ ๊ฐ–์ง€ ์•Š๋Š” ๊ฒƒ์— ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

@Merovius , ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ _exported_ ์ „์—ญ ๋ณ€์ˆ˜๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ ์ „์—ญ์ด ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ธ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ „์—ญ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€๋Š” ๋œ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด ์‹ค์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด runtime.MemProfileRate๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์™„์ „ํžˆ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์€ ๊ทธ๊ฒƒ์„ ํ”„๋กœ๊ทธ๋žจ ์ดˆ๊ธฐ์— ์„ค์ •ํ•˜๊ณ  ๊ฐ€์ ธ์˜จ ํŒจํ‚ค์ง€๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์ดˆ๊ธฐํ™” ๊ณ ๋ฃจํ‹ด์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. var ๋Œ€ const์— ๋Œ€ํ•ด ๋‹น์‹ ์ด ์˜ณ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋‹ค๋ฅธ ๋‚ ๋กœ ๋‚จ๊ฒจ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

x/image/draw์— ๋Œ€ํ•œ ์ข‹์€ ์ . ๋‹ค์Œ ์—…๋ฐ์ดํŠธ์—์„œ ์š”์•ฝ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

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

@rsc ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ GothamGo ํ”„๋ ˆ์  ํ…Œ์ด์…˜์ด youtube https://www.youtube.com/watch?v=h6Cw9iCDVcU ์— ๊ฒŒ์‹œ๋˜์—ˆ์œผ๋ฉฐ ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@Merovius ๋‚ด๋ณด๋‚ธ ๋ชจ๋“  ํŒจํ‚ค์ง€ ์ „์—ญ ๊ฐ€๋ณ€ ๋ณ€์ˆ˜๋Š” ํŒจํ‚ค์ง€ ์ˆ˜์ค€ getter ๋ฐ setter ํ•จ์ˆ˜๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

p ํŒจํ‚ค์ง€์˜ ๋ฒ„์ „ n์ด ์ฃผ์–ด์ง€๋ฉด

package p
var Global = 0

๋ฒ„์ „ n+1์—์„œ๋Š” getter ๋ฐ setter๊ฐ€ ๋„์ž…๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณ€์ˆ˜๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

package p
//Deprecated: use GetGlobal and SetGlobal.
var Global = 0
func GetGlobal() int {
    return Global
}
func SetGlobal(n int) {
   Global = n
}

๋ฒ„์ „ n + 2๋Š” Global ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package p
var global = 0
func GetGlobal() int {
    return global
}
func SetGlobal(n int) {
   global = n
}

(์—ฐ์Šต์€ ๋…์ž์—๊ฒŒ ๋งก๊ธฐ์‹ญ์‹œ์˜ค: global ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ n + 2์˜ ๋ฎคํ…์Šค๋กœ ๋ž˜ํ•‘ํ•˜๊ณ  ๋ณด๋‹ค ๊ด€์šฉ์ ์ธ Global() ๋ฅผ ์œ„ํ•ด GetGlobal() ๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)

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

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

@jimmyfrasche ๋งž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” getter์™€ setter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š์ง€๋งŒ (๊ตฌ์กฐ ํ•„๋“œ์— ๋Œ€ํ•ด ๊ทธ๊ฒƒ๋“ค์„ ๊ฐ–๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ) ๋‹น์‹ ์˜ ๋ถ„์„์€ ๋ฌผ๋ก  ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

๋ณ„์นญ์˜ ๋น„์ˆ˜๋ฆฌ ์‚ฌ์šฉ(์˜ˆ: ๋“œ๋กญ์ธ ๊ต์ฒด ํŒจํ‚ค์ง€ ๋งŒ๋“ค๊ธฐ)์— ๋Œ€ํ•ด ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•  ์ ์ด ์žˆ์ง€๋งŒ var-aliases์˜ ๊ฒฝ์šฐ๋ฅผ ์•ฝํ™”์‹œํ‚จ๋‹ค๋Š” ์ ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค.

@Merovius ๋Š” ๋ชจ๋“  ์ ์— ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ € ์—ญ์‹œ ๋งŒ์กฑ์Šค๋Ÿฝ์ง€๋Š” ์•Š์ง€๋งŒ ๋…ผ๋ฆฌ๋ฅผ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค vโ˜นv

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

@rogpeppe ์ด๊ฒƒ์ด ์˜ค๋Š˜๋‚  ๋ฐœ์ƒํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค๋Š”

type two one

์ด๊ฒƒ์€ one ๋ฐ two ๋…๋ฆฝ ์œ ํ˜•์„ ๋งŒ๋“ค๊ณ  interface{} ๋ฐ˜์˜ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๊ทธ๊ฒƒ์ด ๋ณด์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. one ์™€ two ์‚ฌ์ด์—์„œ ๋ณ€ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์–ด๋Œ‘ํ„ฐ ์ œ์•ˆ์€ ์–ด๋Œ‘ํ„ฐ์— ๋Œ€ํ•œ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ œ์•ˆ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ชจ์ˆœ๋˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

@iand type two one ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‘ ์œ ํ˜•์€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ๋ฉ”์„œ๋“œ ์ง‘ํ•ฉ์„ ๊ฐ€์ง€๋ฏ€๋กœ ์ด๋ฆ„์„ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐ ํŠน๋ณ„ํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ „ ์ฝ”๋“œ ๋ฒ ์ด์Šค๊ฐ€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜๊ธฐ ์ „์— ์ด์ „ ์œ ํ˜•(ํ˜„์žฌ ์–ด๋Œ‘ํ„ฐ)์˜ ์ด์ „ ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ƒˆ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ์ƒˆ ์ฝ”๋“œ๋Š” ์ƒˆ ์„œ๋ช…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ์œ ํ˜•์˜ ๊ฐ’์„ ์ด์ „ ์ฝ”๋“œ์— ์ „๋‹ฌํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ›„์ž๊ฐ€ ์ „์ž์˜ ์–ด๋Œ‘ํ„ฐ์ž„์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

@jimmyfrasche ๋ณ„์นญ์˜ ๋ฉ”์„œ๋“œ์™€ ๊ด€๋ จํ•˜์—ฌ ๋ณ„์นญ์€ ์ผ๋ฐ˜์ ์ธ ๋ฉ”์„œ๋“œ ์ •์˜ ์ œํ•œ์„ ์šฐํšŒํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๊ฐ€ ์œ ํ˜• T1 = otherpkg.T2๋ฅผ ์ •์˜ํ•˜๋ฉด otherpkg.T2์—์„œ ์ง์ ‘ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ T1์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒจํ‚ค์ง€๊ฐ€ ์œ ํ˜• T1 = T2(๋‘˜ ๋‹ค ๋™์ผํ•œ ํŒจํ‚ค์ง€์— ์žˆ์Œ)๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€๋‹ต์€ ๋œ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ œํ•œ์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ (์•„์ง) ๋ช…๋ฐฑํ•œ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ตœ์ƒ์œ„ ํ† ๋ก  ์š”์•ฝ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค . ๋ณ€๊ฒฝ ์‚ฌํ•ญ:

  • GothamGo ๋น„๋””์˜ค์— ๋Œ€ํ•œ ๋งํฌ ์ถ”๊ฐ€
  • @jba์— ๋”ฐ๋ผ "๊ธด ์ด๋ฆ„ ์ถ•์•ฝ"์„ ๊ฐ€๋Šฅํ•œ ์šฉ๋„๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • @Merovius์— ๋”ฐ๋ผ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œํ•œ์— ๋Œ€ํ•œ ์ธ์ˆ˜๋กœ x/image/draw๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • @jimmyfrasche์— ๋”ฐ๋ผ ๋ณ„์นญ์˜ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋””์ž์ธ ๋ฌธ์„œ ์ถ”๊ฐ€: golang.org/design/18130-type-alias

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

์ œ์•ˆ ์ ˆ์ฐจ ์— ๋”ฐ๋ผ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ œ์•ˆ์— ๋Œ€ํ•œ ์‹ค์งˆ์ ์ธ ์˜๊ฒฌ์„ _์—ฌ๊ธฐ_์— ๊ฒŒ์‹œํ•˜์‹ญ์‹œ์˜ค. ๋งž์ถค๋ฒ•/๋ฌธ๋ฒ•/๋“ฑ์€ Gerrit ์ฝ”๋“œ ๊ฒ€ํ†  ํŽ˜์ด์ง€ https://go-review.googlesource.com/#/c/34592/ ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

"์ž„๋ฒ ๋”ฉ์— ๋Œ€ํ•œ ์˜ํ–ฅ"์„ ์žฌ๊ณ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ ์ง„์  ์ฝ”๋“œ ๋ณต๊ตฌ๋ฅผ ์œ„ํ•œ ์œ ํ˜• ๋ณ„์นญ์˜ ์‚ฌ์šฉ์„ฑ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, p1 ๊ฐ€ type T1 = T2 ์œ ํ˜•์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  p2 ํŒจํ‚ค์ง€๊ฐ€ p1.T2 ๋ฅผ ๊ตฌ์กฐ์ฒด์— ํฌํ•จํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ •์˜๋ฅผ p1.T1 ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. p3 ๊ฐ€ ์ด๋ฆ„์œผ๋กœ ํฌํ•จ๋œ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. p2 ๋‹ค์Œ์€ ์ „ํ™˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค p1.T1 ํŒŒ๊ดดํ•˜์ง€ ์•Š๊ณ  p3 ; p3 ๋Š” ํ˜„์žฌ p2 ํ•˜์ง€ ์•Š๊ณ  ์ด๋ฆ„์„ p1.T1 ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ a) ์ผ๋ฐ˜์ ์œผ๋กœ ํฌํ•จ๋œ ํ•„๋“œ๋ฅผ ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ํ˜ธํ™˜์„ฑ/์‚ฌ์šฉ ์ค‘๋‹จ ๊ธฐ๊ฐ„ ์•ฝ์†์„ ์ œํ•œํ•˜๊ฑฐ๋‚˜ b) ๋ณ„๋„์˜ ์‚ฌ์šฉ ์ค‘๋‹จ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ p1 ์ถ”๊ฐ€ type T1 = T2 ์™€ deprecates T2 ๋‹ค์Œ์„ p2 (๋ง)๋ฅผ ์ฐธ์กฐ deprecates s2.T2 ์ด๋ฆ„์œผ๋กœ, ๋ชจ๋“  ์ˆ˜์ž… p2 ๋ณต๊ตฌ๋ฉ๋‹ˆ๋‹ค ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด p2 ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ด๋ก ์ƒ ๋ฌธ์ œ๋Š” ๋ฌดํ•œ์ • ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. p4 ๋Š” p3 ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. p2 ; ์ด๋ฆ„์œผ๋กœ ๋‘ ๋ฒˆ ํฌํ•จ๋œ ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋ ค๋ฉด p3 ์—๋„ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ธฐ๊ฐ„์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ฐ€์žฅ ์•ˆ์ชฝ์˜ ๊ฐ๊ฐ€์ƒ๊ฐ ๊ธฐ๊ฐ„์ด ๋ฌดํ•œ๋Œ€๊ฐ€ ๋˜๊ฑฐ๋‚˜ ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ์ด ๋ฌดํ•œ๋Œ€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€์  ์ธ ๊ฒƒ์œผ๋กœ ๊ณ ๋ คํ•˜์ง€ ์•Š๋”๋ผ๋„ b) ์‹œ๊ฐ„์ด ๊ฝค ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค ( p2 ์˜ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ธฐ๊ฐ„์€ p1 ์˜ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ธฐ๊ฐ„์— ์™„์ „ํžˆ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ 2T์—์„œ ์„ ํƒํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

a) ๋˜ํ•œ ๋‚˜์—๊ฒŒ ๋น„์‹ค์šฉ์  ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ ํ˜•์— *byte.Buffer ์žˆ๊ณ  ํ•ด๋‹น ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ(๋˜๋Š” ํ•ด๋‹น ๋ฒ„ํผ๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ), ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ ๋Š” ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค(๊ตฌ์กฐ์ฒด ์ด๋‹ˆ์…œ๋ผ์ด์ € ์‚ฌ์šฉ ์ œ์™ธ ์ด๋ฆ„์ด ์—†์œผ๋ฉด ํ˜ธํ™˜์„ฑ ๋ณด์žฅ๋„ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. :) ).

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

๋ณ„์นญ์— ๋Œ€ํ•œ @rsc re ๋ฉ”์„œ๋“œ

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

type T = S ๊ฒฝ์šฐ T ์—์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋Š” ๊ทœ์น™์€ ์ ˆ๋Œ€์ ์ด๋ฉฐ ์†Œ์Šค์˜ ์†Œ์Šค๋ฅผ ์กฐ์‚ฌํ•  ํ•„์š” ์—†์ด ์ ์šฉ๋˜๋Š” ์†Œ์Šค์˜ ํ•œ ์ค„์—์„œ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. S, ๋ณ„์นญ ์ƒํ™ฉ์—์„œ์™€ ๊ฐ™์ด.

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

@jimmyfrasche type T1 = T2 ์“ฐ๊ณ  ์žˆ๊ณ  T2๊ฐ€ ๊ฐ™์€ ํŒจํ‚ค์ง€์— ์žˆ๋‹ค๋ฉด T2๋ผ๋Š” ์ด๋ฆ„์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ์šฐ๋ฆฌ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ godoc์—์„œ T2์˜ ๋ฐœ์ƒ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋ฅผ func (T1) M() ๋กœ ์„ ์–ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

@jba ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ ๋ณ„์นญ์˜ ๋ฐฉํ–ฅ์„ ๋ฐ˜๋Œ€๋กœ type T2 = T1 ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ T1 ์— ๋™์ผํ•œ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ฐจ์ด์ ์€ reflect ํŒจํ‚ค์ง€์—์„œ ๋ณด๊ณ ํ•˜๋Š” ์œ ํ˜• ์ด๋ฆ„์ด๋ฉฐ ๋ณ„์นญ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ์ด๋ฆ„์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๋ฅผ ์ด๋ฆ„์— ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •ํ•˜์—ฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jimmyfrasche ์ œ์•ˆ ๋ฌธ์„œ์—์„œ :

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

๋ฉ”์†Œ๋“œ ์ˆ˜์‹ ์ž ์œ ํ˜•์œผ๋กœ pF๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฒฐ์ฝ” ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@mdempsky ๋‚˜๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

์ œ ์š”์ ์€ ํŠน์ • ์ฝ”๋“œ ์ค„๋งŒ ๋ณด๋ฉด ๊ทธ๊ฒƒ์ด ์œ ํšจํ•œ์ง€ ์•„๋‹Œ์ง€๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ type S = T , ๋‹น์‹ ์€ ๋˜ํ•œ ๋ณผ ํ•„์š” T ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ๋ณ„๋ช… ์•„๋‹Œ ๋ณ„๋ช…์ด ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ด์ ์€ ๋ณต์žก์„ฑ์ž…๋‹ˆ๋‹ค.

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

@๋ฉ”๋กœ๋น„์šฐ์Šค

p1์ด ์œ ํ˜• ์œ ํ˜• T1 = T2์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  ํŒจํ‚ค์ง€ p2๊ฐ€ p1.T2๋ฅผ ๊ตฌ์กฐ์ฒด์— ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์ ธ์˜ค๊ธฐ p3๊ฐ€ ํฌํ•จ๋œ ๊ตฌ์กฐ์ฒด๋ฅผ ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ •์˜๋ฅผ p1.T1๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

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

๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ์„ ์–ธ์„ ๊ณ ๋ ค:

package p2

type S struct {
  p1.T2
}

ํ•˜๋‚˜์˜ ๋ณด์ƒ ๊ธฐ๋Šฅ์€ "ํ•„๋“œ ๋ณ„์นญ"์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋ณ„์นญ ์œ ํ˜•๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

package p2

type S struct {
  p1.T1
  T2 = T1  // field T2 is an alias for field T1.
}

var s S  // &s.T2 == &s.T1

๋˜ ๋‹ค๋ฅธ ๋ณด์ƒ ๊ธฐ๋Šฅ์€ ์ต๋ช… ํ•„๋“œ์˜ ๋ฉ”์„œ๋“œ ์ง‘ํ•ฉ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ฑ„ํƒํ•˜๋Š” "์œ„์ž„"์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package p2

type S struct {
  T2 p1.T1 delegated  // T2 is a field of type T1.
  // The method set of S includes the method set of T1 and forwards those calls to field T2.
}

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

@Merovius ์ฃผ์š” ๋ฌธ์ œ๋Š” ์œ ํ˜•์ด ๋ณ„์นญ์œผ๋กœ ์ด๋ฆ„์ด ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์™„์ „ํžˆ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ„์‹ ํžˆ ์ง€๋‚˜๊ฐ€๋Š” ์ƒ๊ฐ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€์— ์ด๋ฆ„์„ ๋‹ค์‹œ ์ง€์ •ํ•˜๊ณ  ํฌํ•จํ•˜๋Š” ๋ณ„์นญ์„ ๋„์ž…ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋ฃจํ”„๋ฅผ ๊นฐ ์‹œ๊ฐ„์„ ๋ฒŒ ์ˆ˜ ์žˆ์„๊นŒ์š”?

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

@Merovius ์ƒ๊ฐํ•˜๋ฉด ํ• ์ˆ˜๋ก ํ•„๋“œ ๋ณ„์นญ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์—

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

@๋ฉ”๋กœ๋น„์šฐ์Šค

p1์ด ์œ ํ˜• ์œ ํ˜• T1 = T2์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  ํŒจํ‚ค์ง€ p2๊ฐ€ p1.T2๋ฅผ ๊ตฌ์กฐ์ฒด์— ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€์ ธ์˜ค๊ธฐ p3๊ฐ€ ํฌํ•จ๋œ ๊ตฌ์กฐ์ฒด๋ฅผ ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ •์˜๋ฅผ p1.T1๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด p2๋Š” p3์„ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  p1.T1์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. p3๋Š” ํ˜„์žฌ p2์™€ ๊นจ์ง€์ง€ ์•Š๊ณ  ์ด๋ฆ„์„ p1.T1๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ๋ฅผ ์ดํ•ดํ•˜๋ฉด ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

package p1

type T2 struct {}
type T1 = T2
package p2

import "p1"

type S struct {
  p1.T2
  F2 string // see below
}

๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ตฌ์กฐ์ฒด ํ•„๋“œ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ ์ž ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์˜ ํŠน์ •ํ•œ ์˜ˆ์ผ ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. S.F2์˜ ์ด๋ฆ„์„ S.F1๋กœ ๋ฐ”๊พธ๋ ค๋Š” ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

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

package p2

import "p1"

type T2 = p1.T1

type S struct {
  T2
}

๋ฌผ๋ก  ์ด๊ฒƒ์€ ์žฅ๊ธฐ์ ์œผ๋กœ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” p2๊ฐ€ T2 ์ด๋ฆ„์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ณด๋‚ธ API๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์šฐํšŒํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•„๋“œ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

"ํŒจํ‚ค์ง€ ๊ฐ„ ์œ ํ˜• ์ด๋™"์— ๊ด€ํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๊ทธ ๊ณต์‹์ด ์•ฝ๊ฐ„ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ, ์ œ์•ˆ์€ ์ƒˆ ์ด๋ฆ„์„ ํ†ตํ•ด ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ์žˆ๋Š” ๊ฐœ์ฒด ์ •์˜๋ฅผ "์ฐธ์กฐ"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@atdiar ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์˜ ์œ ํ˜•์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์€ ์œ ํ˜•์„ ์ด๋™ํ•˜๋Š” ๋‹จ๊ณ„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ๋ณ„์นญ์€ ์œ ํ˜•์„ ์ด๋™ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๋™์„ ์œ„ํ•œ ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Merovius ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฆฌํ”Œ๋ ‰์…˜ ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋งˆ์ง€๋ง‰์œผ๋กœ ์œ ์šฉํ•˜๊ณ  ์ž˜ ์ž‘์„ฑ๋œ ์ œ์•ˆ์„œ์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ๋ณ„์นญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ๋ณ„์นญ ์—†์ด ๋‹จ์ผ API๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋‹ค์ง€ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ go v1.8์— ํฌํ•จ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ๊ฒฐ์ฝ” ๋Šฆ์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ 1.9๋กœ ์ง„ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

@๋ฉ”๋กœ๋น„์šฐ์Šค
ํŒจํ‚ค์ง€ ๊ฐ„์— "์œ ํ˜• ์ด๋™"์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ •์˜๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, pkg reflect์—์„œ ์ผ๋ถ€ ์ •๋ณด๋Š” ๊ฐ์ฒด๊ฐ€ ์ •์˜๋œ ํŒจํ‚ค์ง€์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
์ •์˜๋ฅผ ์ด๋™ํ•˜๋ฉด ๊นจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@kataras ๊ทธ๊ฒƒ์€ ์ข‹์€ ๋ฌธ์„œ์™€ ์ฃผ์„์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ง€ ์œ ํ˜• ์ •์˜๊ฐ€ ์ด๋™๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณ„์นญ ์ œ์•ˆ์— ๊ฐ์‚ฌํ•˜๋Š” ๋งŒํผ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋ƒฅ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์กฐ์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

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

@kataras ๊ฐœ์ธ์ ์œผ๋กœ ๋™์˜ํ•˜์ง€๋งŒ ์ด ๊ธฐ๋Šฅ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ๋‹จ์ˆœํžˆ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์ด ํŠน๋ณ„ํžˆ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์˜ ์šฐ๋ ค๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฑด์„ค์ ์ธ ๋…ผ์Ÿ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. :)

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

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

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

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

@Merovius ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์ข…์†์„ฑ ์ค‘ ํ•˜๋‚˜๊ฐ€ reflect.Type.PkgPath()๋ฅผ ๋ณด๊ณ  ์žˆ๋Š” ์ „์ด ์ข…์†์„ฑ์˜ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?
๊ทธ๊ฒƒ์€ ์ž„๋ฒ ๋”ฉ ๋ฌธ์ œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋™์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@atdiar ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ด ์Šค๋ ˆ๋“œ์˜ ๋…ผ์˜์™€ ์ด ์ œ์•ˆ์ด ๋ฌด์—‡์— ๊ด€ํ•œ ๊ฒƒ์ธ์ง€

๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋‹ค์‹œ ํ‘œํ˜„ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

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

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

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

@niemeyer

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

๋‹น์‹ ์€ ์‚ฌ์ด์—์„œ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

 func() one

๊ทธ๋ฆฌ๊ณ 

func() two

@Merovius ์•ผ์ƒ์— ์กด์žฌํ•˜๋Š” ์ฝ”๋“œ ์ˆ˜๋ฆฌ ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ์ž„ํฌํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ ํŒจํ‚ค์ง€ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

@jimmyfrasche re ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์˜ ๋ฉ”์†Œ๋“œ ์˜จ ์•จ๋ฆฌ์–ด์Šค ์œ ํšจ์„ฑ:

func (t T) M() ๊ฐ€ ๋•Œ๋กœ๋Š” ์œ ํšจํ•˜๊ณ  ๋•Œ๋กœ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ„๋ฅผ ์ž์ฃผ ๋„˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์ด ๋‚˜์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ๋กœ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. https://play.golang.org/p/bci2qnldej. ์–ด์จŒ๋“  ์ด๊ฒƒ์€ _๊ฐ€๋Šฅํ•œ_ ์ œํ•œ ์‚ฌํ•ญ ๋ชฉ๋ก์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ œํ•œ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณต์žก์„ฑ์ด ์ถ”๊ฐ€๋˜๋ฉฐ ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ๊ตฌ์ฒด์ ์ธ ์‹ค์ œ ์ฆ๊ฑฐ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@Merovius , ์ด๋ฆ„์„ ๋‹ค์‹œ ์ž„๋ฒ ๋”ฉ:

์ƒํ™ฉ์ด ์™„๋ฒฝํ•˜์ง€ ์•Š๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ io.ByteBuffer์— ๋Œ€ํ•œ ์ฐธ์กฐ๋กœ ๊ฐ€๋“ ์ฐฌ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๊ณ  ์ด๋ฅผ bytes.Buffer๋กœ ์˜ฎ๊ธฐ๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ์„ ์†Œ๊ฐœํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

package io
type ByteBuffer = bytes.Buffer

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

์šฐ๋ฆฌ๋Š” #17746์—์„œ ์ด์— ๋Œ€ํ•ด ์–ด๋Š ์ •๋„ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์›๋ž˜ ๋‚ด์žฅ๋œ io.ByteBuffer ๋ณ„์นญ์˜ ์ด๋ฆ„์ด Buffer์ธ ํŽธ์— ์†ํ–ˆ์ง€๋งŒ ์œ„์˜ ์ฃผ์žฅ์€ ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๊ณ  ํ™•์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ @jimmyfrasche ๋Š” ์ž„๋ฒ ๋””๋“œ ์‚ฌ๋ฌผ์˜ ์ •์˜์— ๋”ฐ๋ผ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ช‡ ๊ฐ€์ง€ ์ข‹์€ ์ฃผ์žฅ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํฌํ•จ๋œ ๋ณ„์นญ์„ ์™„์ „ํžˆ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ์—์„œ p2์— ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. p2๊ฐ€ io.ByteBuffer๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ  ByteBuffer๋ผ๋Š” ์ด๋ฆ„์˜ ํฌํ•จ๋œ ํ•„๋“œ๋ฅผ ์ •๋ง๋กœ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type ByteBuffer = bytes.Buffer

๊ทธ๋Ÿฐ ๋‹ค์Œ io.ByteBuffer ๋Œ€์‹  ByteBuffer(์ฆ‰, p2.ByteBuffer)๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋„ ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ˆ˜๋ฆฌ๋ฅผ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

(/cc @neild ๋ฐ @bcmills)

@atdiar , ์˜ˆ, ๋ฆฌํ”Œ๋ ‰์…˜์ด ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฟฐ๋šซ์–ด ๋ณผ ์ˆ˜ ์žˆ๊ณ  ์ฝ”๋“œ๊ฐ€ ๋ฆฌํ”Œ๋ ‰์…˜์˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ

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

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

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

@Merovius ๊ฐ„๋‹จํ•œ ๊ทœ์น™์„ ์‹œ๋„ํ•˜๊ณ  ๋” ๋ณต์žกํ•œ ๊ทœ์น™์„ ๋„์ž…ํ•˜๊ธฐ ์ „์— ์šฐ๋ฆฌ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‚˜์ค‘์— (a)์™€ (b)๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (c)๋Š” ์ƒ๊ด€์—†์ด ์ฃผ์–ด์ง„๋‹ค.

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

@rsc

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

@ ๋ฉ”๋กœ ๋น„์šฐ์Šค @rsc

a) ๋ณ„์นญ๊ณผ ๋™์ผํ•œ ๊ตฌ์กฐ์ฒด์— ์ •์˜ ์œ ํ˜•์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ๊ฒฝ์šฐ ์ž„๋ฒ ๋”ฉ์ด ๋ฉ”์†Œ๋“œ ์„ธํŠธ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์˜ ๊ฒฐ๊ณผ๋กœ ์ด๋ฏธ ๊ธˆ์ง€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. (ํฌํ•จ๋œ ์œ ํ˜•์— ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๊ณ  ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ ์ปดํŒŒ์ผ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค: https://play.golang.org/p/XkaB2a0_RK.)

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

๋Œ€์‹ ์— ์œ ํ˜• ๋ณ„์นญ์„ ๋Œ€์ˆ˜์  ์œ ํ˜•์œผ๋กœ ์ ‘๊ทผํ•˜๊ณ  ์œ ํ˜• ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ๋ณ„์นญ์„ ์ง€์›ํ•˜์—ฌ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์œ ํ˜• ๊ฒ€์‚ฌ์™€ ๋™๋“ฑํ•œ ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณด๋„ˆ์Šค๋กœ ์–ป์Šต๋‹ˆ๋‹ค.

type Stringeroonie = {string,fmt.Stringer}

@j7b

๋Œ€์‹  ์œ ํ˜• ๋ณ„์นญ์„ ๋Œ€์ˆ˜ ์œ ํ˜•์œผ๋กœ ์ ‘๊ทผํ•˜๊ณ  ์œ ํ˜• ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ๋ณ„์นญ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ด์œ 

๋ณ„์นญ์€ ์˜๋ฏธ ๋ฐ ๊ตฌ์กฐ์ ์œผ๋กœ ์›๋ž˜ ์œ ํ˜•๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ํ˜• ํƒœ๊ทธ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. (Go ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์€ ์ด๋ฏธ ํ•ด๋‹น ์œ ํ˜• ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜์ง€๋งŒ ๊ตฌ์กฐ์ฒด ๋ฐ ๊ธฐํƒ€ ๋น„์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

@bcmills

์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ์ถ”๋ก ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ T ์œ ํ˜•์˜ ๋ณ„์นญ A๋กœ ๋ฌธ์ œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” A๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค{}๋กœ ์„ ์–ธํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ A ์œ ํ˜•์˜ ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ๋ฒ”์œ„์—์„œ A ์œ ํ˜•์˜ ๋ณ€์ˆ˜๋ฅผ T๋กœ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ณ€ํ™˜ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. , ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„ ์„ ํ˜• ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋น„์šฉ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ  ๋ชจํ˜ธํ•˜์ง€ ์•Š์œผ๋ฉฐ type T = ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์ˆ˜ํ•™์„ ํฌํ•จํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ ๊ด€๋ฆฌ ์˜์‚ฌ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ธฐ๋ฐ˜์„ ๋งŒ๋“ค๊ณ  ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถˆ๋ณ€ ์ฐธ์กฐ์™€ ๊ฐ™์€ ์œ ํ˜•์„ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ฝ”๋“œ์— ๊ด€ํ•œ ํ•œ, ์ธํ„ฐํŽ˜์ด์Šค๋Š”{} "๋‚ด๋ถ€"์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

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

@j7b ADT๊ฐ€ ํ•˜๋‚˜์˜ ์ ์ง„์ ์ธ ์ˆ˜๋ฆฌ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…

์ธํ„ฐํŽ˜์ด์Šค์—์„œ{} ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ฒˆ์—ญํ•œ๋‹ค๋Š” ๋‹น์‹ ์˜ ์•„์ด๋””์–ด๋Š” []interface{} ์™€ ๊ฐ™์€ ๊ณ ์ฐจ ์œ ํ˜•์—์„œ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ์—๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ ๋ ˆ์ด์•„์›ƒ์— ๋Œ€ํ•œ ์ œ์–ด ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ณ  ๋Œ€์‹  ๋ชจ๋“  ๊ฒƒ์„ ๋ž˜ํ•‘ํ•˜๋Š” Java ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” go์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋ฅผ ์žƒ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ADT๋Š” ์—ฌ๊ธฐ์„œ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค.

@Merovius ๋Œ€์ˆ˜ ์œ ํ˜• ๊ตฌ์„ฑ์— ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด(๋™์ผํ•œ ์ •์˜์™€ ์ผ์น˜ํ•จ) ์ด๊ฒƒ์ด ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋Š”{} ์ปดํŒŒ์ผ๋Ÿฌ ๊ด€๋ฆฌ ํ”„๋กœ์ ์…˜ ๋ฐ ์„ ํƒ ํ˜•์‹์˜ โ€‹โ€‹ํ”„๋ก์‹œ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค๋ช…๋˜์–ด ์žˆ๊ณ  ๋ฐ์ดํ„ฐ ๋ ˆ์ด์•„์›ƒ์ด ์–ด๋–ป๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”์ง€, "๊ณ ์ฐจ" ์œ ํ˜•์„ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ณ  []์ธํ„ฐํŽ˜์ด์Šค{}๊ฐ€ ์œ ํ˜•์ผ ๊ฒฝ์šฐ ์œ ํ˜•์€ ์œ ํ˜•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

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

@j7b

๊ทธ ๋ชจ๋“  ๊ฒƒ์„ ์ œ์ณ๋‘๊ณ , ๋‚˜๋Š” ๊ธ์ •์ ์ธ ์œ ํ˜• T = ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ ์ด์ƒ์œผ๋กœ ์ง๊ด€์ ์ด๊ณ  ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ™•์‹คํžˆ ๋ฐ”๋ž๋‹ˆ๋‹ค. Go๋Š” ์˜ค๋Š˜๋‚  (๋Œ€๋ถ€๋ถ„) ํ›Œ๋ฅญํ•˜๊ฒŒ ์ง๊ตํ•˜๋ฉฐ, ๊ทธ ์ง๊ต์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  Go์—์„œ ์ƒˆ๋กœ์šด ์œ ํ˜• T๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ type T def . ์—ฌ๊ธฐ์„œ def ๋Š” ์ƒˆ ์œ ํ˜•์˜ ์ •์˜์ž…๋‹ˆ๋‹ค. ๋Œ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•(ํƒœ๊ทธ๋œ ๊ณต์šฉ์ฒด๋ผ๊ณ ๋„ ํ•จ)์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ํ˜• ๋ณ„์นญ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ์ด ์•„๋‹ˆ๋ผ ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ๋”ฐ๋ฅผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌํŒฉํ† ๋ง ์™ธ์— ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜• ๋ณ„์นญ์˜ ๋‹ค๋ฅธ ๊ด€์ (์ง€์›)์„ ๋˜์ง€๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ž ์‹œ ๋’ค๋กœ ๋ฌผ๋Ÿฌ๋‚˜์„œ type T <a type> ํ˜•์‹์˜ ์ผ๋ฐ˜ ์ด์ „ Go ์œ ํ˜• ์„ ์–ธ์ด ์—†์—ˆ์ง€๋งŒ ์œ ํ˜• ๋ณ„์นญ ์„ ์–ธ type A = <a type> ๋งŒ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

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

๋‹ค์‹œ ๋งํ•ด, Go๊ฐ€ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋„ ๋Œ€์ฒด๋กœ ๊ดœ์ฐฎ์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”๊ตฐ๋‹ค๋‚˜ ๊ทธ๋Ÿฐ ์„ธ๊ณ„์—์„œ๋Š” ์œ ํ˜•์ด ๊ตฌ์กฐ์ ์œผ๋กœ ๋™์ผํ•˜๋ฉด(์ด๋ฆ„์— ๊ด€๊ณ„์—†์ด) ์œ ํ˜•์ด ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๋ฆฌํŒฉํ† ๋ง๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ์ฒ˜์Œ์—๋Š” ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋ฉฐ ์–ธ์–ด ๋ณ€๊ฒฝ.

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

๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ๊ธฐ์กด ์œ ํ˜•๊ณผ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ์œ ํ˜•์„ ๋งŒ๋“œ๋Š” ๊ฐœ๋…์„ "๋ธŒ๋žœ๋”ฉ"์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. get ์œ ํ˜•์€ ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜•๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๋ธŒ๋žœ๋“œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Modula-3์—๋Š” ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํŠน์ˆ˜ ํ‚ค์›Œ๋“œ BRANDED ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: TYPE T = BRANDED REF T0 ๋Š” T0์— ๋Œ€ํ•œ ์ƒˆ๋กญ๊ณ  ๋‹ค๋ฅธ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•จ). Haskell์—์„œ๋Š” ์œ ํ˜• ์•ž์— new ๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๋น„์Šทํ•œ ํšจ๊ณผ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค.

๋Œ€์ฒด Go ์„ธ๊ณ„๋กœ ๋Œ์•„๊ฐ€์„œ ๋ฆฌํŒฉํ† ๋ง์— ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ type MyBuffer = []byte ๋ฐ type YourBuffer = []byte ์‹ค์ˆ˜๋กœ ์ž˜๋ชป๋œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๋‹ค๋ฅธ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ •ํ™•ํžˆ ๊ทธ ๋ชฉ์ ์„ ์œ„ํ•ด ์ผ์ข…์˜ ์œ ํ˜• ๋ธŒ๋žœ๋”ฉ์„ ๋„์ž…ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, MyBuffer๊ฐ€ ์ด์ œ YourBuffer์™€ ๋‹ค๋ฅธ ์œ ํ˜•์ด๋ผ๋Š” ํšจ๊ณผ๋กœ type MyBuffer = new []byte ๋˜๋Š” type MyBuffer = new YourBuffer ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด์ค‘์ ์ธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. Go์—์„œ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ "๋ธŒ๋žœ๋“œ" ์œ ํ˜•์ด ์ด๋ฆ„์„ ์–ป์ž๋งˆ์ž ํ•ญ์ƒ ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, type T <a type> ๋Š” ์‚ฌ์‹ค์ƒ type T = new <a type> ์ž…๋‹ˆ๋‹ค.

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

์š”์ ์€ ๋‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋ชจ๋‘ ๋ณธ์งˆ์ ์œผ๋กœ ์œ ์šฉํ•˜๋ฉฐ ์œ ํ˜• ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งˆ์นจ๋‚ด ๋‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ชจ๋‘ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋‘ ์ œ์•ˆ์—์„œ ๋‚˜๋Š” ๋‹น์‹ ์ด ์„ค๋ช…ํ–ˆ๋“ฏ์ด ์ด๋ฆ„์ด Go์˜ ์œ ํ˜• ์ •์˜์˜ ์ผ๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ง์ปค์˜ ํ˜‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

@atdiar "๋ถ„๋ฆฌ ์ปดํŒŒ์ผ"์ด๋ผ๊ณ  ๋งํ•  ๋•Œ ๋‚ด๊ฐ€ํ•˜๋Š” ์ผ์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ P๊ฐ€ io ๋ฐ ๋ฐ”์ดํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ์„ธ ๊ฐ€์ง€ ๋ชจ๋‘ ๋ณ„๋„์˜ ๋‹จ๊ณ„๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ io ๋˜๋Š” bytes๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด P๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. io ๋˜๋Š” bytes๋ฅผ ๋ณ€๊ฒฝํ•œ ๋‹ค์Œ P์˜ ์ด์ „ ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” _์•„๋‹™๋‹ˆ๋‹ค_. ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ชจ๋“œ์—์„œ๋„ ์ด๊ฒƒ์€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ํฌ๋กœ์Šค ํŒจํ‚ค์ง€ ์ธ๋ผ์ด๋‹๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋กœ ์ธํ•ด io ๋˜๋Š” ๋ฐ”์ดํŠธ ๊ตฌํ˜„์— ๋Œ€ํ•œ API๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ผ๋„ ํšจ๊ณผ์ ์ธ ABI๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฏ€๋กœ P๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ๋ณ„์นญ์€ ์ด ๋ฌธ์ œ๋ฅผ ์•…ํ™”์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@j7d , ์œ ํ˜• ์‹œ์Šคํ…œ ์ˆ˜์ค€์—์„œ ํ•ฉ๊ณ„ ์œ ํ˜• ๋˜๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํ•˜์œ„ ์œ ํ˜•(ํ† ๋ก ์˜ ์•ž๋ถ€๋ถ„์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ œ์•ˆํ•œ ๋Œ€๋กœ)์€ ํŠน์ • ์ข…๋ฅ˜์˜ ์šฉ๋„์—๋งŒ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. bytes.Buffer๋ฅผ io.Reader์˜ ํ•˜์œ„ ์œ ํ˜•์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค("๋ฒ„ํผ๋Š” ํŒ๋…๊ธฐ" ๋˜๋Š” ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ "๋ฌธ์ž์—ด์€ ์ŠคํŠธ๋ง๊ฑฐ๋ฃจ๋‹ˆ"). ๋ฌธ์ œ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋ณต์žกํ•œ ์œ ํ˜•์„ ๊ตฌ์„ฑํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฃผ์„์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ Go ์œ ํ˜•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜์ง€๋งŒ Go ์–ธ์–ด๊ฐ€ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•˜์œ„ ์œ ํ˜• ์ˆ˜์ค€์—์„œ ๊ธฐ๋ณธ์ ์ธ ๊ด€๊ณ„์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Go๋Š” ๊ธฐ๋ณธ ๊ด€๊ณ„์™€ ์ผ์น˜ํ•˜๋Š” ๊ทœ์น™์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜• ์ƒ์„ฑ์ž("์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•"์„ ๋งํ•˜๋Š” ๋ฉ‹์ง„ ๋ฐฉ๋ฒ•)๋Š” ํ•˜์œ„ ์œ ํ˜• ์ง€์ • ๊ด€๊ณ„๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ๊ณต๋ณ€์ด๊ณ  ๊ด€๊ณ„๋ฅผ ๋ฐ˜์ „ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ˜๊ณต์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ๊ฒฐ๊ณผ์—์„œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ณต๋ณ€์ž…๋‹ˆ๋‹ค. func() Buffer๋Š” func() Reader์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด Buffer๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์€ Reader๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์Œ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ธ์ˆ˜์—์„œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ณต๋ณ€์ด _not_์ž…๋‹ˆ๋‹ค. func๋Š” ๋ฒ„ํผ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ผ๋ถ€ ๋ฆฌ๋”๋Š” ๋ฒ„ํผ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— func(Buffer)๋Š” func(Reader)๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์ธ์ˆ˜์—์„œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ˜๊ณต๋ณ€์ž…๋‹ˆ๋‹ค. func(Reader)๋Š” func(Buffer)์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด func๋Š” Reader๋งŒ ํ•„์š”ํ•˜๊ณ  Buffer๋Š” Reader์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ๊ฒฐ๊ณผ์—์„œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ˜๊ณต๋ณ€์ด _์•„๋‹Œ_์ž…๋‹ˆ๋‹ค. func() Reader๋Š” func() ๋ฒ„ํผ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. func๋Š” Reader๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ผ๋ถ€ Reader๋Š” ๋ฒ„ํผ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‘˜์„ ๊ฒฐํ•ฉํ•˜๋ฉด func(Reader) Reader๋Š” func(Buffer) ๋ฒ„ํผ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๊ทธ ๋ฐ˜๋Œ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฒฐ๊ณผ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. (์ด ๋ผ์ธ์—์„œ ์ž‘๋™ํ•˜๋Š” ์œ ์ผํ•œ ์กฐํ•ฉ์€ func(Reader) Buffer๊ฐ€ func(Buffer) Reader๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

์ผ๋ฐ˜์ ์œผ๋กœ func(X1) X2๊ฐ€ func(X3) X4์˜ (์„œ๋ธŒํƒ€์ž…) X4์ธ ๊ฒฝ์šฐ X3์€ X1์˜ (์„œ๋ธŒํƒ€์ž…) X2๋Š” X4์˜ (์„œ๋ธŒํƒ€์ž…)์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. T1๊ณผ T2๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋ณ„์นญ ์‚ฌ์šฉ์˜ ๊ฒฝ์šฐ T1์ด T2์˜ ํ•˜์œ„ ์œ ํ˜•์ด๊ณ  T2๊ฐ€ T1์˜ ํ•˜์œ„ ์œ ํ˜•์ธ ๊ฒฝ์šฐ์—๋งŒ func(T1) T1์€ func(T2) T2์˜ ํ•˜์œ„ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ T1์ด T2์™€ _๋™์ผํ•œ_ ์œ ํ˜•์ด์ง€ ๋” ์ผ๋ฐ˜์ ์ธ ์œ ํ˜•์ด ์•„๋‹˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์ธ์ˆ˜์™€ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ์ด๊ฒƒ์ด ์ •์‹ ์˜ˆ(๊ทธ๋ฆฌ๊ณ  ์ข‹์€ ์˜ˆ)์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณต์žกํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ถœ๋ ฅ์— ๋Œ€ํ•œ ๊ณต๋ถ„์‚ฐ(์˜ˆ: func() T, <-chan T, ๋˜๋Š” map[...]T) ๋ฐ ์ž…๋ ฅ์— ๋Œ€ํ•œ ๋ฐ˜๊ณต(์˜ˆ: func(T), chan<- T ๋˜๋Š” map[T ]...) ์ž…๋ ฅ+์ถœ๋ ฅ์— ๋Œ€ํ•œ ๊ฐ•์ œ ์œ ํ˜• ๋™์ผ์„ฑ(์˜ˆ: func(T) T, chan T, *T, ๋˜๋Š” [10]T, []T, ๋˜๋Š” struct {Field T} ๋˜๋Š” ๋ณ€์ˆ˜ ์œ ํ˜• T). ์‹ค์ œ๋กœ Go์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” ์˜ˆ์ œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ž…๋ ฅ+์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค.

๊ตฌ์ฒด์ ์œผ๋กœ, []Buffer๋Š” []Reader๊ฐ€ ์•„๋‹ˆ๋ฉฐ(ํŒŒ์ผ์„ []Reader์—๋Š” ์ €์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ []Buffer์—๋Š” ์ €์žฅํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—), []Reader๋Š” []Buffer๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค([] ๋ฆฌ๋”๋Š” ํŒŒ์ผ์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ []๋ฒ„ํผ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋ฒ„ํผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ).

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

์ฆ‰, ์„œ๋ธŒํƒ€์ดํ•‘๋งŒ์œผ๋กœ๋Š” ์ ์ง„์ ์ธ ์ฝ”๋“œ ๋ณต๊ตฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์œ ํ˜• ๋ณ„์นญ์ด ํ•˜์œ„ ์œ ํ˜•์„ ์‹œ๋„ํ•˜๋Š” ๋Œ€์‹  T1 = T2๊ฐ€ ๋˜๋„๋ก ๋™์ผํ•œ ์œ ํ˜•์— ๋Œ€ํ•œ ์ƒˆ ์ด๋ฆ„์„ ๋„์ž…ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ด ์˜๊ฒฌ์€ 2์ฃผ ์ „ ์ผ์ข…์˜ "๋Œ€์ฒด ๊ฐ€๋Šฅํ•œ ์œ ํ˜•"์— ๋Œ€ํ•œ @iand ์˜ ์ œ์•ˆ๊ณผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๋•Œ๋ถ€ํ„ฐ @griesemer ์˜ ๋‹ต๋ณ€์˜ ํ™•์žฅ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ตœ์ƒ์œ„ ํ† ๋ก  ์š”์•ฝ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ:

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

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

@atdiar ์‹œ์Šคํ…œ ์–ด๋””์—๋„ ๊ทธ๋Ÿฌํ•œ ๋ณ„์นญ ์ด๋ฆ„ ๋ชฉ๋ก์ด ์—†์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์— ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„์นญ์€ ๋Ÿฐํƒ€์ž„์— ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

@rsc ๋‹ค์‹œ ์š”์•ฝ ์ด ์˜๊ฒฌ ์˜ ๋” ํฐ ์š”์ ์€, ์ฆ‰ ์ด๊ฒƒ์ด ํ•„๋“œ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ด๋ฉฐ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์€ ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ๋ณ„๋„์˜ ๋ฌธ์ œ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ(๋ฐ ํ•ด๊ฒฐ)๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ ์ง„์ ์ธ ๋ณต๊ตฌ๋ฅผ ์œ„ํ•œ ํ•„๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์š”์ฒญ/์ œ์•ˆ/ํ† ๋ก ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ(๋™์ผํ•œ ๋ฆด๋ฆฌ์Šค์—์„œ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์Œ)?

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

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

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

  • ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž„์‹œ ์†”๋ฃจ์…˜์œผ๋กœ ์œ ํ˜• ๋ณ„์นญ ์ œ์•ˆ์„ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค.
    ์‚ฌ๋žŒ๋“ค์ด Go 1.9(2์›” 1์ผ)๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„์ด ์ค€๋น„๋˜์–ด ์žˆ๋‹ค๋ฉด.
  • ์ง€๊ธˆ(1์›”) CL์„ ๊ฒ€ํ† ํ•˜๊ณ  Go 1.9 ์‹œ์ž‘ ์‹œ ๋งˆ์Šคํ„ฐ์— ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก dev.typealias dev ๋ถ„๊ธฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • Go 1.9 ๋™๊ฒฐ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„ ๊ทผ์ฒ˜์— ์œ ํ˜• ๋ณ„์นญ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ตœ์ข… ๊ฒฐ์ •์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค(Go 1.8 ์ฃผ๊ธฐ์—์„œ ์ผ๋ฐ˜ํ™”๋œ ๋ณ„์นญ์— ๋Œ€ํ•ด ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ).

+1

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

@Merovius : ์ œ ๊ธ€์„ ์ˆ˜์ •ํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค! ์•„๋ฌด๋„ ์ฝ์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ์ด ์˜๊ฒฌ์˜ ์ฒ˜์Œ์—๋Š” gorename ๋„๊ตฌ์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์–ธ์–ด ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ํšŒ์˜๋ก ์„ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

@jcao219 ์ด๊ฒƒ์€ ์ „์—๋„ ๋…ผ์˜๋œ ์ ์ด ์žˆ์ง€๋งŒ ๋†€๋ž๊ฒŒ๋„ ์—ฌ๊ธฐ์—์„œ ๋นจ๋ฆฌ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๋ณ„์นญ #16339 ๋ฐ ๊ด€๋ จ golang-nuts ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ์›๋ž˜ ์Šค๋ ˆ๋“œ์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ: ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋„๊ตฌ๋Š” ์†์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ ๋ณต๊ตฌ ์ปค๋ฐ‹์„ ์ค€๋น„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋งŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ ๋˜๋Š” ์‚ฌ๋žŒ์— ์˜ํ•ด ๋ณ€๊ฒฝ์ด ์ˆ˜ํ–‰๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํ˜„์žฌ ๋ฌธ์ œ์— ์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ˜„์žฌ ์ผ๋ถ€ ์ฝ”๋“œ ๋˜๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๋Š” ์ปค๋ฐ‹ ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹์—†์Šต๋‹ˆ๋‹ค(์ด ๋ฌธ์ œ์˜ ์›๋ž˜ ์ฃผ์„ ๋ฐ ๊ด€๋ จ ๋ฌธ์„œ๋Š” ์ด ์ง„์ˆ ์„ ๋‹ค์Œ์—์„œ ๋” ์ •๋‹นํ™”ํ•ฉ๋‹ˆ๋‹ค. -๊นŠ์ด).

๋ณด๋‹ค ์ž๋™ํ™”๋œ ๋„๊ตฌ(์˜ˆ: go ๋„๊ตฌ ๋“ฑ์— ํ†ตํ•ฉ๋จ)์˜ ๊ฒฝ์šฐ ์›๋ž˜ ์ฃผ์„์€ "์–ธ์–ด ๋ณ€๊ฒฝ ๋Œ€์‹  ๋„๊ตฌ ๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ „์šฉ ๋ณ€๊ฒฝ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?"๋ผ๋Š” ์ œ๋ชฉ ์•„๋ž˜ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

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

์ €๋Š” ์˜์‹ฌ์„ ํ‘œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. :) ๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ˆ๊ฒฌ๋œ ๊ฒฐ๋ก ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@๋ฉ”๋กœ๋น„์šฐ์Šค

์ €๋Š” ์˜์‹ฌ์„ ํ‘œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. :) ๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ˆ๊ฒฌ๋œ ๊ฒฐ๋ก ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

์˜ˆ๋ฅผ ๋“ค์–ด "github.com/gonum/graph/simple".DirectedGraph ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  simple.DirectedGraph ์ž…๋ ฅ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด digraph ๋กœ ๋ณ„์นญ์„ ์ง€์ •ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค . ์‚ฌ์šฉ ์‚ฌ๋ก€? ์•„๋‹ˆ๋ฉด ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด protobuf์™€ ๊ฐ™์ด ์ƒ์„ฑ๋œ ๋น„ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๊ธด ์ด๋ฆ„์œผ๋กœ ์ œํ•œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@jcao219 , ์ด ํŽ˜์ด์ง€ ์ƒ๋‹จ์˜ ํ† ๋ก  ์š”์•ฝ์ด ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ๋‹ค์Œ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • ์ด๊ฒƒ์ด ์–ธ์–ด ๋ณ€๊ฒฝ ๋Œ€์‹  ๋„๊ตฌ ๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ „์šฉ ๋ณ€๊ฒฝ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ๋ณ„์นญ์—๋Š” ์–ด๋–ค ๋‹ค๋ฅธ ์šฉ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ์ œํ•œ ์‚ฌํ•ญ(ํ•ด๋‹น ์„น์…˜์„ ์‹œ์ž‘ํ•˜๋Š” ์ผ๋ฐ˜ ์ฐธ๊ณ  ์‚ฌํ•ญ)

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

์ข‹์•„์š”, ์—ฌ๊ธฐ์˜ ๋งŒ์žฅ์ผ์น˜/์กฐ์šฉํ•จ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ €๋Š” (์ง€๋‚œ์ฃผ https://github.com/golang/go/issues/18130#issuecomment-268614964์—์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ) ์ด ์ œ์•ˆ์„ ์Šน์ธ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  dev.typealias ๋ถ„๊ธฐ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

ํ›Œ๋ฅญํ•œ ์š”์•ฝ์—๋Š” "์œ ํ˜• ๋ณ„์นญ์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?" ์„น์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ์ด ์ˆ˜๋ฝ๋œ ๊ฒƒ์œผ๋กœ ์„ ์–ธ๋œ ํ›„ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ณ„ํš์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

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

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

@ulikunitz ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค( ์„ค๊ณ„ ๋ฌธ์„œ ์˜ ๋ชจ๋“  ์ธ์šฉ๋ฌธ์€ '์œ ํ˜• T1 = T2'๋ฅผ ๊ฐ€์ •ํ•จ).

  1. godoc์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋””์ž์ธ ๋ฌธ์„œ๋Š” godoc์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ง€์›์ด ํ•„์š”ํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ณ„์นญ์œผ๋กœ ๋ช…๋ช…๋œ ํ˜•์‹์— ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ. ๋””์ž์ธ ๋ฌธ์„œ: "T1์€ T2๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž์ฒด ๋ฉ”์„œ๋“œ ์„ ์–ธ ์ง‘ํ•ฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  T1์˜ ๋ฉ”์„œ๋“œ ์ง‘ํ•ฉ์€ T2์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ์ดˆ๊ธฐ ์‹œ๋„์—์„œ๋Š” ๋ฉ”์„œ๋“œ ์„ ์–ธ์— ๋Œ€ํ•œ ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์„ ์–ธ์—์„œ T2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๊ณต๋œ ์ˆ˜์‹ ๊ธฐ ์œ ํ˜•์œผ๋กœ T1์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค."
  3. ๋ณ„์นญ์— ๋Œ€ํ•œ ๋ณ„์นญ์ด ํ—ˆ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ๋ณ„์นญ ์ฃผ๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ? ์‚ฌ์ดํด์ด ์—†์Šต๋‹ˆ๋‹ค. ์„ค๊ณ„ ๋ฌธ์„œ: "์œ ํ˜• ๋ณ„์นญ ์„ ์–ธ์—์„œ ์œ ํ˜• ์„ ์–ธ๊ณผ ๋‹ฌ๋ฆฌ T2๋Š” T1์„ ์ง๊ฐ„์ ‘์ ์œผ๋กœ ์ฐธ์กฐํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค."
  4. ๋ณ„์นญ์ด ๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ ์‹๋ณ„์ž๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ. ๋””์ž์ธ ๋ฌธ์„œ: "T2์˜ ํ˜•์‹์—๋Š” ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜จ ์œ ํ˜•์„ ํฌํ•จํ•˜๋˜ ์ด์— ๊ตญํ•œ๋˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์œ ํ˜•์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."
  5. ๋ณ„์นญ์„ ํฌํ•จํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ(ํฌํ•จ๋œ โ€‹โ€‹ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ๋ฒ•)? ์ด๋ฆ„์€ ๋ณ„์นญ(ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ด๋ฆ„)์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋””์ž์ธ ๋ฌธ์„œ: https://golang.org/design/18130-type-alias#effect -on-embedding.
  6. ๋นŒ๋“œ๋œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ณ„์นญ์„ ๊ธฐํ˜ธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ์š”. ๋””์ž์ธ ๋ฌธ์„œ: "์œ ํ˜• ๋ณ„์นญ์€ ๋Ÿฐํƒ€์ž„์— ๋Œ€๋ถ€๋ถ„ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค." (๋‹ต์€ ์ด๊ฒƒ์—์„œ ์ด์–ด์ง€์ง€๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.)
  7. Ldflags ๋ฌธ์ž์—ด ์ฃผ์ž…: ๋ณ„์นญ์„ ์ฐธ์กฐํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? var ๋ณ„์นญ์ด ์—†์œผ๋ฏ€๋กœ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

@rsc ์„ค๋ช…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

package a

import "b"

type T1 = b.T2

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ T1์€ b.T2์™€ ๋ณธ์งˆ์ ์œผ๋กœ ๋™์ผํ•˜๋ฏ€๋กœ ๋กœ์ปฌ์ด ์•„๋‹Œ ์œ ํ˜•์ด๋ฉฐ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹๋ณ„์ž T1์€ ํŒจํ‚ค์ง€ a์—์„œ ๋‹ค์‹œ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋งž๋Š” ํ•ด์„์ธ๊ฐ€์š”?

@ulikunitz ๋งž์Šต๋‹ˆ๋‹ค

T1์€ b.T2์™€ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์œ ํ˜•์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋‹ค๋ฅธ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๋ฌด์–ธ๊ฐ€๋ฅผ ๋‚ด๋ณด๋‚ด๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์ด๋ฆ„์—๋งŒ ๊ธฐ๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค(ํ‘œ์‹œํ•˜๋Š” ์œ ํ˜•๊ณผ ๊ด€๋ จ ์—†์Œ).

@griesemer ์˜ ์‘๋‹ต์„ ๋ช…์‹œ์ ์œผ๋กœ ๋งŒ๋“ค๋ ค๋ฉด ์˜ˆ, ํŒจํ‚ค์ง€ a์—์„œ T1์„ ๋‚ด

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#18893์—์„œ ๋ฆฌ๋””๋ ‰์…˜๋จ

package main

import (
        "fmt"
        "q"
)

func main() {
        var a q.A
        var b q.B // i'm a named unnamed type !!!

        fmt.Printf("%T\t%T\n", a, b)
}

๋ฌด์—‡์„ ๋ณผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๊นŒ?

deadwood(~/src) % go run main.go
q.A     q.B

๋Œ€์‹  ๋ฌด์—‡์„ ๋ณด์•˜์Šต๋‹ˆ๊นŒ?

deadwood(~/src) % go run main.go
q.A     []int

๋…ผ์˜

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

์˜ค, ๋ณ„์นญ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋„ ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์œ ํ˜•์ผ ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

type Any = interface{}

์ด๋ฆ„ ์—†๋Š” ์œ ํ˜•์˜ ๋ณ„์นญ์„ ํ—ˆ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

@davecheney

์ด๋ฆ„ ์—†๋Š” ์œ ํ˜•์—์„œ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ์ด๋™ํ•  ๋•Œ "์ฝ”๋“œ ๋ณต๊ตฌ" ์ด์•ผ๊ธฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

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

(๋ฉ”์†Œ๋“œ ์ด๋ฆ„์„ ๋‘ ๋ฒˆ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ค๋Š˜ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์ด์ค‘ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๋Š” ๊ธฐ๊ปํ•ด์•ผ ์ง€๋ฃจํ•ฉ๋‹ˆ๋‹ค.)

๊ทธ๋ฆฌ๊ณ  ๋” ๋‚˜์œ ๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€๋…์„ฑ ์•ˆํ‹ฐ ํŒจํ„ด์„ ๊ณตํ‘œํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
type Any = interface{}

์‚ฌ๋žŒ๋“ค์€ ์˜ค๋Š˜ ์ด๋ฏธ type Any interface{} ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ณ„์นญ์ด ์ถ”๊ฐ€๋กœ ๋ฐœ์ƒํ•˜๋Š” ํ”ผํ•ด๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์˜ค๋Š˜๋‚  ์‚ฌ๋žŒ๋“ค์€ ์ด๋ฏธ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์„{} ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ณ„์นญ์ด ์ถ”๊ฐ€๋กœ ๋ฐœ์ƒํ•˜๋Š” ํ”ผํ•ด๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ๊ทธ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•ˆํ‹ฐ ํŒจํ„ด์ด๋ผ๊ณ  ๋ถˆ๋ €์Šต๋‹ˆ๋‹ค. type Any interface{} , ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ์ด ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ๋” ์งง๊ฒŒ ์ž…๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— Go ์ฝ”๋“œ๋ฅผ ์ฝ์€ ๊ฒฝํ—˜์ด ์žˆ๊ณ  interface{} ๋ฅผ ๊ฑฐ์šธ์— ๋น„์นœ ์ž์‹ ์˜ ์–ผ๊ตด์ฒ˜๋Ÿผ ๋ณธ๋Šฅ์ ์œผ๋กœ ์ธ์‹ํ•˜๋Š” ๋…์ž _๋ชจ๋‘_๋Š” Any ์˜ ๋ชจ๋“  ๋ณ€ํ˜•์„ ๋ฐฐ์šฐ๊ณ  ๋‹ค์‹œ ๋ฐฐ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. , Object , T , ํŒจํ‚ค์ง€๋ณ„๋กœ type Any interface{} , type Any map[interface{}]interface{} , type Any struct{} ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ Go ๊ด€์šฉ๊ตฌ์— ๋Œ€ํ•œ ํŒจํ‚ค์ง€ ํŠน์ • ์ด๋ฆ„์ด ๊ฐ€๋…์„ฑ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์‹ญ๋‹ˆ๊นŒ?

์ผ๋ฐ˜์ ์ธ Go ๊ด€์šฉ๊ตฌ์— ๋Œ€ํ•œ ํŒจํ‚ค์ง€ ํŠน์ • ์ด๋ฆ„์ด ๊ฐ€๋…์„ฑ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์‹ญ๋‹ˆ๊นŒ?

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

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

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์œ ํ˜• ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ํ•ด๋‹น ๋ฐ˜ํŒจํ„ด์„ _์ ์ง„์ ์œผ๋กœ ์ œ๊ฑฐ_ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๋ คํ•˜๋‹ค:

package antipattern

type Any interface{}  // not an alias

type Widget interface{
  Frozzle(Any) error
}

func Bozzle(w Widget) error {
  โ€ฆ
}

์˜ค๋Š˜๋‚  antipattern.Bozzle ์‚ฌ์šฉ์ž๋Š” Widget ๊ตฌํ˜„์—์„œ antipattern.Any ์‚ฌ์šฉ์— ๊ฐ‡ํžˆ๊ฒŒ ๋˜๋ฉฐ ์ ์ง„์ ์ธ ์ˆ˜๋ฆฌ๋กœ antipattern.Any ๋ฅผ ์ œ๊ฑฐํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ ํ˜• ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋ฉด antipattern ํŒจํ‚ค์ง€ ์†Œ์œ ์ž๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// Any is deprecated; please use interface{} directly.
type Any = interface{}

์ด์ œ ํ˜ธ์ถœ์ž๋Š” Any ์—์„œ interface{} ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์—ฌ antipattern ์œ ์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ๊ฒฐ๊ตญ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์š”์ ์€ ๋ช…๋ช…๋˜์ง€ ์•Š์€ ์œ ํ˜•์˜ ๋ณ„์นญ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ •๋‹น์„ฑ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์˜ต์…˜์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด
์—ฐ์Šต.

๋ฐ˜๋Œ€๋กœ ๋ช…๋ช…๋˜์ง€ ์•Š์€ ์œ ํ˜•์˜ ์•จ๋ฆฌ์–ด์‹ฑ์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋‘˜์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
์ด ์•ˆํ‹ฐ ํŒจํ„ด์˜ ํ˜•ํƒœ.

2017๋…„ 2์›” 2์ผ ๋ชฉ์š”์ผ 16:34 Bryan C. Mills [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ํ”ํ•œ Go ๊ด€์šฉ๊ตฌ์— ๋Œ€ํ•œ ํŒจํ‚ค์ง€ ํŠน์ • ์ด๋ฆ„์ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ€๋…์„ฑ์— ๋Œ€ํ•œ ์ˆœ ๋„ค๊ฑฐํ‹ฐ๋ธŒ?

๋™์˜ํ•˜์ง€๋งŒ ๋ฌธ์ œ์˜ ์˜ˆ ์ดํ›„(์ง€๊ธˆ๊นŒ์ง€ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ
๋‚ด๊ฐ€ ๋งŒ๋‚œ ๋ฐ˜ํŒจํ„ด์˜ ๋ฐœ์ƒ) ์—†์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณ„์นญ, ๋‚˜๋Š” ๊ทธ ์˜ˆ๊ฐ€
์œ ํ˜• ๋ณ„์นญ.

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

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

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

์ด์— ๋ฐ˜ํ•ด API๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ํŠน์ • ์œ ํ˜•์œผ๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์œ ํ˜• ๋ฆฌํ„ฐ๋Ÿด๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ณต๊ฐœ API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: https://golang.org/pkg/go/types/#Info ์ฐธ์กฐ). ). ๋ช…์‹œ์  ํ˜•์‹ ๋ฆฌํ„ฐ๋Ÿด์ด ์žˆ์œผ๋ฉด ์œ ์šฉํ•œ ๋ฌธ์„œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์— ๊ฐ™์€ ์œ ํ˜•์˜ ๋ฆฌํ„ฐ๋Ÿด์„ ๋ชจ๋“  ๊ณณ์—์„œ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์„ฑ๊ฐ€์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ฐ€๋…์„ฑ์— ๋ฐฉํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. map[int]struct{} IntSet ์ •์˜์— ์–ฝ๋งค์ด์ง€ ์•Š๊ณ  IntSet ์— ๋Œ€ํ•ด ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ œ ์ƒ๊ฐ์— ํ”Œ๋Ÿฌ์Šค์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ type IntSet = map[int]struct{} ๊ฐ€ ์ •ํ™•ํžˆ ๋งž์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋†“์นœ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ https://github.com/golang/go/issues/18130#issuecomment -268411811์„ ๋‹ค์‹œ ์ฐธ์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. = ์‚ฌ์šฉํ•˜๋Š” ๋ฌด์ œํ•œ ์œ ํ˜• ์„ ์–ธ์€ ์‹ค์ œ๋กœ "๊ธฐ๋ณธ" ์œ ํ˜• ์„ ์–ธ์ด๋ฉฐ, ๋งˆ์นจ๋‚ด Go์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ type intSet = map[int]struct{} (๋‚ด๋ณด๋‚ด์ง€ ์•Š์Œ)๊ฐ€ ์ด๋ฆ„ ์—†๋Š” ์œ ํ˜• ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋Šฅ์„ ์ œํ•œํ•˜๊ธฐ๋ณด๋‹ค๋Š” CodeReviewComments ๋ฐ ๊ถŒ์žฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์˜ ๋„๋ฉ”์ธ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

์ฆ‰, %T ๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๋””๋ฒ„๊น…ํ•˜๊ฑฐ๋‚˜ ํƒ์ƒ‰ํ•  ๋•Œ ์œ ํ˜•์„ ํ™•์ธํ•˜๋Š” ํŽธ๋ฆฌํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ณ„์นญ์„ ํฌํ•จํ•˜๋Š” ์œ ์‚ฌํ•œ ํ˜•์‹์˜ ๋™์‚ฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. @davecheney ์˜ ์˜ˆ์—์„œ q.B = []int .

@nathany ๊ทธ ๋™์‚ฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๊นŒ? ๋ณ„์นญ ์ •๋ณด๋Š” ๋Ÿฐํƒ€์ž„์— ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ( reflect ํŒจํ‚ค์ง€์— ๊ด€ํ•œ ํ•œ ๋ณ„์นญ์€ ๋ณ„์นญ์ด ์ง€์ •๋œ ๊ฒƒ๊ณผ _๋™์ผํ•œ ์œ ํ˜•_์ž…๋‹ˆ๋‹ค.)

@bcmills ๊ทธ๋Ÿด์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค ์‹ถ์—ˆ๋Š”๋ฐ ... ๐Ÿ˜ž

์ •์  ๋ถ„์„ ๋„๊ตฌ์™€ ํŽธ์ง‘๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์—ฌ์ „ํžˆ ๊ทธ๋ฆผ์— ์žˆ์–ด ๋ณ„์นญ์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

2017๋…„ 2์›” 2์ผ ์˜คํ›„ 5์‹œ 1๋ถ„์— "Nathan Youngman" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ฆ‰, %T๋Š” ๋””๋ฒ„๊น…ํ•˜๊ฑฐ๋‚˜ ํƒ์ƒ‰ํ•  ๋•Œ ์œ ํ˜•์„ ํ™•์ธํ•˜๋Š” ํŽธ๋ฆฌํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
์œ ํ˜• ์‹œ์Šคํ…œ. ๋น„์Šทํ•œ ํ˜•์‹์˜ ๋™์‚ฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
๋ณ„์นญ์„ ํฌํ•จํ•ฉ๋‹ˆ๊นŒ? @davecheney์˜ qB = []int
https://github.com/davecheney ์˜ ์˜ˆ.

๋” ๋‚˜์€ ํ•ด๊ฒฐ์ฑ…์€ ์ด์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์œ„ํ•ด ์ „๋ฌธ๊ฐ€์—๊ฒŒ ์ฟผ๋ฆฌ ๋ชจ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์งˆ๋ฌธ:

์ด๊ฒƒ์€ ์ „์ฒด GOPATH(๋˜๋Š” ์ฃผ์–ด์ง„ ํŒจํ‚ค์ง€)์—์„œ ์„ ์–ธ๋œ ๋ณ„์นญ์ž…๋‹ˆ๋‹ค.
๋ช…๋ น์ค„์— ์ด ์œ ํ˜•์ด ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

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

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

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

@minux @bcmills๊ฐ€ ์ง€์ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณ„์นญ ์ •๋ณด๋Š” ๋Ÿฐํƒ€์ž„์— ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์™„์ „ํžˆ ๋””์ž์ธ์˜ ๊ธฐ๋ณธ). "๋ณ„์นญ์„ ํฌํ•จํ•˜๋Š” %T"๋ฅผ ๊ตฌํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

2017๋…„ 2์›” 2์ผ ์˜คํ›„ 8์‹œ 33๋ถ„์— "Russ Cox" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@minux https://github.com/minux , @bcmills์ฒ˜๋Ÿผ
https://github.com/bcmills ์ง€์ , ๋ณ„์นญ ์ •๋ณด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
๋Ÿฐํƒ€์ž„ ์‹œ(์™„์ „ํžˆ ๋””์ž์ธ์˜ ๊ธฐ๋ณธ). ๋ฐฉ๋ฒ•์ด ์—†๋‹ค
"๋ณ„์นญ์„ ํฌํ•จํ•˜๋Š” %T"๋ฅผ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.

Go guru(https://golang.org/x/tools/cmd/guru) ์ฟผ๋ฆฌ ๋ชจ๋“œ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.
์ •์  ์ฝ”๋“œ ๋ถ„์„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์—ญ ๋ณ„์นญ ๋งคํ•‘์šฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ
๋Ÿฐํƒ€์ž„์— ๋ณ„์นญ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์šฉ์–ด ๋ฐ ๊ต์œก๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ธŒ๋žœ๋“œ ์œ ํ˜• ๋ฐฐ๊ฒฝ @griesemer ๊ฐ€ ๋งค์šฐ ์œ ์ตํ•˜๊ฒŒ ๊ฒŒ์‹œ ๋˜์—ˆ์Œ์„ ์•Œ์•˜ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์œ ํ˜•๊ณผ ์œ ํ˜• ๋ณ€ํ™˜์„ ์„ค๋ช…ํ•  ๋•Œ, baby gophers๋Š” ์ฒ˜์Œ์— ๋‚ด๊ฐ€ ๋‹ค๋ฅธ ์–ธ์–ด์— ์ต์ˆ™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ํ˜• ๋ณ„์นญ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

type intSet map[int]struct{} map[int]struct{} ๊ฐ€ _underlying_ ์œ ํ˜•์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. type intSet = map[int]struct{} ์˜ ์–‘์ชฝ์„ ๋ฌด์—‡์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๊นŒ? ๋ณ„์นญ ๋ฐ ๋ณ„์นญ ์œ ํ˜•?

%T ๊ด€ํ•ด์„œ๋Š” byte ๋ฐ rune ๊ฒฐ๊ณผ๊ฐ€ uint8 ๋ฐ int32 ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ด๋ฏธ ์„ค๋ช…ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ด๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ.

๋ฌด์—‡์ด๋“  ์œ ํ˜• ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋ฉด byte ๋ฐ rune ๋” ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IMO์—์„œ ๋„์ „ ๊ณผ์ œ๋Š” ๋ช…๋ช…๋œ ์œ ํ˜•๊ณผ ์œ ํ˜• ๋ณ„์นญ์„ ์‚ฌ์šฉํ•  ๋•Œ๋ฅผ ์•Œ๊ณ  ์ด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

์ด ๋น„์œ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด์˜ ๋‹ค์–‘ํ•œ ๊ทœ์น™๋„ ๋‹ค์‹œ ๊ณต์‹ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์šฐ๋ฆฌ๋Š” ์ƒ์ˆ˜ ์ด๋ฆ„์„ ๋ณ„์นญ์ด๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š๊ณ  ์ƒ์ˆ˜ ๊ฐ’์„ ๋ณ„์นญ ์ƒ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์ข‹์€์  ๐Ÿ‘

์œ ์ƒ‰๊ณผ ๋ฌด์ฑ„์ƒ‰์˜ ๋น„์œ ๊ฐ€ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐœ๋…์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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

type intSet map[int]struct{} // a new type with an underlying type map[int]struct{}

type myIntSet intSet // a new type with an underlying type map[int]struct{}

type otherIntSet = intSet // just another name (alias) for intSet, add methods to intSet (only in the same package)

type literalIntSet = map[int]struct{} // just another name for map[int]struct{}, no adding methods

๊ทธ๋ž˜๋„ ๊ทน๋ณตํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Go 1.9์— ํฌํ•จ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ Go ์ฑ…์˜ ๋‘ ๋ฒˆ์งธ ํŒ์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜‰

๋‚˜๋Š” ์ •๊ธฐ์ ์œผ๋กœ Go spec์—์„œ ํ—ˆ์šฉ๋˜๋Š” ์šฉ์–ด๋ฅผ ์ฐธ์กฐํ•˜๋ฏ€๋กœ ๊ฒฐ๊ตญ ์–ด๋–ค ์šฉ์–ด๊ฐ€ ์„ ํƒ๋˜๋Š”์ง€ ๋งค์šฐ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋ชจ๋“  ์œ ํ˜•์ด ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์œ ํ˜•์— ๋Œ€ํ•œ ์ƒˆ ์šฉ์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด:

  • "distinguished" ๋˜๋Š” "distinct"(์—์„œ์™€ ๊ฐ™์ด, ๋‹ค๋ฅธ ์œ ํ˜•๊ณผ ๊ตฌ๋ณ„๋  ์ˆ˜ ์žˆ์Œ)
  • "unique"(in, ๊ทธ๊ฒƒ์€ ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜•๊ณผ ๋‹ค๋ฅธ ์œ ํ˜•์ž…๋‹ˆ๋‹ค)
  • "๊ตฌ์ฒด์ ์ธ"(๋Ÿฐํƒ€์ž„์— ์กด์žฌํ•˜๋Š” ์—”ํ„ฐํ‹ฐ์™€ ๊ฐ™์ด)
  • "์‹๋ณ„ ๊ฐ€๋Šฅํ•œ"(์˜ˆ: ์œ ํ˜•์— ID๊ฐ€ ์žˆ์Œ)

@bcmills ์šฐ๋ฆฌ๋Š” ๊ณ ์œ ํ•œ, ๊ณ ์œ ํ•œ, ๊ณ ์œ ํ•œ, ๋ธŒ๋žœ๋“œ๊ฐ€ ์žˆ๋Š”, ์ƒ‰์ƒ์ด ์ง€์ •๋œ, ์ •์˜๋œ, ๋ณ„์นญ์ด ์•„๋‹Œ ๋“ฑ์˜ ์œ ํ˜•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ์™”์Šต๋‹ˆ๋‹ค. "์ฝ˜ํฌ๋ฆฌํŠธ"๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋„ ์ƒ‰์ƒ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ถ”์ƒ ์œ ํ˜•์˜ ํ™”์‹ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. "struct{int}"๋Š” ๋ช…์‹œ์ ์œผ๋กœ(๋ณ„์นญ์ด ์•„๋‹Œ) ๋ช…๋ช…๋œ ํ˜•์‹๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— "์‹๋ณ„ ๊ฐ€๋Šฅ"๋„ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฐ˜๋Œ€ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค:

  • "์ƒ‰์ƒ"(๋น„ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ปจํ…์ŠคํŠธ์—์„œ "์ƒ‰์ƒ ์œ ํ˜•"์ด๋ผ๋Š” ๋ฌธ๊ตฌ๋Š” ์ธ์ข…์  ํŽธ๊ฒฌ์„ ๊ฐ•ํ•˜๊ฒŒ ํ•จ์ถ•ํ•จ)
  • "๋น„๋ณ„์นญ"(๋ณ„์นญ์˜ ๋Œ€์ƒ์ด ์ด์ „์— "๋ช…๋ช…๋œ ์œ ํ˜•"์ด๋ผ๊ณ  ํ–ˆ๋˜ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค)
  • "์ •์˜๋จ"(๋ณ„์นญ๋„ ์ •์˜๋จ, ๋ณ„์นญ์œผ๋กœ ์ •์˜๋จ)

"branded"๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ๊ทธ๊ฒƒ์€ "์†Œ์™€ ๊ฐ™์€ ์œ ํ˜•"์„ ์˜๋ฏธํ•˜์ง€๋งŒ ๋ณธ์งˆ์ ์œผ๋กœ ๋‚˜์˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋…ํŠนํ•˜๊ณ  ๋…ํŠนํ•œ ๊ฒƒ์€ ์ง€๊ธˆ๊นŒ์ง€ ๋ˆˆ์— ๋„๋Š” ์˜ต์…˜์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

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

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

์ด๊ฒƒ์€ ์ž์ „๊ฑฐ ๋ณด๊ด€์†Œ ๋…ผ์Ÿ์˜ ์ •์˜์ž…๋‹ˆ๋‹ค. Robert๋Š” https://go-review.googlesource.com/#/c/36213/์— ๋ณด๋ฅ˜ ์ค‘์ธ CL์ด ์žˆ์œผ๋ฉฐ ์™„๋ฒฝํ•˜๊ฒŒ ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

go fix ๋‹ค์‹œ ์ œ๊ธฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณ„์นญ์„ '์‚ญ์ œ'ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด. ๋‹ค๋ฅธ ์ง์—…์— ์œ ์šฉํ•˜๊ณ  ์ ํ•ฉํ•œ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฑด ๋˜ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

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

@tux21b๊ฐ€ ์ œ์•ˆํ•œ ์•„์ด๋””์–ด์ฒ˜๋Ÿผ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋„๊ตฌ๋ฅผ ์ฝ”๋“œ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

$ cat "$GOROOT"/RENAME
# This file could be used for `go fix`
[package]
x/net/context=context
[type]
io.ByteBuffer=bytes.Buffer

$ go fix -rename "$GOROOT"/RENAME [packages]
# -- or --
# use a standard libraries rename table as default
$ go fix -rename [packages]
# -- or --
# include this fix as default
$ go fix [packages]

@rsc ๊ฐ€ ์—ฌ๊ธฐ์„œ ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ž‘์—… ํ๋ฆ„์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค . ์˜ค๋ž˜๋œ ํŒจํ‚ค์ง€(์˜ˆ: ์ข…์†์„ฑ)๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํŒจํ‚ค์ง€ ์ด๋ฆ„/๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: x/net/context ) ์ฒ˜์Œ์—๋Š” ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. , ๋ฌธ์„œ๊ฐ€ ํ…์ŠคํŠธ ํ˜•์‹์˜ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์ƒˆ ๋ฒ„์ „์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์ง€๋งŒ ํ•˜๋“œ ์ฝ”๋”ฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒˆ ๋ฒ„์ „์˜ Go์™€ ๋™์ผํ•˜๊ฒŒ ์›ํ•  ๋•Œ๋งˆ๋‹ค ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค.

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

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

ํŒ์— ์ด ์ œ์•ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ œ ์ด ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package safe

import "unsafe"

type Pointer = unsafe.Pointer

ํ”„๋กœ๊ทธ๋žจ์—์„œ unsafe ์ง์ ‘ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  unsafe.Pointer ๊ฐ’์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package main

import "safe"

func main() {
    x := []int{4, 9}
    y := *(*int)(safe.Pointer(uintptr(safe.Pointer(&x[0])) + 8))
    println(y)
}

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

๋ณ„์นญ ์„ ์–ธ ๋ฌธ์ œ์—์„œ ์ด์— ๋Œ€ํ•œ ํ•ฉ๋ฆฌ์  ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. _"unsafe.Pointer์— ๋Œ€ํ•œ ๋ณ„์นญ ์ง€์ •์„ ํ—ˆ์šฉํ•˜๋Š” ์ด์œ ๋Š” unsafe.Pointer๊ฐ€ ๊ธฐ๋ณธ ์œ ํ˜•์œผ๋กœ ํฌํ•จ๋œ ์œ ํ˜•์„ ์ด๋ฏธ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค."_ https://github.com/ golang/go/issues/16339#issuecomment -232435361

๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ด์ง€๋งŒ unsafe.Pointer ์˜ ๋ณ„์นญ์„ ํ—ˆ์šฉํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ฒƒ์ด ๋„์ž…๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์€ ์ด์ œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ ๋„ unsafe.Pointer ๊ฐ’์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ ์ „์— ์œ„์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด safe.Pointer ์บ์ŠคํŠธ๋ฅผ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฐ€์ ธ์˜ค๊ธฐ ํŒจํ‚ค์ง€๋กœ ์˜ฎ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๊ฐ์‚ฌํ•˜๋Š” ๊ฒƒ์„ ์กฐ๊ธˆ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@crawshaw , ๋‹น์‹ ์€ ์ „์— ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๊นŒ?

package safe

import (
  "reflect"
  "unsafe"
)

func Pointer(p interface {}) unsafe.Pointer {
  switch v := reflect.ValueOf(p); v.Kind() {
  case reflect.Uintptr:
    return unsafe.Pointer(uintptr(v.Uint()))
  default:
    return unsafe.Pointer(v.Pointer())
  }
}

main ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ์ •ํ™•ํžˆ ๋™์ผํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

: (๊ทธ๊ฒƒ์€ ๋ฐ˜๋“œ์‹œ ์˜ฌ๋ฐ”๋ฅธ ํ”„๋กœ๊ทธ๋žจ์ด๋˜์ง€ ์•Š์„ ๊ฒƒ uintptr Di์˜ Pointer ๊ฐ€ ์ถฉ์กฑํ•˜์ง€ ์•Š๋„๋ก, ๋ณ€ํ™˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํฌํ•จ unsafe ํ•ด๋‹น ํŒจํ‚ค์ง€ ์ œ์•ฝ ์กฐ๊ฑด์„ " ๋ชจ๋‘ ๋ณ€ํ™˜์ด "๊ทธ๋“ค ์‚ฌ์ด์—๋งŒ ๊ฐœ์ž… ์‚ฐ์ˆ ๊ณผ ๊ฐ™์€ ํ‘œํ˜„์— ํ‘œ์‹œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ€์ ธ ์˜ค์ง€ ์•Š๊ณ  ๋™๋“ฑํ•œ ์œ ํšจํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์ถ• ํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ์˜์‹ฌ unsafe ์—์„œ main ๊ฒฐ์ •์— ์˜ํ•ด reflect.SliceHeader ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.)

์ˆจ๊ฒจ์ง„ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์œ ํ˜•์„ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์€ ๊ฐ์‚ฌ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ๊ทœ์น™์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ˆ, unsafe.Pointer๋ฅผ ์ง์ ‘ ๋ณ„์นญ์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๊ฐ์‚ฌํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง€๊ณ  ์•„๋ฌด๋„ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@crawshaw ๋‚ด ์˜๊ฒฌ์— ๋”ฐ๋ฅด๋ฉด ์ด๊ฒƒ์€ ์œ ํ˜• ์•จ๋ฆฌ์–ด์‹ฑ์ด ์žˆ๊ธฐ ์ „์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜€์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์ด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

package a

import "unsafe"

type P unsafe.Pointer
package main

import "./a"
import "fmt"

var x uint64 = 0xfedcba9876543210
var h = *(*uint32)(a.P(uintptr(a.P(&x)) + 4))

func main() {
    fmt.Printf("%x\n", h)
}

์ฆ‰, ํŒจํ‚ค์ง€ ๋ฉ”์ธ์—์„œ unsafe ํŒจํ‚ค์ง€๊ฐ€ ์—†๊ณ  a.P ๊ฐ€ ๋ณ„์นญ์ด ์•„๋‹ˆ๋”๋ผ๋„ a.P ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์‚ฐ์ˆ ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•ญ์ƒ ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์–ธ๊ธ‰ํ•˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์‹ค์ˆ˜. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. (๋‚˜๋Š” unsafe.Pointer์— ์ ์šฉ๋˜๋Š” ํŠน์ˆ˜ ๊ทœ์น™์ด ์—ฌ๊ธฐ์—์„œ ์ •์˜๋œ ์ƒˆ ์œ ํ˜•์— ์ „ํŒŒ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.)

์‚ฌ์–‘์€ ์‹ค์ œ๋กœ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋™ / ์œ ํ˜•์˜ ๊ตฌํ˜„์„ ๋ณด๋ฉด, ๋‚ด ์ดˆ๊ธฐ ๊ตฌํ˜„์ด ํ•„์š”ํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ๋‹ค unsafe.Pointer ์˜ ๊ธฐ๋ณธ ์œ ํ˜•์ดํ•˜๋Š” ์ผ์ด ์ •ํ™•ํžˆ๋ฟ ์•„๋‹ˆ๋ผ ์–ด๋–ค ์ข…๋ฅ˜์˜ unsafe.Pointer . go/types๋ฅผ gc์™€ ํ˜ธํ™˜๋˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ #6326์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

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

https://github.com/golang/go/issues/19306์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค

์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๊ธฐ์— ์•„๋ฌด๊ฒƒ๋„ ๋‚จ์•„ ์žˆ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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