์๋ ์ ๋ชฉ: ์ ์: ํจํค์ง ๊ฐ์ ์ ํ์ ์ด๋ํ๋ ๋์ ์ ์ง์ ์ธ ์ฝ๋ ๋ณต๊ตฌ ์ง์
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 ์ฃผ๊ธฐ ์์ ์ ๊ตฌํ ์์ .
์ ํ ๋ณ์นญ์ด 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 ๋ณ์นญ์ ๊ณํํ๊ธฐ์ ์ถฉ๋ถํ ์ค์ํ์ง ์์ ์ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ์ฌ๋ฐ๋ฅธ ์ ํ์ ์ ํ ๋ณ์นญ์๋ง ์ด์ ์ ๋ง์ถ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ ๋๊ธ ๋๋ถ๋ถ์ด ๋์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋ชจ๋ ์ฌ๋์ ๋์ดํ์ง ์์ ๊ฒ์ ๋๋ค.
์๋ก์ด ๊ตฌ๋ฌธ์ ๋ํ ๊ฐ์ฅ ๊ฐ๋ ฅํ ์ฃผ์ฅ์ ํ์ฌ ๋๋ ๋ฏธ๋์ 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์ ํฌํจํ๊ธฐ์ ์ถฉ๋ถํ ์ค์ํ๋ค๊ณ ๊ฐ์ฃผ๋๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ณ์นญ๋ ์์ ์ ์์ต๋๋ค.
๋ณ์นญ(๋๋ ๋ณ์นญ๋ง ์ ๋ ฅ)์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ํจํค์ง๋ฅผ ํ์ฅํ๋ ๋๋กญ์ธ ๊ต์ฒด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด https://go-review.googlesource.com/#/c/32145/ , ํนํ ์ปค๋ฐ ๋ฉ์์ง์ ์ค๋ช ์ ์ฐธ์กฐ
๋ณ์นญ(๋๋ ๊ทธ๋ฅ ์ ํ ๋ณ์นญ)์ ์ฌ์ฉํ๋ฉด ์์ API ํ๋ฉด์ผ๋ก ํจํค์ง๋ฅผ ๊ตฌ์กฐํํ ์ ์์ง๋ง ๋ ๋์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ํด ํจํค์ง ์ปฌ๋ ์ ์ผ๋ก ๋๊ท๋ชจ ๊ตฌํ์ ๊ตฌ์ฑํ ์ ์์ง๋ง ์ฌ์ ํ ํด๋ผ์ด์ธํธ์์ ๊ฐ์ ธ์ค๊ณ ์ฌ์ฉํ ํจํค์ง๋ ํ๋๋ง ์ ๊ณตํฉ๋๋ค. https://github.com/golang/go/issues/16339#issuecomment -232813695์ ์ค๋ช ๋ ๋ค์ ์ถ์์ ์ธ ์๊ฐ ์์ต๋๋ค.
ํ๋กํ ์ฝ ๋ฒํผ์๋ ์๋ฏธ ์ฒด๊ณ๊ฐ ์์ฑ๋ C++ ์ฝ๋์์ ๊ตฌํํ๊ธฐ ์ฝ์ง๋ง ์์ฑ๋ Go ์ฝ๋์์ ๊ตฌํํ๊ธฐ ๋ถ๊ฐ๋ฅํ "๊ณต๊ฐ ๊ฐ์ ธ์ค๊ธฐ" ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ด๊ฒ์ C++์ Go ํด๋ผ์ด์ธํธ ๊ฐ์ ๊ณต์ ๋๋ ํ๋กํ ์ฝ ๋ฒํผ ์ ์์ ์์ฑ์์๊ฒ ์ข์ ๊ฐ์ ์ค๋๋ค. ์ ํ ๋ณ์นญ์ Go์์ ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ฌ์ค import public ์
๊ธด ์ด๋ฆ์ ์ค์ ๋๋ค. ๋ก์ปฌ(๋ด๋ณด๋ด์ง ์์๊ฑฐ๋ ํจํค์ง ๋ฒ์๊ฐ ์๋) ๋ณ์นญ์ ์์ ํ ์๋ก์ด ์ ํ์ ์ค๋ฒํค๋๋ฅผ ๋์ ํ์ง ์๊ณ ๊ธด ์ ํ ์ด๋ฆ์ ์ถ์ฝํ๋ ๋ฐ ํธ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ชจ๋ ์ฉ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ต์ข ์ฝ๋์ ๋ช ํ์ฑ์ ์ด๊ฒ์ด ์ ์๋ ์ฉ๋์ธ์ง ์ฌ๋ถ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ฐธ๊ณ ์ฉ์ผ๋ก ๋์ดํฉ๋๋ค. ์ผ๋ถ๋ ๋์ค์ ๋ ผ์๋๊ณ ์๋ ๋ณ๋ ์น์ ์ ์์ฝ๋์ด ์์ง๋ง ์ด ์น์ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฑฐ๋ ๋ ผ์ํ๋ ค๊ณ ์๋ํ์ง ์์ต๋๋ค.
godoc์์ ์ฒ๋ฆฌํฉ๋๋ค. (https://github.com/golang/go/issues/18130#issuecomment-264323137 @nigeltao ๋ฐ https://github.com/golang/go/issues/18130#issuecomment-264326437 @jimmyfrasche)
๋ณ์นญ์ผ๋ก ๋ช ๋ช ๋ ํ์์ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์ต๋๊น? (https://github.com/golang/go/issues/18130#issuecomment-265077877 @ulikunitz ์์ฑ)
๋ณ์นญ์ ๋ํ ๋ณ์นญ์ด ํ์ฉ๋๋ ๊ฒฝ์ฐ ๋ณ์นญ ์ฃผ๊ธฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํฉ๋๊น? (https://github.com/golang/go/issues/18130#issuecomment-264494658 @thwd ์์ฑ)
๋ณ์นญ์ด ๋ด๋ณด๋ด์ง ์์ ์๋ณ์๋ฅผ ๋ด๋ณด๋ผ ์ ์์ด์ผ ํฉ๋๊น? (https://github.com/golang/go/issues/18130#issuecomment-264494658 @thwd ์์ฑ)
๋ณ์นญ์ ํฌํจํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น(ํฌํจ๋ โโํ๋์ ์ก์ธ์คํ๋ ๋ฐฉ๋ฒ)? (https://github.com/golang/go/issues/18130#issuecomment-264494658 by @thwd , ์ญ์ #17746)
๋น๋๋ ํ๋ก๊ทธ๋จ์์ ๋ณ์นญ์ ๊ธฐํธ๋ก ์ฌ์ฉํ ์ ์์ต๋๊น? (https://github.com/golang/go/issues/18130#issuecomment-264494658 @thwd ์์ฑ)
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 ์์ฑ
๊ทธ๊ฒ๋ค์ด ์๋ชป ์ฌ์ฉ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ธฐ ์ ๊น์ง๋ ์ฌ์ฉ์ ์์ ํ๋ ๊ฒ์ ์๊ธฐ์์กฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ๋์๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ ์ฉํ ์ ์์ต๋๋ค(์ ์ฐธ์กฐ).
๋์์ธ ๋ฌธ์์์ ์ธ๊ธํ๋ฏ์ด ์ํฉ์ ๋ ๋ช ํํ๊ฒ ํ๊ธฐ ์ํด ์ฉ์ด๋ฅผ ๋ณ๊ฒฝํ ์์ ์ ๋๋ค.
๋๋ ์ด๊ฒ์ด ์๊ฐ์ ์ผ๋ก ์ผ๋ง๋ ๊ท ์ผํ๊ฒ ๋ณด์ด๋์ง ์ข์ํฉ๋๋ค.
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
๋ด ์ด์ :
์์ ๋ชจ๋ ๊ฒ: ๊ฒฐ๊ณผ๋ ๋จ์ํ๊ณ ์ง์ค์ ์ด๋ฉฐ ๋ณด์์ ์ด๋ฉฐ ๋ฏธํ์ ์ด๋ฏ๋ก ๋ฐ๋์ ์ผ๋ถ์ธ ๊ฒ์ผ๋ก ์ฝ๊ฒ ์์ํ ์ ์์ต๋๋ค.
์๋ฃจ์ ์ด ์ ํ์ผ๋ก๋ง ์ ํ๋๋ ๊ฒฝ์ฐ ๊ตฌ๋ฌธ
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 ๋๋ ํ๋ ๋งํฌ์ ๊ฐ์ด ์๊ฐํ๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๋์ผํ ์ด๋ฆ์ ์ฒ ์๊ฐ ์ฌ๋ฌ ๊ฐ์ง). ๋ณํ์ ์ฌ์ฉํ๋ฉด ์ ํ์ ๊ตฌ๋ณํจ์ผ๋ก์จ ํผํ ์ ์์ต๋๋ค.
fmt.Println("abc")
๋ฅผ ํธ์ถํ๊ฑฐ๋ var e interface{} = "abc"
ํ๋ฉด "abc"
๊ฐ ์๋์ผ๋ก interface{}
๋ก ๋ณํ๋ฉ๋๋ค. type T struct { S }
์ ์ธํ๊ณ T์ ์น๊ฒฉ๋์ง ์์ ๋ฉ์๋๊ฐ ์๋ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๋ ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด ๋ด๋ถ์์ ์ฌ๊ท์ ์ผ๋ก ํฌํจํ์ฌ ํ์์ ๋ฐ๋ผ S์ T ๊ฐ์ ์๋์ผ๋ก ๋ณํํ๋๋ก ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ T๋ ์ ์ง์ ๋ฆฌํฉํ ๋ง ๋ชฉ์ ์ ์ํด S์ ์ฌ์ค์ ๋ณ์นญ(๋๋ ๊ทธ ๋ฐ๋)์ ์ญํ ์ ํ ์ ์์ต๋๋ค.
type T ~S
๊ฐ "S์ฒ๋ผ ๋ณด์ด๋" ์ ํ์ธ ์๋ก์ด ์ ํ T๋ฅผ ์ ์ธํ๋๋ก ํ์ญ์์ค. ๋ณด๋ค ์ ํํ๊ฒ๋ T๋ "์ ํ S๋ก ๋ฐ ์ ํ S์์ ๋ณํํ ์ ์๋ ๋ชจ๋ ์ ํ"์
๋๋ค. (ํญ์ ๊ทธ๋ ๋ฏ์ด ๊ตฌ๋ฌธ์ ๋์ค์ ๋
ผ์ํ ์ ์์ต๋๋ค.) ์ธํฐํ์ด์ค ์ ํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก T๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก T๋ก ๋ฌด์์ด๋ ํ๋ ค๋ฉด T๋ฅผ S(๋๋ S๋ก/์์ ๋ณํ ๊ฐ๋ฅํ ์ ํ)๋ก ๋ณํํด์ผ ํฉ๋๋ค. ์ธํฐํ์ด์ค ์ ํ๊ณผ ๋ฌ๋ฆฌ "๊ตฌ์ฒด์ ์ธ ์ ํ"์ด ์์ผ๋ฉฐ S์์ T๋ก, T์์ S๋ก์ ๋ณํ์๋ ํํ ๋ณ๊ฒฝ์ด ํฌํจ๋์ง ์์ต๋๋ค. ์ ์ง์ ๋ฆฌํฉํ ๋ง์ ๊ฒฝ์ฐ ์ด๋ฌํ "๋ชจ์" ์ ํ์ ์ฌ์ฉํ๋ฉด ์์ฑ์๊ฐ ์ด์ ์ ํ๊ณผ ์ ์ ํ์ ๋ชจ๋ ํ์ฉํ๋ API๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ("look like" ์ ํ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณ ๋๋ก ์ ํ๋๊ณ ๋จ์ํ๋ ๊ณต์ฉ์ฒด ์ ํ์
๋๋ค.)
๋ณด๋์ค ์ํผ ๋์ฐํ ์์ด๋์ด. (๋์๊ฒ ์ด๊ฒ์ด ๋์ฐํ๋ค๊ณ ๋งํ์ง ๋ง์ญ์์ค. ์๊ณ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ์๋ก์ด ์์ด๋์ด๋ฅผ ์ ๊ณตํ๋ ค๊ณ ํ ๋ฟ์
๋๋ค.) ์ ํ ํ๊ทธ(๊ตฌ์กฐ์ฒด ํ๊ทธ์ ๊ฐ์)๋ฅผ ๋์
ํ๊ณ ํน์ ์ ํ ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? 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
๋งคํ).//+rewrite ...
ํ๊ทธ๋ก ์ง์ ํ ์ ์์ต๋๋ค.pkg.MyFunc(a) => pkg.MyFunc(context.Contex(), a)
).๋ง์ง๋ง ๋จ๊ณ๋ ์ปดํ์ผ๋ฌ๋ฅผ ์ฝ๊ฐ ๋ณต์กํ๊ฒ ๋ง๋ค๊ฑฐ๋ ์๋๋ฅผ ๋ฆ์ถ ์ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์ ์ฒ๋ฆฌ๊ธฐ์ผ ๋ฟ์ด๋ฏ๋ก ์ฌ์์ฑ ๊ท์น์ ์์ ์ด์จ๋ ์๊ฒ ์ ์ง๋์ด์ผ ํฉ๋๋ค. ์, ์ค๋์ ๋ธ๋ ์ธ์คํ ๋ฐ์ ์ถฉ๋ถํฉ๋๋ค :)
ํจ์ ํธ์ถ ์ค๋ฒํค๋๋ฅผ ํผํ๊ธฐ ์ํด ๋ณ์นญ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฆฌํ๊ฐ ์๋ ํจ์๋ฅผ ์ธ๋ผ์ธํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํดํน์ฒ๋ผ ๋ณด์ ๋๋ค. ๊ตฌํ ๊ฒฐํจ์ด ์ธ์ด ์ฌ์์ ์ํฅ์ ๋ฏธ์ณ์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
@josharian ์์ ํ ์ ์์ผ๋ก ์๋ํ ๊ฒ์ ์๋์ง๋ง ๋ต๋ณ์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ ํ์ด ์ค์ ๋ก ๋ฌธ์ ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค. x/net/context.Context
์ ํ ๋น / convertable / whateverable์
๋๋ค context.Context
. ๋ฌธ์ ๋ ๊ณ ์ฐจ ์ ํ์
๋๋ค. ์ฆ func (ctx x/net/context.Context)
๋ฐ func (ctx context.Context)
์ ์ธ์๊ฐ ํ ๋น ๊ฐ๋ฅํ๋๋ผ๋ ๋์ผํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด type T struct { S }
๊ฐ T
์ S
๊ฐ ๋์ผํ ์ ํ์์ ์๋ฏธํด์ผ ํฉ๋๋ค. ์ฆ, ๋ณ์นญ์ ๋ํด ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ณ ์๋ค๋ ๋ป์
๋๋ค(์ด ๊ตฌ๋ฌธ์๋ ์ด๋ฏธ ๋ค๋ฅธ ์๋ฏธ๊ฐ ์์).
ํ ๋น ๊ฐ๋ฅ/๋ณํ ๊ฐ๋ฅ ์ ํ์ด ๋ฐ๋์ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ํํ์ ๊ฐ์ง ํ์๋ ์๊ธฐ ๋๋ฌธ์ ๊ณ ์ฐจ ์ ํ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค(๊ทธ๋ ๋ค๋ฉด ํด์์ด ํฌ๊ฒ ๋ณ๊ฒฝ๋ ์ ์์). ์๋ฅผ ๋ค์ด, uint8
๋ uint64
๋๋ ๊ทธ ๋ฐ๋๋ก ๋ณํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์๋ฅผ ๋ค์ด type T ~uint8
์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ func(T)
๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์คํ์์ 1, 2,4 ๋๋ 8๋ฐ์ดํธ๋ฅผ ํธ์ํด์ผ ํฉ๋๊น? ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ง๋ง ๋์๊ฒ๋ ๊ฝค ๋ณต์กํ๊ฒ ๋ค๋ฆฝ๋๋ค(๋ณ์นญ๋ณด๋ค ์ดํดํ๊ธฐ ๋ ์ด๋ ต์ต๋๋ค).
@Merovius๋ ๊ฐ์ฌํฉ๋๋ค.
์, ์ฌ๊ธฐ์ ์ธํฐํ์ด์ค ๋ง์กฑ๋๋ฅผ ๋์ณค์ต๋๋ค. ๋น์ ๋ง์ด ๋ง์, ์ด๊ฒ์ ์ผ์ํ์ง ์์ต๋๋ค.
๋๋ "๋์ผํ ๋ฉ๋ชจ๋ฆฌ ํํ์ ๊ฐ์ง๊ณ "๋ฅผ ์ผ๋์ ๋์์ต๋๋ค. ์ปจ๋ฒํฐ๋ธ ์๋ณต์ ๋ถ๋ช ํ ๊ทธ๊ฒ์ ๋ํ ์ฌ๋ฐ๋ฅธ ์ค๋ช ์ด ์๋๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
@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 ์ ํ์ด ๋๋๋ก ํ์ฉํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ฉด ์ข์ ๊ฒ์ด๋ผ๊ณ ์ง์ ํ์ต๋๋ค. ๊ทธ๊ฒ์ ์ด ๋ฌธ์ ์ ์ ํ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๋์ง๋ง ๋ ๋ฌธ์ ๋ชจ๋ ์ ํ ์จ๋ฆฌ์ด์ฑ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
๋ณ์นญ์ ๋ํ ์ ์/์๋ฝ/๊ฑฐ๋ถ ์ ํ/์ ํ์ ๋ํ ์์ฝ์ด ์์ต๋๊น? ๋ ์ค๋ฅด๋ ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@rsc ๋ํ๋ฅผ ๋๋ฌด ๋ง์ด ๋๋ฆฌ๊ณ ์ถ์ง๋ ์์ง๋ง ๋ณ์นญ ์ ์์์ "new"๊ฐ "old"๊ฐ ์์กดํ๋ ํ๋๋ฅผ ์ ๊ฑฐํ๋ฉด "old"์ ํด๋ผ์ด์ธํธ๊ฐ ์ด์ ์ปดํ์ผํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋์ฒด ์ ์์์๋ ๊ตฌํ๊ณผ ์ ํ์ ํจ๊ป ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ง ์ค๋จ๋๋๋ก ์กฐ์ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ด ๊ฐ๋ฅํ๋ ค๋ฉด ์ปดํ์ผ๋ฌ๊ฐ "์" ํจํค์ง์์ "์ด์ " ์ ํ์ ์ฌ์ฉ์ ๊ฐ์งํ ๊ฒฝ์ฐ์๋ง ๋์ฒด ์ง์๋ฌธ์ ๊ฒ์ฆํด์ผ ํฉ๋๋ค.
@thwd ์์ง ์ข์ ๊ธ์ด ์๋ ๊ฒ ๊ฐ์์. ๋ด ๋ฉ๋ชจ:
x/image/draw.Image
์จ๋ฆฌ์ด์ฑ draw.Image
๋ค์ ๋๊ตฐ๊ฐ๊ฐ ์์ ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ๋ณ์นญ์ ํตํด draw.Image
๋ฅผ image.Draw
๋ก ์ด๋ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ๊ฐ์๊ธฐ x/image/draw
๋ ๋ณ์นญ์ ๋ํ ๋ณ์นญ์ด ํ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ค๋จ๋ฉ๋๋ค.@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 ๋ณ์นญ ์ํ ์ค์ ๋ํ๋ ๋ ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฅ์ฑ์ ์๊ณ ์์ต๋๋ค.
๋ณ์นญ(๋๋ ๋ณ์นญ๋ง ์ ๋ ฅ)์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ํจํค์ง๋ฅผ ํ์ฅํ๋ ๋๋กญ์ธ ๊ต์ฒด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด https://go-review.googlesource.com/#/c/32145/ , ํนํ ์ปค๋ฐ ๋ฉ์์ง์ ์ค๋ช ์ ์ฐธ์กฐ
๋ณ์นญ(๋๋ ๊ทธ๋ฅ ์ ํ ๋ณ์นญ)์ ์ฌ์ฉํ๋ฉด ์์ API ํ๋ฉด์ผ๋ก ํจํค์ง๋ฅผ ๊ตฌ์กฐํํ ์ ์์ง๋ง ๋ ๋์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ํด ํจํค์ง ์ปฌ๋ ์ ์ผ๋ก ๋๊ท๋ชจ ๊ตฌํ์ ๊ตฌ์ฑํ ์ ์์ง๋ง ์ฌ์ ํ ํด๋ผ์ด์ธํธ์์ ๊ฐ์ ธ์ค๊ณ ์ฌ์ฉํ ํจํค์ง๋ ํ๋๋ง ์ ๊ณตํฉ๋๋ค. https://github.com/golang/go/issues/16339#issuecomment -232813695์ ์ค๋ช ๋ ๋ค์ ์ถ์์ ์ธ ์๊ฐ ์์ต๋๋ค.
๋ณ์นญ์ ๊ธฐ๋ณธ ๋ชฉํ๋ ํ๋ฅญํ์ง๋ง ๊ธฐ๋ฅ์ ๋ํ ์ต๊ณ ์ ๋๊ธฐ๋ถ์ฌ์์๋ ๋ถ๊ตฌํ๊ณ ์ฝ๋ ๋ฆฌํฉํ ๋ง์ ๋ชฉํ์ ๋ํด ์ ์งํ์ง ์์ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ์ผ๋ถ ์ ์์ ์ด๋ฆ์ ์ ๊ทธ๋ ๊ฒ์ ์ ์ํ๋ฉฐ ์ ํ์ด ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ๋ฆฌํฉํ ๋ง์ผ๋ก ํ๋ฉด์ ๋ณ๊ฒฝํ๋ค๋ ์ธ๊ธ์ ์์ง ๋ณด์ง ๋ชปํ์ต๋๋ค. ์ฌ์ง์ด ์๋ฅผ ๋ค์ด os.Error => error
์ข
์ข
๋ณ์นญ ์ฃผ์ ์ธ๊ธ์ ์ฌ์ค ๋ฌด์ os.Error
ํ๋ค String
๋ฐฉ๋ฒ์ด ์๋ Error
. ์ ํ์ ์ด๋ํ๊ณ ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ์์๋ฉ๋๋ค. ๊ทธ๊ฒ์ ๋ฆฌํฉํ ๋ง ์ค์ ํํ ์ผ์
๋๋ค. ์ค๋๋ ๋ฉ์๋๋ ์ด๋ฆ์ด ๋ฐ๋๊ณ , ์ด๋๋๊ณ , ์ญ์ ๋๋ฉฐ, ์ ์ฝ๋์์ ๋นํธํ์ฑ์ ์ ์งํ๊ธฐ ๋๋ฌธ์ ์ ์ ํ์์๋ ์ด๋ฌํ ๋ฉ์๋๋ฅผ ์ํ์ง ์์ต๋๋ค.
๋์์ ์ฃผ๊ธฐ ์ํด ์ฌ๊ธฐ์ ์จ์ ์์ด๋์ด๊ฐ ์์ต๋๋ค. ๋ณ์นญ ๋์ ์ด๋ํฐ ์ธก๋ฉด์์ ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด ์ด๋จ๊น์? ์ด๋ํฐ๋ ๊ธฐ์กด ์ ํ์ ๋์ฒด ์ด๋ฆ _๋ฐ ์ธํฐํ์ด์ค_๋ฅผ ์ ๊ณตํ๋ฉฐ ์ด์ ์ ์๋ ์ ํ์ด ๋ณด์๋ ๊ณณ์์ ๊พธ๋ฏธ์ง ์๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ํฐ๋ ๊ธฐ๋ณธ ์ ์ ์ ํ์ ๋์ผํ ์ธํฐํ์ด์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ธฐ๋ณด๋ค๋ ์ง์ํ๋ ๋ฉ์๋๋ฅผ ๋ช
์์ ์ผ๋ก ์ ์ํด์ผ ํฉ๋๋ค. ์ด๋ ๊ธฐ์กด type foo bar
๋์๊ณผ ๋งค์ฐ ์ ์ฌํ์ง๋ง ๋ช ๊ฐ์ง ์ถ๊ฐ ์๋ฏธ๊ฐ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์์ ๋น๋ถ๊ฐ ์์ "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.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 ๋ฑ์์ ๊ฐ๋ฐ์ ์๊ฐํ๊ณ ์์ต๋๋ค.
๋ค๋ฅธ ์๋ ๋จ์ผ ์ ํ์ด ํฌ๊ฑฐ๋ ๋ฌธ์ ๊ฐ ์๋ ํจํค์ง์ ๋ํ ์ข ์์ฑ์ด ์ญ์ ๋๋ ๊ฒ์ ๋ง๋ ์ ์ผํ ๊ฒฝ์ฐ์ ๋๋ค(์: ๋ผ์ด์ผ์ค ๋นํธํ์ฑ์ด ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ).
๋ฐ๋ผ์ ์ฌ๊ธฐ์ ํ๋ก์ธ์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ๊ณผ์ ์ด ๋๋๋ฉด ์์ ์ ๋ฐฉํฅ์ผ๋ก ์์ ๋กญ๊ฒ ๋ฐ์ ํ ์ ์๋ ๋ ๊ฐ์ง ๋ ๋ฆฝ์ ์ธ ์ ํ์ด ์์ต๋๋ค.
์ด ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ:
@Merovius ์ด์ ๋ฐฉ๋ฒ์ ์ญ์ ํ๊ฑฐ๋ ์ด๋ฆ์ ๋ฐ๊พธ๋ ์๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ฅผ ํ ๋ฒ์ ์ฃฝ์ ๋๋ค. ๋น์ ์ด ๊ทธ๋ ๊ฒ ํ ์ํฅ์ด ์๋ค๋ฉด, ํ๊บผ๋ฒ์ ์ค๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ธ์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ์ ์ฒด ์ฌ์ํ์ง ์์ ์ฐ์ต์ ๋ฌด์๋ฏธํฉ๋๋ค. ์ฝ๋ ์ด๋์ ๋ํด ์ ํํ ๊ฐ์ ๊ฒ์ ๋งํ ์๋ ์์ต๋๋ค. ๋ชจ๋ ํธ์ถ ์ฌ์ดํธ์์ ํ ๋ฒ์ ์ ํ์ ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด ๋ฉ๋๋ค. ์๋ฃ. ๋ ์์ ๋ชจ๋ ๋จ์ํ ์์์ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ์ด๋ฉฐ, ๊ณตํต์ ์ผ๋ก ํธ์ถ ์ฌ์ดํธ์ ๋ชจ๋ ์ฝ๋ ๋ผ์ธ์ ๋ํ ์์ ํ ์ก์ธ์ค๋ฅผ ๊ฐ์ ํ๋ค๋ ์ฌ์ค์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๊ฒ์ Google์ ๊ฒฝ์ฐ์ผ ์ ์์ง๋ง ๋๊ท๋ชจ ์คํ ์์ค ์์ฉ ํ๋ก๊ทธ๋จ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ง ๊ด๋ฆฌ์๋ก์ ๋ด๊ฐ ์ด๊ณ ์๋ ์ธ์์ ์๋๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ Go ํ์ด ์ธ๋ถ ๋น์ฌ์๋ฅผ ํฌํจํ๋ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ง์ ์๊ฐ์ ๋ค์ด๊ธฐ ๋๋ฌธ์ ๋นํ์ด ๋ถ๊ณตํํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฃผ์ด์ง ํจํค์ง๋ฅผ ํธ์ถํ๋ ๋ชจ๋ ๋จ์ผ ์ฝ๋ ๋ผ์ธ์ ์ก์ธ์คํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ ์๊ฐ ์คํ ์์ค ์ปค๋ฎค๋ํฐ์ ๋งฅ๋ฝ๊ณผ ์ผ์นํ์ง ์๋ ์ ์. ๋ฒฝ์ผ๋ก ๋๋ฌ์ธ์ธ ์ ์ ๋ด์์๋ง ์๋ํ๋ ์ธ์ด ์์ค์ ๋ฆฌํฉํ ๋ง ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ต์ํ ๋น์ ํ์ ์ผ ๊ฒ์ ๋๋ค.
@niemeyer ๋๋ ๋ถ๋ช ํ ๋ ์์ ์ ๋ช ํํํ์ง ์์์ต๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ์ด์ 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
๋ก ๋ฉ์๋๋ฅผ ์ด๋ํ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
A.Foo
์ฃผ์์ ๋ํผ๋ก A.Bar
๋ฉ์๋ ์ถ๊ฐA.Bar
๋ง ํธ์ถํ๋๋ก ์ฌ์ฉ์ ๋ง์ด๊ทธ๋ ์ด์
A.Foo
์ญ์ ํ๊ฑฐ๋ ์ญ์ ํ์ง ๋ง์ญ์์ค.ํจ์ ์ธ์ ๋ณ๊ฒฝ์ ๋น์์์ ์ผ๋ก ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด x int
๋งค๊ฐ๋ณ์๋ฅผ func Foo()
์ ์ถ๊ฐํ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
func FooWithInt(x int) { Foo(); // use x somehow; }
func Foo(x int) { FooWithInt(x) }
.s/FooWithInt/Foo/g
์ฌ์ฉ์๋ฅผ ๋ง์ด๊ทธ๋ ์ด์
ํฉ๋๋ค.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 ๋ด์์ ๋ณ์นญ ์ฌ์ฉ์ ๋ํด ๋ณด์์ ์ธ ์ ์ฅ์ ์ทจํ๋๋ผ๋ ์ ํ ๋ณ์นญ์ ์กด์ฌ๊ฐ (๊ธฐ๊ณ์ ์ผ๋ก ๊ฐ์ง๋๊ฑฐ๋ ์๊ฐ์ ์ผ๋ก ํ์๋๋ ๋ฐฉ์์ผ๋ก) ์ด์ ์ ํ์ด ๋ ์ด์ ์ฌ์ฉ๋์ง ์์์ ์๋ฏธํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ด ํญ์ ์ค์ ๋ก ๊ทธ๊ฒ์ ์๋ฏธํ๋ค๋ฉด.
๊ทธ๋ ๊ฒ ํ๋ฉด ๋ค์ ์ค ํ๋๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด์ ์ ํ์ด ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ ์ ํ ๋ณ์นญ์ด ๋์ ๋ ๊ฒฝ์ฐ, ์ด์ ์ ํ์ ๊ด๊ณ์์ด ์ ์ ํ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ์ ํ์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฒ์ผ๋ก ํ์ํ์ฌ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ ๊ฐ๋จํ๊ณ ์ผ๋ฐํ๋์ด ๋ ๋์ ๋๊ตฌ๊ฐ ์กด์ฌํ ์ ์์ต๋๋ค. ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ํ์ํ์ง ์์ผ๋ฉฐ ์ ํ ๋ณ์นญ์ ๋ํด์๋ ์ ํ์๊ฐ ์์ต๋๋ค. ๋ฌธ์ ์ฃผ์์์ "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(๋ ๋ค ๋์ผํ ํจํค์ง์ ์์)๋ฅผ ์ ์ํ๋ ๊ฒฝ์ฐ ๋๋ต์ ๋ ๋ช ํํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ ํ์ ๋์ ํ ์ ์์ง๋ง (์์ง) ๋ช ๋ฐฑํ ํ์๋ ์์ต๋๋ค.
์ต์์ ํ ๋ก ์์ฝ์ ์ ๋ฐ์ดํธํ์ต๋๋ค . ๋ณ๊ฒฝ ์ฌํญ:
๋์์ธ ๋ฌธ์ ์ถ๊ฐ: 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 ์ ๋ต๋ณ์ ํ์ฅ์๋ ์ ์ฉ๋ฉ๋๋ค.
์ต์์ ํ ๋ก ์์ฝ์ ์ ๋ฐ์ดํธํ์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ:
@rsc ๋ณ๋์ ์ปดํ์ผ๊ณผ ๊ด๋ จํ์ฌ ๋ด ์๊ฒฌ์ ์ ํ ์ ์๊ฐ ๋ณ์นญ ๋ชฉ๋ก์ ์ ์งํด์ผ ํ๋์ง(๋ณ๋์ ์ปดํ์ผ ์๊ตฌ ์ฌํญ ๋๋ฌธ์ ๋๊ท๋ชจ๋ก ๋ค๋ฃจ๊ธฐ ํ๋ ์ง) ๋๋ ๊ฐ ๋ณ์นญ์ ๋ค์๊ณผ ๊ฐ์ ๋ณ์นญ ์ด๋ฆ ๋ชฉ๋ก์ ๋ฐ๋ณต์ ์ผ๋ก ์์ฑํด์ผ ํ๋์ง ์ฌ๋ถ์ ๊ด๋ จ์ด ์์ต๋๋ค. ์ ํ ์ ์์ ์ ๊ณต๋ ์ด๊ธฐ ์ ํ ์ด๋ฆ๊ณผ ๊ด๋ จ๋ ๊ฐ์ ธ์ค๊ธฐ ๊ทธ๋ํ. (๊ทธ๋ฆฌ๊ณ ๋ฐํ์์ด ์ก์ธ์คํ ์ ์๋๋ก ํด๋น ์ ๋ณด๋ฅผ ๋ณด๊ดํ๋ ๋ฐฉ๋ฒ๊ณผ ์์น).
@atdiar ์์คํ ์ด๋์๋ ๊ทธ๋ฌํ ๋ณ์นญ ์ด๋ฆ ๋ชฉ๋ก์ด ์์ต๋๋ค. ๋ฐํ์์ ์ก์ธ์ค ๊ถํ์ด ์์ต๋๋ค. ๋ณ์นญ์ ๋ฐํ์์ ์กด์ฌํ์ง ์์ต๋๋ค.
@rsc ํ, ์ฃ์กํฉ๋๋ค. ๋๋ ๋จธ๋ฆฌ์ ์ด๊ธฐ ๋ณ์นญ ์ ์์ด ๋ถ์ด ์๊ณ func์ ๋ํ ๋ณ์นญ์ ๋ํด ์๊ฐํ๊ณ ์์์ต๋๋ค(์ ํ์ ๋ํ ๋ณ์นญ์ ๋ํด ๋
ผ์ํ๋ ๋์). ์ด ๊ฒฝ์ฐ ์ฝ๋์ ์ด๋ฆ๊ณผ ๋ฐํ์ ์ ์ด๋ฆ ์ฌ์ด์ ๋ถ์ผ์น๊ฐ ์์ ์ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ ๋ก๊น
์ ์ํด runtime.Frame์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ์ฝ๊ฐ์ ์ฌ๊ณ ๊ฐ ํ์ํฉ๋๋ค.
๋๋ ์ ๊ฒฝ ์ฐ์ง ๋ง.
@rsc ๋ค์ ์์ฝ ์ด ์๊ฒฌ ์ ๋ ํฐ ์์ ์, ์ฆ ์ด๊ฒ์ด ํ๋ ์ด๋ฆ์ ๋ฐ๊พธ๋ ํน๋ณํ ๊ฒฝ์ฐ์ด๋ฉฐ ๋ถ๊ฐ๋ฅํ๋ค๋ ์ ์ ์ด๊ฒ์ด ์ค์ ๋ก ๋ณ๋์ ๋ฌธ์ ๋ก ๊ฐ์ฃผ๋์ด์ผ(๋ฐ ํด๊ฒฐ)๋์ด์ผ ํ๋ค๊ณ ํ์ ํฉ๋๋ค. ์ ์ง์ ์ธ ๋ณต๊ตฌ๋ฅผ ์ํ ํ๋ ์ด๋ฆ ๋ณ๊ฒฝ์ ์ง์ํ๊ธฐ ์ํด ์์ฒญ/์ ์/ํ ๋ก ์ ๋ํด ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ฌ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์์ต๋๊น(๋์ผํ ๋ฆด๋ฆฌ์ค์์ ํด๊ฒฐ๋ ์ ์์)?
@Merovius , ํ๋ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ๋ฅผ ์ํ ์ ์ง์ ์ฝ๋ ๋ณต๊ตฌ๊ฐ ์ํ์ค์ ๋ค์ ๋ฌธ์ ์ฒ๋ผ ๋ณด์ธ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ ๋ ผ์๋ฅผ ์์ํ๋ ค๋ฉด ๋๊ตฐ๊ฐ๊ฐ ์ค์ ์ฌ๋ก ๋ชจ์์ ์์งํด์ผ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๊ฒ ํจ์ผ๋ก์จ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด ๊ด๋ฒ์ํ ๋ฌธ์ ๋ผ๋ ์ฆ๊ฑฐ๋ฅผ ํ๋ณดํ๊ณ ์ ์ฌ์ ์ธ ์๋ฃจ์ ์ ํ์ธํ ์ ์์ต๋๋ค. ์ฌ์ค ๊ฐ์ ๋ฆด๋ฆฌ์ค์์๋ ๊ทธ๋ฐ ์ผ์ด ์ผ์ด๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
2์ฃผ๋ง์ ๋์์์ต๋๋ค. ๋ ผ์๊ฐ ์๋ ด๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. 2์ฃผ ์ ์ ํ ๋ก ์ ๋ฐ์ดํธ์กฐ์ฐจ๋ ์๋นํ ๋ฏธ๋ฏธํ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ ์ํฉ๋๋ค.
+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'๋ฅผ ๊ฐ์ ํจ).
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์์ ํ์ฉ๋๋ ์ฉ์ด๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก ๊ฒฐ๊ตญ ์ด๋ค ์ฉ์ด๊ฐ ์ ํ๋๋์ง ๋งค์ฐ ๊ถ๊ธํฉ๋๋ค.
์ด์ ๋ชจ๋ ์ ํ์ด ์ด๋ฆ์ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก ์๋ก ์์ฑ๋ ์ ํ์ ๋ํ ์ ์ฉ์ด๊ฐ ํ์ํฉ๋๋ค.
๋ช ๊ฐ์ง ์์ด๋์ด:
@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์ ๋ง๋ค์์ต๋๋ค
์ด๋ฐ ์ผ์ด ์ผ์ด๋ฌ์ต๋๋ค. ๋๋ ์ฌ๊ธฐ์ ์๋ฌด๊ฒ๋ ๋จ์ ์์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@cznic , @iand , ๊ธฐํ: _์ ํ์ ๋ณต์ก์ฑ์ ์ถ๊ฐํฉ๋๋ค_. ๊ทธ๊ฒ๋ค์ ๊ธฐ๋ฅ์ ๋ํ ์ค๋ช ์ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ธ์ง ๋ถํ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ ํ ์ฌํญ์ ์์ด๋ฒ๋ฆฐ ๊ฒฝ์ฐ ์๋ํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ด ์ ์๋ํ์ง ์๋์ง ์์ํดํด์ผ ํฉ๋๋ค.
๋จ์ง ๊ฐ์์ ์ค์ฉ์ผ๋ก ์ธํด ๋์์ธ ์ํ์ ๋ํ ์ ํ์ ๊ตฌํํ๋ ๊ฒ์ ์ข ์ข ์ค์์ ๋๋ค. ๊ทธ๊ฒ์ ๋ณ์นญ ์ ์ ํ ๋ก ์์ ์ผ์ด๋ฌ๊ณ , ๊ทธ๊ฒ์ ์๋์ ๋ณ์นญ์ด ๊ธฐ์ฌ์์
io.ByteBuffer
=>bytes.Buffer
๋ณํ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋ง๋ค์์ต๋๋ค. ์ด ๊ธฐ์ฌ๋ฅผ ์์ฑํ๋ ๋ชฉ์ ์ ์ผ๋ถ๋ ์ฐ๋ฆฌ๊ฐ ์ฒ๋ฆฌํ ์ ์๊ธฐ๋ฅผ ์ํ๋ ๋ช ๊ฐ์ง ์ฌ๋ก๋ฅผ ์ ์ํ์ฌ ๋ถ์ฃผ์๋ก ์ ํํ์ง ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.๋ ๋ค๋ฅธ ์๋ก, ํฌ์ธํฐ๊ฐ ์๋ ์์ ๊ธฐ๋ฅผ ํ์ฉํ์ง ์๊ฑฐ๋ ๊ตฌ์กฐ์ฒด๊ฐ ์๋ ์ ํ์ ๋ฉ์๋๋ฅผ ํ์ฉํ์ง ์๋ ์ค์ฉ ์ธ์๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ฝ์ต๋๋ค. ๋ ์ค ํ๋๋ฅผ ์ํํ๋ค๋ฉด ์ค์ค๋ก ์ธ์ํ๊ธฐ ์ํด String() ๋ฉ์๋๋ก ์ด๊ฑฐํ์ ๋ง๋ค ์ ์์๊ณ
http.Headers
๋ชจ๋ ์ผ๋ฐ ๋งต์ด ๋๊ณ ๋์ฐ๋ฏธ ๋ฉ์๋๋ฅผ ์ ๊ณตํ ์ ์์์ต๋๋ค. ์ค์ฉ์ ์์ํ๊ธฐ ์ฌ์ด ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ค๋๋ ฅ ์๋ ๊ธ์ ์ ์ธ ์ฌ์ฉ์ ํ์๋๋ ๋ฐ ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆด ์ ์์ผ๋ฉฐ ์คํ์ ์ํ ๊ณต๊ฐ์ ๋ง๋๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.๋ ๋ค๋ฅธ ์๋ก์, ํฌ์ธํฐ ๋ ๊ฐ ๋ฉ์๋์ ๋ํ ์๋ ์ค๊ณ ๋ฐ ๊ตฌํ์ T์ *T์ ๋ฉ์๋ ์ธํธ๋ฅผ ๊ตฌ๋ถํ์ง ์์์ต๋๋ค. *T๊ฐ ์์ผ๋ฉด ๊ฐ ๋ฉ์๋(์์ ๊ธฐ T)๋ฅผ ํธ์ถํ ์ ์๊ณ , T, ํฌ์ธํฐ ๋ฉ์๋(์์ ๊ธฐ *T)๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ค๋ช ํ ์ ํ ์์ด ๊ฐ๋จํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ๊ฐ์ ๋ํ ํฌ์ธํฐ ๋ฉ์๋ ํธ์ถ์ ํ์ฉํ๋ฉด ํน์ ํด๋์ค์ ํผ๋์ค๋ฝ๊ณ ๋๋ผ์ด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
io.Copy๋ ์ฑ๊ณตํ์ง๋ง buf์๋ ์๋ฌด ๊ฒ๋ ํฌํจ๋์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ํ๋ก๊ทธ๋จ์ด ์๋ชป ์คํ๋ ์ด์ ๋ฅผ ์ค๋ช ํ๊ฑฐ๋ ๊ทธ ํ๋ก๊ทธ๋จ์ด ์ปดํ์ผ๋์ง ์์ ์ด์ ๋ฅผ ์ค๋ช ํ๋ ๊ฒ ์ค์์ ์ ํํด์ผ ํ์ต๋๋ค. ์ด๋ ์ชฝ์ด๋ ์ง๋ฌธ์ด์์ ๊ฒ์ด์ง๋ง ์ฐ๋ฆฌ๋ ์๋ชป๋ ์คํ์ ํผํ๋ ํธ์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋์์ธ์ ๊ตฌ๋ฉ์ด ์๋ฆฐ ์ด์ ์ ๋ํ FAQ ํญ๋ชฉ ์
๋ค์ ๋งํ์ง๋ง, ์ ํ์ ๋ณต์ก์ฑ์ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ๋ชจ๋ ๋ณต์ก์ฑ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ํ์๋ ์๋นํ ์ ๋น์ฑ์ด ํ์ํฉ๋๋ค. ๋์์ธ ํ๋ก์ธ์ค์ ์ด ๋จ๊ณ์์ ํน์ ๋์์ธ์ ์ ์ ํ ์ ์๋ ์ ํ ์ฌํญ์ ๋ํด ์๊ฐํ๋ ๊ฒ์ด ์ข์ง๋ง ์ ํ์ด ์๋ ๋จ์ํ ๋์์ธ์ ์ค์ ๋ก ๊ฒฝํํ ํ์๋ง ์ด๋ฌํ ์ ํ์ ๊ตฌํํด์ผ ํฉ๋๋ค. ๋น์ฉ์ ์ง๋ถํ๊ธฐ ์ํด.