Go2 ์ ์ #32437์ ์ธ์ด์ ์๋ก์ด ๊ตฌ๋ฌธ์ ์ถ๊ฐํ์ฌ if err != nil { return ... }
์์ฉ๊ตฌ๋ฅผ ๋ ๋ฒ๊ฑฐ๋กญ๊ฒ ๋ง๋ญ๋๋ค.
๋ค์ํ ๋์ ์ ์์ด ์์ต๋๋ค: #32804์ #32811์ ์๋์ ๊ฒ๊ณผ ๊ฐ์ด ๋ณดํธ์ ์ผ๋ก ์ฌ๋๋ฐ์ง ๋ชปํฉ๋๋ค.
ํผํฉ์ ๋ค๋ฅธ ๋์์ ๋์ง๋ ค๋ฉด: ๊ทธ๋๋ก ์ ์งํ๋ ๊ฒ์ด ์ด๋ป์ต๋๊น?
๋๋ if err != nil
๊ตฌ์กฐ์ ๋ช
์์ ํน์ฑ์ ์ข์ํ๊ฒ ๋์๊ณ , ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ์ด์ ๋ํ ์๋ก์ด ๊ตฌ๋ฌธ์ด ํ์ํ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ ๋ง ๊ทธ๋ ๊ฒ ๋์๊ฐ์?
๋๋ ์ด๊ฒ์ ๋ ๋ฒ์งธ. ๋๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ธฐ ์ ์ ๋ฐ์ฝ๋ ์ด์ ํ์ฌ ์ฌ๋์ด ์ฝ์ ์ ์๋ ๋ฌธ์๋ฅผ ์์ค์ ์ถ๊ฐํ๋ ๋ฐฉ์์ ์ ๋ง ์ข์ํฉ๋๋ค(์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ์ค๋ฅ๋ฅผ "ํ ์ ์๋ [์ด ์ฝ๋ ์ค]: [์ด์ ์ค๋ฅ]"๋ก ํ์ ์ง์ ) ๋ฐ ์ฌ์ฉ์์๊ฒ๋ ์ฝ๊ธฐ ์ค๋ฅ.
์ด ๋ฐฉ๋ฒ์ผ๋ก ์์ฑ๋ ์ค๋ฅ๋ ์คํ ์ถ์ ๋ณด๋ค ๋งค์ฐ ์ ์ตํ๊ณ ์ฝ๊ธฐ ์ฝ์ต๋๋ค. ์คํ ์ถ์ ์ ํฌํจํ๋ ์ธ์๋ ์ค๋ฅ๋ ์ผ๋ฐ์ ์ผ๋ก ์์ค์ ๋ํ ์ค๋น๋ ์ก์ธ์ค ๊ถํ์ด ์๊ณ (๊ด๋ฆฌ์๋ ์ด๋ฌํ ์ก์ธ์ค ๊ถํ์ด ์์ ์ ์์) ์ค์ ๋ก ์ฝ๋์์ ์ฌ์ฉ์์ ๋ฐฉ์์ ์๊ณ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ด๋ค ํํ์ ์ปจํ ์คํธ๋ ์ถ์ ์ด ์๋ ์ค๋ฅ(๋ฒ ์ด ๋ฌธ์์ด "EOF")๋ ์ ๋์ ์ผ๋ก ์ธ๋ชจ๊ฐ ์์ต๋๋ค. ๋ค์ดํค๋ ์ค๋ฅ๋ฅผ ์ฝ๊ฒ ๋ฐํํ ์ ์๋ ๋ฐ๋ก ๊ฐ๊ธฐ๊ฐ ์์ผ๋ฉด Go ํ๋ก๊ทธ๋จ์ด ์ธ๋ชจ์๋ ์ค๋ฅ๋ฅผ ๋ง์ด ์ธ์ํ๊ฒ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ง์ฝ ์๋ค๋ฉด, ์ฐ๋ฆฌ๋ ์๋ก์ด ์์์ฌ ๋ฐ ๋ฆฐํธ ๊ท์น์ ์ฌ์ฉํ์ฌ ์ปจํ ์คํธ์ ํจ๊ป ์ค๋ฅ๋ฅผ ๋ฐ์ฝ๋ ์ดํ ํ๋ ๊ฒ์ ๋ฐ์ด๋ถ์ด๊ณ ์ง์ํด์ผ ํฉ๋๋ค.
๋๋ ๋ํ ๋ช
์์ ์ธ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ์ข์ํฉ๋๋ค. try
๋ ํผ๋์ค๋ฝ๊ณ ์์์ ๋ฐํ์ ์ด์ํฉ๋๋ค.
์ค๋ฅ์ ๋ํด ๋ค์ ์๊ฐํ๋ ๋์ ์ด๋ฌํ ๊ฒ์ฌ๋ฅผ ๋ ์งง๊ฒ ๋ง๋๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ค์์ ๋ด๊ฐ ๋ฐ๋์ ๋์ํ์ง ์๋ ์์ ๋๋ค.
value, err := foo()
return err if err != nil
์ด๊ฒ์ ๋ ์งง์ง๋ง ์ฌ์ ํ ๋ช ์์ ์ธ ์ ๊ทผ์ ํ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค!
๊ทธ๋ ๊ธด ํ์ง๋ง ์ธ๋ผ์ธ if๋ Ruby์ด๊ณ Goish๊ฐ ๋ณ๋ก ๋๊ปด์ง์ง ์์ง๋ง ์ด๊ฒ์ ๋จ์ง ๋ธ๋ ์ธ์คํ ๋ฐ์ผ ๋ฟ์ ๋๋ค. ์ด์ฉ๋ฉด ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๊ฒ์ ์ฐพ์ ์ ์์ต๋๋ค.
ํธ์ง: ์ฌ๊ธฐ์ ์ ์์ ์ถ๊ฐํ์ต๋๋ค: https://github.com/golang/go/issues/32860
์ผ์ ํ๋ ๋ฐฉ๋ฒ์ ํ ๊ฐ์ง๋ฟ์ด์ด์ผ ํฉ๋๋ค.
[...]์ ๊ทธ๋๋ก ๋์ง ์์ต๋๊น?
๋๋ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ด๊ฒ์ ๋ํ ๋ต์ ์๊ณ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ด ๊ณตํํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ง์ฌ์ผ๋ก ๋ชจ๋ฅธ๋ค๋ฉด ๋ต์ ์ฐพ์ผ๋ ค๋ฉด ๋ค์ํ ์ ์ ์ค ํ๋๋ฅผ ์ฝ์ด๋ณด๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
IMO, ์ฌ๊ธฐ์ ์ง์ค ํ ๋ก ์ ํ๊ธฐ์๋ ์ธ๋ถ ์ฌํญ์ด ๋๋ฌด ์ ์ผ๋ฉฐ(์ฆ, ์ ์์ผ๋ก ์ ํฉํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.) ๊ณง ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋จ์ด๋จ๋ฆฌ๋ ์์ด๋์ด๋ก ๊ฐ๋ ์ฐฌ ๋ ๋ค๋ฅธ ์์ ๊ฑฐ ์ฐฝ๊ณ ๋ก ๋ฐ๋ ๊ฒ์ ๋๋ค. .
์ด๋งํผ.
ํ๋ฆผ์์ด ๋๋ ์ด ๋ช ์์ ์ค๋ฅ ์ฒ๋ฆฌ ๋๋ฌธ์ Go์ ์ ๋ฌธํ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ง์ ์ธ์ด๊ฐ ์ฌ์ฉํ๋ ์์์ try-catch์ ์ฌ์ฉ์์๊ฒ ๋ฐํ๋๊ณ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ ๊ฒ์ ์ ํธํ๋ Option ๋๋ Maybe์ ๊ฐ์ ํจ์ ์ ํ ์ฌ์ด ์ด๋๊ฐ์ ์์ต๋๋ค.
์๋ก์ด ๊ตฌ์กฐ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ์ ๋ง๋ก ํด๊ฒฐํ ์ ์์์ง ํ์ ํ ์ ์์ต๋๋ค. if err := nil
๋ฅผ ์ด์ ๊ฐ์ ๋์ฐ๋ฏธ ํจ์๋ก ๋ํํ๋ฉด ์ฝ๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค(๋ด ๋
น์จ Go๋ฅผ ์ฉ์ํ์ญ์์ค).
func handleErr(err error, cb func(error)) {
if err := nil {
cb(err)
}
}
๊ทธ๋ฌ๋ ์ด ๋์ฐ๋ฏธ ํจ์๋ฅผ ์ผ๋ฐ์ ์ผ๋ก ๋ ์ ์ฉํ๊ฒ ๋ง๋๋ ๋ฌธ์ ๋ ๋ค๋ฅธ ์ฃผ์ ์ธ ์ ํ ์์คํ ์ ๋๋ค.
๋๋ ์ด๊ฒ์ ๋ ๋ฒ์งธ. if err != nil { return err }
๋ ์ฐ๋ฆฌ ์ฝ๋ ๋ฒ ์ด์ค์ ์ด๋ค ์ฝ๋์๋ ํฌํจ๋์ด ์์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋ "๋งคํฌ๋ก"๋ ์ ํ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ปจํ
์คํธ๋ฅผ ์ค๋ช
ํ๋ ๋ฉ์์ง์ ํจ๊ป ๋ํ๋ ์ค๋ฅ๋ง ๋ฐํํฉ๋๋ค.
defer๋ฅผ ํตํด ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ ์ข
๋ฅ์ ์ค๋ฅ๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ํด ๋ค๋ฅธ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐํํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ try(fn(), "my error message: %w")
๊ฐ ์ ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋์๋ if err != nil
๊ตฌ๋ฌธ์ด ๋ ์งง์ ์ค ๊ธธ์ด ๋๋ฌธ์ ์ฌ์ ํ ์ ํธ๋ ์ ์์ต๋๋ค.
์์งํ ์ ๋ try
์ ๊ณตํ๋ ์์์ ๋ฐํ์ ์ํ์ง ์์ต๋๋ค. ์ ๋ค๋ฆญ์ด ์๋ค๋ฉด ๋์ ๋ชจ๋๋ ๋ฐฉ์์ ๋์์ ์ฌ์ฉํ๋ ์๋ฃจ์
์ ํจ์ฌ ๋ ์ ํธํ ๊ฒ์
๋๋ค.
type Result<T> interface {
Expect(err error) T
OrElse(defaultValue T) T
}
func From<T>(value T, err error) Result<T> { ... }
๋์๊ฒ ์ด๊ฒ์ ํ์ฌ ์ ์๋ ๋ด์ฅ๋ณด๋ค ํจ์ฌ ๊นจ๋ํ์ง๋ง (๊ฐ, ์ค๋ฅ) ๋ฐ Result
์ค๋ฅ๋ฅผ ๋ช
์์ ์ผ๋ก ์ฅ์ํ ๋ฐฉ๋ฒ์ด ์๋ ํ์ฌ try
์ ์์ ๋ด ์๊ตฌ๋ฅผ ์ถฉ์กฑํ์ง ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ์์ํ ์ ์๋ค. ์์งํ code_smell
์ข์ต๋๋ค.
์๋ชป๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ด์น์ ๋ง์ง ์์ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ์๊ฒ ์ต์ํ ์ฝ๋๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์๋๋๋ค.
if err != nil {
return err
}
nil
์ฒ๋ฆฌ ์ค๋ฅ์
๋๋ค. ์ด ํจํด์ ์ด๋ค ์ง์ ์์๋ ์ฒ๋ฆฌ๋ ์ค๋ฅ ๊ฐ์ด ์์ต๋๋ค.
์ด๊ฒ์ ๋ค๋ฅธ ์ธ์ด๋ก ์์ฐํ๋ค๋ฉด Ruby.
begin
some_method_that_raises_an_error
rescue => e # catch any exception
retry e # throw it up again
end
์ด๊ฒ์ golang ์ฝ๋์ ๋์ผํ ๋์์ ์ ๋ฌํฉ๋๋ค. ์์ธ๊ฐ ๋ฐ์ํ์์ ๊ฐ์งํ ๋ค์ ๋ค์ ๋ฐ์์ํต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์คํ์ ๋์ง๋๋ค.
golang์์๋ return
์
๋๋ค.
์ค์ _์ค๋ฅ ์ฒ๋ฆฌ_๋ ์ด๋์์ ๋ฐ์ํฉ๋๊น?
์ฐ๋ฆฌ๋ ๋ชจ๋ ์ด ํจํด์ ์คํจ์ ๋ํด ๋น์ทํ ๊ฒฝํ์ ํ์ต๋๋ค. ์๋ฅผ ๋ค์ด, file not found
์ค๋ฅ๋ฅผ ์์ ํ ๋ค์ ์ด ์ค๋ฅ์ ์๋ _thrower_๋ฅผ ์ถ์ ํ๋ ๋ฐ ๋ง์ ์๊ฐ์ ์๋นํฉ๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐ try
์ ์(๋ฐ ๊ธฐํ)์ ๊ฒฐํจ์ด ์๋ค๊ณ ์๊ฐํ๋ ์ด์ ์
๋๋ค. ์ค์ ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ข์ ํจํด์ด ์์ต๋๋ค.
์ค์ ๋ก ์ค๋ฅ๋ฅผ ๊ฒ์ฌํ๊ธฐ ์ํด err.Error()
๋ฌธ์์ด ๊ฒ์ฌ, ์ ํ ์ฃผ์ฅ ๋ฑ์ ๋ณด์์ต๋๋ค.
์ด ๋ถ์ผ์น์ ๋ํ ํจํด์ด ํ์ํฉ๋๋ค. xerrs
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ ๊ฒ ๊ฐ์ง๋ง ์์ง ์์ ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ err!=nil ์ฒดํฌ๋ฅผ ์๋ ๊ทธ๋๋ก ์ ์งํ๋ ๊ฒ์ ์ง์งํฉ๋๋ค.
์๋นํ ๊ท๋ชจ์ Go ์ฝ๋ ๊ธฐ๋ฐ์ ํํค์น ๋๋ง๋ค ์ด๋ป๊ฒ ํ๋ฉด ์์ฉ๊ตฌ๋ฅผ ์ค์ผ ์ ์์์ง ์๋ฌธํฉ๋๋ค. ๋๋ ํญ์ ๋ค์์ผ๋ก ๋์์ต๋๋ค.
์ด์ ํธ๋์ปค๋ ๋ง์ ๊ฒฝ์ฐ์ ์ ์ฉํ์ง๋ง ์ ์ฉํ์ง ์์ ํ ๊ฐ์ง๋ ๋ณต์กํ ์ฃผ์ ์ ๋ํ ์์ธํ ๋ ผ์์ ๋๋ค. ์ด์ ํธ๋์ปค๋ ์ค๋ ๋ฉ์ ์ ๊ณตํ์ง ์์ผ๋ฉฐ ํน์ ๋ฉ์์ง์ ์๋ตํ๋ ๊ฒ์ด ์ด์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ค์ ์ ์์ด ์๊ณ ๋ค๋ฅธ ์ ์์ ๋ํ ์๋ต์ผ ๋ฟ์ด๋ฏ๋ก ์ด ํ ๋ก ์ golang-nuts ๋ฉ์ผ๋ง ๋ฆฌ์คํธ๋ก ๊ฐ์ ธ๊ฐ ๊ฒ์ ๊ฐ๋ ฅํ ๊ถ์ฅํฉ๋๋ค.
ํ ์ ์๋ค๋ฉด ์ด๊ฒ์ด ๋ต์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด ์๋ก์ด ์ค๋ฅ ์ ์์ ์ธ์ด์ ๋ชฉํ์ ์ง์ ์ ์ผ๋ก ์ถฉ๋ํฉ๋๋ค.
๋ด๊ฐ golang์ ์ข์ํ๋ ์ด์ ๋ ์ ์ด ํ๋ฆ์ ๋จ์์ฑ๊ณผ ๋ช ํํ ์ฌ์ฉ ๋๋ฌธ์ ๋๋ค. Java์์ ๋ด๊ฐ ๊ฐ์ฅ ๊ฒฝ๋ฉธํ๋ ๊ฒ ์ค ํ๋๋ try throw ๊ตฌ์กฐ์ ๋๋ค. ์ ๋ง ์ญ๊ฒน๋ค. ๊ทธ๊ฒ์ ๋์ฐํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์กฐ์ฅํฉ๋๋ค. ํธ์ถ ์คํ ์๋ก ์์ธ๋ฅผ ๋ณด๋ด๋ ๊ฒ์ ์ ์ด ํ๋ฆ์ ์ฒ๋ฆฌํ๋ ๋์ฐํ๊ณ ์ญ๊ฒจ์ด ๋ฐฉ๋ฒ์ ๋๋ค. ๋ฌด์๋ณด๋ค๋ ์์ฒด ๋ฌธ์ํ ๋ฐ ๊ฐ ์ค๋ฅ ์ํฉ์ ๋ช ์์ ์ฒ๋ฆฌ ๋์ ๋ชจ๋ ๊ฒ์ ๊ฑฐ๋ํ ์ํ๋ก ํฌ์ฅํ๊ณ ํ๋ฃจ๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
If err != nil์ด ์ข์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ถ์ฅํ๊ณ ์์ฒด ๋ฌธ์ํ๋๋ฉฐ ํน์ ์ฌ๋ก์ ๋ํ ์ข์ ๋ฌธ์ํ๋ฅผ ๊ถ์ฅํ๋ฉฐ ์์งํ ์ด๊ฒ์ ๋ด๊ฐ go์ ๋ํด ๊ฐ์ฅ ์ข์ํ๋ ๊ฒ ์ค ํ๋์ ๋๋ค. ์ง์ ๋ถํ๊ณ ๋ค์ ๋ชจํธํ ๋ฐํ ๋ฐ ๋งค๊ฐ๋ณ์, ํผ๋์ค๋ฌ์ด ์๋ฏธ๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์๋ก์ด ์ ์ด ํ๋ฆ์ ์ธํฐ๋ฝํธํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋ด๊ฐ ์ข์ํ๊ฒ ๋ ์ธ์ด์ ์ ์ ์ด ์๋๋๋ค .
์ฅํฉํ ๊ฒ์ ๋์ ๊ฒ์ด ์๋๋๋ค. ๋ถํ์ํ ์ฅํฉํจ์ ์์ง๋ง go์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ๋ถํ์ํ์ง ์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ๊ทธ๊ฒ์ ์ธ์ด์ ๋งค๋ ฅ์ ์ผ๋ถ์ ๋๋ค.
๋ ๋์ํ ์ ์์ต๋๋ค. ๋ช ์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ธ์ด IMO์ ๊ฐ์ฅ ์ข์ ๊ธฐ๋ฅ ์ค ํ๋์ ๋๋ค. ๋๋ ํญ์ ๊ทธ๊ฒ์ ๋ํด ๊ท์ฐฎ๊ฒํ๋ ๋ง์ ์ฌ๋๋ค์ด ์์ง ์ต์ํ์ง ์๋ค๊ณ ๋๋๋๋ค.
๋ฌธ์ ๊ฐ ๋ถ๋ฆฌ๋๋ ๊ฒ์ ์ข์ง ์์ง๋ง, ์ด๋ฒ ๊ฒฝ์ฐ์๋ ๋ ๊ฐ์ ์๊ฒฌ์ด ํ๋์ ์๊ฒฌ์ผ๋ก ๋ณํฉ๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
GitHub ํฌํ ์์ด์ฝ์ ๋ ๋ฒ์งธ๋ฅผ ํด์ํ ์ ์์ต๋๋ค.
go์ ๋ช ์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๋ด๊ฐ golang์ ์ฌ๋ํ๋ ์ด์ ์ค ํ๋์ ๋๋ค. ๋๋ ์ ์ด๋ค go ๊ฐ๋ฐ์๊ฐ ๊ทธ๊ฒ์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ํ ์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์๋ก์ด ๊ตฌ๋ฌธ์ ์ถ๊ฐํ์๋ ์ ์์ ๋๋ถ๋ถ ๋ค๋ฅธ ์ธ์ด์์ ์ฌ์ฉ๋๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๋ฐ ์ต์ํ ์ฌ๋๋ค์ ์ ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ต์ํด์ง๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ง๋ง ์ต์ํด์ง๋ฉด ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค.
์ ๋ #32811์ ์ผ๊ณ ์ด ์ ์์ ๋ ์ง์งํฉ๋๋ค... ์ฐจ๋ผ๋ฆฌ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ทธ๋ฅ ๋๊ฒ ์ต๋๋ค. ์ด ์ ์์ ๋ํ ์ด๋ชจํฐ์ฝ ๋ฐ์์ ๋ง์ ๊ฒ์ ๋งํด์ค๋๋ค.
๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ทธ๋๋ก ๋๋ ๋ฐ ๋์ํฉ๋๋ค. ๋ด๊ฐ Go์ ๋ํด ์ข์ํ๋ ๊ฒ ์ค ํ๋๋ ์ธ์ด๊ฐ ์ต์ํ๋๊ณ ์ผ๋ฐ์ ์ผ๋ก ๋งํ๋ฉด ์ผ์ ํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ ๊ตฌ๋ฌธ์ ์ถ๊ฐํ์ฌ ์ฝ๋์ x%๊ฐ ํ์ฌ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ y%๊ฐ ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ์ธ๊ณ๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค. ์ด๋ ์ด๋ฏธ ๋ ผ์๋ ๋ค๋ฅธ ๋ฌธ์ ์ค์์ ์ผ๊ด์ฑ ์๋ ์ฝ๋ ๊ธฐ๋ฐ์ ์์ฑํฉ๋๋ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ๊ธฐ์กด ๊ตฌ๋ฌธ์ด ์ถฉ๋ถ/์ถฉ๋ถํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด ์ค๋ฅ ์ฒ๋ฆฌ ๊ตฌ๋ฌธ์ ๊ฐ์น๊ฐ ์ ์ถฉํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋ด๊ฐ ์ฐพ์ ๊ฒ์ Golang, ๊ฒ๋ค ์ค ํ๋์ ์๋ก์ด ์ฌ๋์ผ๋ก ์ธ์ด์ ๋ํด ์๋ก ๊ณ ์นจํ๋ฉด ๋ช ์ ์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋๋ค. Java, Ruby, Python ๋ฐ Node์์ ๊ฝค ๋ง์ด ์์ ํ์ผ๋ฉฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด Go์์๋ณด๋ค ํจ์ฌ ๋ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค. ๋๋ ์ค๋ฅ๋ฅผ ๋ ๋ชจํธํ๊ฒ ๋ง๋๋ ์ผ๋ถ ์ธ์ด ๊ตฌ์ฑ์ ์ํด ์์๋๊ธฐ๋ณด๋ค ๋ช ํํ '๊ฒฝ๋ก' ์ค๋ฅ๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค.
หreturn ... if ...ห @andreynering ์ ์ ์์ ์ค์ ๋ก ์๋นํ ๋๋ํฉ๋๋ค. ์์ฉ๊ตฌ(ํ ์ค์ง๋ฆฌ)๋ฅผ ์ค์ด๋ ๋์ ์ฝ๋๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์งํฉ๋๋ค(์จ๊ฒจ์ง ์ ์ด ํ๋ฆ ์ค๋จ ์์).
๋์ํฉ๋๋ค. if err != nil
๊ทธ๋๋ก ๋์ญ์์ค.
ํ์ฌ ํ์์ ์ ํธํฉ๋๋ค. ๋ช ํํ๊ณ ๊ฐ๋ฅด์น๊ธฐ ์ฌ์ด ํจํด์ ๋๋ค. ์๋ก์ด ์์ง๋์ด๊ฐ ํ๋์ ๊ฐ๋จํ ํจํด์ ๋ฐฐ์ฐ๊ณ ๋ฐ๋ณตํ ์ ์์ผ๋ฏ๋ก ์๋๋ฅผ ๋์ด๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค. ๋ํ ์ฌ์ฉ์์๊ฒ ์ต์ํ ํ์ฌ ์ปจํ ์คํธ์์ ์ค๋ฅ๋ฅผ ๊ณ ๋ คํ๋๋ก ์์ฒญํ์ฌ ์ต์ํ ์์ง๋์ด๊ฐ ์ฌ๊ธฐ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์์ ์ธ์ ํ๊ณ ๋ด๊ฐ ๋ฌด์์ ํด์ผ ํ๋์ง์ ๋ํด ์๊ฐํด์ผ ํฉ๋๋ค.
๋๋ #32804๋ฅผ ์ผ๊ณ ๋๋ ์ฐจ๋ผ๋ฆฌ ๋ณํ์ง ์๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ์ฝ๋๊ฐ ๊ธธ๋ค๋ฉด ๋ง์ ์ผ์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ๋ง๋ค๋ฉด ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ฒ๋ฆฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋จ์ง ๋ฌผ๊ฑด์ ์ถ๊ฐํ๊ธฐ ์ํด ๋ฌผ๊ฑด์ ์ถ๊ฐํ์ง ๋ง์ญ์์ค.
๋๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋จ์ํจ์ ๊ทธ๋๋ก ์ฆ๊ธด๋ค.
๊ธฐ๋๋ ๋จ์ง ์๋๊ทธ๋จ์ผ ๋ฟ์ด๋ฉฐ ๋๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค. ์์ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ ์ฑ๋ฐฐ๋ฅผ ๋ฐ๊พธ์ง ๋ง์์ฃผ์ธ์.
๋ณด๋ค ๊ฐ์ํ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๋ ์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ์ด ์๋์ ์ผ๋ก ๋ง์์ต๋๋ค(์ฐ๊ฐ ์ค๋ฌธ์กฐ์ฌ์์). Go ํ์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ต๋๋ค.
@icholy ๋ฌผ๋ก ์ ๋๋ค. ํ์ง๋ง ํ์ฌ ์ ์์ ๋ง์ด ๋จ์ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋๋ ํํ๊ฑฐ๋, ๋ ๋ง์ try/catch/finally ์คํ์ผ ๊ตฌํ์ผ๋ก ๋๋๋ฆฌ๊ฑฐ๋, ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ปจํ ์คํธ์์ ์ ์ธํ๊ฑฐ๋, ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ ๋ณต์กํ๊ฒ ๋ง๋๋ ๊ฒ ๊ฐ์ต๋๋ค. Go๋ ๋จ์ํ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ๋ง์ ์ฌ๋๋ค์ด ๊ฐ๋จํ ์ต์ ์ ์ํ์ ๊ฒ์ ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋ง์์ ๋๋ ๊ฑธ ๋ณธ ์ ์ด ์์ด์ ํ์ฌ์ ํจํด์ ์ ์งํ๋ ๊ฒ์ด ๋ ๋์ ์ ํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํ ๊ฐ์ง ๋ถ๋ง ์ฌํญ์ ์ ๋ ฅํด์ผ ํ๋ค๋ ๊ฒ์ด์์ง๋ง ๊ฑฐ์ ๋ชจ๋ ํธ์ง๊ธฐ์๋ ์ฝ๋ ์กฐ๊ฐ์ ์ฝ์ ํ ์ ์๋ ๋ฐ๋ก ๊ฐ๊ธฐ๊ฐ ์์ผ๋ฏ๋ก ํฐ ๋ฌธ์ ๋ ์๋๋๋ค. ์๋ง๋ 1.0 ์ด์ ๋ถํฐ Go๋ฅผ ์ฌ์ฉํ ๋ด ๊ฒฝํ์ผ์ง ๋ชจ๋ฅด์ง๋ง ๋๋ ๋จ์ํจ์ ์ข์ํ๊ณ ์ค๋ณต์ฑ์ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค.
@kevineaton try
์ด ๋ณต์กํ๋ค๊ณ ์๊ฐํ์ญ๋๊น?
๋๋ ์ด๊ฒ์ ์์ ํ ๋์ํฉ๋๋ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ด๋ค ์กฐ์น๋ฅผ ์ทจํด์ผ ํ๋ค๊ณ ํ์ ํ์ง๋ ์์ต๋๋ค. if err != nil
์ํ๊ฐ ์ฒ์์๋ ์ผ๊ตด์ ๋ถํ ๋ ์ด์ํด ๋ณด์ธ๋ค๋ ๋ฐ ๋์ํ์ง๋ง ์ค์ ๋ก ์งํ ์ค์ธ ๋ฐ๋ก ๊ทธ ์ฌํญ์ ๊ด๋ฒ์ํ๊ฒ ์๋ฐํ์ง ์์ผ๋ฉด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ ์์ ๋ณธ ์ ์ด ์์ต๋๋ค. ์ ๋ํ ์ธ๊ธฐ.
@icholy ๋ Go ์ด์ ์ Java์ Python์ ์์ฑํ๋ ๋ฐ 10๋ ์ ๋ณด๋ธ ํ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋น์ ์ด Pokemon ์์ธ ์ก๊ธฐ, ๋๋ ์ฌ๋ฌ ์์ธ์ catch chaining์ ๋ถ๋ช์น๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ ๋ง์ ์ค๋ฒํค๋์ ์์ฉ๊ตฌ๋ฅผ ๋์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ํผํ ์๋ง ์๋ค๋ฉด ๊ทธ ์คํ์ผ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ก ๋์๊ฐ์ง ์์ ๊ฒ์ ๋๋ค. ํนํ ๊ฐ๋ฅด์น ๋ ๊ฑฐ์ ํญ์ ๋ํต๊ณผ ํผ๋์ ์ผ๊ธฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ํ ์ํํธ์จ์ด ์ค๊ณ์๋ก์์ ์ผ์ ์ ๋ฌด ์ธ์ ์ปดํจํฐ ๊ณผํ์ ๊ฐ๋ฅด์น๊ธฐ ๋๋ฌธ์ ์๋ก์ด ๊ฐ๋ฐ์๋ฅผ ๊ฐ๋ฅด์น๊ณ ๋ฉํ ๋งํ๋ ๋ฐ ํธํฅ๋์ด ์์ต๋๋ค. Go๋ฅผ ์ ํํ๋ฉด ๋ ๋ณต์กํ๊ฑฐ๋ ๋ฏธ๋ฌํ ์ค๋ฅ ์ฒ๋ฆฌ๋ณด๋ค ๋จ์ํ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋๋ค.
์ด์ ํธ๋์ปค๋ ๋ง์ ๊ฒฝ์ฐ์ ์ ์ฉํ์ง๋ง ์ ์ฉํ์ง ์์ ํ ๊ฐ์ง๋ ๋ณต์กํ ์ฃผ์ ์ ๋ํ ์์ธํ ๋ ผ์์ ๋๋ค.
_๊ทธ๊ฒ์_ ์ง์ค์ด ์๋๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ ์์ต๋๋ค.
if err != nil
๋ try
๋ฅผ ์ถ๊ฐํด๋ ์ฌ๋ผ์ง์ง ์์ต๋๋ค. try
๋ ์ค๋ฅ ์ ๋ฌ์ด ๋ง๊ฑฐ๋ ๋ง์ ๋ค๋ฅธ ์ค๋ฅ๊ฐ ํ๋์ ์ง์ฐ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ์์ ์ฝ๊ฒ ์์ฝ๋ ์ ์๋ ์ฝ๋ ๊ฒฝ๋ก์ ์ฝ๊ฐ์ ๋ช
ํ์ฑ์ ์ถ๊ฐํ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค. . try
๊ฐ ๋น if-err-return-err
์ ๋ฌด๋ฆฌ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ์ง ์๋๋ก ๊ถ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. try
๊ฐ ์๋ ์๋ ์ค์ ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ฌด์ํ๊ธฐ ์ฝ์ต๋๋ค. ๋๋ try
๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ฌ์ธ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ ์์ง๊น์ง ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ต๊ณ ์ ์ ์ ์ค ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ด ์์ฒญํ์ง ์์ 2์ผํธ, ๊ทธ๊ฒ์ ๊ทธ๋ค์ง "๊ฐ๋" ๋๋์ด ์๋๋๋ค. ๋๋ฌด ๋ง์ ์ ์ด์ด์ ์ฐ๋ฆฌ๋ ๋ช ์์ ๊ตฌ์ฑ๋ณด๋ค ์์์ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค.
Go FAQ์์
Go์ ?: ์ฐ์ฐ์๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
_Go์๋ ์ผํญ ํ ์คํธ ์์ ์ด ์์ต๋๋ค. ๋ค์์ ์ฌ์ฉํ์ฌ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค._if expr { n = trueVal } else { n = falseVal }
Go์์ ?:๊ฐ ์๋ ์ด์ ๋ ์ธ์ด ์ค๊ณ์๊ฐ ์์ ์ด ๋๋ฌด ์์ฃผ ์ฌ์ฉ๋์ด ๊ฟฐ๋ซ์ ์ ์์ ์ ๋๋ก ๋ณต์กํ ํํ์์ ๋ง๋๋ ๊ฒ์ ๋ณด์๊ธฐ ๋๋ฌธ์ ๋๋ค. if-else ํ์์ ๋ ๊ธธ์ง๋ง ์์ฌํ ์ฌ์ง ์์ด ๋ ๋ช ํํฉ๋๋ค. ์ธ์ด ์๋ ์กฐ๊ฑด๋ถ ์ ์ด ํ๋ฆ ๊ตฌ์กฐ ๊ฐ ํฉ๋๋ค .
@ianlancetaylor
์ด์ ํธ๋์ปค๋ ๋ง์ ๊ฒฝ์ฐ์ ์ ์ฉํ์ง๋ง ์ ์ฉํ์ง ์์ ํ ๊ฐ์ง๋ ๋ณต์กํ ์ฃผ์ ์ ๋ํ ์์ธํ ๋ ผ์์ ๋๋ค. ์ด์ ํธ๋์ปค๋ ์ค๋ ๋ฉ์ ์ ๊ณตํ์ง ์์ผ๋ฉฐ ํน์ ๋ฉ์์ง์ ์๋ตํ๋ ๊ฒ์ด ์ด์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ค์ ์ ์์ด ์๊ณ ๋ค๋ฅธ ์ ์์ ๋ํ ์๋ต์ผ ๋ฟ์ด๋ฏ๋ก ์ด ํ ๋ก ์ golang-nuts ๋ฉ์ผ๋ง ๋ฆฌ์คํธ๋ก ๊ฐ์ ธ๊ฐ ๊ฒ์ ๊ฐ๋ ฅํ ๊ถ์ฅํฉ๋๋ค.
ํน์ ๋ฉ์์ง์ ๋ต์ฅํ ์ ์์ต๋๋ค. ๋๋ ๋ฐฉ๊ธ ๋น์ ์๊ฒ ๋๋ตํ์ต๋๋ค. :)
์ฌ๊ธฐ์๋ ์ค์ ์ ์์ด ์๊ณ ๋ค๋ฅธ ์ ์์ ๋ํ ์๋ต๋ง ์์ผ๋ฏ๋ก,
๋์๊ฒ ์ ์์ด๋ ๋ณํ๋ฅผ ์๊ตฌํ๋ ๊ฒ์ ๋๋ค. ์ด ํน์ ๋ฌธ์ ๋ ๋ณ๊ฒฝ ๋ฐฉ์ง์ ๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ์ง _์๋๋ก_ ์ ์ํ์๊ฒ ์ต๋๊น? ๋๋ ์ ์ ์์คํ ์ด ํ๋ฅญํ๋ค๊ณ ์๊ฐํ์ง๋ง ํ์ ์ ์ง๊ฐ ๊ณผ์ ๋ํ๋ฉ๋๋ค.
Java ๋ฐ Python์ ์์ฑํ๋ ๋ฐ 10๋ ์ ๋ณด๋ธ ํ ... ์ ๋ ์ํํธ์จ์ด ์ค๊ณ์๋ก์์ ์ผ์ ์ ๋ฌด ์ธ์ ์ปดํจํฐ ๊ณผํ๋ ๊ฐ๋ฅด์นฉ๋๋ค.
@kevineaton ์๊ธฐ ๊ฑฐ์๊ธฐ ๋นจ๊ธฐ ๋ค ๋์ด?
์ด ๋ฌธ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ตฌ๋ ์ฝ๊ฒ ์ ์์ ๋ํด ์ฐฌ์ฑ ๋๋ ๋ฐ๋ ํฌํ๋ฅผ ํ ์ ์๋ ๋ฐ๊ณต์์ ์ธ ์ฅ์์์ ์ฅ๊ธฐ๊ฐ ์งํ๋๋ ํฌํ์ ๊ธฐ๋ฅ์ ํฉ๋๋ค.
if err != nil
๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ถ๊ฐ ์ธ๋ถ ์ฌํญ์ด ํ์ํ์ง ์์ ์๋ฒฝํ๊ฒ ํฐ ์ ์์
๋๋ค. ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋์, ์ ์ด ๋์ฐํ๊ณ ๊ธธ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ด ํ๋ฆฌ๊ฑฐ๋ ๋์๊ฑฐ๋ ๋ถ์ถฉ๋ถํ์ง ์์ต๋๋ค.
+1, ๋ ๋์ ๊ฒ์ด ์๋ค๋ฉด ์ข์ ๊ฒ์ ์ ๋ง ์ข์ ์คํ ์ถ์ ์ ๋ณด(ํ๋ ์ ๋์ค ํญ๋ชฉ ์ ์ธ)๊ฐ ๋ ๊ฒ์
๋๋ค. x/errors
์ด๋ฏธ ์ด๊ฒ์ ๋ฌ์ฑํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๊น์ด ์ฅ๋์ ๋งํน๊ณผ ๊ฐ์ ์ ์ํ ๊ฒ์ ์ํฉ๋๋ค func
error
+ try
ํค์๋๋ฅผ ๋ฐํํ๋ throws
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ
func a() (int) throws {
throw &someError{}
}
anInt, err := try a()
@icholy ์ ๋ง
ํ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ฌ๋์ด ์ค์ํ๊ธฐ ์ฝ์ต๋๋ค. ํ์ฌ err
๋ฅผ ํ์ธํ๋ ๊ฒ์ ์์ด๋ฒ๋ฆฌ๊ธฐ ์ฝ์ต๋๋ค. ๋ฒ์์ ์ด๋ฏธ ๊ฒ์ฌ๊ฐ ์๋ ๊ฒฝ์ฐ(๋๋ถ๋ถ์ ๊ฒฝ์ฐ) ์ปดํ์ผ๋ฌ๋ unused variable
์ข
๋ฃ๋์ง ์์ต๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๋ ์๊ฒฉํด์ผ ํฉ๋๋ค. _
์ค๋ฅ๋ฅผ ํ์ธํ๊ฑฐ๋ ์ค๋ฅ๋ฅผ ํ์ธํ์ญ์์ค.
@kevineaton
try
์ด ๋ณต์กํ๋ค๊ณ ์๊ฐํ์ญ๋๊น?
try
๋ ์ฝ๋ ๋์์
๋๋ค. ํ ์ง์ ์ด ์๋ ์ ์ฒด ์ฝ๋ ๋ธ๋ก ์ฌ์ด์ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ๊ฐ์ ํฉ๋๋ค. ๊ฒ๋ค๊ฐ ์์ธ ์ฒ๋ฆฌ์ "๋ฒ๋ธ์
(bubble-up)" ํน์ฑ์ ์ฝ๋ ๋ฐ ์ฌ๋ฌ ์ข
๋ฃ ์ง์ ์์ ์ฌ์ค์ ๋น๊ฒฐ์ ์ ๋์์ ์์ฑํฉ๋๋ค.
try
๋์ ์ฌ๋ฌ ๋ฐํ ๊ฐ์ ์ฌ์ฉํ๋ ์ฅ์ ์ ํจ์๊ฐ ์๋ฃ๋ ๋ ํ์ธํ ๊ฐ์ด ํ๋ ์๊ณ ํจ์์ ์ข
๋ฃ ์ง์ ์ด ํ๋ ์๋ค๋ ๊ฒ ์
๋๋ค(๋ฌผ๋ก ๊ฐ๋ ๋ฌธ์ด๋ ๊ธฐํ ๋ช
์์ ๋ฐํ์ ์ฌ์ฉํ์ง ์๋ ํ).
try
๋ธ๋ก์ ๋ค์ค ๋ฐํ์ ์ ์ฒด ๋ชฉ์ ์ ๋ฌดํจํํฉ๋๋ค.
@fillest ์ฝ๋ ๊ฐ๋ ์ฑ์ด ์กฐ๊ธ
ํ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ฌ๋์ด ์ค์ํ๊ธฐ ์ฝ์ต๋๋ค. ์๊ฐ์ ์ค๋ฅ๋ฅผ ํ์ธํ๋ ๊ฒ์ ์๋ ๊ฒ์ ์ฝ์ต๋๋ค. ๋ฒ์์ ์ด๋ฏธ ๊ฒ์ฌ๊ฐ ์๋ ๊ฒฝ์ฐ(๋๋ถ๋ถ์ ๊ฒฝ์ฐ) ์ปดํ์ผ๋ฌ๋ ์ฌ์ฉ๋์ง ์์ ๋ณ์๋ก ์ข ๋ฃ๋์ง ์์ต๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๋ ์๊ฒฉํด์ผ ํฉ๋๋ค. _ ์ค๋ฅ๋ฅผ ํ์ธํ๊ฑฐ๋ ํ์ธํด์ผ ํฉ๋๋ค.
@fillest ์ค๋ฅ ์ฒ๋ฆฌ์ ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ "๋ ๊ทธ์ํ "์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ณ ์ค๋ฅ๋ฅผ ๋๋ฆฌ๊ฒ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ๋๋๋ฌ์ง๋๋ค.
๋๋ ์ ๋ค๋ฆญ ๋ถ์กฑ, ์์ฉ๊ตฌ ์ฑํฅ, GC, ๋ฆฌ์์ค ์ ํ/ํ๊ณ ๋ถ์กฑ ๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ํ๋ ์ผ์ ์ดํดํ์ง ๋ชปํ๋ PHP ๋ฉ์ฒญ์ด๋ค๋ก๋ถํฐ ์์ฑ๋ ์ํฌ๋ก๋ ๋๋ฌธ์ Go ์ฌ์ฉ์ ์ค๋จํ์ต๋๋ค. Haskell, C# ๋ฐ ๊ธฐํ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ฝค ์ ํด๊ฒฐํ์ต๋๋ค... Go 2 ์ ์์ด ์ด์ ๊ณผ ๊ฐ์ด ๋ช ์์ ์ธ ๋์๋ฌธ์ ์ฒ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ(ํ์คํ์ง ์์) ๊ด์ฐฎ์ ๋ณด์ ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ๋ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ ๋๋ค. ๋น์ฆ๋์ค ๋ก์ง์ ๋ชจ๋ธ๋งํ๋ ๊ฒ์(์๋ฌด๋ฆฌ ๋ณต์กํ๋๋ผ๋) ์ด ๋ก์ง์ด ์์ฑํ๋ ์๋ชป๋ ์กฐ๊ฑด์ ์๋ตํ๋ ๊ฒ๋ณด๋ค ํญ์ ๊ฐ๋จํฉ๋๋ค. ๋จ์ํ ์ค๋ฅ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ์ฝ๋ ๋์์ ๋๋ค. Go๊ฐ ์ด๋ฌํ ํ๋์ ์ฅ๋ คํ์ง ์๊ณ ์ค๋ฅ ๊ด๋ฆฌ ํจํด์ ์ฅ๋ คํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ด๋ณด์๋ ์ค๋ฅ ๊ด๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์ค์ ์ง์ค์์ธ์ง ๊นจ๋ซ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ด ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋์ ํผ๋๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
try
๋ด์ฅ์ ์ค๋ฅ๋ฅผ ๊ฐ์ธ๊ณ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ฝ๊ฐ์ ๋์์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค.
try
๋ค์ ์ฐ๊ธฐ ์ ์ :
_, err := doSomething()
if err != nil {
return nil, errors.Wrap(err, "failed to do something")
}
_, err = doOtherThing()
if err != nil {
return nil, errors.Wrap("failed to do the other thing")
}
try
๋ค์ ์์ฑํ ํ์ ๊ฒฐ๊ณผ๋ฅผ ์์ํด ๋ณด์ญ์์ค.
try
์ด๋ฏธ ์ธ์๋ฅผ ๊ดํธ๋ก ๋ฌถ์ด 1์ธ์ ํจ์์ฒ๋ผ ์๋ํ๋ฏ๋ก ์ค๋ฅ ๋ํ ์ฝ๋์ธ ๋ ๋ฒ์งธ ์ธ์๋ฅผ ๋ฐ์๋ค์ผ ์ ์์ต๋๋ค.
try(extract_value(try(get_data(1), errors.Wrap(err, "failed to get data")), errors.Wrap(err, "failed to get data")))
err
๊ฐ์ด ์์์ ์ผ๋ก ๋์
๋์ด์ผ ํ๋ ๊ฒฝ์ฐ(์์์ ์ธ ๋ฐฉ์์ผ๋ก). ๊ทธ๋ฐ ๋ค์ try
๊ฐ 1-์ธ์ ํจ์๋ก ์ฌ์ฉ๋๋ฉด ๋ณ๊ฒฝ๋์ง ์์ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
๋์ํฉ๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์กฐ๊ธ ๋ ๋จ์ํ๊ฒ ๋ง๋ค ์ ์๋ ์ ์ผํ "๊ตฌ๋ฌธ์ ์คํ"์ ํจ์์์ ์ฌ๋ฌ ๋ฐํ์ด ์์ ๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค... ๋ฐ์ค์ ๋ฐํ ์ ํ์ด ๋ฌด์์ด๋ ๊ธฐ๋ณธ๊ฐ์ผ ๋ฟ์ ๋๋ค.
if err != nil {
return _, _, err
}
@sorenvonsarvort ๋์๊ฒ ๊ทธ๋ ๊ฒ ๋์์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
var errContext string
defer func() {
// err is a named return
if err != nil {
err = fmt.Errorf("%v: %w", errContext, err)
}
}()
errContext = "failed to do something"
_ := try(doSomething())
errContext = "failed to do other thing"
_ := try(doOtherThing())
๋ด ์ดํด์ ๋ฐ๋ฅด๋ฉด ์ฝ๋์ ํน์ ์น์
์ ๋ํด ๋ ๋ช
ํํ๋ค๋ฉด if err != nil { ... }
๊ณ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
try
๋ ๋ค๋ฅธ ๊ฒฝ์ฐ์ ๋น๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์์ํด๋ณด์ญ์์ค.
func trySomeComplexOp() (r result, err error) {
a := try(step1())
b := try(step2(a))
c, d := try(step3(b))
return try(lastStep(c, d)), nil
}
์์ ์ฝ๋์ ๊ฐ์ ์ฝ๋๋ if err != nil
๋ธ๋ก์ ๋ฟ๋ ค์ผ ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊นจ๋ํ ์ ์์ต๋๋ค. Go๋ "์ ํ ๊ฐ๋
์ฑ"์ ๊ดํ ๊ฒ์ด๋ฏ๋ก try
๊ฐ ๊ทธ๋ฐ ๋ฐฉํฅ์ผ๋ก ์ ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ณด๋ค ๊ฐ์ํ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๋ ์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ์ด ์๋์ ์ผ๋ก ๋ง์์ต๋๋ค(์ฐ๊ฐ ์ค๋ฌธ์กฐ์ฌ์์). Go ํ์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ ์์์ ๋ณด์ปฌ์ด๋ฉฐ ๊ทธ๋ค ์ค ์๋น์๋ Go๋ฅผ ์ฌ์ฉํ์ง๋ ์์ต๋๋ค.
@sirkon ๊ทธ ์ง์ ์ ๊ทผ๊ฑฐ๋ ๋ฌด์์ ๋๊น?
@sorenvonsarvort ๋์๊ฒ ๊ทธ๋ ๊ฒ ๋์์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์์ ์ฝ๋์ ๊ฐ์ ์ฝ๋๋
if err != nil
๋ธ๋ก์ ๋ฟ๋ ค์ผ ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊นจ๋ํ ์ ์์ต๋๋ค. Go๋ "์ ํ ๊ฐ๋ ์ฑ"์ ๊ดํ ๋ชจ๋ ๊ฒ์ด๋ฏ๋กtry
๊ฐ ๊ทธ๋ฐ ๋ชฉ์ ์ผ๋ก ์ ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฌ์์์์๋ ์ด๊ฒ์ ยซัะบะพะฝะพะผะธั ะฝะฐ ัะฟะธัะบะฐั ยป๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. Google ๋ฒ์ญ์ ์ฌ์ฉํ์ฌ ์๋ฏธ๋ฅผ ์ป์ผ์ญ์์ค.
์์ง ์ฝ์ง ์์ ์ด ์ค๋ ๋์ ๊ฒฝ์ฐ ์๋ try
์ ์ ๋ฌธ์ ์ ๋ํ ์ด ์๊ฒฌ ์ ์ฝ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์ค๋ฅ ์ปจํ
์คํธ ๋ชจ๋ฒ ์ฌ๋ก์ ์ด๋ฅผ try
๋ก ํํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช
ํฉ๋๋ค.
๋๋ ์๋ง๋ ์ค๋ฅ ์ปจํ ์คํธ๊ฐ Go ์ปค๋ฎค๋ํฐ์์ ์ฝ๊ฐ ๋ ๋จํ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ด๊ฒ์ ๋น ์ก๊ณ ๋ด ์ค๋ฅ๋ฅผ ๊ณผ๋ํ๊ฒ ๋งฅ๋ฝํํ์ฌ ๋ฉ์์ง๊ฐ ๋งค์ฐ ๊ธธ๊ณ ๋ฐ๋ณต์ ์ด๋ฉฐ ์ฝ๊ธฐ ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ค๋ฅ๋ฅผ ๋งฅ๋ฝํํด์ผ ํ ๋์ ํ์ง ๋ง์์ผ ํ ๋์ ๊ด๋ จํ์ฌ ๋ง์ ๋์์ค๊ฐ ์์ต๋๋ค.
try
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ๋ก ๊ฐ๊ธฐ์ด๋ฉฐ ์ผ๋ถ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ฌ์ค๋๋ค. ๊ทธ๋ฌ๋ ์ถ๊ฐ ์ ๋ณด๋ก ์ค๋ฅ๋ฅผ ๊ฐ์ ์ ์๋ ๋ฅ๋ ฅ์ ์๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ์ ์์ต๋๋ค.
f := try(os.Open(filename))
๋๋ค
f := try(os.Open(filename), "open data file")
๋ฌผ๋ก , ๊ทธ๋ณด๋ค ๋ ๋ง์ ์์
์ ์ํํด์ผ ํ๋ ๊ฒฝ์ฐ err != nil
๊ฒ์ฌ๋ฅผ ์ํํ๋ "์ ์ฒด" ๋ฐฉ๋ฒ์ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด์ ๋์ํ์ง๋ง ์ต์ข ์๊ฒฌ์ ๋ฃ๊ธฐ ์ ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ ๋ง์ด ๊ฒฝํํด ๋ฌ๋ผ๋ go ํ์ ์์ฒญ์ ์กด์คํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ณํ์ ๋ํ ๋์ ์๋น ๊ฒฝํ์ ๊ทธ๊ฒ์ด ์ ๋ง๋ก ๋ถํ์ํ๋ค๋ ๊ฒ์ ๋ท๋ฐ์นจํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๊ฐ๊ฐ ์ฝ 10,000๊ฐ์ ๋ผ์ธ์ด ์๋ 2๊ฐ์ "์ค์ " ํ๋ก๊ทธ๋จ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋ ํ๋ก๊ทธ๋จ ๋ชจ๋์์ tryhard ๋ฅผ ์คํ tryhard
๋ ๊ทธ ์ค ํ๋์์ try
๋ฅผ ์ฌ์ฉํ ์ ์๋ 1๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์์ง๋ง ๊ทธ๊ฒ ์ ๋ถ์
๋๋ค.
๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋์ ๋ค๋ฅด๊ฒ ์ค๋ฅ๋ฅผ ์ทจ๊ธํ ์ ์์์ ์ธ์ ํ๊ณ try
๊ฐ ๊ธ์ ์ ์ธ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ค๋ ๊ฐ๋ฅ์ฑ์ ์ธ์ ํฉ๋๋ค. tryhard
์์ค ์ฝ๋ ์์ฒด์๋ return err
์ ์ฐ์์ ์ธ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. try
๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋
์ฑ์ด ๊ทธ๋ค์ง ์์๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ฉ์ด ๊ฐ๋
์ฑ์ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ์ค์ฉ์ด ๋๋ ต์ต๋๋ค. ์ฌ๊ธฐ์ ์ข์ ์๊ฐ ์ ๊ณต
๋ํ ์ฌ๋๋ค์ด ์ค์ค๋ก go๋ฅผ ํ๋ก๊ทธ๋๋ฐํ์ง ์๋๋ผ๋ ์ผ๋ฐ์ ์ผ๋ก go ์ฝ๋๋ฅผ ์ฝ์ ์ ์๋ ๋ฐฉ์์ ์ข์ํฉ๋๋ค. ์ด๊ฒ์ ๊ทธ๋ค์ด ๋ค๋ฅธ ์ธ์ด์์ ๋ณธ ๋ค๋ฅธ try
์ ๋ค๋ฅธ ์ผ์ ํ๊ธฐ ๋๋ฌธ์ ํนํ try
๊ฐ ํ๋ ๋ง๋ฒ์ ๋ฐฐ์์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์ธ์ด๋ฅผ ์ฒ์ ์ ํ๋ ์ฌ๋๋ค์๊ฒ๋ ํด๋น๋๋ฉฐ, "ํ์ํ ๊ธฐ๋ฅ๋ง"์ด ์๋ ๋จ์ํจ์ ์๋์ค๋ฝ๊ฒ ์ฌ๊ธฐ๋ ์ธ์ด๋ก ๋ฐฐ์์ผ ํ๋ ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์
๋๋ค.
๊ธฐ๋ค๋ฆฌ๊ณ ๋ณด์. ์ด ๋ณ๊ฒฝ ์ฌํญ์ ๋ ๋ง์ด ์คํํด ๋ณด๊ฒ ์ต๋๋ค. ํ์ง๋ง ๋ด ์์น๊ฐ ๋ณ๊ฒฝ๋ ์ง ํ์ ํ์ง ๋ชปํฉ๋๋ค.
๋ณด๋ค ๊ฐ์ํ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๋ ์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ์ด ์๋์ ์ผ๋ก ๋ง์์ต๋๋ค(์ฐ๊ฐ ์ค๋ฌธ์กฐ์ฌ์์). Go ํ์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ต๋๋ค.
@icholy ๋ด๊ฐ ๋งํ๋ฏ์ด, ๋๋ ์ค๋ฅ์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฐ ์ ์์ "๋ ๊ฐ์ํ๋ ์ค๋ฅ ์ฒ๋ฆฌ"๋ ํด๋น ์ปจํ
์คํธ๋ฅผ ์ ๊ณตํ๊ณ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ ๋ ๋์ ๋ฐฉ๋ฒ์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ด ์ค๋ฅ์ ์ถ๊ฐํ ๋ชจ๋ ์ปจํ
์คํธ์์ ์ค๋ฅ๊ฐ ์๊ฐ ์ด๊ณผ๋ก ์ธํด ๋ฐ์ํ ๊ฒฝ์ฐ "์ปจํ
์คํธ"๋ฅผ ๋ฌป๋ ๊ฒ์ ๊ฐ๋จํด์ผ ํฉ๋๋ค. ํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก pkg/error
๋ฅผ ์ฌ์ฉํ๊ณ , ์์ ๋ง์ "์ค๋ฅ ๊ตฌ์กฐ"๋ฅผ ๋ง๋ค๊ฑฐ๋ ๊ตฌํ์ ๋ฐ๋ผ ๋ฌธ์์ด ๊ฒ์์ ์์กดํ ์ ์๋ ์์
๋ฐฉ๋ฒ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๊ธฐ๊ปํด์ผ ์์ฃผ ๊ฐ๋ if
ํ๋๋ฅผ ์ ์ฝํ๋ ๊ฒ๋ณด๋ค ์ ์ฒด ๊ตฌ์กฐ์ฒด์ ๋ฉ์๋๋ฅผ ๋ง๋๋ ๋ฐ ๋์์ด ๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ์ ๋งํ๋ฏ์ด ์ด ๋ณ๊ฒฝ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ฅ๋ฅผ ์ค์ ๋ก ์ฒ๋ฆฌํ์ง ์๋ ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ ๋ ์ด๋ฅผ "์ค๋ฅ ์ฒ๋ฆฌ"๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ต๋๊น?
try
์ด ๋ณต์กํ๋ค๊ณ ์๊ฐํ์ญ๋๊น?
try
๋ฅผ ๋ฐ๋ก๋ฐ๋ก ๋ณด๋ฉด ๋ณต์กํ์ง ์์ง๋ง ์ธ์ด ๋ณ๊ฒฝ์ ๋ฐ๋ก ๊ณ ๋ คํ์ง ์์ต๋๋ค. ๊ณ ๋ คํ๋ค:
if err != nil {return ... errors.Wrap() }
๋ฅผ ๋์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ ์งง์์ try
์ฌ์ฉ์ผ๋ก ์ธํ ๊ฐ๋
์ฑ ๊ฐ์๋๋ ์ค๋ฅ๋ฅผ ํ์ธํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ๋ณด๋ค ๋จ์ํจ(์ค๋ฅ๋ฅผ ํ์ธํ๋ ๋จ์ผ ๋ฐฉ๋ฒ์ ๊ฐ๋ ๊ฒ)์ด ๋ ์ค์ํ๋ค๋ ๊ฐ์ ์ ์๊ธฐํฉ๋๋ค.
์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ go์ ๋ฐฉ๋ฒ์ ํด๋น ์ ์ญ ๋ฌธ์ ํตํ ๊ฒ์ด ์๋๊ณ ์ด๊ฒ์ด ๋ฌด์๋์ด์ผ ํ๋ ๊ฒ์ด๋ผ๋ฉด ํจ๋ ์ํฉ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋ฉ๋๊น? ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ด ์ค๋๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ์ง๋ง ๋ฌด์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ง์ํฉ๋๋ค.
try
์ ์์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น?
์ด์ ๋์์ ์ฌ์ฉํ๊ฑฐ๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด์ ๋ฐฉ์์ ๋ค์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? try
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ชฉ์ ์นผ์ ๋๊ณ ๋๋ฅด๋ ์ฌ๋์ด ์์ต๋๊น?
try
๊ตฌ๋ฌธ์ ๊ฐ๋จํ๊ณ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ด๋ ์๋ฆ๋ค์ด ๋ฐฉ๋ฒ์
๋๋ค. gopher๊ฐ ์๋์ฆ ๋ฐฉ์์ ์ข์ํ๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ธ๋ก์ด ํ ์ค์ ๋จ์ ์์ผ๋ฉด ํ ๋ฌธ์ฅ์ผ๋ก gofmt๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๊ทธ๋ ๊ฒ ํ๋ฉด ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ 3์ค์ด ์๋ ํ ์ค๋ง ์ฒ๋ฆฌํ๋ ๋ํ๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ฐจ์งํ๋ ์์ง ๊ณต๊ฐ์ด ์ค์ด๋ค๊ณ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํ๊ท ํจ์์์ ์์ง ๊ณต๊ฐ์ ์ ๋ฐ ์ด์์ ์ฐจ์งํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
// we already have an err in scope
err = frub.Confozzle(foo, bar, baz)
if err != nil { return errors.Wrap(err, "confozzling didn't work") }
๋๋ ์๋ง๋ ์ค๋ฅ ์ปจํ ์คํธ๊ฐ Go ์ปค๋ฎค๋ํฐ์์ ์ฝ๊ฐ ๋ ๋จํ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ด๊ฒ์ ๋น ์ก๊ณ ๋ด ์ค๋ฅ๋ฅผ ๊ณผ๋ํ๊ฒ ๋งฅ๋ฝํํ์ฌ ๋ฉ์์ง๊ฐ ๋งค์ฐ ๊ธธ๊ณ ๋ฐ๋ณต์ ์ด๋ฉฐ ์ฝ๊ธฐ ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ค๋ฅ๋ฅผ ๋งฅ๋ฝํํด์ผ ํ ๋์ ํ์ง ๋ง์์ผ ํ ๋์ ๊ด๋ จํ์ฌ ๋ง์ ๋์์ค๊ฐ ์์ต๋๋ค.
์ค๋ฅ ๋ํ ๋ฐ ์คํ ํ๋ ์/์ค๋ฅ ์ธ์ ์์ ์ ํจ์ฌ ๋ ๊ฐ๋จํด์ง๋๋ค. ์๊ฐ์ด ์ง๋๋ฉด ์ด์ ๋ํ ์ข์ ์๋ฃจ์ ์ด ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ์ง๊ธ์ ์๋๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋๋จธ์ง ๊ธฐ๋ฅ์ ์ค๊ณํ ๋ ์ ์ฌ์ ์ผ๋ก ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋งค๊ฐ๋ณ์ ๋คํ์ฑ์ด ํด๊ฒฐ๋ ๋๊น์ง ๋ ๊ฐ๋ ฅํ go2 ๊ธฐ๋ฅ์ ๋์ ํ๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
๊ทธ๋๋ก ๋๋ ๊ฒ์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ์ฝ๊ฐ ๋๋ฌด ์ฅํฉํ์ง๋ง ๋ฐ๋ผํ๊ธฐ์๋ ๊ฝค ๊ฐ๋จํฉ๋๋ค.
์ค์ผ ์๋ง ์๋ค๋ฉด
if err := foo.x(a, b); err != nil {
return err
}
if err := foo.y(); err != nil {
return err
}
if err := foo.z(c); err != nil {
return err
}
๋ญ๊ฐ์
if err := check foo.x(a, b), foo.y(), foo.z(c); err != nil {
return err
}
๊ด์ฉ๊ตฌ๋ฅผ ๋๋ฌด ๋ง์ด ๋ณ๊ฒฝํ์ง ์๊ณ IMHO๋ ์ข์ ๊ฒ ์ ๋๋ค.
@henvic ๋๋ ๋น์ ์ด ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ธ ๊ฐ์ง ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ๊ฐ์ ํ๋ค๋ ๊ฒ์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. Go๋ ๊ฐ ์ค๋ฅ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๋๋ก ๊ฐ์ํฉ๋๋ค. ๋ณ๋์ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ํ๋ฉด ์ด๋ฅผ ๋ช ํํ๊ฒ ์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ํ๋๋ก ํตํฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ธ์ง์ ์ผ๋ก ๋์๊ฐ ํ์ธํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ์ค๋ฅ๋ฅผ _์ ๋ง_ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ ๊น์? ๋๋ ์ด ์ ์์ ํตํด ์ฐ๋ฆฌ๊ฐ ๋ช ํ์ฑ์ ์์ด๋ฒ๋ฆฌ๊ณ ๋ช ๋ฒ์ ํค ์ ๋ ฅ์ด ๋ํ ์ค๋ฅ์ ๋ํด ๊ฐ์ ๋ก ์๊ฐํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@sanbornm , ๋น์ ์ด ๋ง์ต๋๋ค. ๋๋ ๋์ํ๋ค.
์ด check
๋ checkNonZero
์ฐ์ฐ์์ผ ์ ์์ต๋๋ค. ์ด ์ฐ์ฐ์๋ ๋ฐํ ์ธ์๋ฅผ ํ๋๋ง ์ฌ์ฉํ๊ณ 0์ด ์๋ ์ฒซ ๋ฒ์งธ ๊ฐ(์: null)์์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ฌด ๋ชจํธํ๊ณ ์ธ์ด์ ํจ์ฌ ๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์๋ฅผ ๋ค์ด io.EOF๊ฐ ์์๋๋ ๊ฒฝ์ฐ ์ฌ์ฉํด์๋ ์ ๋๋ค๋ ํํธ๋ฅผ ์ฝ๊ฐ๋ง ์ค ๋ฟ์
๋๋ค. ๋ ๋ค๋ฅธ ๊ฐ๋ฅ์ฑ์ ์๋ง๋ go vet
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ(์: ํ์ดํ์์ ์ฝ์ ๋ io.EOF)๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ์
๋๋ค... ํ์ง๋ง ์ด ์์ด๋์ด๋ ์ ๋ค๋ฆฌ์ง ์์ต๋๋ค. ๋ชจ๋ ๋์๊ฒ.
try
์ ์์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น?
์ด์ ๋์์ ์ฌ์ฉํ๊ฑฐ๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด์ ๋ฐฉ์์ ๋ค์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?try
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ชฉ์ ์นผ์ ๋๊ณ ๋๋ฅด๋ ์ฌ๋์ด ์์ต๋๊น?
try
๊ตฌ๋ฌธ์ ๊ฐ๋จํ๊ณ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ด๋ ์๋ฆ๋ค์ด ๋ฐฉ๋ฒ์ ๋๋ค. gopher๊ฐ ์๋์ฆ ๋ฐฉ์์ ์ข์ํ๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ณต๋์ฒด ์์ ์ด๊ณ ์์ต๋๋ค. ๋งค์ผ ๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ฑํ ๋ง์ ์ฝ๋๋ก ์์ ํฉ๋๋ค. ๊ทธ๋์ ์ธ์ด์ ๋ณํ๋ ๋ด๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ์๋๋ผ๋ ๋์๊ฒ ์ํฅ์ ๋ฏธ์น ๊ฒ์ ๋๋ค.
๋๊ท๋ชจ ํ๋ก์ ํธ์์ ์ต์
์ ๋ก๊ทธ๋ "Pokemon" ์์ธ ํธ๋ค๋ฌ๊ฐ ์ฒ๋ฆฌํ ๋๊น์ง ์๋ฌด ๊ฒ๋ ํฌ์ฐฉํ์ง ๋ชปํ ์ผ๋ฐ new Exception()
๋ฅผ ๋์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ์ถํ๋ ๋๊ตฐ๊ฐ ์์ฑํ๋ ๊ฒ์ ์์ด๋ฒ๋ฆฐ ํจ์์ ์ํด ์์ฑ๋ฉ๋๋ค. ์ผ๋ฐ ์ค๋ฅ๋ฅผ ๊ธฐ๋กํ์ต๋๋ค. ๋ ๋ฒ์งธ๋ก ๋์ ๊ฒ์ ๋์ผํ์ง๋ง ์๋ฐฑ ์ค์ ์คํ ์ถ์ ์ด ๋ถ๊ฐํดํ ๊ด๊ณ๋ก ๊ฒฐ๊ตญ ์์ธ์ ํ์
ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค(๋คํํ github.com/<us>/<ourproject>
๊ฒ์ํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋๋ถ๋ถ์ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ง๋ง ๊ฐ๋ ๋ง์ด). ์ด๋ฆ์๋ ๋ถ๊ตฌํ๊ณ "์์ธ"๋ ํฐ Java ํ๋ก์ ํธ์์ ๋น์ฐธํ ์ ๋๋ก ์์ธ์ ์
๋๋ค.
ํํธ, ์ค๋ณต ์ปจํ
์คํธ๊ฐ ๋ง์ ๊ฒฝ์ฐ์๋ "narf: Error unpoiting the zort: foo: Unexpected bar in baz: {\"ork\": \"morpork\"}"
์ ๊ฐ์ ๊ฐ๋จํ Go ์ค๋ฅ ๋ฌธ์์ด์ (๋ด ๊ฒฝํ์) ์ค์ํ ์ปจํ
์คํธ๋ฅผ ์ค์ ์ค๋ฅ ๊ฐ. ์ค์ํ ์ปจํ
์คํธ๊ฐ ๋๋ฝ๋ ๊ฒ์ผ๋ก ํ๋ช
๋๋ฉด ์ด๋ _๋ํ_ ์ผ๋ฐ์ ์ผ๋ก ์๋นํ ๋ถ๋ช
ํฉ๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ "์์ "์ ๋ ๋ง์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ๋ค๋ฅธ ์ค๋ฅ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด๋ฏ๋ก ์๋ฒฝํ์ง๋ ์์ง๋ง ๊ท ํ์ ์ ์งํ๋ฉด์ ์คํ ์ถ์ ์ ์คํฌ๋กคํ๊ฑฐ๋ "throw"์ ๋ํ ์ข
์์ฑ์ ์ข
์์ฑ์ ์์กดํ๋ ๊ฒ๋ณด๋ค ์ฌ์ ํ ์ด๊ฒ์ ์ ํธํฉ๋๋ค. " ๋๋ "๋ฐ์" ์ ์์ ์ธ ์ค๋ฅ ๋ฉ์์ง. panic()
๋ผ๋ ์ด๋ฆ์ด ๋๋ถ๋ถ์ Go ๊ฐ๋ฐ์๊ฐ ๋ณธ์ง์ ์ผ๋ก ๋์ผํ ์ธ์ด ๊ธฐ๋ฅ์ ์์ ๋กญ๊ฒ ๋ฐฐํฌํ๋ ๊ฒ์ ๋ง๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ ๋ํด ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. error
์ panic
๊ฒฐ๊ตญ ๊ฐ์ ๊ฒ์ผ๋ก ๋ง๋ค์ง ๋ง์๋ค.
๋๋ ๋๋๋ก ํจ์์ 12๊ฐ ์ ๋์ ์คํจ ๋ชจ๋๊ฐ ์๊ณ ๊ทธ ๋๋ถ๋ถ์ด ๋์ผํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์๊ฒฉ์ด ์๋ ์ํฉ์ ๋ถ๋ช์ณค์ต๋๋ค. ๋ฐ๋ณต์ ์ ๋ฅผ ๊ท์ฐฎ๊ฒ ํ์ง ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์ ํฌ ํ์๋ ๊ท์ฐฎ๊ฒ ํ๋ ๋ค๋ฅธ ์ฌ๋์ด ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ธ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํจ์ ์์ ์ ํด๋ก์ ๋ฅผ ์ ์ธํ์ฌ ์ ์ถฉํฉ๋๋ค.
func foo(a, b, c SomeArgType) (x, y, z SomeReturnType, err error) {
handleError := func(handleErr error) (x, y, z SomeReturnType, err error) {
log.WithFields(logrus.Fields{
"package": "foo",
"func": "foo",
"arguments": map[string]SomeArgType{"a": a, "b": b, "c": c},
"error": handleErr,
}).Error("Error fooing the bar")
return reasonable, default, values, handleErr
}
err := doABunchOfThings()
if err != nil {
return handleError(err)
}
}
๋ฌผ๋ก ์ด๊ฒ์ _์ฌ์ ํ_ ์ด๋ค ๋ฉด์์ ๋ถ์์ ํ ์๋ฃจ์
์
๋๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ์ ์ด ํ๋ฆ์ด ๋๋ฌด ๋ง์ด ๋ฐ์ด๋ค๋์ง ์๊ณ ๋ ๋ฏธ๋์ ๊ฐ๋ฐ์๊ฐ foo
๊ฐ ์ธ์ ๊ทธ๋ฆฌ๊ณ ๋ฌด์์ ๋ฐํํ๋์ง ์ดํดํ ์ ์๋ค๋ ์ ์ด ๋ง์์ ๋ญ๋๋ค.
์ด๋ป๊ฒ ํด์๋ ์ด ๋ฐ๋ณต "๋ฌธ์ "๊ฐ ํ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ณต์กํ ํจํค์ง์ ํ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ณต์กํ ์์์ ๊ธฐ๋ฅ์ ๊ตญํ๋์ง ์๊ณ ์๋ง์ ํจํค์ง ์ ์ฒด์์ ๋งค์ฐ ์ผ๋ฐ์ ์ด๋ผ๋ฉด ํ๋ก์ ํธ ์ ์ฒด์ "ํํฐ"๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋น์ทํ ๋, ๊ทธ๋ฆฌ๊ณ (ํ์จ) ๋งค๊ฐ๋ณ์ ์ ํ์ ๊ฐ๋ ์ด ์ธ์ด์ ์ถ๊ฐ๋๋ฉด try/catch์ ์์กดํ ํ์ ์์ด ์ค๋ฅ ์ฒ๋ฆฌ ๊ณต์ฅ ๋ค์ ํจ์ฌ ๋ ์์ธํ ์ ๋ณด๋ฅผ ์จ๊ธธ ์ ์์ต๋๋ค.
@thomasf
์ค๋ฅ ๋ํ ๋ฐ ์คํ ํ๋ ์/์ค๋ฅ ์ธ์ ์์ ์ด ํจ์ฌ ๋ ๊ฐ๋จํด์ง๋๋ค.
๋๋ ๋์ํ๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ ํ๋ผ๋ฉํธ๋ฆญ ๋คํ์ฑ์ด ๋๋จธ์ง ๊ธฐ๋ฅ์ ๋์์ธํ ๋ ์ ์ฌ์ ์ผ๋ก ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ๋ ฅํ go2 ๊ธฐ๋ฅ์ ๋์ ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
์๋ try
์ ์์์ ๋ช๋ช ์ฌ๋๋ค์ ์ ๋ค๋ฆญ ๋๊ธฐ์ ๋ํด์๋ ๋
ผ์ํ์ง๋ง ๋งค๊ฐ๋ณ์์ ๋คํ์ฑ์ด try
์ ์์๋ฅผ ์ด๋ป๊ฒ ๋ค๋ฅด๊ฒ ๋ง๋ค์ง ๋์๊ฒ๋ ๋ช
ํํ์ง ์์ต๋๋ค. ์ด๋ฏธ ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์ธ์ด๋ก ํํํ ์ ์๋ ๊ฒ์ ํ๊ณ์ ๊ตญํ๋์ง ์์ต๋๋ค.
@icholy
๋ณด๋ค ๊ฐ์ํ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๋ ์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ์ด ์๋์ ์ผ๋ก ๋ง์์ต๋๋ค(์ฐ๊ฐ ์ค๋ฌธ์กฐ์ฌ์์). Go ํ์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ ์๋ตํ๊ธฐ ์ํด; ๋ํ ์๊ตญ์์๋ ๋ธ๋ ์ํธ๋ฅผ ์ฐฌ์ฑํ๋ ๊ณผ๋ฐ์๊ฐ ์์์ต๋๋ค. ๋ฌผ๋ก EU๋ ์ผ๋ฐ ๋์ค์ด ๋ฐ์ํ ๋ช ๊ฐ์ง ๋ถ๋ฆฌํ ์ ์ด ์๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ๋์์ด ์ ๊ธฐ๋๋ฉด ๊ฒฐ๊ตญ EU์ ๋จธ๋ฌด๋ฅด๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ๋์์ง ์์ ๊ฒ ๊ฐ์์ต๋๋ค.
์ด์ ์ด๊ฒ์ ์ ์นํํ๋ ค๋ ๊ฒ์ ์ ํ ๋ด ์๋๊ฐ ์๋๋ฉฐ, ๋น์ ์ ์์ ๋ด์ฉ์ ๋์ํ์ง ์์ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ๋ณด์ฌ์ฃผ๊ณ ์ ํ๋ ๊ฒ์ ๋๋ค์๊ฐ ์ฒ์์ ์ด๋ค ๊ฒ์ ์ฑ๊ฐ์ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋๋ผ๋ ๋ชจ๋ ๋์์ ๊ฒํ ํ ํ์๋ ์ฌ์ ํ ์ต์์ ์๋ฃจ์ ์ด ๋ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํด ๊ฐํ ์๊ฒฌ์ ๊ฐ๊ณ ์์ง๋ ์์ง๋ง, ๊ทธ๊ฒ์ ์๋ ๊ทธ๋๋ก ๋๋ ๊ฒ์ ๋ํ ๋ ผ์์ด ๋ ์ ์์ต๋๋ค.
์ ๋ฌธ์ ์ธ ์ฝ๋ฉ ํ๊ฒฝ์์ ์ฐ๋ฆฌ๋ ํ์ฌ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ์์ ํ์ฉํ์ฌ ์ถ์ ์์คํ ์ ์ฃผ์์ ๋ฌ๊ณ ๋ก๊ทธ๋ฅผ ์ฅ์ํฉ๋๋ค. ์ ์ณ๋๊ณ , ์์์ ๋ฐํ์ ์ฆ๊ฐ์ ์ธ ํ๋ฆ ์ ์ด ๊ฐ๋ ์ฑ์ ํ๋ฆฌ๊ฒ ํ๋ค๋ ์ ์์ ๋ด๋ณด๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์์ ํจ๋์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค.
@icholy
๋ณด๋ค ๊ฐ์ํ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๋ ์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ์ด ์๋์ ์ผ๋ก ๋ง์์ต๋๋ค(์ฐ๊ฐ ์ค๋ฌธ์กฐ์ฌ์์). Go ํ์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ ์๋ตํ๊ธฐ ์ํด; ๋ํ ์๊ตญ์์๋ ๋ธ๋ ์ํธ๋ฅผ ์ฐฌ์ฑํ๋ ๊ณผ๋ฐ์๊ฐ ์์์ต๋๋ค. ๋ฌผ๋ก EU๋ ์ผ๋ฐ ๋์ค์ด ๋ฐ์ํ ๋ช ๊ฐ์ง ๋ถ๋ฆฌํ ์ ์ด ์๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ๋์์ด ์ ๊ธฐ๋๋ฉด ๊ฒฐ๊ตญ EU์ ๋จธ๋ฌด๋ฅด๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ๋์์ง ์์ ๊ฒ ๊ฐ์์ต๋๋ค.
์ด ์ฌ๋์ ์ฃผ์ฅ์ ์ฌ๊ฐํ๊ฒ ๊ณ ๋ คํ ํ์๋ ์์ต๋๋ค. ์ด๋ชจํฐ์ฝ ์๋ ์ฌ๋๋ค์ด ์ผ๋ฐ์ ์ผ๋ก try
์ ์์ ์ข์ํ์ง ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก "์๋ ๊ทธ๋๋ก ๋๋" ์ ์์ ์ข์ํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.
๋ด ์ค์ต์์ PS ๋ฉ์ธ ๋๋ฉ์ธ(๋คํธ์ํฌ ์๋น์ค, CLI ์ ํธ๋ฆฌํฐ)์์ Go๋ฅผ ์ซ์ดํ๋ ๋๋ค์์ ์ฌ๋๋ค์ ์ฌ์ฉ์กฐ์ฐจ ํ์ง ์์ต๋๋ค. ๊ทธ๋์ ๋๋ ๊ทธ๋ค์ ์๊ฒฌ์ ๋ฌด์ํ๊ณ ์ถ์ต๋๋ค.
์ฐ๋ฆฌ๋ try
์ ์๋ณด๋ค ๋ ์ข๊ณ ๋ ๋
ผ๋์ ์ฌ์ง๊ฐ ์๋ ์ต์
์ด ํ์ํฉ๋๋ค.
๋๋ ์ฑ๊ธํ ํด๊ฒฐ์ฑ
์ด ์๊ธํ๋ค๊ณ ๋ณด์ง ์์ต๋๋ค.
@velovix ๋๋ try/catch ์ค๋ฅ "์ฒ๋ฆฌ"๋ณด๋ค ๋งค๊ฐ๋ณ์ ๋คํ์ฑ์ ๋ ์ซ์ดํ๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๊ฒ์ด ์ธ์ด ๊ธฐ๋ฅ์ด ๋๋ค๋ฉด ๋ค๋ฅธ ๋ด์ฅ ์ธ์ด ๊ธฐ๋ฅ์ ๋ํ ํ์์ฑ์ ํผํ ์ ์๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ณผ ์ ์์ต๋๋ค.
ํ ๊ฐ์ง ์๋ก, ์ฌ๋๋ค์ด ๋ฐ๋ณตํ๊ณ ์ถ์ง ์์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์ฉ๊ตฌ์ ๋๋ค.
foo, err := Foo()
if err != nil {
log(err)
}
bar, err := Bar(foo)
if err != nil {
log(err)
}
// ...
๊ทธ๋ฌ๋ฉด ๋งค๊ฐ๋ณ์ ํจ์, ์ ํ ์ถ๋ก , _์๋ง๋_ ๋๋ _์ ํ์ _ ์คํ์ผ์ ๊ฐ์ฒด ๋์์ธ ํจํด์ ์ผ๋ถ ์กฐํฉ์ด ์ด์ํ ๋น์ ํ ์ ์ด ํ๋ฆ ์ ๋ต์ ์์กดํ์ง ์๊ณ ์์ฉ๊ตฌ๋ฅผ ๊ฐ๋จํ๊ฒ(ํค) ์ค์ผ ์ ์์ต๋๋ค.
func<T> DoWithErrorLogging(f func(any...) (T, error), args... any) T {
t, err := f(args...)
if err != nil {
log(err)
}
return t
}
// ...
foo := DoWithErrorLogging(Foo)
bar := DoWithErrorLogging(Bar, foo)
IMO๋ ์ด ๋ชจ๋ ๊ฒ์ด Go1๋ณด๋ค ํจ์ฌ ๋ ๋์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ธ์ด์์ ์ด _plus_ try/catch ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค.
์์งํ... ํ์ฌ ์ํฉ์์ Go2์ ๋ํ ๋ด๊ฐ ๊ฐ์ฅ ์ข์ํ๋ "์ค๋จ" ๋ณ๊ฒฝ ์ฌํญ์ net/http
๊ธฐ๋ณธ๊ฐ์ด ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ณต์ ์ ์ญ ์์ ์ค์ฒฉ๋๋ ๊ฐ๋ณ ๊ณต์ ์ ์ญ๊ณผ ๊ฐ์ Go1์ ๋ชจ๋ ์์ ๋ถํธ์ ํด๊ฒฐํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Hashicorp์ cleanhttp
ํ์ค์ ๋ง๋ค๊ฑฐ๋ (*time.Timer).Reset()
์ ๋ํด ์์์ผ ํ ์ธ๋ชจ์๋ ๋ฐํ ๊ฐ ์ ๊ฐ์ง๊ฑฐ๋ ์ ์ฒด syscall ํจํค์ง๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. Go3๋ ์ฌ๋๋ค์ด ์๋ผ๊ธฐ๋ฅผ ์ํ๋ ์ข
์๊ณผ ํจ๊ป ๊ฑฐ์ ์ฆ์ ์ถ์๋ ์ ์์ต๋๋ค. ์๊ณ ํฐ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋จ์ผ ๋ฆด๋ฆฌ์ค์์ ๋ชจ๋ ์ํํด์ผ ํ๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋๋ try
...์(๋ฅผ) ๋๋ฌผ๊ฒ ์ฌ์ฉํฉ๋๋ค. ๋๋ ์ธ๊ธฐ์๋ ํ๋ก์ ํธ๊ฐ try๋ฅผ ์ฌ์ฉํด๋ ๊ด์ฐฎ์ ๊ฒฝ์ฐ์ ๋ํ ์ง์นจ์ ์ถ๊ฐํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๊ท๋ชจ/์ ๊ท/1์ธ ํ๋ก์ ํธ๋ try
๋ก ์ธํด ๊ฐ๋ ์๋ชป๋ ์ค๋ฅ๋ก ์ธํด ์ฌ์ฉ ๋ถ์กฑ์ ๊ฒช์ ๊ฒ์
๋๋ค.
์ธ์ด์ try
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ๋์ฐํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฌ๋๋ค์ ์ต์
์ ๊ฒฝ์ฐ์ ๋ํ ๋๋ ค์์ด ๊ทผ๊ฑฐ๊ฐ ์๋ ๊ฒ์ผ๋ก ํ๋ช
๋๋ฉด ๊ทธ ์ฌ์ฉ์ ๋์ด์ ์ฐํธ๋ฆฌ๊ฒ ๋ ๊ฒ์
๋๋ค. ๊ฒฝํ์ด ์๋ ์ฌ๋๋ค์ ๊ทธ๊ฒ์ ๋ฌด๋ถ๋ณํ๊ฒ ์ฌ์ฉํ ๊ฒ์ด๊ณ ๋ค๋ฅธ ์ฌ๋๋ค์ ๊ทธ๋ ์ง ์์ ๊ฒ์
๋๋ค. ์ธ์์ ๋์ด ์๋๋๋ค.
try
๊ฐ ์ถ๊ฐ๋๋ฉด ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ๋ ์ค๋ฅ๊ฐ ๋ฐํ๋์ง๋ง ์ค์ ๋ก ์ค๋ฅ๊ฐ ์์ ๊ฐ๋ฅ์ฑ์ ๋งค์ฐ ๋ฎ์ ์ปจํ
์คํธ ์ถ๊ฐ์ ์์ ์ ์์ง ๋ชปํ๊ณ ๋จ์ํ ์ค๋ฅ๋ฅผ ์๋ ๊ทธ๋๋ก ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค์ด 1TB๋ก ์๊ณ ์๋ ๋์คํฌ๋ฅผ ์ฑ์ฐ๋ ํ์ผ ์์คํ
์ ๋ฐฉ๊ธ ์์ฑํ๋ค๋ฉด 1kb ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ ๊ณต๊ฐ์ด ์๋ค๊ณ ํ์ ํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ์คํจํ๋ฉด ์ค๋ฅ๋ฅผ ๋ฌด์ํ๊ณ ์ถ์ง ์์ต๋๋ค. ๋ค๋ฅธ ๊ณณ์ ๋ฒ๊ทธ, ํ๋์จ์ด ์ค๋ฅ ๋ฑ์ ๋ํ๋ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ๋ฏธ์น ๊ฐ๋ฅ์ฑ์ด ์๋ ์ค๋ฅ์ ์ฃผ์์ ์ถ๊ฐํ๋ ๋ฐ ๋
ธ๋ ฅ์ ๊ธฐ์ธ์ผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋๋ try(..)๊ฐ ํ์ดํํ ๋ ์๊ฐํ ์ ์๋๋ก ์ฝ๋์ ๋ง์ธ๋ ์คํ์ ํ ์์ ๊ดํธ/๋๊ดํธ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์์ด ๋ง์์ ๋ค์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ์์ํ ์ ์๋ ๊ฐ์ฅ ๊ธด ์๊ฐ ๋์!
๊ทธ๋์ ์ด๊ฒ์ ๋ ์ข์ต๋๋ค:
๊ฐ, ์ค๋ฅ := foo()
err != nil์ด๋ฉด ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฌ์ ํ โโ์ผ๋ฐ์ ์ ๋๋ค. ๊ทธ๋์ ๋๋ ์ด์ ๊ฐ์ sm์ด ์ด๋ป๊ฒ ๋ ๊ฐ๋ฅํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ฐ, ์ค๋ฅ ํ์ธ := foo()
Go๊ฐ ์ฝ์ ์ ์๋ ์ธ์ด๊ฐ ๋๊ณ ์ถ๋ค๋ฉด ์ฝ๊ฑฐ๋ ์ดํดํ๊ธฐ ์ด๋ ค์ด ์๊ฐ์ ํ ์ ์๋ ๋ฅ๋ ฅ์ ์ต์ํํด์ผ ํฉ๋๋ค.
Go๊ฐ ์ข์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ๋ฉด ์ค๋ฅ๊ฐ ํธ์ถ ์คํ์ ์ฌ๋ผ๊ฐ ๋ ์ถ๊ฐ ์ปจํ ์คํธ๋ฅผ ๊ฐ๋๋ก ๊ถ์ฅํด์ผ ํฉ๋๋ค. defer๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ์๊ตฌ ์ฌํญ์ ํผ๋์ค๋ฌ์ ๋ณด์ ๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ์ ์ค๋ฅ๊ฐ ์์ผ๋ฉด ์ด๋ป๊ฒ ํฉ๋๊น? Defers๋ ์คํ ์์๋ก ์คํ๋ฉ๋๋ค. ํธ๋ค๋ฌ๋ฅผ ์ญ์์ผ๋ก ์ ์ธํด์ผ ํฉ๋๊น?
If ๋ฌธ์ ๊ฐ๋จํ๊ณ ์ฌ๊ธฐ์ ๋ชจํธ์ฑ์ ์ํ ์ฌ์ง๋ฅผ ๊ฑฐ์ ๋จ๊ฒจ ๋์ง ๋ง์ญ์์ค. try
๊ฐ ์ค์ ์์ง๋์ด๋ง ๋ฌธ์ ๋ผ๊ธฐ ๋ณด๋ค๋ ํต์ฌ์ ํด๊ฒฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ด ์ ์์ ์ข์ํ๋๋ฐ, ์นจ๋ฌตํ๋ ๋ค์๊ฐ ์ด๋ฌํ ๋ณต์กํ ์ ์์ ๋ชจ๋ ์ธก๋ฉด์ ์์ ํ ์ดํดํ์ง ๋ชปํ ์ฑ ๋ง์นจ๋ด ์ฑ๋ช
์ ๋ฐํํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
@icholy ์ ์คํ ๋ถํ๋๋ฆฝ๋๋ค. Gopher ํ๋ ๊ฐ๋ น: https://golang.org/conduct๋ฅผ ์์ง
์ฌ๋ฌ๋ถ: ์์ ์ ๋๊ธ(https://github.com/golang/go/issues/32825#issuecomment-506740412) ์ธ์๋ https://golang.org/wiki/NoPlusOne์ ์์๋์๊ธฐ ๋ฐ๋๋๋ค. '๋์ํฉ๋๋ค' ๋๋ '๋์ํ์ง ์์ต๋๋ค' ์ ๋์ ๋๊ธ์ ์์ฑํ๋ ๊ฒ์ ๋์์ด ๋์ง ์์ต๋๋ค. ๋์ ์ด๋ชจํฐ์ฝ ๋ฒํผ์ ์ฌ์ฉํ์ธ์. ๊ฐ์ฌ ํด์.
@sanbornm
(๋๋ ๋ฉ์์ง์ ๋ต์ฅ์ ๋ณด๋ผ ์ ์๋ค๋ ์ ์ ๋์ํ๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ด์ํ ๊ฒ์ด์ง ๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋๋ผ๊ณ ๋งํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์์ ์ฐ๋ ๋๊ฐ ๋ค๋ฅธ ๋๊ธ์ ๋๋ณด๋ผ ์์์ ๊ธธ์ ์๋๋ค๋ ์ ์์ ์ฐ๋ ๋์ ๋ํ ๋์ ์์ ์ ์ฌ์ ํ โโ์ ํจํ๋ค.)
๋์๊ฒ ์ ์์ด๋ ๋ณํ๋ฅผ ์๊ตฌํ๋ ๊ฒ์ ๋๋ค. ์ด ํน์ ๋ฌธ์ ๋ ๋ณ๊ฒฝ ๋ฐฉ์ง์ ๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ์ ์์ ์์ฑํ ๊ฒ์ ์ ์ํฉ๋๊น? ๋๋ ์ ์ ์์คํ ์ด ํ๋ฅญํ๋ค๊ณ ์๊ฐํ์ง๋ง ํ์ ์ ์ง๊ฐ ๊ณผ์ ๋ํ๋ฉ๋๋ค.
์ ์ B๋ฅผ ์ฑํํ์ง ๋ง์์ผ ํ๋ค๋ ์ ์ A๋ฅผ ๋ง๋ค ํ์๋ ์์ต๋๋ค. ๋์ ์ ์ B์ ํฌํํ์ญ์์ค. ์ ์ B์ ๋ํ ์์ธํ ๋ ผ์๋ ํด๋น ์ ์ ๋๋ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
(์ด ๊ฒฝ์ฐ ์ ์ B๊ฐ ์ ๊ฒจ ์์์ ์ดํดํฉ๋๋ค. ์ด ์ ์์ ํ๋ฃจ๋ ์ฑ ๋์ง ์๋ ๊ธฐ๊ฐ์ 77๊ฐ์ ๋๊ธ์ด ์๋ค๋ ์ฌ์ค์ด ๊ทธ ์ด์ ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ด ์์ค์ ํ ๋ก ์ ๋ฌธ์ ์ถ์ ๊ธฐ๋ณด๋ค๋ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ์์ ๋ ์ ์๋ํฉ๋๋ค.)
@ianlancetaylor
(๋๋ ๋ฉ์์ง์ ๋ต์ฅ์ ๋ณด๋ผ ์ ์๋ค๋ ์ ์ ๋์ํ๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ด์ํ ๊ฒ์ด์ง ๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋๋ผ๊ณ ๋งํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์์ ์ฐ๋ ๋๊ฐ ๋ค๋ฅธ ๋๊ธ์ ๋๋ณด๋ผ ์์์ ๊ธธ์ ์๋๋ค๋ ์ ์์ ์ฐ๋ ๋์ ๋ํ ๋์ ์์ ์ ์ฌ์ ํ โโ์ ํจํ๋ค.)
์ถฉ๋ถํ ํฉ๋ฆฌ์ ์ ๋๋ค. ๋ฉ์ผ๋ง ๋ฆฌ์คํธ๋ ํ๋ฅญํ์ง๋ง ๊ฐ์ธ์ ์ผ๋ก ์ด ๊ฒฝ์ฐ GitHub๋ฅผ ํตํด ๊ธฐ์ฌํ๋ ๊ฒ์ด ๋ ์ฝ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ํ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํ๋ฅญํ๊ณ ๊ทธ๋๋ก ์ ์ง๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ด๋ชจํฐ์ฝ/ํฌํ๋ ์ด์ ์ ํฉํฉ๋๋ค. 100๋ช ์ "ํฌํ"๋ก ์ถฉ๋ถํ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ์ 100๋ช ์ด "์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ทธ๋๋ก ๋์ญ์์ค"๋ผ๊ณ ์ฐ๋ ๊ฒ์ ์ํ์ง ์์ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ๋ ์ ๊ฒจ ์๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ์ด๋ชจํฐ์ฝ์ผ๋ก "ํฌํ"ํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๊ฐ ์ฒ์๋ถํฐ ๋ง๋ค์ด์ก๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ถ์์ ์ด์ง๋ง ๊ด๋ จ๋ ์ข ์์ฑ ๊ด๋ฆฌ๊ฐ ์ ๋๋ก ์ฒ๋ฆฌ๋์ง ์์์ต๋๋ค. Dep์ ํ๋ฅญํ๊ฒ ์๋ํ๊ณ go mod๊ฐ ๊ฐ์๊ธฐ ์ ํ๋์์ต๋๋ค[1]. ์ด๊ฒ์ด ์ ์ ์์คํ ์ด ๋ง๋ค์ด์ง ์ด์ ์์ ์ดํดํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ ์ ์์คํ ์ด ๋ฌธ์ ๊ฐ ์ ๊ฒจ ์๊ณ ๋ฉ์ผ๋ง ๋ฆฌ์คํธ๋ก ์ด๋ํ๋ผ๋ ์ง์๋ฅผ ๋ฐ์ผ๋ฉด ์ปค๋ฎค๋ํฐ๋ฅผ ๊ณผ์ ๋ํํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
[1] https://twitter.com/_rsc/status/1022588240501661696
ํธ์ง: Go ํ๊ณผ ์ปค๋ฎค๋ํฐ๋ ๋๋ถ๋ถ ์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ์ ๊ฒฝ์ฒญํ๋ ๋๋ผ์ด ์ผ์ ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ค์ด๊ฐ๋ ๋ชจ๋ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. Go ์ค๋ฌธ์กฐ์ฌ๊ฐ ์ข์ ์์ ๋๋ค.
@sanbornm
Dep์ ํ๋ฅญํ๊ฒ ์ผํ์ต๋๋ค.
์ฌ๊ธฐ์ ๋์ํ์ง ์์ ํ์๊ฐ ์์ต๋๋ค. Go ๋ชจ๋์ ๋ง์นจ๋ด https://proxy.golang.org ์ ์๊ตฌ ์บ์ฑ์ผ๋ก ์ ์๋ ค์ง์ง ์์ "gobindata" ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
๊ทธ dep ์น๊ตฌ๋ ๋ฌธ์ ๋ฅผ ์ธ์ํ์ง๋ ๋ชปํ๊ณ ๋์ VCS๋ฅผ ํตํด ๋ฉ์ง "๋ณด์ฅ"์ ๊ฐ์ง๊ณ ๋๊ณ ์์์ต๋๋ค.
@sirkon ์ด๊ฒ์ ์ฝ๊ฐ ๋ฒ์ด๋ ์ฃผ์ ์ด์ง๋ง Dep๊ณผ ๊ฐ์ ๋ฒค๋ dep๋ผ๋ฉด ๊ทธ๋ฐ ๊ฒ์ ํ์ํ์ง ์์ต๋๋ค.
ํ ์ค์ 1๊ฐ์ try ๋ฌธ๊ณผ ๊ฐ์ด ๋ ๋ง์ ์ ์ฝ ์กฐ๊ฑด์ด ์ถ๊ฐ๋์ง ์๋ ํ ๊ทธ๋๋ก ๋๋ ๊ฒ์ด ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด์ ๋ ์ ์ ์์ ์ด ์๋ฅผ ๊ณ ๋ คํ๊ธฐ ๋๋ฌธ์
๋๋ค. info := try(try(os.Open(file)).Stat())
๋งํผ ๋ฌดํดํด ๋ณด์ด์ง๋ง ์ ์์ ์ธ ์ ์ด ํ๋ฆ์ ๋ฒ์๋ฅผ ๋์ด ํ์ผ ํธ๋ค์ด ๋์ถ๋ฉ๋๋ค. io.Closer
๊ตฌํ ๋๋ ์ฌ๋๋ค์ด ๋ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์ถ๊ตฌํ๊ธฐ ์ํด ํํผํ ์ ์๋ ๊ธฐํ ์ ๋ฆฌ ๊ธฐ๋ฅ์ผ๋ก ํ์ผ ๋ฆฌ์์ค ๋์๊ฐ ์ฆ๊ฐํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
f๊ฐ ๋ ์ด์ ์๋ํ์ง ์์ ์ฆ์ GC์ ์ ํฉํ๊ณ ์ด๋ ์์ ์์ ์ข ๋ฃ์๊ฐ f๊ฐ ๋ซํ ์๋์ง ํ์ธํ๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ์ฌ๋๋ค์ ์ด๊ฒ์ด ์ค์ํ์ง ์๋ค๊ณ ์๊ฐํ ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๊ธฐ๋ฅ ๋ธ๋ก์ ๋ฌถ์ธ ์ค๋ defer๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ๋ช ํํ (๋ฆฐํฐ ์ง์) ๊ท์น์ ๋ณ๊ฒฝํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ๋ฅ ๋ธ๋ก์ด ์ข ๋ฃ๋๋ฉด ๋ฆฌ์์ค๊ฐ ํด์ ๋ฉ๋๋ค. ๊ฐ๋น์ง ์์ง๊ธฐ์ ์์กดํ๋ค๊ณ ํด์ ๋ฆฌ์์ค๋ฅผ ์์งํ์ง ์๋๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค(์ผ๋ฐ์ ์ธ ํ์ผ ์ด๊ธฐ ํธ๋ค ์ ํ ๊ธฐ๋ณธ๊ฐ์ 1k์์ 4k ์ฌ์ด์ผ ์ ์์). ์ด๋ ํ์ผ์ ๋ซ์ง ์๋ ๊ฐ๋จํ filepath.Walk๋ก ์ฝ๊ฒ ์ด๊ณผ๋ฉ๋๋ค.
์์ฝํ๋ฉด ๊ตฌํ๋ ์ด ๊ตฌ๋ฌธ์ ctor/dtor๊ฐ ์๊ณ ๋ฆฌ์์ค ๋์ถ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฝ๋ ๋ธ๋ก์์ ๋ฉ๋ฆฌ ๋จ์ด์ง ๋ฎ์ ์์ค์ GC ๊ธฐ๊ณ์ ์์กดํ๊ธฐ ๋๋ฌธ์ Go์์ ๋ฆฌ์์ค ๊ด๋ฆฌ์ ๋ฏธ๋ฌํ ์ํ์ ์ ๊ณตํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฌดํดํด ๋ณด์ด๋ ๊ฒ์ ์ ์ฌ์ ์ธ ์ค๋ฅ ์กฐ๊ฑด์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ(์ด๋ฆฐ ํ์ผ์ด ๋๋ฌด ๋ง์).
var n int
for _, name in try(os.Readdir(...)) {
n += try(getSize(name))
}
func getSize(name string) (int, error) {
return try(try(os.Open(name)).Stat()).Size
}
ํธ์งํ๋ค:
์ ์ฝ ์กฐ๊ฑด์ ๊ฒฝ์ฐ ์ค์ ๋ก a, b := try(get("a")), try(get("b"))
๊ฐ ์ถฉ๋ถํ ํฉ๋ฆฌ์ ์ด๊ธฐ ๋๋ฌธ์ ํ ์ค์ 1์ ๋งํ๋ ๊ฒ๋ณด๋ค ํ ๋น์ ์ค๋ฅธ์ชฝ์์๋ง ์ ํจํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ try(os.Open(name)).Stat()
๋ฅผ ์ํํ ์ ์๋ ๊ธฐ๋ฅ์ ๋จ์ต๋๋ค. try()๋ฅผ ๋ฌดํจ๋ก ๋ง๋ค๋ ค๋ฉด ํ ๋น์ RHS์ ์์ง ์์ ๋๋ง ๋ค์๊ณผ ๊ฐ์ด ๊ทธ๋ค์ง ๊ธฐ๋ฅํ์ง ์๋ ๋ฌด์ธ๊ฐ๊ฐ ๋จ์ต๋๋ค. ๋ชจ๋.
@cstockton ์์ฐ ๋๋จํ ๋ฐ๊ฒฌ!
Rust๋ ์ค์ ๋ก ์ด try
์๋ฏธํ๋ ๋ฐ๋ฅผ ์ ํํ ์ํํ๋ ์ ์ฌํ ๋งคํฌ๋ก(์ ๊ธฐ์ต์ด ๋ง๋ค๋ฉด ?
)๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ๊ฑฐ๊ธฐ์๋ ์ ์ ํ raii๊ฐ ์์ผ๋ฏ๋ก ํด๋น ์ธ์ด์์๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ผ๋ฉฐ ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ๊ตฌ๋ฉ
@sanbornm ๋ค, ์ ์ฅ์์ ์ธํฐ๋ท์ ์ ๋ฐ์ ๋ณด๊ดํ๋ ๊ฒ์ ์ ๋ง ์ข์ ์๊ฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๋๊ตฐ๊ฐ ๊ฐ try
๊ฐ ์๊ฐ/๋
ธ๋ ฅ์ ์ ์ฝํ ์ ์๋ ์ฅ์์ ์๋ฅผ ๊ณ์ฐํ๋ ์ ํธ๋ฆฌํฐ๋ฅผ ์ธ๊ธํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ํฐ ์์
ํ๋ก์ ํธ์ ์ด์ GOPATH GitHub ๋๋ ํ ๋ฆฌ์ ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ์ ๋ํด ์ด ์ ํธ๋ฆฌํฐ๋ฅผ ์คํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
| ํ๋ก์ ํธ | ์์น* | ํ๋ณด์๋ฅผ ์๋ |
|------------|------|----------------|
| ์นผ1 | 2047 | 3 |
| ํํ1 | 1030 | 0 |
| ๋ฌธ์1 | 4576 | 8 |
| ํด๊ตฌํธ | 604 | 1 |
| ๋ค๋ฅธ ๋ชจ๋ ๊ฒ | 8452 | 23 |
cloc
์ ํธ๋ฆฌํฐ์ ๋ฐ๋ผ ์ฃผ์์ ์ ์ธํ๊ณ ์ฝ๋๋ง ์ด๋ํฉ๋๋ค."๋ค๋ฅธ ๋ชจ๋ ๊ฒ"์ ๋ด์ฉ์๋ ๋ด๊ฐ ๋ฐ๋์ ๋ฐฐ์ธ ๋ ์์ฑํ ๋น ๋ฅธ ํดํน๊ณผ ์ฝ๋๊ฐ ํฌํจ๋์ด ์์์ ๋ช ์ฌํ์ญ์์ค.
๋ด ์ ๋ฐ์ ์ธ ๊ฒฐ๋ก ์ ์ ์ด๋ ๋์๊ฒ try
์ ์์ ๋ด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํฉ๋ฆฌํํ๋ ๋ฐ ๋์์ด ๋์ง ์๋๋ค๋ ๊ฒ์
๋๋ค.
๋ด๊ฐ go๋ฅผ ์ข์ํ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ ๊ทธ ์ฌ์์ด ์ฝ๋๋ฅผ ๋ค๋ฅธ ์ธ์ด์์ ์ฌ์ฉํ ์ ์๋ ๊ตฌ๋ฌธ์ ์์ ํ์ ์งํฉ์ผ๋ก ์ ํํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋งค์ฐ ์์ ๊ธฐ๋ฅ ์ธํธ์ด๊ธฐ ๋๋ฌธ์ ์ ์ฒด ๊ธฐ๋ฅ ์ธํธ๋ฅผ ์ฝ๊ฒ ๋ฐฐ์ธ ์ ์์ต๋๋ค. ๋ฏธ๋์ ๊ฐ๋ฐ์๋ ์๋ง๋ ๋ด ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ด๊ฐ ํ ์ผ์ ์ ์ ์์ ๊ฒ์
๋๋ค. ์ธ์ด์ ์๋ก์ด ๊ฒ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ๋ฏธ๋์ ๊ฐ๋ฐ์๊ฐ ๊ทธ ๋ด์ฉ์ ์ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ญ๋๋ค. ๋ฏธ๋๋ฌ์ด ๊ฒฝ์ฌ์ ๊ทน๋จ์ C++ ๋๋ ์ค์นผ๋ผ์ ๊ฐ์ด ๋ณต์ก์ฑ์ผ๋ก ์ธํด grokํ๊ธฐ ์ด๋ ค์ด ์ธ์ด์
๋๋ค.
go 1์ ๊ตฌ๋ฌธ ์ถ๊ฐ๊ฐ ์๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค. ๋์ go 2์ ๋ฃ์ผ์ญ์์ค.
@miekg https://github.com/golang/go/issues/32825#issuecomment -506882164 ์ด ๋งํฌ๋ฅผ ์ ์์์ ์ถ๊ฐ try
ํค์๋์ ์ ์ฒด ์์ด๋์ด๋ฅผ ์์ ํ ๋ฌดํจํํฉ๋๋ค.
๊ทธ๋๋ก ๋๋ ๊ฒ์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ์ฝ๊ฐ ๋๋ฌด ์ฅํฉํ์ง๋ง ๋ฐ๋ผํ๊ธฐ์๋ ๊ฝค ๊ฐ๋จํฉ๋๋ค.
์ค์ผ ์๋ง ์๋ค๋ฉด
if err := foo.x(a, b); err != nil { return err } if err := foo.y(); err != nil { return err } if err := foo.z(c); err != nil { return err }
๋ญ๊ฐ์
if err := check foo.x(a, b), foo.y(), foo.z(c); err != nil { return err }
๊ด์ฉ๊ตฌ๋ฅผ ๋๋ฌด ๋ง์ด ๋ณ๊ฒฝํ์ง ์๊ณ IMHO๋ ์ข์ ๊ฒ ์ ๋๋ค.
"์๋ง๋" ์ ํ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ฉด ๋จผ์ ๋ณํ ์ ํ์ด ํ์ํฉ๋๋ค.
if err != nil
์ ์งํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ํ๋ค๋ ๊ฒ์ ๋ถ๋ช
ํฉ๋๋ค. ์ค์ ๋ก ๊ทธ๋ ๊ฒ ์ฅํฉํ์ง ์์ผ๋ฉฐ ์ฝ๋์ ํ๋ฆ์์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ด ๊ตฌ์ฑ์ผ๋ก ์ฝ๋๋ฅผ ์ฝ์ ๋ ๋ฌด์์ ํ ๊ฒ์ธ์ง ์ ์ ์์ต๋๋ค.
์ ์งํ์, try
์ถ๊ฐํ์ง ๋ง์
๋๋ ์ฝ๋๋ฅผ ์ฝ์ ๋ ์ต์ํ์ ์ค๋ฅ ์ฒ๋ฆฌ ์์ด ์์ ์ ์ํํ๋ ํ์ ๋ช ํํ๊ฒ ์ฝ์ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
๊ฐ์ ์์ค์ 3๊ธ์ 'err'์ด ํ์ฉ๋ฉ๋๋ค. ์ค์ํ ์ฝ๋๊ฐ ๋ ๋ฒ์งธ ์์ค์ ์๊ธฐ ๋๋ฌธ์ ์ค์ํ ์ฝ๋๋ฅผ ๋ํํ๋ ์ผ๋ถ 'ํ์ธ' ๊ธฐ๋ฅ์ ์ํ์ง ์์ผ๋ฉฐ(lisp๋ฅผ ๊ธฐ์ตํ์ญ๋๊น?) ์ค์ํ ์ฝ๋๊ฐ ๋ค์ฌ์ฐ๊ธฐ๋๊ธฐ ๋๋ฌธ์ ์ด์ ์ '์๋' ํ์ ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ์ค์.
res, err := begin_job()
์ค๋ฅ != nil {
ํธ๋ค ์ค๋ฅ()
}
์ค๋ฅ = ๊ณ์_์์
(res)
์ค๋ฅ != nil {์ธ ๊ฒฝ์ฐ
ํธ๋ค ์ค๋ฅ()
}
์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ธ๋ก์ ์ฒซ ๋ฒ์งธ ์ค์ ์ฝ์์ผ๋ก์จ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ์ ํ๋ฆ์ ์ฝ์ ์ ์์ต๋๋ค(๋นจ๋ฆฌ ์ฝ์ด์ผ ํ ๋ ๋ฌธ์ ์ ๋ชฉ์ ์ฝ๋ ๊ฒ์ฒ๋ผ)
๋๊ตฐ๊ฐ ๊ฐ
try
๊ฐ ์๊ฐ/๋ ธ๋ ฅ์ ์ ์ฝํ ์ ์๋ ์ฅ์์ ์๋ฅผ ๊ณ์ฐํ๋ ์ ํธ๋ฆฌํฐ๋ฅผ ์ธ๊ธํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ํฐ ์์ ํ๋ก์ ํธ์ ์ด์ GOPATH GitHub ๋๋ ํ ๋ฆฌ์ ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ์ ๋ํด ์ด ์ ํธ๋ฆฌํฐ๋ฅผ ์คํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.ํ๋ก์ ํธ LOC* ์๋ ํ๋ณด์
cal1 2047 3
ํํ1 1030 0
๋ฌธ์1 4576 8
ํด๊ตฌํธ 604 1
๋ค๋ฅธ ๋ชจ๋ ๊ฒ 8452 23
cloc
์ ํธ๋ฆฌํฐ์ ๋ฐ๋ผ ์ฃผ์์ ์ ์ธํ๊ณ ์ฝ๋๋ง ์ด๋ํฉ๋๋ค.
๋ ํฐ ํ๋ก๊ทธ๋จ์์๋ try
๊ฐ ๋ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ์์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ฉด LOC ํฌ๊ธฐ๊ฐ ์ฝ 15-20k ์ด์์ธ ํ๋ก๊ทธ๋จ์ด ๋ ๋ง์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ ์ด์ ๋ ๋ซํ ์์คํ
์์ ์ ์ ํ๊ฒ ์ง์ ๋๊ณ ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๋ฅผ ์ ๋ฌํด์ผ ํ๋ ๋ ์ด์ด๋ฅผ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ณด๋ด๋ ์ชฝ๊ณผ ๋ฐ๋ ์ชฝ ๋ชจ๋. ์ด๋ค ์ข
๋ฅ์ ํ๋ก๊ทธ๋จ์ธ์ง์ ๋ฐ๋ผ ๋ง์ด ๋ค๋ฆ
๋๋ค. ๋๋ ์๋ง๋ ๋ ์์ ํ๋ก๊ทธ๋จ์์๋ ๋ง์ด ์ฌ์ฉํ์ง ์์ ๊ฒ์
๋๋ค
๋ ํฐ ํ๋ก๊ทธ๋จ์์๋ ์๋๊ฐ ๋ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ข์ ์ง์ . ๋๋ heptio/contour, 28.7k ๋ผ์ธ์ ์์ค ํ ์คํธ์ ๋ํด tryhard๋ฅผ ์๋ํ๊ณ , tryhard๋ 12๊ฐ์ ๋์ฒด ํญ๋ชฉ์ ์ฐพ์์ต๋๋ค.
๋ ํฐ ํ๋ก๊ทธ๋จ์์๋ ์๋๊ฐ ๋ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ข์ ์ง์ . ๋๋ heptio/contour, 28.7k ๋ผ์ธ์ ์์ค ํ ์คํธ์ ๋ํด tryhard๋ฅผ ์๋ํ๊ณ , tryhard๋ 12๊ฐ์ ๋์ฒด ํญ๋ชฉ์ ์ฐพ์์ต๋๋ค.
์ฐ์! 12 ๋ 28.7K ๋ผ์ธ, ์ด๊ฒ์ ์ ๋ง ์ ์ฉ ํค์๋๊ฐ ํ์ํฉ๋๋ค!
๊ธ์, ๋๋ ์ด๊ฒ ์ ๋ํ ๋น์ ์ POV์ ๋ ๊ด์ฌ
stat := try(try(os.Open(fileName)).Stat())
๊ทํ์ ํ๋ก๊ทธ๋จ์ด ์ข ๋ ๋ชจ๋๋ฆฌ์์ด๊ณ ๋ง์ ์๋น์ค ๊ฐ์ ์๋น์ค ํตํฉ์ ์ผ๋ถ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ ์ผ๋ฐ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํด๋น ์ ์ฅ์( heptio/contour
)์ github์์ fmt.errorf
๋๋ errors
๋ฅผ ๊ฒ์ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ๊ฑฐ์ ์์ผ๋ฏ๋ก ๋น ๋ฅธ ๊ฐ์๋ฅผ ์ป๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๋ ํฐ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ์๋ ํ๋ก๊ทธ๋จ๋ง๋ค ๋ง์ด ๋ค๋ฅผ ์ ์๋ค๊ณ ๋งํ์ต๋๋ค.
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ์ง ์๋ ๋จ์ผ ํ๋ก๊ทธ๋จ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด๋ฏธ ์ฌ์ฉ์ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ณ ์ค์ ๋ก ํ์ํ ํญ๋ชฉ์ ํฌ๊ฒ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๋ช ๊ฐ์ ๋ ์ด์ด๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ ํํ ์ ์๋ ํน์ AuthorizationError๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค(๋ฐํ๋ ๋ชจ๋ ์ค๋ฅ๋ ์ด๋ฏธ ์ฒ๋ฆฌ๋๊ณ ๋ํ๋ ๋ชจ๋ io ์ค๋ฅ๋ก ์ถฉ๋ถํ ๊ตฌ์ฒด์ ์). ์์ฒญ ๊ณ์ธต๊น์ง ์ฒ๋ฆฌํฉ๋๋ค.
๊ทํ์ ํ๋ก๊ทธ๋จ์ด ์ข ๋ ๋ชจ๋๋ฆฌ์์ด๊ณ ๋ง์ ์๋น์ค ๊ฐ์ ์๋น์ค ํตํฉ์ ์ผ๋ถ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ ์ผ๋ฐ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํด๋น ์ ์ฅ์์ github์์
fmt.errorf
๋๋errors
๋ฅผ ๊ฒ์ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ๊ฑฐ์ ์์ผ๋ฏ๋ก ๋น ๋ฅธ ๊ฐ์๋ฅผ ์ป๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ๋งํ๋ฏ์ด ์๋ง๋ ํ๋ก๊ทธ๋จ๋ง๋ค ๋ง์ด ๋ค๋ฅผ ์ ์์ต๋๋ค. ๋ ํฐ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ์๋ ํ๋ก๊ทธ๋๋ฐํ ์ ์์ต๋๋ค.์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ์ง ์๋ ๋จ์ผ ํ๋ก๊ทธ๋จ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด๋ฏธ ์ฌ์ฉ์ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ณ ์์ฒญ ๊ณ์ธต๊น์ง ์ค์ ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ํญ๋ชฉ์ ๋ง์ ๋ณ๊ฒฝ ์์ด ๋ช ๊ณ์ธต์ ๋ณ๊ฒฝํ์ง ์๊ณ ์ ํ๋ ์ ์๋ ํน์ AuthorizationError๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
๋น์ ์ ์์ด๋์ด๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ฃผ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ๋ก๋ฅผ ์ฝ๊ฒ ์ฐพ๊ธฐ ์ํ ๊ฒ์
๋๋ค. ์ ์ฌํ๊ฒ os.NotExist
์์ง๋ง ์ด๊ฒ์ ์ค๋ฅ ๊ฒฝ๋ก์ ๋ํ ์ข์ ํํธ๊ฐ ์๋๋๋ค.
@thomasf ๋ ๋ช ๋ ๋ juju/juju ์์ ์ฌ๋ณธ์ ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ํฌ์ธํธ์ ๋๋ค.
529628 ์์ค ๋ผ์ธ, tryhard๊ฐ 1763(0.3%) ๋์ฒดํ์ ์ฐพ์์ต๋๋ค.
๋ค, ๋ฌผ๋ก ์ ๋๋ค. ๋น์ ์ด ๋ ๊ฐ์ง ๋ชจ๋์ ๊ด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ ์๋ง๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ข์ ์๊ฐ ์๋ ๊ฒ์ ๋๋ค. ๋๋ tryhard ํ๋ก๊ทธ๋จ atm์ ์๋ํ ์๊ฐ์ด ์๊ณ ๋ค์ํ ์์ค์์ ์ ์ ํ ์คํ์ ๋ ์ํํฉ๋๋ค(github๋ฅผ ํตํด ์์ง๋๋ ๊ฒฝ์ฐ ๋ซํ ์์ค ์ฝ๋๋ฅผ ์๋ตํ๊ธฐ ๋๋ฌธ์ ์ด์จ๋ ์์งํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ์ ์์)
529628 ์์ค ๋ผ์ธ, tryhard๊ฐ 1763(0.3%) ๋์ฒดํ์ ์ฐพ์์ต๋๋ค.
๋๊ตฐ๊ฐ (์ธ์ฉ ํ์) ํ๋ช
ํ๊ฒ ๋งํ๋ฏ์ด try
๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ค์ง ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ๋ค๋ฃจ์ง ์๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ๋ง์ try
๋์ฒดํ์ ์ฐพ์ผ๋ฉด ์ฝ๋๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒ ์ธ์๋ ์๋ฌด ๊ฒ๋ ํ์ง ์๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์๋ง๋ ํ๋ฅญํ ์ฝ๋๊ฐ ์๋ ๊ฒ์
๋๋ค. ์ฌ๋๋ค์ด ๋ ์ฝ๊ฒ ๊ฒ์ผ๋ฅด๊ณ ์ค๋ฅ์ ๋ํด ๊ฑฑ์ ํ์ง ์๋๋ก ํด์ผ ํฉ๋๊น? ๊ทธ๊ฒ์ด ๋ฐ๋ก Go์ ์์ธ๊ฐ ์๋ ์ด์ ์ค ํ๋๊ฐ ์๋๊ฒ ์ต๋๊น? ์ ํํ ๊ทธ๊ฒ์ ํผํ๊ธฐ ์ํด์์
๋๊น?
๋๋ ๊ทธ๊ฒ์ ๋ํด ์ ์ฅ์ ์ทจํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ์ฐพ์ ๊ฒ์
NS. ๊ธฐ์กด go ์ฝ๋๋ฒ ์ด์ค์ try
๋ฅผ ์ ์ฉํ ์ ์๋ ์์น๊ฐ ๋ง์ด ์์ต๋๋ค.
NS. ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ๋ ๋ด ์์ ์ ์ธก์ ๊ฐ๊ณผ Go ํ์ด ์ ์ํ ์ซ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก SLOC์ ์๋น ๋ถ๋ถ์ ๊ตฌ์ฑํฉ๋๋ค(์ฐธ์กฐ https://youtu.be/RIvL2ONhFBI?t=440 ํ์์ฝ๋ 07:26).
์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ๋ง์
try
๋์ฒดํ์ ์ฐพ์ผ๋ฉด ์ฝ๋๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒ ์ธ์๋ ์๋ฌด ๊ฒ๋ ํ์ง ์๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์๋ง๋ ํ๋ฅญํ ์ฝ๋๊ฐ ์๋ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ด ๋ ์ฝ๊ฒ ๊ฒ์ผ๋ฅด๊ณ ์ค๋ฅ์ ๋ํด ๊ฑฑ์ ํ์ง ์๋๋ก ํด์ผ ํฉ๋๊น? ๊ทธ๊ฒ์ด ๋ฐ๋ก Go์ ์์ธ๊ฐ ์๋ ์ด์ ์ค ํ๋๊ฐ ์๋๊ฒ ์ต๋๊น? ์ ํํ ๊ทธ๊ฒ์ ํผํ๊ธฐ ์ํด์์ ๋๊น?
try
๊ฐ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ๊ฐ์ง๊ณ ์๋ ๊ฒ๋ณด๋ค ์ด๋ป๊ฒ ์ค์ฉํ๊ธฐ ์ฌ์ด์ง ์ ์ ์์ต๋๋ค. go์๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ ์ฉํ๋ ๊ธฐ๋ฅ์ด ์์ผ๋ฉฐ ์ด๋ฏธ ๊ฑด๋๋ฐ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค. ๋๋ฅผ ์ํด try
์ด ํธ๋ค ์ค๋ฅ๋ฅผ ํ์๋กํ์ง ์๋ ๊ฒฝ์ฐ ์ฝ๊ธฐ ์ฝ๊ฒ ์ฝ๋๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฒ์
๋๋ค.๋ง์ ๊ณณ์์ ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ try
๊ฐ ํ์ํ์ง ์์ ์๋ ์์ง๋ง ๊ทธ๋ฅ ์ฌ์ ๊ถ๊ฒ ์๊ฐํ๊ธฐ ๋ณด๋ค๋ ์์ด๋์ด๋ฅผ ์ฆ๊ฒ๊ฒ ํ๊ณ ์ ์ค ์ผ์ด์ค๋ฅผ ์๊ฐํด ๋ด
์๋ค...
์ค์ ์ฌ์ฉํ๋ ์ํฉ์ด ๋ง์ด ์๊ฐ๋์ง ์์ง๋ง ์์ง ์กด์ฌํ์ง๋ ์์์ ์กด์ฌํ๋ค๋ฉด ๋ค๋ฅด๊ฒ ๋์์ธํ ์ง ์ด๋จ์ง ์ฅ๋ดํ๊ธฐ ์ด๋ ต์ต๋๋ค.. ์๊ฐ๋๋ ํ ๊ฐ์ง๋ ์๋ง๋ do๋ try๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ๊ฐ์ ์ต๋ช ํจ์์ ์ฌ๋ฌ ์์ ์ ๊ทธ๋ฃนํํ๊ณ ํธ์ถ์๋ฅผ ๋ฐํํ๊ธฐ ์ ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ผ๋ถ ์ฝ๋๋ฅผ ํจ์ฌ ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
var v1, v3 string
if err := func() error {
try(onething())
v = try(twothing())
try(otherthing())
v3 = try(somethingg())
}(); err != nil {
... handle error...
}
์ด ์์ ์์ tryhard
์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํจํค์ง์ ๋ณด๊ดํ๊ณ ์๊ฐํํ๋ ์น ์ฌ์ดํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค. golang/gddo(godoc.org)๋ฅผ ์ฝ๊ฐ ์์ ํ๋ฉด ์์
์ ์ํํ ์ ์์ต๋๋ค.
๋๋ if err != nil
ํผ์ ๋๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด ๋ฌด์ธ๊ฐ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค๋ฉด ์ฌ๊ธฐ์ throws
ํค์๋๋ฅผ ์ถ๊ฐํ๋ ์๋ก์ด ์ ์์ด ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ด๋ฏธ ๋์ ์๋ ๋ช ๊ฐ์ง ์ฃผ์ฅ์ ๋ฐ๋ณตํ์ง ์๊ณ if err != nil
๋ฅผ ๊ทธ๋๋ก ๋๋ ๋๋์ ๋ํ์ดํฉ๋๋ค.
์ ๊ฐ ์ ์ํ ์ ์๋ ๊ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์๋ฐฑ ๋ช
์ ์ ๊ท ์ด๋ฏผ์(ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ฐ๋ ๋ชจ๋์ ๋ํด)๋ฅผ ๊ฐ๋ฅด์น ์ฌ๋์ผ๋ก์ if err != nil
๋ ๊ทธ๋ค์๊ฒ ๊ฒฐ์ฝ ๋ฌธ์ ๊ฐ ๋์ง ์์์ต๋๋ค. ๋ด ์ํฌ์ต์ ์๋ จ๋ ํ๋ก๊ทธ๋๋จธ๋ ์ฒ์์๋ ์ด์ํ๋ค๊ณ ์๊ฐํ์ง๋ง Go์์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ช
์์ ํน์ฑ์ ์ฌ๋ํ๋ ๋ฒ์ ๋นจ๋ฆฌ ๋ฐฐ์๋๋ค.
์ธ์ด๋ก ํด๊ฒฐํ ์ ์๋ ๋ ํฐ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ์ด ๋ฌธ์ ์ ๋ํ ์ปค๋ฎค๋ํฐ์ ๋ช
ํํ ๋ฐ์์ if err != nil
๊ฐ ๊ทธ ์ค ํ๋๊ฐ ์๋๋ผ๊ณ ๋งํฉ๋๋ค.
Go๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ์๋ฒฝํฉ๋๋ค. ๊ทธ ์ค ๊ฐ์ฅ ์ค์ํ ๊ฒ์ "if err != nil"์ ๋๋ค. ์ฅํฉํ๊ฒ ๋ณด์ผ ์ ์์ง๋ง ์ฝ๋ฉ์ ๋ฐฐ์ฐ๋ ์ฌ๋๋ค์๊ฒ๋ ์ฝ๋๋ฅผ ๋๋ฒ๊ทธํ๊ณ ์ฝ๋๋ฅผ ์์ ํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค.
@davecheney
๋๋ ๊ทธ๊ฒ์ ๋ํด ์ ์ฅ์ ์ทจํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ์ฐพ์ ๊ฒ์
NS. ๊ธฐ์กด go ์ฝ๋๋ฒ ์ด์ค์
try
๋ฅผ ์ ์ฉํ ์ ์๋ ์์น๊ฐ ๋ง์ด ์์ต๋๋ค.
NS. ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ๋ ๋ด ์์ ์ ์ธก์ ๊ฐ๊ณผ Go ํ์ด ์ ์ํ ์ซ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก SLOC์ ์๋น ๋ถ๋ถ์ ๊ตฌ์ฑํฉ๋๋ค(์ฐธ์กฐ https://youtu.be/RIvL2ONhFBI?t=440 ํ์์ฝ๋ 07:26).
ํ์ฌ ์ํฉ์์ ์ฐ๋ฆฌ๊ฐ ์ฐพ์ ๋ชจ๋ ์์ ๋ "๊ทธ๊ฑด ์๋ง๋ ์ข์ ์ฝ๋๊ฐ ์๋ ๊ฒ"์ผ๋ก ๋ฌด์๋ ๊ฒ์ ๋๋ค.
๋ค์์ ์์ ๋๋ค.
llorllale:~/go/src/github.com/hyperledger/fabric$ cloc --exclude-dir=vendor .
2406 text files.
2256 unique files.
3130 files ignored.
http://cloc.sourceforge.net v 1.60 T=6.69 s (272.8 files/s, 58350.9 lines/s)
--------------------------------------------------------------------------------
Language files blank comment code
--------------------------------------------------------------------------------
Go 1751 54365 34149 294005
YAML 35 547 2171 2060
Bourne Shell 26 354 325 1312
make 3 135 96 418
CSS 1 40 14 140
HTML 3 7 5 63
Python 1 50 103 57
Bourne Again Shell 1 1 6 50
Java 3 7 4 26
XML 2 1 4 2
--------------------------------------------------------------------------------
SUM: 1826 55507 36877 298133
--------------------------------------------------------------------------------
llorllale:~/go/src/github.com/hyperledger/fabric$ tryhard -l . | grep -v vendor | less | wc -l
1417
๊ณตํํ๊ฒ ๋งํ๋ฉด, tryhard๊ฐ ์ฐพ์ ์์น์ ์์ ๋ํ ๋ฐ์ดํฐ๋ ๋ํ ์ค๋ฅ๊ฐ ํ์ํ ๊ท์น์ผ๋ก ์ธํด ํผ๋๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ์ฌ ๊ท์น์ด
if err != nil {
return errors.Wrap(err)
}
...
if err != nil {
return errgo.Notef(err, "error doing x")
}
๊ทธ๊ฒ์ tryhard์ ์ํด ๋ณด๊ณ ๋์ง ์์ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ ํ์ฌ์๋ ๊ทธ๋ฐ ์ปจ๋ฒค์ ์ด ์์ต๋๋ค. ๊ฐ๋จํ ๊ฒ์ ๋ฐ ๋ฐ๊พธ๊ธฐ๋ฅผ ์ํํ์ฌ ํด๋น ์ค๋ฅ๋ฅผ ๊ธฐ๋ณธ ์ค๋ฅ ๋ฐํ์ผ๋ก ๋๋๋ฆฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค.
Language files blank comment code
---------------------------------------------------------------------------------------
Go 2488 40317 15901 297038
tryhard๋ 2736๊ฐ์ ๋์ฒดํ์ ๋ณด๊ณ ํ์ง๋ง ๋๋จธ์ง ๋ํ์ ๋ํ ์๋ ๊ฒํ ๋ฅผ ์ํํ๋ฉด ์ฝ 1850๊ฐ๋งํผ ๊ณผ์ ๊ณ์ฐ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก 300k ๋ผ์ธ์ ์ฝ๋๋ฒ ์ด์ค์์ ์ด ~4500 try
์ฌ์ฉ๋์ ์ถ์ ํฉ๋๋ค.
(๊ฐ์ธ์ ์ผ๋ก, ๋๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ํ์ฌ ๋ช ์์ฑ์ ์ฐฌ์ฑํ๋ฉฐ ๊ทธ๊ฒ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค.)
์๋ฅผ ๋ค์ด ํ์ฌ ๊ท์น์ด
[์ฌ์ฉ์ ์ ์ ๋ฉ์์ง๋ก ์ค๋ฅ ๋ํ]
๊ทธ๊ฒ์ tryhard์ ์ํด ๋ณด๊ณ ๋์ง ์์ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ด ์์ ์
๋๋ค. try
์ ์์ if err != nil return err
๋ค์ดํค๋ ๋ฆฌํด์ ๋จ์ํํ ๋ฟ ์ฌ์ฉ์ ์ ์ ๋ฉ์์ง ๋ฐ ์ปจํ
์คํธ๋ก ์ค๋ฅ๋ฅผ ๋ํํ๋ ๊ฒ์ ์ง์ํ์ง ์์ต๋๋ค.
if err != nil
์ ์ ์ผํ ๋ฐ๋ณต์ฑ์ ๋ค๋ฅธ ๋ฐํ ๊ฐ์ 0 ๊ฐ๋ ์ง์ ํด์ผ ์์ ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ์ธ์ด๋ฅผ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
์ค๋์ Go์์ ์ด ์๋ช ์ด ์๋ ํจ์๊ฐ ์๋ ๊ฒฝ์ฐ:
func add(x, y string) (int, error)
ํจ์์ ์ด๋๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ผ ํฉ๋๋ค.
func add(x, y string) (int, error) {
// ...
if err != nil {
return 0, err
}
์์ฑ์๊ฐ ํจ์ ์ ์ฒด์์ ๋์ผํ 0 ๊ฐ์ ๋ฐ๋ณตํ๋๋ก ํฉ๋๋ค.
์ธ์ด๊ฐ ์ค๋ฅ๊ฐ ์๋ ๋ฐํ ๊ฐ์ ๋ํด 0 ๊ฐ์ ์๋์ผ๋ก ์ฑ์ธ ์ ์๋ค๋ฉด ํจ์ฌ ๋ ์ฌ์ธ ๊ฒ์ ๋๋ค.
func add(x, y string) (int, error) {
// ...
if err != nil {
return ..., err
}
// ...
}
func main() {
add("8", "beep") // returns 0, error(`strconv.ParseInt: parsing "beep": invalid syntax`)
}
DB ์ฟผ๋ฆฌ ๋ฐ ํธ์ถ๊ณผ ์ํธ ์์ฉํ๋ ๋ง์ ์ฝ๋์ ๋ํ ๊ฒฝํ์ผ๋ก ๋ณผ ๋ ํจ์ ์ ์ฒด์์ 0 ๊ฐ์ ๋ฐ๋ณตํด์ผ ํ๋ ๊ฒ์ Go ์คํ์ผ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ ์ผํ ๋จ์ ์ด๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋๋ ์ด ์ ์์ ์๊ฒฌ์ ๋์ํฉ๋๋ค. if err != nil
๊ทธ๋๋ก ๋์ญ์์ค!
์ฐธ๊ณ : ์, ๋ช ๋ช ๋ ๋ฐํ ๊ฐ์ _sort of_ ์ด ์์ ์ ์ํํ ์ ์์ง๋ง(https://play.golang.org/p/MLV8Y52HUBY), ์ด ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ด ์ฝ๋๋ฒ ์ด์ค์์ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ ๊ตฌํํ ํ -gun ์ด๋ฆ์ ๋ฐํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋๋ ํญ์ ๋ช ๋ช ๋ ๋ฐํ ๊ฐ์ ์๋์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ํ์ฌ ๊ท์น์ด
[์ฌ์ฉ์ ์ ์ ๋ฉ์์ง๋ก ์ค๋ฅ ๋ํ]
๊ทธ๊ฒ์ tryhard์ ์ํด ๋ณด๊ณ ๋์ง ์์ ๊ฒ์ ๋๋ค.์ด๊ฒ์ด ์์ ์ ๋๋ค.
try
์ ์์if err != nil return err
๋ค์ดํค๋ ๋ฆฌํด์ ๋จ์ํํ ๋ฟ ์ฌ์ฉ์ ์ ์ ๋ฉ์์ง ๋ฐ ์ปจํ ์คํธ๋ก ์ค๋ฅ๋ฅผ ๋ํํ๋ ๊ฒ์ ์ง์ํ์ง ์์ต๋๋ค.
์ฌ์ค์
๋๋ค. ์ค๋ช
๋ฌธ์์ด์ ์ถ๊ฐํ ์ ์๋ ๋ณํ์ ์๊ฐํ๊ณ ์์์ต๋๋ค. ์ค๋ฅ ๋ฐํ์ ๋๋ค์(~4000 / 4500)๋ ์ปจํ
์คํธ ์์ errgo.Mask(err)
์ด๋ฉฐ, ์ค๋ช
์์ try()
๊ณผ ๋๋ฑํ๋ค๊ณ ์๊ฐํ์ง๋ง ํ์ฌ๋ errgo๋ ์คํ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๊ณ try๋ (์์ง) ํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฅ์
๋๋ค.
@ianlancetaylor ์ฌ๊ธฐ์ ์ ์์ด ์์ต๋๋ค. @miekg ๋ ์ฐ๋ฆฌ ์ธ์ด์ ์ง๋์ ์ค ํ ์ฌ๋์ผ๋ก์ ๋ ์ด์ if err != nil
๋ฅผ ์๋ Go ์์ฑ์๊ฐ ๊ฒฐ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ ์ ์ ๊ณผ ๋ชจ์๋๋ ๋ค๋ฅธ ๊ตฌ์ฑ์ผ๋ก ๋์ฒดํ์ง ์์ ๊ฒ์ ์ ์ํฉ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ด ์์ฒญ์ ๋ค๋ฅธ ์ ์์ฒ๋ผ ์ฒ๋ฆฌํ๋ ๋์ golang-nuts
๋ก ์ด๋ํ์ฌ ์ด ์์ฒญ์ ์ค์์ฑ์ ์ฃผ์ฅํ๋ ค๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ๊ทธ๊ฒ์ ๋น์ ์ ์๋๊ฐ ์๋ ์๋ ์์ง๋ง, ๊ทธ๊ฒ์ ๋ด๊ฐ ๋๋ผ๋ ์ํฅ์
๋๋ค.
์ฐ๋ฆฌ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ ํนํ๋ฉฐ ๋ค๋ฅธ ์ธ์ด์ ๋นํด ์์ฒญ๋ ๋ถ๊ฐ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ด๊ฐ ๊ตฌ์ถํ ์์คํ ์ ์ค๋ฅ์ ๋ํด ์๊ฐํ๋ ๋ฐฉ์์ ์์ ํ ๋ฐ๊ฟจ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ๊ฐ๋ ฅํ ์ํํธ์จ์ด ์์ง๋์ด๊ฐ ๋์์ต๋๋ค. ๋ ๋ง์ Go ๊ฐ๋ฐ์๋ฅผ ํ๋ณดํ๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐ ์์ ๋๋ ์ธ๋ถ์ธ์๊ฒ ์์ ๋๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ์ฝ๋์ ๊ฐ๊ฒฐํจ์ ์ ์ถฉํจ์ผ๋ก์จ ๊ถ๊ทน์ ์ผ๋ก ์ฐ๋ฆฌ๋ฅผ ๋ ๋ซ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ๋ก ์ ํํ ๋ฐฉ์๊ณผ ํจ๊ป ํน์ ์ฌํญ์ ๋ํด ๊ฐ๊ฒฝํ ํ๋๋ฅผ ์ทจํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ Google ๋ด๋ถ ํ์ด ์ปค๋ฎค๋ํฐ์ ๋ ๋ง์ ์ ๋ขฐ์ ๋ฏฟ์์ ๊ตฌ์ถํ๊ฑฐ๋ ์ธ์ด, ์ํ๊ณ ๋๋ ์ฌ์ฉ์์๊ฒ ์ข์ง ์์ ํ์ฌ ๊ถค๋๋ฅผ ๊ณ์ํ ์ ์๋ ๊ธฐํ์ ๋๋ค.
Go ํ์ด ์ด ์ ์์ ์๋ ๊ทธ๋๋ก ๋ฐ์๋ค์ด๊ณ ๋ ๋ช ํํ ๋ถ๊ฐ๊ฐ์น๊ฐ ์๋ ๊ด๋ จ ์๋ ๋ค๋ฅธ ์ธ์ด ๋ฐ๋ณต์ ๊ณ์ ์ถ๊ตฌํ ๊ฒ์ ์์ฒญํฉ๋๋ค.
ํธ๋์ปค์ ์ค๋ ๋ฉ์ด ์์ ์๋ ์์ง๋ง ๊ฐ์ธ์ ์ผ๋ก ์ด ์ ์์ด ๊ณต์ ์๊ฒฉ์ผ๋ก ์๋ต๋๊ณ ์กฐ์ฉํ ์ฌ๋ผ์ง ์ ์๋ Google ๊ทธ๋ฃน์ผ๋ก ๋ถ๋ฅ๋์ง ์๋๋ค๋ ๋ณด์ฅ์ ๊ฐ์ธ์ ์ผ๋ก ํจ์ฌ ์ํฉ๋๋ค.
์ฃผ์ ๋ ์ด๋ฏธ Google ๊ทธ๋ฃน์์๋ ๋ ผ์๋์์ต๋๋ค.
#32437์ ํ์ฌ ๋ฒ์ ์ ๋ง์กฑ์ค๋ฝ์ง ์์ต๋๋ค. try() ๋ด์ฅ์ ํ๋ จ๋์ง ์์ ๋์ ๋ํ ๋ง์ ์คํ ๊ฒฝ๋ก๋ฅผ ์จ๊น๋๋ค. ์ฒดํฌ์ ํธ๋ค์ด ์๋ ์๋ ์ ์์ ๋งค์ฐ ์ดํดํ๊ธฐ ์ฌ์ ๊ณ ์ฒดํฌ ํค์๋๊ฐ ๋์ ๋์์ต๋๋ค.
์ด์ try() ๋ด์ฅ์ ํจ์์ฒ๋ผ ๋ณด์ ๋๋ค. ์ ์ด ํ๋ฆ์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๊ฒ์ ๋ถ๋ช ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ํ panic()์ ๊ฐ์ง๊ณ ์์ง๋ง, ๊ทธ๊ฒ์ (๋ด ์๊ฐ์) ํญ์ ๊ทธ ์์ฒด๋ก ์ค์ ์๊ณ , ์ ๋ช ํ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๊ทธ ์ฌ์ฉ์ ๊ฑฐ์ ์์ต๋๋ค. ๋ฐ๋ฉด์ try()๋ ๋ณต์กํ ํํ์ ์์ ์จ๊ธธ ์ ์์ต๋๋ค.
@theckman Robert๋ Rob๊ณผ Ken๊ณผ ํจ๊ป Go์ ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต์ ๋์์ธํ์ผ๋ฉฐ Robert์ Russ๋ ์ผ์ฐ ํ์ ํฉ๋ฅํ์ต๋๋ค. ๊ทธ๋ค์ ์ฒ์๋ถํฐ ๋ฐ๋์ ์ฐ๊ตฌํด ์์ต๋๋ค. ์ ์์ด "์๋ Go ์์ฑ์๊ฐ ๊ฒฐ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ ์ ์ ์ ์๋ฐฐ"๋๋์ง ์ฌ๋ถ๋ฅผ ์ ์ ์๋ค๊ณ ๋ฏฟ์ ์ ์์ต๋๋ค.
๋๋ ์ค๋๋ ๊ณผ ๊ฐ์ด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋๊ฒฐํ๋ ์ ์์ ์์น์ ์ซ์ดํฉ๋๋ค. ๊ทธ๋ฌํ ์ ์์ ์ด ์ฃผ์ ์ ๋ํ ๋ชจ๋ ํฅํ ์ ์์ ๊ธ์งํฉ๋๋ค.
๋์ ๋์์ธ ๋ฐ๋ณต์ ์๋ฝํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ํ์ธ/์ฒ๋ฆฌ ์ ์์ด ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ช ๊ฐ์ง ๋จ์ ์ด ๋ ผ์๋์์ต๋๋ค. ์ด๊ฒ์ ์๋ ์ ์์ผ๋ก ์ด์ด์ก์ต๋๋ค. ์ด ์ ์์ ๋ช ๊ฐ์ง ๋จ์ ์ด ์ง๊ธ ๋ ผ์๋ฉ๋๋ค. ์๋ง๋ ์ด๊ฒ์ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ด ๋ฐ๊ฒฌ๋ ๋๊น์ง ๋ ๋์ ๋ ๋ค๋ฅธ ์ ์์ผ๋ก ์ด์ด์ง ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ ํนํฉ๋๋ค.
Rust์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๊ฐ๋ ์ ์ผ๋ก Go์์ ์ํํ๋ ์์ ๊ณผ ์ ์ฌํฉ๋๋ค(์ค๋ฅ๋ ๊ฐ, ๋ช ์์ ์ ์ด ํ๋ฆ์ด์ง๋ง ํฉ๊ณ ์ ํ์ ๋์ ์ฌ์ฉํ ๋ ์ฌ๋ฌ ๋ฐํ ๊ฐ์ ์ฌ์ฉํ๋ค๋ ์ ์ ์ ์ธํ๋ฉด). Rust๋ Go์ ๊ฐ์ ์ฅํฉํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ด๊ฒ์ Rust๊ฐ ์๋๋ฅผ ์ถ๊ฐํ๋๋ก ํ์ต๋๋ค! ๋งคํฌ๋ก, ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ตญ ? ์ด์์. Rust ์ปค๋ฎค๋ํฐ๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ด๋ จํ์ฌ Go ์ปค๋ฎค๋ํฐ๋ณด๋ค ํจ์ฌ ๋ ์๊ฒฉํฉ๋๋ค(์ค๋ฅ ์ฒ๋ฆฌ RFC ๋ฐ ํ ๋ก ์ ๊ณ๋ชฝ์ ์ ๋๋ค). ๊ทธ๋ค์ ์๋ชป๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ฏธ๋๋ฌ์ด ๊ธฐ์ธ๊ธฐ ์์ด ์ค๋ฅ ์ฒ๋ฆฌ์ ์ฅํฉํจ์ ์ค์ด๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
ํ์ฌ ์ธ์ด, ์ํ๊ณ ๋๋ ์ฌ์ฉ์์๊ฒ ์ข์ง ์์ ๊ถค์
๋ฌด์จ ์๊ธฐ๋ฅผํ๋ ๊ฑด๊ฐ์? Go๋ ์ง์์ ์ผ๋ก ๊ฐ์ ๋๊ณ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฅญํ ์ธ์ด, ๋๊ตฌ ๋ฐ ๋ฌธ์์ ๋ฌด๋ฃ๋ก ์ก์ธ์คํ ์ ์๋ค๋ ๊ฒ์ ๋๋ผ์ด ์ผ์ ๋๋ค.
@theckman Robert๋ Rob๊ณผ Ken๊ณผ ํจ๊ป Go์ ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต์ ๋์์ธํ์ผ๋ฉฐ Robert์ Russ๋ ์ผ์ฐ ํ์ ํฉ๋ฅํ์ต๋๋ค. ๊ทธ๋ค์ ์ฒ์๋ถํฐ ๋ฐ๋์ ์ฐ๊ตฌํด ์์ต๋๋ค. ์ ์์ด "์๋ Go ์์ฑ์๊ฐ ๊ฒฐ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ ์ ์ ์ ์๋ฐฐ"๋๋์ง ์ฌ๋ถ๋ฅผ ์ ์ ์๋ค๊ณ ๋ฏฟ์ ์ ์์ต๋๋ค.
๋๋ ์ค๋๋ ๊ณผ ๊ฐ์ด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋๊ฒฐํ๋ ์ ์์ ์์น์ ์ซ์ดํฉ๋๋ค. ๊ทธ๋ฌํ ์ ์์ ์ด ์ฃผ์ ์ ๋ํ ๋ชจ๋ ํฅํ ์ ์์ ๊ธ์งํฉ๋๋ค.
๋์ ๋์์ธ ๋ฐ๋ณต์ ์๋ฝํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ํ์ธ/์ฒ๋ฆฌ ์ ์์ด ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ช ๊ฐ์ง ๋จ์ ์ด ๋ ผ์๋์์ต๋๋ค. ์ด๊ฒ์ ์๋ ์ ์์ผ๋ก ์ด์ด์ก์ต๋๋ค. ์ด ์ ์์ ๋ช ๊ฐ์ง ๋จ์ ์ด ์ง๊ธ ๋ ผ์๋ฉ๋๋ค. ์๋ง๋ ์ด๊ฒ์ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ด ๋ฐ๊ฒฌ๋ ๋๊น์ง ๋ ๋์ ๋ ๋ค๋ฅธ ์ ์์ผ๋ก ์ด์ด์ง ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ ํนํฉ๋๋ค.
Rust์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๊ฐ๋ ์ ์ผ๋ก Go์์ ์ํํ๋ ์์ ๊ณผ ์ ์ฌํฉ๋๋ค(์ค๋ฅ๋ ๊ฐ, ๋ช ์์ ์ ์ด ํ๋ฆ์ด์ง๋ง ํฉ๊ณ ์ ํ์ ๋์ ์ฌ์ฉํ ๋ ์ฌ๋ฌ ๋ฐํ ๊ฐ์ ์ฌ์ฉํ๋ค๋ ์ ์ ์ ์ธํ๋ฉด). Rust๋ Go์ ๊ฐ์ ์ฅํฉํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ด๊ฒ์ Rust๊ฐ ์๋๋ฅผ ์ถ๊ฐํ๋๋ก ํ์ต๋๋ค! ๋งคํฌ๋ก, ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ตญ ? ์ด์์. Rust ์ปค๋ฎค๋ํฐ๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ด๋ จํ์ฌ Go ์ปค๋ฎค๋ํฐ๋ณด๋ค ํจ์ฌ ๋ ์๊ฒฉํฉ๋๋ค(์ค๋ฅ ์ฒ๋ฆฌ RFC ๋ฐ ํ ๋ก ์ ๊ณ๋ชฝ์ ์ ๋๋ค). ๊ทธ๋ค์ ์๋ชป๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ฏธ๋๋ฌ์ด ๊ธฐ์ธ๊ธฐ ์์ด ์ค๋ฅ ์ฒ๋ฆฌ์ ์ฅํฉํจ์ ์ค์ด๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
ํ์ฌ ์ธ์ด, ์ํ๊ณ ๋๋ ์ฌ์ฉ์์๊ฒ ์ข์ง ์์ ๊ถค์
๋ฌด์จ ์๊ธฐ๋ฅผํ๋ ๊ฑด๊ฐ์? Go๋ ์ง์์ ์ผ๋ก ๊ฐ์ ๋๊ณ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฅญํ ์ธ์ด, ๋๊ตฌ ๋ฐ ๋ฌธ์์ ๋ฌด๋ฃ๋ก ์ก์ธ์คํ ์ ์๋ค๋ ๊ฒ์ ๋๋ผ์ด ์ผ์ ๋๋ค.
Rust ๊ฐ๋ฐ์ ์ญ์ฌ๋ ๊ทธ ๋ค์ ์๋ ์น๊ตฌ๋ค์ด ์์ ๋ค์ด ๋ฌด์์ ํ๊ณ ์๋์ง ์ ํ ๋ชฐ๋์์ ๋ณด์ฌ์ค๋๋ค. ๊ทธ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก Haskell์ ์ค๋ฅ ์ฒ๋ฆฌ ์์น์ ๋ณต์ฌํ์ง๋ง ๋ช
๋ นํ(์ค์ ์ธ๊ณ?) ํ๋ก๊ทธ๋๋ฐ์๋ ์ ํฉํ์ง ์์ต๋๋ค. ?
๋งคํฌ๋ก๋ ์ด๊ธฐ์ ์คํจํ ์ค๋ฅ ์ฒ๋ฆฌ ์์คํ
์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ ๋ฟ์
๋๋ค.
@ianlancetaylor ์ฌ๊ธฐ์ ์ ์์ด ์์ต๋๋ค. @miekg ๋ ์ฐ๋ฆฌ ์ธ์ด์ ์ง๋์ ์ค ํ ์ฌ๋์ผ๋ก์ ๋ ์ด์
if err != nil
๋ฅผ ์๋ Go ์์ฑ์๊ฐ ๊ฒฐ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ ์ ์ ๊ณผ ๋ชจ์๋๋ ๋ค๋ฅธ ๊ตฌ์ฑ์ผ๋ก ๋์ฒดํ์ง ์์ ๊ฒ์ ์ ์ํฉ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ด ์์ฒญ์ ๋ค๋ฅธ ์ ์์ฒ๋ผ ์ฒ๋ฆฌํ๋ ๋์golang-nuts
๋ก ์ด๋ํ์ฌ ์ด ์์ฒญ์ ์ค์์ฑ์ ์ฃผ์ฅํ๋ ค๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ๊ทธ๊ฒ์ ๋น์ ์ ์๋๊ฐ ์๋ ์๋ ์์ง๋ง, ๊ทธ๊ฒ์ ๋ด๊ฐ ๋๋ผ๋ ์ํฅ์ ๋๋ค.์ฐ๋ฆฌ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ ํนํ๋ฉฐ ๋ค๋ฅธ ์ธ์ด์ ๋นํด ์์ฒญ๋ ๋ถ๊ฐ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ด๊ฐ ๊ตฌ์ถํ ์์คํ ์ ์ค๋ฅ์ ๋ํด ์๊ฐํ๋ ๋ฐฉ์์ ์์ ํ ๋ฐ๊ฟจ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ๊ฐ๋ ฅํ ์ํํธ์จ์ด ์์ง๋์ด๊ฐ ๋์์ต๋๋ค. ๋ ๋ง์ Go ๊ฐ๋ฐ์๋ฅผ ํ๋ณดํ๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐ ์์ ๋๋ ์ธ๋ถ์ธ์๊ฒ ์์ ๋๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ์ฝ๋์ ๊ฐ๊ฒฐํจ์ ์ ์ถฉํจ์ผ๋ก์จ ๊ถ๊ทน์ ์ผ๋ก ์ฐ๋ฆฌ๋ฅผ ๋ ๋ซ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ๋ก ์ ํํ ๋ฐฉ์๊ณผ ํจ๊ป ํน์ ์ฌํญ์ ๋ํด ๊ฐ๊ฒฝํ ํ๋๋ฅผ ์ทจํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ Google ๋ด๋ถ ํ์ด ์ปค๋ฎค๋ํฐ์ ๋ ๋ง์ ์ ๋ขฐ์ ๋ฏฟ์์ ๊ตฌ์ถํ๊ฑฐ๋ ์ธ์ด, ์ํ๊ณ ๋๋ ์ฌ์ฉ์์๊ฒ ์ข์ง ์์ ํ์ฌ ๊ถค๋๋ฅผ ๊ณ์ํ ์ ์๋ ๊ธฐํ์ ๋๋ค.
Go ํ์ด ์ด ์ ์์ ์๋ ๊ทธ๋๋ก ๋ฐ์๋ค์ด๊ณ ๋ ๋ช ํํ ๋ถ๊ฐ๊ฐ์น๊ฐ ์๋ ๊ด๋ จ ์๋ ๋ค๋ฅธ ์ธ์ด ๋ฐ๋ณต์ ๊ณ์ ์ถ๊ตฌํ ๊ฒ์ ์์ฒญํฉ๋๋ค.
๊ทธ๋ค์ 60 ๋ ๋์ ํ์ฌ ์ ํ ์์คํ ์ผ๋ก ์ฌ๊ฐํ ์ผ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ค์ ๋ง์นจ๋ด Go 2.0์์ 80๋ ๋ ์์ด๋์ด๋ฅผ ๋น๋ ค์ผ ํฉ๋๋ค.
๋ฌด์จ ์๊ธฐ๋ฅผํ๋ ๊ฑด๊ฐ์? Go๋ ์ง์์ ์ผ๋ก ๊ฐ์ ๋๊ณ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฅญํ ์ธ์ด, ๋๊ตฌ ๋ฐ ๋ฌธ์์ ๋ฌด๋ฃ๋ก ์ก์ธ์คํ ์ ์๋ค๋ ๊ฒ์ ๋๋ผ์ด ์ผ์ ๋๋ค.
@ngrilly ๋ง์ง๋ง ๋ถ๋ถ์ ์๋ง๋ ๋ ํฐ ํ ๋ก ์ ์ํ ๊ฒ์ ๋๋ค. ์ด ์ ์์ ํ์ ์ํค์ง ์๊ณ ๊ทธ ์๊ฒฌ์ ์ด๋ ์ ๋ ๋ง๋ฌด๋ฆฌํ๋ฉด์ ์ปค๋ฎค๋ํฐ/์ํ๊ณ์ ์ฌ์ฉ์์ ๋ฆฌ๋์ญ ์ฌ์ด์ ๋ถ์ผ์น์ ๋ํ ๊ฐ์ ์ด ์ปค์ง๊ณ ์์ต๋๋ค.
๋๋จธ์ง ํ ๋ก ์์๋ ๊ตฌ๋ฌธ์ ๋ ๋ง์ ์ธ์ง ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์น๋ฆฌ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋๋ ๊ทธ๋ค์ด ๊ทธ๋ค์๊ฒ ํจ๊ณผ๊ฐ ์๋ ๊ฒ์ ๋ฐ๊ฒฌํด์ ๊ธฐ์ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๋ค์ด ์๋๋๋ค.
๋ฐฉ๊ธ ์ธ๋ผ์ธ if ๋ฌธ์ ๋ํ ์ ์์ ์ด์์ต๋๋ค. https://github.com/golang/go/issues/32860
์ฐธ์กฐ: https://github.com/golang/go/issues/32825#issuecomment -506707539
์๋ก์ด golang 2.0 ๊ธฐ๋ฅ์ ๋ํ ์ ์์ ์ ์ถํ๋ ๋ชจ๋ ์ฌ๋์ด https://github.com/golang/go ์ ๋ถ๊ธฐ ๋ถ๊ธฐ๋ฅผ ์ ๊ณตํ๋ค๋ฉด ์ด ์ธ์์ด ์ผ๋ง๋ ๋ ์ข์๊น? ์ ์ฅ์ ํ์) ํด๋น ์ ์์ ๊ตฌํํฉ๋๋ค.
๋์ํ์ง ์์ต๋๊น?
@av86743 ์ด ์ ์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒ ๊ฐ์ต๋๋ค. ํด๋น ์กฐ์น๋ฅผ ์ ์ํ๋ ์ ์์๋ฅผ ์ ์ถํ์ญ์์ค.
์ ์ ๋ฌธ์ ์์ฒด์ ์๋ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋๊ตฐ๊ฐ๊ฐ ๊ฑฐ์ ํ๊ธฐ ์ ์ ๋ง์ ๋ ธ๋ ฅ์ ๋ญ๋นํ ์ํ์ด ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฒํ ์กฐ์ฐจ ๋์ง ์๋ ํฌํฌ์ ๊ทธ ๋ชจ๋ ์๊ฐ์ ๋ณด๋์ต๋๋ค.
์ด ๊ตฌ๋ฌธ์ ์ด๋ป์ต๋๊น?
# call error handler
try callFunction(), errorHandler()
# error handler with anonymous function
variable := try callSomething(), func(err *Error) { # error handling }
@theckman ์ด ํ ๋ก ์ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ฎ๊ธฐ
"์๋ ๋ฐ๋ ์๊ฐ"๋ฅผ ์ธ๊ธ ํ์ จ๊ธฐ ๋๋ฌธ์ "์๋" ์ ์์ ๋ฐ๋ ์์์ 3๋ช ์ค ํ
๋๋ ์ด ์ ์์ ๊ฐ๋ ฅํ ๋์ํฉ๋๋ค. ๋ณ๊ฒฝํด์ผ ํ ์ ์ผํ ๊ฒ์ go fmt, make go fmt ํ๋์ if ๋ฌธ์ ํ์ฉํ๋๋ก ํ๋ ๊ฒ๋ฟ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ ์ ๋ง ํ ์ค์ ์ํด
if err != nil { return wrappedErr{err} }
์ธ ์ค ๋์
if err != nil {
return wrappedErr{err}
}
@av86743 ์ด ์ ์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๊ฒ ๊ฐ์ต๋๋ค. ํด๋น ์กฐ์น๋ฅผ ์ ์ํ๋ ์ ์์๋ฅผ ์ ์ถํ์ญ์์ค.
@theckman ์ด๋ป๊ฒ ํ๋ผ๊ณ ๋ง์
์ ์ ๋ฌธ์ ์์ฒด์ ์๋ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋๊ตฐ๊ฐ๊ฐ ๊ฑฐ์ ํ๊ธฐ ์ ์ ๋ง์ ๋ ธ๋ ฅ์ ๋ญ๋นํ ์ํ์ด ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฒํ ์กฐ์ฐจ ๋์ง ์๋ ํฌํฌ์ ๊ทธ ๋ชจ๋ ์๊ฐ์ ๋ณด๋์ต๋๋ค.
๊ทธ๊ฒ์ [... _๊ฐ๊ฒฐํจ์ ์ํด ์๋ต๋ ์์ ํ ์ ์ ํ ์ธ์ด๋ก ๋ ์ค๋ช _ ...]์ ๋ํ "๋ญ๋น๋ ๋ ธ๋ ฅ"์ผ ๋ฟ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ฝ๋์๊ฒ ์ด๋ ์ฌ์ํ์ง๋ง ์ ์ฉํ ์ฐ์ต์ด ๋ ๊ฒ์ด๋ฉฐ ๋์์ Go ์ปค๋ฎค๋ํฐ์ ๋ํ ์๋น์ค๊ฐ ๋ ๊ฒ์ ๋๋ค.
@av86743 ๋๋ ๋น์ ์ด ์ ์ํ ๊ฒ์ด ํฅ๋ฏธ๋ก์ด ์์ด๋์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ ๊ด๋ จ์ด ์๋ ๋ฌธ์ ์ ๋ ผํ์ผ๋ก ์์ค๋๋ ๊ฒ์ ์ํ์ง ์์์ต๋๋ค. ๊ณต์์ ์ธ ๊ณ ๋ ค ๋์์ผ๋ก ์ผ๋ ๋ฐ ๊ด์ฌ์ด ์์ผ์๋ค๋ฉด ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ ๊ฒ์ ์นํธํ๋ ์ ์ฌ๊ณผ๋๋ฆฝ๋๋ค.
์ด ํน์ ์ ์์ด @griesemer ์์ ์ฅํฉํจ ์ ๋ํด 10๋ ๋์ ๋ด์ ๋ถ๋ ธ๋ก ๋์ด์ค๋ฅด๊ณ ์๋ค๋ ๊ฒ์ด ๋ฏฟ๊ธฐ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ ๋ฐ์ด๋ ์์ง๋์ด์ด๊ณ ์์ง๋์ด๋ (์ธ์๋) ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ ์ ์ํฉ๋๋ค. ๊ทธ๋ค์ ๋ง๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ฌธ์ ํด๊ฒฐ์ _์ข์_ํฉ๋๋ค. ๋ฌธ์ ์ ๋์๋ฅผ ๋งก๋ ๊ฒ๋ง์ผ๋ก๋ ๋ชจ๋ ์ข ๋ฅ์ ์์ด๋์ด๋ฅผ ๋ ์ฌ๋ฆฌ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค. ์ผ๋จ ๊ทธ ์ฌ๊ณ ๊ณผ์ ์ด ์๋นํ ์ง์ ๋๋ฉด, ์ฐ๋ฆฌ ์ค ๋๊ตฌ๋ ๊ฐ์ ์ ์ผ๋ก ์ฐ๋ฆฌ์ ์ถ์ ๋๋ ํด๊ฒฐ์ฑ ์ ๋ฒ๋ฆฌ๊ณ _์ด์ฉ๋ฉด ๊ทธ๊ฒ์ด ์ค์ ๋ก ๋ฌธ์ ๊ฐ ๋์ง ์์ ์๋ ์๋ค๊ณ ์๊ฐํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๊ฒฐ๊ตญ, ์ฐ๋ฆฌ๋ ์ง์ ์ผ๋ก ๋งํด์ ์๊ธฐ๋ฅผ ๋ณ์๊ณ , ๊ทธ๊ฒ์ ๊ทธ๋ฅ ๋ฒ๋ฆฌ๊ธฐ๊ฐ ์ฝ์ง ์์ต๋๋ค.
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ด ๊ฐ์ธ์ ์ธ ์์ฌ์ ์ด์ ๋ํ Go ํ์ ์ถ๋ก ํ๋ก์ธ์ค๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋์๋ค๋ ๊ฒ์ ๋๋ค.
์๋์์ ๋ณต๊ตฌ()์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ catch()๋ฅผ ์ฐ๊ธฐํ์ฌ catch() ํจ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
์์:
func doSomthing()(err error){
//return error
}
func main(){
defer func(){
if err:=catch();err!=nil{
//found error
}
}()
try doSomthing()
}
๋ง์ ๊ธฐ๋ฅ์
func Foo() (err error) {
defer func(){
if err:=catch();err!=nil{
//found error
}
}()
try{
file1 := open("file1")
defer file1.Close()
file2 := open("file2")
defer file2.Close()
}
//without try
file3,err := open("file3")
defer file3.Close()
}
์๋์์ ๋ณต๊ตฌ()์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ catch()๋ฅผ ์ฐ๊ธฐํ์ฌ catch() ํจ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
์์:func doSomthing()(err error){ //return error } func main(){ defer func(){ if err:=catch();err!=nil{ //found error } }() try doSomthing() }
๋ง์ ๊ธฐ๋ฅ์
func Foo() (err error) { defer func(){ if err:=catch();err!=nil{ //found error } }() try{ file1 := open("file1") defer file1.Close() file2 := open("file2") defer file2.Close() } //without try file3,err := open("file3") defer file3.Close() }
์ด๊ฒ์ด ๊ฐ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ณ๋์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ์ด๋ป๊ฒ ๋์์ด ๋ฉ๋๊น?
๋ช ๊ฐ์ง ์ค๋ช :
try
์ ์ ์ ์ผ๋ถ ์ฌ๋๋ค์ด ์ด ์ค๋ ๋์์ ์ฃผ์ฅํ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ์๋ก์ด ๊ตฌ๋ฌธ์ด๋ ์ ํค์๋๋ฅผ ๋์
ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด ํ ์ ์๋ ๊ฐ์ฅ ์ต์ํ์ ๋ณ๊ฒฝ์ ๋ํ ์๋ก์ด ๋ด์ฅ ๊ธฐ๋ฅ์ ์๊ฐํฉ๋๋ค. ์ค์ํ๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํด ๋
ผ์ํ ๋ ์ ํํ๊ฒ ๋ง์ํด ์ฃผ์ญ์์ค. ์ ๊ตฌ๋ฌธ๊ณผ ์ ํค์๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ธฐ๋ณธ ์ ๊ณต๋๋ ๊ฒ ์ฌ์ด์๋ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ ์๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด๊ณ ํ์๋ ๋น๊ต์ ์ฌ์ํ ์ถ๊ฐ ์ฌํญ์
๋๋ค. try
์ ์์ด ์ ์ํ๋ ๊ฒ์ ๋น๊ต์ ์ฌ์ํ ์ถ๊ฐ ์ฌํญ์
๋๋ค.
๋๋ ์ด ํ ๋ก ์ด ๋ค๋ฅธ ๊ณณ(golang-nuts)์์ ๊ฐ์ต๋๋ ๊ฒ์ด ๋ ๋ซ๋ค๋ @ianlancetaylor์ ์๊ฒฌ์ ๋์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ ์์ด ์์ต๋๋ค.
์ค์ ๋ก @bitfield , ์ ๋ "Go์์ ๋ํ๋์ง ์์ ์ค๋ฅ ๋ฐํ์ ์์ธํ ์ ๋์ ๋ํ ๋ด๋ถ ๋ถ๋ ธ"๊ฐ ์์ต๋๋ค . ๊ฐ์ฌํฉ๋๋ค :-) ํ์ง๋ง ์ค๋ฅ ๊ฒ์ฌ๊ฐ ์๋ง๋ ํ์ํ ๊ฒ๋ณด๋ค ๋ ์ฅํฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ปค๋ฎค๋ํฐ์์ ์ด์ ๊ฐ์ ๊ฐ์ ์ ๋ฐ๋ณต์ ์ผ๋ก ์ ๊ธฐํ๋ค๋ ์ฌ์ค์ ์ฐ๋ฆฌ(๋ฐ๋ ํ)๋ง์ด ์ด๋ฌํ ๋ฏฟ์์ ๊ฐ๊ณ ์์ง ์๋ค๋ ๋ถ๋ช ํ ์งํ์ ๋๋ค. "๋ฌด์ธ๊ฐ"๋ฅผ ํด์ผ ํ๋ค๋ ์๋ฐ๊ฐ์ด ํฌ๋ค๊ณ ๋งํ ์ ๋๋ ์๋๋๋ค. ์ฐ๋ฆฌ๋ ์ค๋ซ๋์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์์ผ๋ฉฐ "์ฌ๋ฐ๋ฅธ" ์ ๊ทผ ๋ฐฉ์์ ๊ธฐ๋ค๋ฆฌ๋ ๋ฐ ๋ง์กฑํฉ๋๋ค. .
try
์ ์์ ์ค๋ฅ ๊ฒ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ (์ปค๋ฎค๋ํฐ ๊ธฐ์ฌ์ ์๋นํ ๋์์ผ๋ก) ์ฐ๋ฆฌ๊ฐ ์ฐพ์ ๊ฐ์ฅ ์ต์ํ์ ์๋ฃจ์
์ ๊ดํ ๊ฒ์
๋๋ค. try
์ ์์ ๋ชจ๋ ์ค๋ฅ ํ
์คํธ์์ ํน์ ๋ฐฉ์์ผ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ _์ ํ ๋์์ด ๋์ง ์๋๋ค๋ ์ฌ์ค์ ๋ํด ๋งค์ฐ ๋ช
์์ ์
๋๋ค. try
๋ ํจ์์ ๋ชจ๋ ์ค๋ฅ๊ฐ ๋์ผํ ๋ฐฉ์์ผ๋ก ํ
์คํธ๋๊ณ ์ฒ๋ฆฌ๋ ๋๋ง ๋์์ด ๋ฉ๋๋ค(๊ทธ๋ฐ ๋ค์ defer
์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค) ๋๋ ๋จ์ํ ๋ฐํ๋ ๋. ์ฌ๊ธฐ์์ ๋ ๋ช
ํํ๊ฒ ๋งํ๊ธฐ๋ ์ด๋ ต์ง๋ง ์ ์ ๋ด์ฉ์ ๋ฐ๋ณตํด ๋ณด๊ฒ ์ต๋๋ค. try
๋ ๋ชจ๋ ์ค๋ฅ ์๋๋ฆฌ์ค์์ ๋์์ด ๋์ง ์์ต๋๋ค. ๋ง์ ๊ฒฝ์ฐ์ ๋์์ด ๋ฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ์๋ if
๋ฌธ์ ์ฌ์ฉํ์ญ์์ค.
@griesemer try๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. Go์๋ RAII๊ฐ ์์ผ๋ฏ๋ก ๋ง์ ๊ฒฝ์ฐ์ ํจ์๋ฅผ ๊ทธ๋๋ก ๋ ์ ์์ต๋๋ค.
@sirkon , RAII๊ฐ ์ด ํ ๋ก ๊ณผ ์ผ๋ง๋ ๊ด๋ จ์ด ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. try
์ ํจํด ๊ธฐ์กด ๋์ฒดํฉ๋๋ค if ..., err := f(); err != nil { return ..., err }
A๋ฅผ ... := try(f())
. try
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ํด์ ๋ฒ๊ทธ๊ฐ ์์๋ค๋ฉด ๋ถ๋ช
ํ ์ด์ ์๋ ์กด์ฌํ์ต๋๋ค. try
์ ๋์
์ ๋ฆฌ์์ค ํด์ ๋ฒ๊ทธ๋ฅผ ๊ฐ์ ํ๊ฑฐ๋ ๋ฐฉ์งํ์ง ์์ต๋๋ค.
@sirkon , RAII๊ฐ ์ด ํ ๋ก ๊ณผ ์ผ๋ง๋ ๊ด๋ จ์ด ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
try
์ ํจํด ๊ธฐ์กด ๋์ฒดํฉ๋๋คif ..., err := f(); err != nil { return ..., err }
A๋ฅผ... := try(f())
.try
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ํด์ ๋ฒ๊ทธ๊ฐ ์์๋ค๋ฉด ๋ถ๋ช ํ ์ด์ ์๋ ์กด์ฌํ์ต๋๋ค.try
์ ๋์ ์ ๋ฆฌ์์ค ํด์ ๋ฒ๊ทธ๋ฅผ ๊ฐ์ ํ๊ฑฐ๋ ๋ฐฉ์งํ์ง ์์ต๋๋ค.
์ค๋ ๋๋ฅผ ์ฝ์ผ์ญ์์ค. ์๊ฐ ์์ต๋๋ค.
info := try(try(os.Open(fileName)).Stat())
@sirkon ๋๋ ๊ทธ ์๋ฅผ ์ง๊ธ ์ฌ๋ฌ ๋ฒ ๋ณด์์ต๋๋ค. ํฅ๋ฏธ๋กญ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ํ์ง๋ง ์กฐ๊ธ ๋ ์๊ฐํด๋ณด์. ์ ์๋ try
๋ด์ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก Go ์ฝ๋์์ ๋ฐ๊ฒฌ๋๋ ํน์ ์ข
๋ฅ์ ์์ฉ๊ตฌ์ ๋ํ ๊ตฌ๋ฌธ ์คํ์
๋๋ค. ๋ฐ๋ผ์ ํด๋น ์์ ๋ฅผ ์๋ณธ ์ฝ๋๋ก ๋ณํํ ์ ์์ต๋๋ค.
f, err := os.Open(fileName)
if err != nil {
return err
}
info, err := f.Stat()
if err != nil {
return err
}
ํด๋น ์ฝ๋์๋ ๋์ผํ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. ๋๋ ํ์คํ ๊ทธ๋ฐ ์ฝ๋๋ฅผ ๋ณด์๋ค. try
๋ด์ฅ์ด ๊ทธ ๋ฒ๊ทธ๋ฅผ ์์ฑํ๊ธฐ ๋ ์ฝ๊ฑฐ๋ ๋ณด๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์ ๋ถ๋ช
ํ์ง ์์ต๋๋ค.
[ @ianlancetaylor ๊ฐ ์ ๋ฅผ ์ด๊ฒผ๋ ๊ฒ ๊ฐ์ต๋๋ค.]
@sirkon ์ด ๋ฒ๊ทธ๋ ์ด๋ฏธ ๊ฐ๋ฅํฉ๋๋ค. try
์ฌ๋ถ - Go๋ ๋์ ์ฝ๋ ์์ฑ์ ๋ฐฉ์งํ์ง ์์ต๋๋ค. ๋๋ try
๊ฐ ํ์ฉ๋์ง ์์์ผ ํ๋ ์ด์ ๋ก ์๋ชป๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ์ด ์๋๋๋ค. ๋์ go vet
๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ์ ํ๋๊ทธ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
defer
๋ ํจ์๊ฐ ๋ฐํ๋ ๋ ์ ๋ฆฌํ๋ Go ๊ด์ฉ๊ตฌ์ด๋ฉฐ ์ ์๋ํฉ๋๋ค. ๋ฌผ๋ก ์ฌ๊ธฐ์ ๋ํ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
f := try(os.Open(filename))
defer f.Close()
info := try(f.Stat())
์ด๊ฒ์ ๋ค์๊ณผ ๋น๊ตํ์ญ์์ค.
f, err := os.Open(filename)
if err != nil {
return ..., err
}
defer f.Close()
info, err := f.Stat()
if err != nil {
return ..., err
}
try
ํ๋ฉด ์์ค๋ ํ์ผ์ ํ์ผ ์ ๋ณด๋ฅผ ์ป๋ ์ฃผ์ ๊ด์ฌ์ฌ์ ์ง์คํฉ๋๋ค. ์ ํต์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋๋ถ๋ถ์ ์์ค ์ฝ๋๋ ๊ฐ๋ฅํ ์ค๋ฅ์ ๋ํด ์ฐ๋ คํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ชจ๋ ๋์ผํฉ๋๋ค. ์ค๋ฅ๋ฅผ ๊พธ๋ฏธ๊ณ ์ถ์ด๋ try
์ ๊ทผ ๋ฐฉ์์ ํ๋ฅญํ๊ฒ ์๋ํฉ๋๋ค.
defer errd.Wrap(&err, "failed to do X for %s", filename)
f := try(os.Open(filename))
defer f.Close()
info := try(f.Stat())
errd
ํจํค์ง์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค(๋ฌธ์ #32676 ์ฐธ์กฐ).
@griesemer
๋ด ๋ฏธ๋์ ์์ฒด ์ฝ๋ ๊ฒํ ๋ ์ฌ์ ํ ์ ์ด ํ๋ฆ ๋ฉ์ปค๋์ฆ์ด ์์ฒด ๋ผ์ธ์ ์์ด์ผ ํ๋ค๊ณ ๊ณ์ ์ธ์น๊ณ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ด ํ์ฌ ์ ์ ๋ด์์ ์ ํจํ ์ ์์ต๋๊น(์ํ ์์)? ๊ฐ๋
์ฑ ์ธ์๋ ๋ ์์ธํ ์ค๋ฅ ์ฒ๋ฆฌ ๋
ผ๋ฆฌ๋ก์ ๋ฆฌํฉํ ๋ง์ด ์ฌ์์ก์ต๋๋ค.
defer errd.Wrap(&err, "failed to do X for %s", filename)
f, err:= os.Open(filename)
try(err) // check is so much a better term
defer f.Close()
info, err := f.Stat()
try(err)
๋ํ handle
๋ํ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ๊ธฐ์์๋ ํ๋ฅญํด ๋ณด์ด์ง๋ง ์ฌ๋ฌ ๋ฒ ์ฐ๊ธฐํ๋ฉด ์๋ง์ด ๋์ง ์์๊น์? ์๋๋ฉด ๊ธฐ๋ฅ ๋ฒ์ ๋๊ธฐํ๊ฐ ์์ ๊ฒ์
๋๊น?์ผ๋จ ์ผ์ข
์ ๊ฒ(errd ๋ฌธ์ ์์ ์ค๋ช
์ ๋ณด์ง ๋ชปํ์ต๋๋ค)? ๊ทธ๋ ๋ค๋ฉด ์ต๋ช
์ ํจ์์ ์์ฒด ๋ฒ์๊ฐ ๋ถ์ฌ๋ฉ๋๊น? ๊ทธ๋ฆฌ๊ณ ์๋์... ์์ฌ - ๋๊ฐ 1์์ด๊ณ 2์๋ ๋ญ์ผ?
์ด ๋ชจ๋ ๊ฒ์ด Go ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ ๊ฐ์ง "๋ชจ๋"๊ฐ ๋๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ๊ทธ๋ ์ง ์๋ค๊ณ ๋งํฉ๋๋ค.
@griesemer ๋น์ ์ด ์ณ๋ค๊ณ ์๊ฐํ๋ ๋ฒ๊ทธ๋ ์ค๋๋ ์๋ ๊ฐ๋ฅํ์ง๋ง, ํ์ฌ try์ ๊ตฌํ๊ณผ ํจ๊ป ๋ฏธ๋์ ๋ ๋๋ฆฌ
์ด ์ ์์ด ์๋ฝ๋๋ฉด if err
์์ฉ๊ตฌ๋ฅผ ํผํ ์ ์์ด ์ต์ํ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. try๊ฐ ์์ฑ๋๊ธฐ ์ ์ ์์ฑ๋ stackoverflow ๋ต๋ณ, ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ๋ฑ์ ๊ฑฐ์ 10๋
๋์ Go ์ฝ๋๊ฐ ์๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋. ๊ทธ๋ค์ try๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ ๋ฐ if ๋ฌธ์ ๊ฐ๋จํ ์ญ์ ํ๋ ๋ฐฉ๋ฒ์ ๋น ๋ฅด๊ฒ ๋ฐฐ์ธ ๊ฒ์
๋๋ค. ๊ทธ๋ค์ try ์ ์์์ Stat()
์ฒ๋ผ ์ํ๋ ํ๋์ ์ก์ธ์คํ ์ ์์ ๋๊น์ง try
๋ํ๋ ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ์ ์ ์๋ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ต์ํ ํจํด์ด๋ผ ๋ฐ๋์ ์ธ ๋ ์ ์ฉํ๋ ๊ฒ์ ๋น์ฐํ๋ค. ๊ฐ์ฅ ํ์ ํ๋ Go OS๊ฐ ๋ชจ๋ ๊ฒ์ ํ์ผ๋ก ์ทจ๊ธํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๋ ๋ง์ ๋ฆฌ์์ค ๋์๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๋ ๊ฒ์ด ํ๋นํฉ๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ "์ค๋ ์ด๋ฏธ ํ ์ ์๋ค"๋ผ๋ ๋ง์ ๊ฐ๋ ฅํ๊ฒ ๋์ํ์ง ์๋ ์ด์ ๋ฅผ ์๋ ค์ค๋๋ค. ์๋ํ๋ฉด ๋จ์ํ ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฌผ๋ก ์
๋๋ค. ํ์ผ ํธ๋ค์ด ๋์ถ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Go๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฒ์ ๋ด ์๋ณ์๋ฅผ ๊ฑด๋๋ฐ์ด ํ์ผ์ ์ ์ถํ ๊ธฐํ๋ฅผ ์ฃผ์ง ์์ต๋๋ค. ๊ฑด๋๋ด ๊ฐ ์๋ณ์ f
๋ ์ ์ถ๋ ํ์ผ ํธ๋ค์
๋๋ค. ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ฐ๋ ์ํ๊ณ์์ ๋์ ๋๋ ํน์ ๊ด์ฉ๊ตฌ๊ฐ ๊นจ์ ธ์ผ _ํ์ํฉ๋๋ค_. ๋ฐ๋ผ์ ์ค๋๋ ์ค๊ณ๋ ๋๋ก ๊ธฐ๋ฅ์ ๋์
ํ๋ฉด Go์์ ๋ฆฌ์์ค๊ฐ ๋์ถ๋ ์ํ์ด ๋ถ๋ช
ํ ๋์์ง๋๋ค.
https://github.com/golang/go/issues/32825#issuecomment -506882164์์ ์ธ๊ธํ๋ฏ์ด ๋ช ๊ฐ์ง ์์ ์กฐ์ ์ด ์ด๋ฃจ์ด์ง๋ฉด ์ค์ ๋ก try
์ง์ํ ๊ฒ์
๋๋ค. ์ธ์ด ์ถ๊ฐ๋ฅผ ํ์ํฉ๋๋ค. ์๋๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ํ ๋น์ RHS์์๋ง ์ ํจํ๊ฒ ๋ง๋ค๊ณ ๋ฐํ ๊ฐ์ ์ฃผ์ ์ง์ ํ ์ ์๋๋ก ํ๋ ๊ฒ์
๋๋ค. try ์ฌ์ฉ์ "์ข์" ์(ํ ์ค์ ํ ๋ฒ ์๋ํ๋ ๊ฒฝํฅ์ด ์์)๋ฅผ try๋ฅผ ์ฌ์ฉํ๋ "์ ์ผํ" ๋ฐฉ๋ฒ์ผ๋ก ๋ง๋์ญ์์ค. ์:
info := try(try(os.Open(filename)).Stat()) // compiler error
f := try(os.Open(filename)) // valid
// we were forced to assign f, so we still have an identifier to Close (serve linters and users alike)
defer f.Close()
info := try(f.Stat())
a, b := try(strconv.Atoi("1")), try(strconv.Atoi("2")) // also valid
a, b := try(strconv.Atoi("1"), strconv.Atoi("2")) // maybe?
a, b := try strconv.Atoi("1"), strconv.Atoi("2")
๋๋ ์ด๊ฒ์ด ์ธ์ด์ ์์ฐ์ค๋ฝ๊ฒ ๋ ์ ๋ง์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋จ์ ์์ด try
์ ๋ชจ๋ ํ์ฌ ์ด์ (์ด์ ์ ๊ณ ๋ คํ๋ ๊ฒฝ์ฐ ์ค์ฒฉ ์ ์ธ)์ ์ ์งํฉ๋๋ค. ๋๋ try ์ค์ฒฉ์ด ๋๊ตฌ์๊ฒ๋ ๋์์ด ๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ์ฝ์ ๊ฑฐ์ ํ์ง ์์ง๋ง ๋จ์ฉ์ ๋ํ ๋ฌดํํ ๊ฐ๋ฅ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๋๋ ์ค๋ ํน๋ณํ ๊ธฐ๋ถ์ด ์ข์ง ์์ผ๋ฏ๋ก ์ด๊ฒ์ด ๋ด๊ฐ ํ ์ ์๋ ์ต์ ์ด๋ค.
total := try(try(os.Open(filename)).Stat()).Size() + try(strconv.Atoi(try(ioutil.ReadAll(os.Stdin))))
ํ์ง๋ง _์ฐ๋ฆฌ_๋ ๋น์ ์ด ์ฐ๋ฆฌ์๊ฒ ํ๋ฝํ๋ค๋ฉด ์ต์ ์ ์ํฉ์ ์๊ฐํ ๊ฒ์ ๋๋ค.
@daved try(err)
๋ฅผ ๋ ๋ฒ์งธ ์ค์ ๋ฃ๋ ๊ฒ์ ๊ธฐ์กด try
์ ์์์ ์์ ํ ์ง์๋ฉ๋๋ค. try
๋จ์ํ ๋ง์ง๋ง ๊ฐ์ด ๋ค์๊ณผ ๊ฐ์ ํ๋ ์ด์์ ๊ฐ์ผ๋ก ํ๊ฐ๋๋ ์ธ์๋ฅผ ์ํฉ๋๋ค. error
์
๋ ฅํ๋ฉด try(err)
๋ฅผ ์์ฑํ ๋ ์์ฐ์ค๋ฝ๊ฒ ๋ง์กฑ๋ฉ๋๋ค.
defer
์ ๋ํ ๊ทํ์ ์ฐ๋ ค๋ฅผ ๋ฐ๋ฅด๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ค๋ฅธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ defer
๊ฐ ์ฌ๋ฐ๋ฅธ ์ ํ์ด ์๋ ์ ์์ต๋๋ค. ๋์ ๊ธฐ์กด์ if
๊ฐ ํ์ํ ์ ์์ต๋๋ค(์ ์์์ ๋ช
์๋ ๋๋ก).
@cstockton ์ค์ฒฉ๋ try
๊ฐ ๋งค์ฐ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๋ํ ์ฐ๋ฆฌ๊ฐ try
์์๋ค๋ฉด ๋๋ถ๋ถ์ ์ฝ๋๊ฐ ๋น์ ์ด ์ ๊ณต ํ (์ ํจํ)
์คํ์ผ์ ๋ฌธ์ ๋ก, ์ฐ๋ฆฌ๋ ๋น์ ์ด ์ ํธํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ ํ์ ์ธ์ด์ ๋ฃ์ง ์์์ต๋๋ค - ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ํด go vet
๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๊ฒฐ๊ตญ, ์์ฑ๋ ์ํํธ์จ์ด์ ๊ฒฝ์ฐ ํจ๊ณผ๋ ๋์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ธ์ด๋ก ๋์ด ์์ง ์๋ค๊ณ ํด์ ์ฐ๋ฆฌ ์์ ์ ๋ฌถ๋ ๊ฒ์ ์๋๋๋ค. ์ด๋ฌํ ์ ํ ์ฌํญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉํ๋ ๊ฒ์ ๊น๋ค๋กญ๊ณ ์ฌ์์ ๋ถํ์ํ๊ฒ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค. go vet
์ ์กฐ์ ํ๋ ๊ฒ์ด ํจ์ฌ ์ฝ๊ณ ์ธ์ด ์กฐ์ ๋ณด๋ค ๋ ๋ง์ ๊ฒ์ ๋ฐฐ์ธ ๋ ๋ ๋๋ํ๊ฒ ๋ง๋ญ๋๋ค.
@griesemer ์ค๋ช
๊ฐ์ฌํฉ๋๋ค. ์ฝ๋ ์์ ์์ ์ฒซ ๋ฒ์งธ ์ค์ด var err error
์ธ ๊ฒฝ์ฐ ์ค ๋ฐ๊ฟ์ด ๋ ํ์ธ๋ ์ค๋ฅ์ ์ ์ฌ์ ์ผ๋ก ์ํฅ์ ์ค๋๊น? ๋๋ ์๋์์ด ๋ฏธ๋์ ๋ค๋ฃจ์ด์ง ์ ์๋ ๋ฌธ์ ๋ผ๋ ์ด์ผ๊ธฐ๋ฅผ ๋ณธ ์ ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ด๊ฒ๊ณผ ์ด๋ค ๊ด๋ จ์ด ์์ต๋๊น?
์๋์์ ๋ณต๊ตฌ()์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ catch()๋ฅผ ์ฐ๊ธฐํ์ฌ catch() ํจ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
์์:func doSomthing()(err error){ //return error } func main(){ defer func(){ if err:=catch();err!=nil{ //found error } }() try doSomthing() }
๋ง์ ๊ธฐ๋ฅ์
func Foo() (err error) { defer func(){ if err:=catch();err!=nil{ //found error } }() try{ file1 := open("file1") defer file1.Close() file2 := open("file2") defer file2.Close() } //without try file3,err := open("file3") defer file3.Close() }
์ด๊ฒ์ด ๊ฐ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ณ๋์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ์ด๋ป๊ฒ ๋์์ด ๋ฉ๋๊น?
๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์ปค๋ฐํ ๊ฒ์ฒ๋ผ
func Foo() (err error) {
defer func(){
if err:=catch();err!=nil{
//found error
}
}()
file1 :=try open("file1")
defer file1.Close()
file2 :=try open("file2")
defer file2.Close()
//without try
file3,err := open("file3")
defer file3.Close()
}
@daved ์ด ์์์ err
๊ฐ ๊ฒฐ๊ณผ error
์ ์ด๋ฆ์ด๋ผ๊ณ ๊ฐ์ ํ์ต๋๋ค. try
๋ ์ด๋ฆ(๋๋ ์ด๋ฆ์ ๋ถ์ฌ)์ ๊ด๊ณ์์ด ํญ์ ๊ฒฐ๊ณผ ์ค๋ฅ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค. err
๋ผ๋ ๋ก์ปฌ ๋ณ์๊ฐ ์์ผ๋ฉด ๋ค๋ฅธ ๋ณ์์
๋๋ค. ๊ฒฐ๊ณผ ์ค๋ฅ๋ฅผ ์ฐธ์กฐํ๋ ค๋ฉด ๋ค๋ฅธ ์ด๋ฆ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์ด๋ฏธ ์ ํจํ์ง ์์ ๊ฒฝ์ฐ์
๋๋ค.
func f(...) (..., err error) {
var err error // << err already declared
...
๋ฐ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ฉด:
func f(...) (..., err error) {
a, b, ... err := g() // redeclaration of err
...
ํ ๋น์ err
๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ ์ด๋ฆ์ด ์ง์ ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค. ์์ฃผ ์ค๋ซ๋์ ์ด๋ฏธ ๊ทธ๋ฌ๋ ๊ฒ๊ณผ ๋ค๋ฅผ ๋ฐ๊ฐ ์์ต๋๋ค.
์ถ์ : ์ฐ๋ฆฌ๋ try
ํ ๋ก ์ ์ํด ์ด ๋ฌธ์ ๋ฅผ ๊ฐ๋ก์ฑ๋ ๊ฒ์ ์ค๋จํ๊ณ ์๋ ์ ์์ผ๋ก ๋์๊ฐ์ผ ํฉ๋๋ค. ์ ๊ธ์ด ํด์ ๋์ด ๋ด์ผ(7์ 1์ผ) ๋ค์ ํ ๋ก ์ ์ํด ์ด๋ฆด ๊ฒ์
๋๋ค.
@godcong catch()
ํจ์(๋๋ ์ด์ ์ ์ฌํ ๊ฒ)๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๋ฅผ ์ป์ ์๋ง ์๊ณ ์ค์ ํ ์๋ ์์ต๋๋ค(์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ก ์๋ํ๋ ์ง์ฐ๋ ํจ์์์ ๋๋ฌ์ธ๋ ํจ์์ ์ค๋ฅ๋ฅผ ์ค์ ํ๋ ค๊ณ ํจ). . catch()
๊ฐ *error
๋ฅผ ๋ฐํํ๋๋ก ํจ์ผ๋ก์จ ์๋ํ๋๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ๋๋ฌ์ธ๋ ํจ์์ ์ค๋ฅ ๋ฐํ ๊ฐ์ ์ฃผ์์
๋๋ค. ๊ทธ๋ฌ๋ ์ธ์ด์ ์ ๋ฉ์ปค๋์ฆ์ ์ถ๊ฐํ๋ ๋์ ์ค๋ฅ ๊ฒฐ๊ณผ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ์ด์ ๋ํด ๋
ผ์๋ try
์ ์๋ ์ฐธ์กฐํ์ญ์์ค.
๋ํ ์ ์ PS๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
@griesemer
์ฌ๊ธฐ์์ ๋ ๋ช ํํ๊ฒ ๋งํ๊ธฐ๋ ์ด๋ ต์ง๋ง ์ ์ ๋ด์ฉ์ ๋ฐ๋ณตํด ๋ณด๊ฒ ์ต๋๋ค. ๋ชจ๋ ์ค๋ฅ ์๋๋ฆฌ์ค์์ try๊ฐ ๋์์ด ๋์ง๋ ์์ต๋๋ค. ๋ง์ ๊ฒฝ์ฐ์ ๋์์ด ๋ฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ์๋ if ๋ฌธ์ ์ฌ์ฉํ์ญ์์ค.
์ ๋ ์ด๊ฒ์ด try()
์ ์์ ์น๋ช
์ ์ธ ๊ฒฐํจ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด์ ์๋ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด ์์์ง๋ง ์ด์ ๋ ๋ ๊ฐ์ง๊ฐ ์ฝ๋ ๊ธฐ๋ฐ ์ ์ฒด์ ํผํฉ๋์ด ์์ต๋๋ค. ์ ๋ํ, ์ฝ๋๋ฒ ์ด์ค์ ์ ์ด๋ ๋ด๊ฐ ์ผํ๊ณ , 20 % ๋ฏธ๋ง if err != nil
๊ต์ฒด ํ ์ ์์ต๋๋ค try()
์ ๋๊ฐ๋ฅผ ๋ง๋๋ ๋์ ์ค์ํ์ง ์์ผ๋ฉด ์, ๊ฐ์น์ฒ๋ผ ๋ณด์ด์ง ์๋, ์ค๋ฅ ์ฒ๋ฆฌ ์คํ์ผ๋ก ๋๋๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ ๋ชจ๋ if err != nil
์ฌ๋ก์ 95%๋ฅผ ๋์ ํ ๋งํผ ์ถฉ๋ถํ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ตฌ๋ฌธ์ ์ ํธํ์ ๊ฒ์
๋๋ค. ๋ง์ ๋ถ๋ค์ด ์ข์ํ์
จ์ ๊ฒ ๊ฐ์์.
@griesemer ๋๋ ๋น์ ์ด ์ฐธ์กฐํ๋ ์คํ์ผ ๊ฐ์ด๋, ๋ชจ๋ฒ ์ฌ๋ก, ์์ , ๋ฌธ์ ๋ฑ์ด ๋ชจ๋ ๊ตฌ์์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด ๋ฐฐ์ฐ๊ณ ๋๊ตฌ๊ฐ ํ์๊ฐ ๋ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ํ์ฌ ์ ์๋ ์๋๊ฐ ์๋ชป๋ ์ํํธ์จ์ด๋ฅผ ์์ฑํ๋ ๋ฏธ๋ฌํ๊ณ ์๋ก์ด ๋ฐฉ๋ฒ์ ๋์ ํ๋ค๋ ๊ฒ์ด ๋ถ๋ช ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ช ํํ์ง ์์ ๊ฒ์ ์ฌ๋๋ค์ด ํญ์ ์๋ชป๋ ์ํํธ์จ์ด๋ฅผ ์์ฑํ ์ ์๋ค๋ ์ ์ ํ์ ์ด ์ฌ์ค์ ๋ฌด์ํ๋ ๊ฒ์ด ์ด๋ป๊ฒ ์ ํจํ ๋ฐ๋ก ์ ๋๊น?
์ฌ๊ธฐ์ ๊ฐ๋๋ฅผ ๋ฐ๊พธ๊ฒ ์ต๋๋ค. ๋ด๊ฐ ์ค๋ช ํ ์ ์ฌ์ ๋ถ์์ฉ์ ๋ํด ์ถฉ๋ถํ ๊ฐ๋ ฅํ ์ค์ฒฉ try ๋ฌธ์ ๋ํ ์ฌ์ฉ ์ฌ๋ก๋ ๋ฌด์์ ๋๊น? ์ค๋๋ Go ์ฝ๋๋ ์ฒด์ธ ๊ฐ๋ฅ ์ค์ฒฉ ๊ฐ๋ฅ try-separated ๊ดํธ ํํฐ๊ฐ ์ด๋์์๋ ๋งน๋ ฌํ๊ฒ ๋ํ๋ ์ ์๋๋ก ํจ์ผ๋ก์จ ์ด๋ค ์ด์ ์ ์ป์ ์ ์์ต๋๊น? ๋ด ์๊ฐ์๋ ๊ทธ๋ ์ง ์์ผ๋ฉฐ ์๋ฌด๋ ์ค์ฒฉ ์๋๋ฅผ ์์ฒญํ์ง ์์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํจ์๋ก ๊ตฌํ๋๊ธฐ ๋๋ฌธ์ ์ ์๊ณผ ํจ๊ป ์ ๊ณต๋์์ต๋๋ค. ์ธ์ด ์ฌ์์ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ค์ฒฉ ๋จ์ฉ ๋๋ ๋ฏธ๋ฌํ ์ค๋ฅ๋ฅผ ์ ํํ๊ธฐ ์ํด ์ค์ฒฉ ์ ๊ฑฐ/์ฃผ์ ์ง์ ๊ณผ ๊ฐ์ ์ ์ฝ ์กฐ๊ฑด์ ์ถ๊ฐํ๊ณ ์ถ์ง ์์ต๋๋ค. ์ธ์ด์ ๋ณต์ก์ฑ์ ๋ฐฉ์งํ๊ฑฐ๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ ๋์ ๋ฐฉ๋ฒ์ ์ถ๊ฐํ๊ธฐ ์ํ ์ฃผ์ ์ ๋๊น?
์ฌ๊ธฐ์ ๋ชฉํ๊ฐ ์ธ์ด ์ฌ์์ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค์ง ์๋ ๊ฒ์ด๋ผ๋ฉด ์ ํ์ด ๋ช ํํฉ๋๋ค. ์ผ๋ฐ ๋ฐํ ๋ฐ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ ํจ์๋ฅผ ์ถ๊ฐํ์ง ๋ง์ญ์์ค. ๊ทธ๋ฌ๋ ํน์ ๋ด์ฅ ์ธํฐํ์ด์ค๋ฅผ ์ถฉ์กฑํ๋ ๊ฒฝ์ฐ์๋ง) ๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ ๋ก ์์ด ๋ณต์กํ ๊ธฐ๋ฅ์ ์์ ๊ฒ ์ด์์ผ ๊ฒ์ ๋๋ค. ๋ชฉํ๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ด๋ผ๋ฉด ์ค๋ฅ๋ฅผ ์์ฑํ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ๋์ ํ์ง ์๊ณ ๊ทธ๋ ๊ฒ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@sirkon ๋๋ ๊ทธ ์๋ฅผ ์ง๊ธ ์ฌ๋ฌ ๋ฒ ๋ณด์์ต๋๋ค. ํฅ๋ฏธ๋กญ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ํ์ง๋ง ์กฐ๊ธ ๋ ์๊ฐํด๋ณด์. ์ ์๋
try
๋ด์ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก Go ์ฝ๋์์ ๋ฐ๊ฒฌ๋๋ ํน์ ์ข ๋ฅ์ ์์ฉ๊ตฌ์ ๋ํ ๊ตฌ๋ฌธ ์คํ์ ๋๋ค. ๋ฐ๋ผ์ ํด๋น ์์ ๋ฅผ ์๋ณธ ์ฝ๋๋ก ๋ณํํ ์ ์์ต๋๋ค.f, err := os.Open(fileName) if err != nil { return err } info, err := f.Stat() if err != nil { return err }
ํด๋น ์ฝ๋์๋ ๋์ผํ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. ๋๋ ํ์คํ ๊ทธ๋ฐ ์ฝ๋๋ฅผ ๋ณด์๋ค.
try
๋ด์ฅ์ด ๊ทธ ๋ฒ๊ทธ๋ฅผ ์์ฑํ๊ธฐ ๋ ์ฝ๊ฑฐ๋ ๋ณด๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์ ๋ถ๋ช ํ์ง ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋๋ฅผ ํต์ง ํ์ผ์ "๋๋ฆฐ"๊ธฐ์กด์ ํ๋ฆ ์ ๊ณต๊ฐ์ ๋ ๋ซ์์ผ์ ๋ํ ๋ถ๋ช
์ด try
์ฌ๋๋ค์ด ๋จผ ๊ธธ์ ํตํด ๋ฐ๋ก ๊ฐ๊ธฐ๋ฅผ ์ ํธํ๋ ๊ฒฝํฅ์ด ๋์ถ์์ด ์ข
๋ฅ๋ฅผ ๋ถ๋ฌ ์ผ์ผํจ๋ค.
@godcong
catch()
ํจ์(๋๋ ์ด์ ์ ์ฌํ ๊ฒ)๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๋ฅผ ์ป์ ์๋ง ์๊ณ ์ค์ ํ ์๋ ์์ต๋๋ค(์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ก ์๋ํ๋ ์ง์ฐ๋ ํจ์์์ ๋๋ฌ์ธ๋ ํจ์์ ์ค๋ฅ๋ฅผ ์ค์ ํ๋ ค๊ณ ํจ). .catch()
๊ฐ*error
๋ฅผ ๋ฐํํ๋๋ก ํจ์ผ๋ก์จ ์๋ํ๋๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ๋๋ฌ์ธ๋ ํจ์์ ์ค๋ฅ ๋ฐํ ๊ฐ์ ์ฃผ์์ ๋๋ค. ๊ทธ๋ฌ๋ ์ธ์ด์ ์ ๋ฉ์ปค๋์ฆ์ ์ถ๊ฐํ๋ ๋์ ์ค๋ฅ ๊ฒฐ๊ณผ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ์ด์ ๋ํด ๋ ผ์๋try
์ ์๋ ์ฐธ์กฐํ์ญ์์ค.๋ํ ์ ์ PS๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
Go์ ์ ํ ์์คํ ์ 60๋ ๋์ ๊ฐํ๊ธฐ ๋๋ฌธ์ ์์ฐ์ค๋ฝ๊ฒ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ์ ์ฒ๋ฆฌํ ์ ์์์ต๋๋ค. 80๋ ๋์ ์์ด๋์ด๋ฅผ ๋น๋ฆด ๋งํผ ์ ๊ฒฌ์ง๋ช ์ด ์์๋ค๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ๋ฏธ๋ฌํ ํ๋ฆ์ ์ ์ดํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์์ ๊ฒ์ ๋๋ค. ๋น์ ์ ์ง๊ธ ์ค์ธ ๋ง์์์ ์ ๋ฆฌ์ ๊ธ์ ๊ฑด๋ฌผ์ ๊ฑด์คํ๋ ค๊ณ ํฉ๋๋ค. ๋์ ์ ์ ์ด ์ค์ธ ๋ง์์๋ ์ ๊ธฐ์ ์๋๊ด์ด ์์ผ๋ฏ๋ก ๋น์ ๋ ๊ฐ์ง ์ ์์ ๊ฒ์ ๋๋ค.
์๋กญ๊ณ ๊ฐ์ ๋ ์ค๋ฅ ์์ค์ด golang/go
์์ฒด์ ์ด๋ ์ ๋ ์ฌ์ฉ๋ ๊ฒ์ธ์ง ๋ณด๋ ๊ฒ์ ํฅ๋ฏธ๋ก์ธ ๊ฒ์
๋๋ค. ๋ง์ฝ์ ์ ํ.
go2 fmt
์ผ๋ฐ go1.x
๋ฅผ ์ถ๋ ฅํ๋ ์ต์
์ด ์๋์ง ํ์ธํ๋ ๊ฒ๋ ํฅ๋ฏธ๋ก์ธ ๊ฒ์
๋๋ค.
๋ด ์์ ์ ๊ฒฝํ์์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐํ๋ ์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ ์ดํ๋ก:
import "github.com/pkg/errors"
func caller(arg string) error {
val, err := callee(arg)
if err != nil {
return errors.Warpf(err, "failed to do something with %s", arg)
}
err = anotherCallee(val)
if err != nil {
return errors.Warpf(err, "failed to do something with %s", val)
}
return nil
}
์ง์ ํ์ ํ๋ก๋์ ์์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ํด ๋ด ์๊ฒฌ์ ๊ฑฐ์ ํ์๋ก ํ์ง ์์ต๋๋ค.
IMHO, ์ ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ด ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ด๋ ๊ฒ์ด ์๋๋ผ ์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๋ณด๋ค ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค๊ณ ๋ฏฟ์ต๋๋ค. ๋๋ ์ฌ์ ํ try()๋ฅผ ์ฌ์ฉํ๋ ์ข์ ํ๋ช ํ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ต๋๋ค.
์ง์ฐ์ ์ปจํ ์คํธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
func caller(arg string) (err error) {
defer func() {
switch t := err.(type) {
case CalleeErr:
err = errors.Wrapf(err, "failed to do something with %s", arg)
case AnotherCalleeErr:
err = errors.Wrapf(err, "failed to do something with %s", val)
}
}()
val := try(callee(arg))
try(anotherCallee(val)
return nil
}
ํ์ดํ์ ๋ง์ด ์ค์ด๋ ๊ฒ ๊ฐ์ง๋ ์์ง๋ง ๊ฐ๋ ์ฑ๊ณผ ์ฑ๋ฅ์ ํฌ์ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก try()๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
func caller(arg string) error {
val, err := callee(arg)
try(errors.Warpf(err, "failed to do something with %s", arg))
err = anotherCallee(val)
try(errors.Warpf(err, "failed to do something with %s", val))
return nil
}
๊ทธ๊ฒ์ ๋ช ์ค์ ์ค์ ๋๋ค, ๊ทธ๊ฒ ๋ค์ผ.
๋์๊ฒ ์ด ๋ฌธ์ ์ ๋ํ ๋๋ถ๋ถ์ ์๋ฃจ์ ์ ์์ธ๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ธ์ด์ ๋ถ๋ฆฌ๋์ด ์๋ค๊ณ ์๊ฐํ๋ ํ ๊ฐ์ง๋ฅผ ๊นจ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ด ์ ์ด ํ๋ฆ์ผ๋ก ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ด๋ฌํ ์๋ฃจ์ ์ ๋๋ถ๋ถ์ ์ผ๋ถ ํํ์ ์ ์ด ํ๋ฆ(ํ์ธ/์ฒ๋ฆฌ, ์๋, ์บ์น, ์์)์ ์ถ๊ฐํ๋ ์ง์ ์์ Go ํ์ด ์์ธ๋ฅผ ์ถ๊ฐํ๊ณ ํ๋ฃจ๋ผ๊ณ ๋ถ๋ฅผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฃจ๋น์ ๋น์ทํ if
๋ฐ return
์ ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฉด ์ข๊ฒ ์ง
return err if err != nil
์ถ์ : ์ธ์ด ๋์์ธ์ ๋ํ ์ ์ ๊ฒฝํ์ด ๋ถ์กฑํ ์ ์ ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ์ ๊ฐ ์ด๋ฆฌ์์ ๋ง์ ํ๋ค๋ฉด ์์ ๋กญ๊ฒ ์ง์ ํ๊ณ ์ ๋ฅผ ๊ต์กํด ์ฃผ์ญ์์ค.
์๋์์ ๋ณต๊ตฌ()์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ catch()๋ฅผ ์ฐ๊ธฐํ์ฌ catch() ํจ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
์์:func doSomthing()(err error){ //return error } func main(){ defer func(){ if err:=catch();err!=nil{ //found error } }() try doSomthing() }
๋ง์ ๊ธฐ๋ฅ์
func Foo() (err error) { defer func(){ if err:=catch();err!=nil{ //found error } }() try{ file1 := open("file1") defer file1.Close() file2 := open("file2") defer file2.Close() } //without try file3,err := open("file3") defer file3.Close() }
์ด๊ฒ์ด ๊ฐ๊ฐ์ ์ค๋ฅ๋ฅผ ๋ณ๋์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ์ด๋ป๊ฒ ๋์์ด ๋ฉ๋๊น?
๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์ปค๋ฐํ ๊ฒ์ฒ๋ผ
func Foo() (err error) { defer func(){ if err:=catch();err!=nil{ //found error } }() file1 :=try open("file1") defer file1.Close() file2 :=try open("file2") defer file2.Close() //without try file3,err := open("file3") defer file3.Close() }
๊ทํ์ ์์์๋ ๋์ผํ ์ง์ฐ์ผ๋ก ๋ชจ๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ฌ์ฉ์ ์ง์ ๋ฉ์์ง์ ์ฌ์ฉ์ ์ง์ ์ ๋ณด๋ฅผ ์ค๋ฅ์ ์ถ๊ฐํ๋ ค๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋ฉ๋๊น?
@ianlancetaylor "์ถ๋ก ๋ ๋ฐํ"์ ์ง์ํ๊ธฐ ์ํด ":=" ์ฐ์ฐ์๋ฅผ ๋ณด๊ฐํ ๊ฒ์ ์ ์ํ ์ฌ๋์ด
try
๊ธฐ๋ฅ์ ์ด๋ฆ์ผ๋ก ๋
ผ์์ด ์์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ๊ธฐ๋ฅ์ผ๋ก ๊ตฌํํ๋ ํ, ์๋ฌด๋ 100% ์ข๊ฒ ๋๋์ง ํ์ ํ ์ ์๋ ์ด๋ฆ์ ์ง์ ํด์ผ ํฉ๋๋ค.try
๋ ์ ๋ก ์๋ ์์ ์ผ์ ์ํํ๋ฉฐ append()
์ ๊ฐ์ ์
๋ ฅ์ ๊ฐ์ง๋ฉฐ ์ ๋น์ฟผํฐ์ค ํจํด( if err != nil
)์ ๋์ ํ๋ฉด์ panic()
์ ๊ฐ์ ์ ์ด ํ๋ฆ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. .try
์ค์ฒฉ์ ์๊ฒฉํ ๊ธฐ์ ํ ๋ก ์์ ํ์๋ ๋ถ๊ฐ ๊ฐ์น๊ฐ ์๋๋ผ ๊ธฐ๋ฅ์ผ๋ก ๊ตฌํํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฐ๊ณผ์
๋๋ค.try
๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.์ ํ์ ์ํํ๋ ๊ฒ์ฒ๋ผ ๋จ์ํ ๋ฐํ์ ์ถ๋ก ํ๋ฉด ์ํฉ์ด ๊ฐ๊ฒฐํด ๋ณด์ด๊ณ ๋ค์๊ณผ ๊ฐ์ด "๊ฐ๊ธฐ"๊ฐ ๋ ๋ง์ด ๋๊ปด์ง๋๋ค.
f, err := os.Open(filename)
if err != nil {
return ..., err
}
defer f.Close()
info, err := f.Stat()
if err != nil {
return ..., err
}
_์ฌ๊ธฐ์ ์ด โโ๋์์ ๋ํ ์ฌ๋ฐ๋ฅธ ์ปดํจํฐ ๊ณผํ ์ค๋ช ์ ์ฝ์ ํ์ธ์_. ๊ทธ๋๊น์ง ์งง์ ๋ณ์ ์ ์ธ์ ํตํด ์ถ๋ก ๋ ์์ต์ ํด๊ฒฐํ์ธ์.
f := os.Open(filename)
defer f.Close()
info := f.Stat()
๋ค์๋ณด๋ค ํจ์ฌ ๊น๋ํด ๋ณด์ ๋๋ค.
f := try(os.Open(filename))
defer f.Close()
info := try(f.Stat())
์ด๊ฒ์ (๋ด ์๊ฒฌ์ผ๋ก๋) ์ข ๋ "์ข์์"๋ฅผ ๋๋ผ๊ณ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ ์์ ๋์ด๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ์ธ์ด์์ try
์ ๋ณดํธ์ ์ธ ์๋ฏธ๋ฅผ ๊ณ ๋ คํ ๋ try()
์ ๋ํ ํจ์ ํธ์ถ์ ๋ํ "์์์ " ๋ฐํ์ ์ค๋ช
ํ๊ธฐ๊ฐ ์ข ๋ ์ฌ์ด ๊ฒ ๊ฐ์ต๋๋ค. ๊ตฌํ์ ๋ํด 100% ๋งํ ์๋ ์์ง๋ง ๊ฑฐ์ ๋์ผํ ๋
ธ๋ ฅ์ผ๋ก ์ ์ฌ์ ์ผ๋ก ์ํํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๊น? AssignStmt
๋ LHS์ ์ด๋ค ํํ์์ด ๋ด์ฅ๊ณผ ๋์ผํ ๋ฐฑ์๋ ์ปดํ์ผ์ ์๋ฆฌ๊ธฐ ์ํด ์ค๋ฅ ๊ฐ์ ์๋ตํ๋์ง ์ง์ ํ๋ ํ๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๊น?
์ค๋ฅ๋ฅผ ์๋ ๊ทธ๋๋ก ํ์ธํ๋ ๊ฒ๋ ์ข์ง๋ง ์ด๊ฒ์ด ์ง์ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ๋ผ๋ฉด ์ ํค์๋๊ฐ ๋ ๋์ ์๋ฃจ์ ์ด ๋์ง ์์๊น ์๊ฐํฉ๋๋ค. ๋ชจ๋ ์๋ฃจ์ ์๋ ์ ์ด ํ๋ฆ ๋ณ๊ฒฝ์ด ํฌํจ๋ ์ ์์ผ๋ฉฐ ๊ฐ๋ฅํ ํ ๋ช ํํ๊ฒ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
์ด ์์์ on
์กฐ๊ฑด์ err
๊ฐ ์ค์ ๋ ๋๋ง๋ค ํ๊ฐ๋ฉ๋๋ค.
func example() (foo int, err error) {
on err != nil {
return foo, err
}
foo, err = calcThis()
foo, err = calcThat(foo)
return
}
์ด๊ฒ์ ํจ์ ์๋ช ์์ ๋ฐํ ๊ฐ์ ์ด๋ฆ์ ์ ์ธํ์ง ์๊ณ ๋ ์๋ํฉ๋๋ค.
func example() (*int, error) {
var err error
on err != nil {
return nil, err
}
foo, err = calcThis()
foo, err = calcThat(&foo)
return &foo, nil
}
์ฌ๋ฌ ๋ฒ ์ค์ ํ ์๋ ์์ต๋๋ค. ๋ค์์ ์ธ์์ ์ธ ์์ ๋๋ค.
func example() (*int, error) {
var err error
on err != nil {
return nil, err
}
foo, err = calcThis()
on err != nil {
return &foo, err
}
foo, err = calcThat(&foo)
return
}
๋ด ๋์ ์ด๊ฒ์ Go์ ์คํ์ผ๊ณผ ๊ฐ๋
์ฑ์ ์ ์งํ๋ฉด์ err
๊ฐ ์ค์ ๋ ๋๋ง๋ค ํด๋น ์กฐ๊ฑด์ ํจ๊ณผ์ ์ผ๋ก ์ฝ์
ํ๊ธฐ ๋๋ฌธ์ ๊ฐ ๋จ๊ณ(ํจ๋ฌ๋ค์์ ์ดํดํ๋ฉด)์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋ช
ํํ๊ฒ ํฉ๋๋ค.
๋ค์์ ์ํํ ์๋ ์์ต๋๋ค.
func example() (foo int, err error) {
var message string
on err != nil {
return foo, errors.Wrap(err, message)
}
message = "failed to calc this"
foo, err = calcThis()
message = "failed to calc that"
foo, err = calcThat(foo)
return
}
๋ง์ง๋ง์ผ๋ก, ์ด๊ฒ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋์ด ์ ์ฉํ ์ ์์ต๋๋ค. foo == 0์ด๋ฉด ๋ฐํํ๊ณ ์ถ์ต๋๊น? ๋ ๋ค๋ฅธ ๊ณ ์๋ ์:
func example(i int) bool {
on x == 0 {
return false
}
x = calcSomeInt(i)
return true
}
@cstockton
๋๋ ๊ทธ๋ฐ ์์ผ๋ก ์ค๋ฅ๋ฅผ ํผํ๋ ๊ฒ์ด ๋๋ฌด ์ฌ์ธ ๊ฒ์ด๋ผ๊ณ ํญ์ํ๋ ค๊ณ ํ์ง๋ง:
json.Unmarshal
์ ๊ฐ์ด _only_ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ํจ์๊ฐ ์๋ ์ด๋ฏธ "์ก์๋ค"์
๋๋ค. IME ์ข์ ์ฝ๋ ๊ฒํ ์๋ ์ด๊ฒ์ ๊ฝค ๋นจ๋ฆฌ ์ดํด๋ณด๋ ๋ฒ์ ๋ฐฐ์๋๋ค.http.Handler
๋ฉ์๋์ ๊ฐ์ด ์ค๋ฅ ๊ฐ์ ๋ฐํํ์ง ์๋ ํจ์์์๋ ์ฌ์ ํ ๊ตฌ๋ฌธ ์ค๋ฅ์
๋๋ค.๊ทธ๋์, ๋ด๊ฐ ์๊ฐํ ์ ์๋ ๋ชจ๋ ์ฅ์ ์ ํ๊ฐํ๊ณ ๋ช ๋ฐฑํ ๋จ์ ์ ์์์ฐจ๋ฆฌ์ง ๋ชปํ ํ, ๋๋... ์ธํ๋ฆฌ์ ์์ต๋๋ค. ๋ด๊ฐ ๊ณ ๋ คํ์ง ์์ ๋ช ํํ์ง ์์ ๋จ์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ด๊ฒ์ด ๋๊ตฌ์๊ฒ๋ ๊ฐ์น๊ฐ ์๋ ๊ฒ์ด ์๋๋๋ผ๋ ์ด๊ฒ์ด ์ด๋๋ก ๊ฐ๊ณ ์๋์ง๋ฅผ ์ข์ํ๊ธฐ ์์ํ์ต๋๋ค.
์ด๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋์ ๋ฐฉ๋ฒ์ด๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ฌ๊ฐํ ๊ฐ์ง.
19๋ 7์ 1์ผ์ Chris Stockton [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@ianlancetaylor ์ง์ํ๊ธฐ ์ํด ":=" ์ฐ์ฐ์๋ฅผ ๋ณด๊ฐํ ๊ฒ์ ์ ์ํ ์ฌ๋์ด
"์ถ๋ก ๋ ๋ฐํ" - ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์ ์์ด try์ ๋๊ฐ์ด ๋์ํฉ๋๋ค.
์ ํ. [ ... ]
์ด ์ฌ๊ฑด์์ ๋ด๊ฐ ํฅ๋ฏธ๋กญ๊ฒ ์๊ฐํ๋ ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ๋ฌด์ธ๊ฐ๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค
"์ค๋ฅ"๋ฅผ ์๋ตํ๋ "์ผํ ํ์ธ" ํจ๋ฌ๋ค์๊ณผ ์ ์ฌํฉ๋๋ค.
์์์ธ์ ์ผ๋ถ ์ ์ ์๋ ์ํฉ์์ ํ์ฉ๋ฉ๋๋ค. ๊ฐ์น
๊ทธ๋ฌ๋ ๋ถ๋ช
ํ ๊ทธ ์์ฒด๋ก๋ ์ด๊ฒ์ ์ ํจํ๊ฒ ๋ง๋ค๊ธฐ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
์ ์.
๋ฃจ์์ค.
์ด ๋ฒ๊ทธ๋ ์ด๋ฏธ ๊ฐ๋ฅํฉ๋๋ค. ์๋ํ๋ ๋ง๋ - Go๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ง์ง ์์ต๋๋ค. ๋๋ ์๋๋ฅผ ํ์ฉํ์ง ์์์ผ ํ๋ ์ด์ ๋ก ๋์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ์ด ์๋๋๋ค. ๋์ ์์์ฌ๋ ๋ฌธ์ ๊ฐ ์๋ ์ฌ๋ก์ ํ๋๊ทธ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
@griesemer ๋์ํ์ง ์์ต๋๋ค. ํค ์ ๋ ฅ์ ์ ์ฝํ ์ ์์ง๋ง ํฌ์ธํฐ ์ฐ์ ์ ์๋ชป๋๊ณ ๊นจ์ง ์ฝ๋๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์๋ค๋ ์ ์ ํ์ Go์์ ์ ์ธ๋์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ฒ๊ทธ๋ฅผ ๊ฐ์งํ๊ธฐ ๋ ์ด๋ ต๊ฒ ๋ง๋๋ ๋์ผํ ์ ํ์ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
data := try(ioutil.ReadAll(try(os.Open("foo.txt"))))
try
์ ์ผ๋ฐ์ ์ธ ์๋ ์์ ๊ฐ์ ์๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด๋ ๋ถ๋ช
ํ ํ์ผ ์ค๋ช
์๋ฅผ ๋์ถํฉ๋๋ค. (Go๊ฐ ํ์ฌ ๊ตฌํ์์ ์ฌ์ฉ์์๊ฒ ์๋ ค์ง์ง ์์ ์ํ์์ ๋ฐํ์์์ ์ด๋ฌํ ์ค๋ช
์๋ฅผ ์ฐพ์ ๋ซ๋๋ค๋ ์ฌ์ค์ ์ฐ๋ฆฌ์๊ฒ ์์์ ์ค ์ ์์ง๋ง ์ด์จ๋ ๋ ๋์ ์๊ฐ ์์ต๋๋ค).
data := try(ioutil.ReadAll(try(http.Get("http://example.com/")).Body))
์์ ์ฝ๋๋ ์ฌ๋ฐ๋ฅธ ์ฝ๋์ฒ๋ผ ๋ณด์ด์ง๋ง ์๋ต ๋ณธ๋ฌธ์ ์์ ํ ์ฝ์ ๋ค์ ํ๋ณตํ ๊ฒฝ๋ก์์ ๋ซ๋ ์๊ตฌ ์ฌํญ์ ๋ฌด์ํฉ๋๋ค. ์ถฉ๋ถํ ๊ธธ๊ฒ ๋ณด๋ฉด ์๋ชป๋ ์์ ์ ์ญ๊ฒจ์ด ์ฐ์ํจ์ ํตํด ๋ฏธ๋์ ์ด๋ฌํ ์ ํ์ ๋ฒ๊ทธ๋ฅผ ๋ณด๊ฒ ๋ ๊ฒ์์ ๋ถ๋ช ํ ํด์ผ ํฉ๋๋ค.
์ด ์์ ์์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๊ฒ์ ๊ฒํ ํ๋ ์ฌ๋์ผ๋ก์ ๋๋ Go๊ฐ ๋ถ์ ํ์ฑ์ ์ ํนํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ง ์๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
@jesse-amano ํ ๋น ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ ๋ช ์์ ์ธ ํ ๋น ๋ฌธ์ด ์ค๋๋ ์ฒ๋ผ ์ ํํ๊ฒ ๋์ํ์ง ์๊ณ ์ค์ ๋ก ์ด ๊ฒฝ์ฐ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์:
json.Unmarshal(...)
(http.Handler)(h).ServeHTTP(w, r)
์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฐ์ return json.Unmarshal(...)
์ ๊ฐ์ด ๋ฐํ๋ ์ ์์ผ๋ฉฐ if ๋ธ๋ก ์ธ๋ถ์ ๊ฐ์ด ์กด์ฌํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ณด๋ค ๊ฐ๊ฒฐํ ํํ๋ก ํํํ ์๋ ์์ต๋๋ค.
if err := json.Unmarshal(...); err != nIl {
return err
}
์ด ๊ฒฝ์ฐ ๋ด๊ฐ ํฅ๋ฏธ๋กญ๊ฒ ์๊ฐํ๋ ๊ฒ์ "์ค๋ฅ" ์์์ธ์ ์๋ตํ๋ ๊ฒ์ด ์ผ๋ถ ์ ์ ์๋ ์ํฉ์์ ํ์ฉ๋๋ "์ผํ ํ์ธ" ํจ๋ฌ๋ค์๊ณผ ์ ์ฌํ ๊ฒ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ง๋ง ๋ถ๋ช ํ ๊ทธ ์์ฒด๋ก๋ ์ด๊ฒ์ ์ ํจํ ์ ์์ผ๋ก ๋ง๋ค๊ธฐ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
๋์์ ๊ดํธ ๋๋ ์์์ ์ค์ฒฉ ๋ฐ ์ฐ๊ฒฐ ์์ด ์๋ํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค. ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์ธ์ด๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์๊ณ ๋ ์์ฐ์ค๋ฝ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ์ฐพ๊ธฐ๊ฐ ์ด๋ ค์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. Go ์์ฑ์๊ฐ Go์ ์ด๋ฌํ ์ ํ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒ ๊ฐ์์ ์ ๋ ์ฌ์ค try
์ ํ์ฌ ํํ๊ฐ Go์ ์ ํฉํ์ง ์๋ค๊ณ ์ ๋์ ์ผ๋ก ํ์ ํ๊ธฐ ๋๋ฌธ์ ๋์์ ๊น์ด ํ๊ณ ๋ค๊ณ ์์ต๋๋ค. ์ด๊ฒ์ BC๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ ์ ์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์
๋๋ค. ์ด๋ ์ชฝ์ด๋ ๋๋ ์๋ ์ ์์ด ๊ฑฐ๋ถ๋๊ฑฐ๋ ๋๊ตฐ๊ฐ ๋ ๋ง์ ์ฌ๋๋ค์ด ๋์ํ ์ ์๋ ๋ฌด์ธ๊ฐ๋ฅผ ์ ์ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
ํธ์ง: @jesse-amano ๋๋ ๋น์ ์ ์์ ์ ์์ ํ ๋์ณค์ต๋๋ค ์ฃ์กํฉ๋๋ค! ์ค๋ฅ๋ฅผ ๋ฐํํ์ง ์๋ ํจ์ ์์ ์์ผ๋ฉด ์ผ๋ฐ์ ์ธ ํ ๋น ํ์ ๋ถ์ผ์น ์ปดํ์ผ ์ค๋ฅ๊ฐ ํ์๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ๋๋ try๊ฐ ์๋ง๋ ์๋ก์ด ์ ํ์ ์ปดํ์ผ๋ฌ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋์ ํ ๊ฒ์ด๋ผ๊ณ ์์ํฉ๋๋ค.
@beoran ๊ด๋ จ https://github.com/golang/go/issues/32825#issuecomment -507126700 : ์ด๋ฏธ ์ํฉ์ ๋ฐ๋ผ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ๋ค๋ฆ
๋๋ค. ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ์ค๋ฅ๋ฅผ ๋ฐํํ ๋๋ ์๊ณ ์ฅ์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ ๋๋ ์๊ณ ์กฐ์น๋ฅผ ์ทจํ ๋๋ ์์ต๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋๋๋ก ์ค๋ฅ๋ฅผ (์ ํํ๊ฒ) ๋ฌด์ํ ์ ์์ต๋๋ค. ๊ทธ๋ค์ด ๊ณต์ ํ๋ ์ ์ผํ ๊ฒ์(์ค๋ฅ๋ฅผ ๋ฌด์ํ ๋๋ฅผ ์ ์ธํ๊ณ ) err != nil
ํ
์คํธ์
๋๋ค(์ด๋ฏธ ํ ๊ฐ์ง ์ด์์ ๋ฐฉ๋ฒ์ผ๋ก ์ํํ ์ ์์). ์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ์ด ์ด๋ฌํ ๋ชจ๋ ๊ฒฝ์ฐ(๋๋ ๊ทธ ์ค 95%)๋ฅผ ์บก์ฒํ๋ ๊ฒ์ด ์ข์ ๋งํผ, ๊ทธ๋ฌํ ๊ตฌ์ฑ์ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ๋ค๋ฅธ ์ ์ด ๊ตฌ์ฑ๊ณผ ์ง๊ตํ์ง ์์ ๋ฐฉ์์ผ๋ก ๊ฐ์ญํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ฆ, ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ ์ ์๋ ์ต์ ์ ์ด๋ฌํ ๊ฒฝ์ฐ ์ค ์ผ๋ถ(20%, 50%)๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์
๋๋ค.
@cstockton ๊ด๋ จ https://github.com/golang/go/issues/32825#issuecomment -507136111: ์ค์ฒฉ๋ try
๊ฐ ์ ์ผํ ๋๋ก ๋ธ๋ก์ด๊ณ go vet
๊ฐ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ , ๋ด ์๊ฐ์ ์ค์ฒฉ๋ try
ํ์ฉํ์ง ์๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค. ์ถฉ๋ถํ ์ฌ์ธ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ๋ก์๋ try
์ง์งํ๊ฒ ์คํํ ์ฌ๋์ด ๊ฑฐ์ ์๋ ์ํ์์ ์ฐ๋ฆฌ๋ ์ฌ์ ํ FUD(๊ณตํฌ, ๋ถํ์ค์ฑ, ์์ฌ) ๋จ๊ณ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ทธ๋ ๊ฒ ํ ์ฌ๋๋ค์ด ๊ธ์ ์ ์ผ๋ก ๋ณด๊ณ ํ๋ค๋ ์ ์ ์ฃผ๋ชฉํ๋ค.
์ถ์ : try
๋ฌธ์ ๋ ํผ๋๋ฐฑ์ ์ํด ๋ค์ ์ด๋ ค ์์ต๋๋ค. ๊ณ์ํด์ ๊ฑฐ๊ธฐ์ ๊ฐ์๋ค.
@cstockton ์, ๋ฌผ๋ก ์
๋๋ค. ๋ช
ํํ ํ์๋ฉด, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ค๋ฅ ๊ฐ์ ์บก์ฒํ์ง ์๊ณ json.Unmarshal
์ ๊ฐ์ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ _์ด๋ฏธ_ ๋์ ์ต๊ด์ด์ง๋ง ์ผ๋ฐ์ ์ผ๋ก defer file.Close()
๋์ ๋์ ์ต๊ด์ผ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๋ค. defer func() { err = file.Close(); if err != nil { ... }; }()
, ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ ์ฐจ์ด๋ฅผ ์์ฃผ ์ฝ๊ฒ ๊ตฌ๋ณํ๋ ๋ฒ์ ๋ฐฐ์ ์ต๋๋ค. ๋ฐ๋ผ์ (์๋ง๋) ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋ฉ๋๋ค. ๋๋ ์ฒ์์ ๋๊ตฐ๊ฐ๊ฐ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์๋๋ก foo := strconv.ParseFloat(bar, 64)
๋ฌด๊ณ ํ๊ฒ ์ฌ์ฉํ๋ค๋ ์๊ฐ์ ์์ฐํ์ง๋ง, ์ ์ ์๊ฐํด ๋ณธ ๊ฒฐ๊ณผ ๊ฒฐ๊ตญ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
@sirkon ๊ด๋ จ https://github.com/golang/go/issues/32825#issuecomment -507167388 : ๊ทธ๋ฌํ ๋ช ํํ์ง ์์ ์ง์ ์ ํ ๋ก ์์ ์ ์ธํ์ญ์์ค. ๊ธฐ๋ก์ ์ํด Go์ ๋ง์ ์์ด๋์ด๋ ์ค์ ๋ก 60๋ ๋๊ฐ ์๋ 80๋ ๋(ํจํค์ง, ๋ณ๋์ ์ปดํ์ผ ๋ฑ)์์ ๋์จ ๊ฒ์ด๋ฉฐ ๋ง์ ์์ด๋์ด๊ฐ ํจ์ฌ ๋ ์ ์ต๋๋ค(๊ณ ๋ฃจํด, ์ธํฐํ์ด์ค). ์ด๋ฌํ ์์ด๋์ด๋ ์ฌ์ ํ ์ค๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง ์๊ฐ์ ํ ์คํธ๋ฅผ ๊ฒฌ๋๋์ต๋๋ค(์ ์ด๋ CS๊ฐ ๋ฑ์ฅํ ์ง ์ผ๋ง ๋์ง ์์ ์๊ฐ).
@turtleDev ๊ด๋ จ https://github.com/golang/go/issues/32825#issuecomment -507231353: Go๋ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ํํ๊ณ panic
๋ฐ defer
๋ฐ recover
- "์์ธ ์ฒ๋ฆฌ"๋ผ๋ ์ฉ์ด๋ Go์ ๋ํด ์คํด์ ์์ง๊ฐ ์๋ ์๋ฏธ๋ฅผ ๋ดํฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ "์์ธ ์ฒ๋ฆฌ"๋ผ๊ณ ๋ถ๋ฅด์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋จ์ง ๋ช
ํํ๊ฒํ๊ธฐ ์ํด, ์ด๋ํ๋ ๋ชจ๋ ์์
์ ์ํ ํ ์ ์์ต๋๋ค raise
์ try-catch
ํ ์์๋ ๋ฑ (๋๋ฌธ์ ๋ฌ๋ฆฌ try-catch
, defer
์ฌ์ฉํ ์ ์์ต๋๋ค ์กฐ๊ฑด๋ถ). ๊ฐ์ฌ ํด์.
@sorenvonsarvort ๊ด๋ จ https://github.com/golang/go/issues/32825#issuecomment -507268293: ๊ฐ ์ฌ๋ก์ ๋ํด ๋ค๋ฅธ ์ค๋ฅ ์ฅ์์ ์ํ๋ฉด if
๋ฌธ์ ์ฌ์ฉํ์ธ์. ๋์์ธ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ์ด ์ง๋ฌธ์ ์ง๊ธ๊น์ง ์ฌ๋ฌ ๋ฒ ๋ต๋ณ๋์์ต๋๋ค. ๊ฐ์ฌ ํด์.
@cstockton ๊ด๋ จ https://github.com/golang/go/issues/32825#issuecomment -507306652: ์, ์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ๋ํด ์๊ฐํด ๋ณด์์ต๋๋ค. ํนํ, "ํ
์ด๋ธ ๋ค์ง๊ธฐ"์ ๋ํด ์๊ฐํ๊ณ try
๋ฅผ ์ ๊ณตํ๋ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ์ธํ๋ handle
๋ฅผ ์ ๊ณตํ๋ฉด ๋ฉ๋๋ค. ํธ๋ค๋ฌ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ(๊ทธ๋ฆฌ๊ณ ๊ทธ๋๋ง), ํ ๋น์ LHS์ err
๋ฅผ ๋จ๊ฒจ๋๊ณ ์์์ ์ผ๋ก ๊ฒ์ฌ๋ฉ๋๋ค(์: ๋ณด์ด์ง ์๋ try
). ๋ณด๊ธฐ์๋ ์ข์ ๋ณด์ด์ง๋ง ์์ ํ ๋์ ๋์ง ์๋ ํฐ ์ ์ ํธ์
๋๋ค. ์ฐ๋ฆฌ๋ ์์ธ ์ฒ๋ฆฌ๊ฐ ์ฝ๋์ ๋ชจ๋ ์์น์์ ๋ช
์์ ์ผ๋ก ํ์๋๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๊ทธ๊ฒ ์์ด๋ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ค๋ฅ ๊ฒ์ฌ๊ฐ ์ผ์ด๋๋ ๊ณณ์ ๋ณด๋ ๊ฒ์ด ๊ฑฐ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
@griesemer ๋ช ํํ
@matthew-noken ๊ด๋ จ https://github.com/golang/go/issues/32825#issuecomment -507323973: ํฅ๋ฏธ๋ก์ด ์์ด๋์ด๋ฅผ ์ ์ํ๊ณ ๊ณ์ญ๋๋ค. ๋๋ฒ๊ฑฐ์ ๊ฐ์์ ๋ฉ์ปค๋์ฆ๊ณผ ๋งค์ฐ ํก์ฌํฉ๋๋ค. ๋๋ตํด์ผ ํ ๋ช ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค. on
๋ธ๋ก์ด ๋ฐํ๋์ด์ผ ํฉ๋๊น(๊ทธ๋ ์ง ์์ผ๋ฉด ์คํ๊ฒํฐ ์ฝ๋ ์์ญ์ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ์๊ฐํฉ๋๋ค)? ๊ทธ๋ฌํ on
๋ฌธ์ ๋ ๊ฐ ์ด์ ๊ฐ์ง ์ ์์ต๋๊น? on
์กฐ๊ฑด์ด ์ผ๋ง๋ ๋ณต์กํ ์ ์์ต๋๊น(๊ฐ ํ ๋น ์ ํ๊ฐ๋์ด์ผ ํจ)? on
๋ฌธ์ผ๋ก ๋ณ์๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณํด์ผ ํ๋ฏ๋ก ์์์ ํํ์์ ๊ฐ์ง ์ ์์ต๋๋ค. ๋ํ Go: on
๊ตฌ๋ฌธ์์ ๋ค์ ๋ถ๋ช
์์ค๋ฌ์ด ์ฝ๋๋ ๋ค๋ฅธ ๊ณณ์์ ์คํ๋ ๋ณด์ด์ง ์๋ ์ฝ๋๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด๊ฒ์ ๋ ํ๊ตฌํ๊ณ ์ถ๋ค๋ฉด ๋ค๋ฅธ ๊ณณ์์ ๋ ผ์ํ ๊ฒ์ ์ ์ํฉ๋๋ค(golang-nuts, ๋๋ ๋ค๋ฅธ ์๋ก์ด ์ ์). ๊ฐ์ฌ ํด์.
@as ๊ด๋ จ https://github.com/golang/go/issues/32825#issuecomment -507345821:
ํฌ์ธํฐ ์ฐ์ ์ ์๋ชป๋๊ณ ๊นจ์ง ์ฝ๋๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์๋ค๋ ์ ์ ํ์ Go์์ ์ ์ธ๋์์ต๋๋ค.
์ฌ์ค, ๊ฐ๋น์ง ์์ง์ ์ด๋ ต๊ฒ ํ๊ฑฐ๋ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ธ๋์์ต๋๋ค(์, ์์ ํ์ง ์์ ์ฝ๋๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค). ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๋ ์ค์ํ ์ ์ ์ด ๊ฒฐ์ ์ ๋ท๋ฐ์นจํ๋ ๊ตฌ์ฒด์ ์ธ ์ฆ๊ฑฐ์ ๊ฒฝํ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
์ค์ฒฉ๋ try
๊ฐ ๋๋ฆฌ ํผ์ง ๊ฒ์ด๋ผ๋ ๊ฒฝํ๊ณผ ์ฆ๊ฑฐ๋ ์์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ https://github.com/golang/go/issues/32825#issuecomment -507358397์ ์ฐธ์กฐ
@turtleDev ๊ด๋ จ https://github.com/golang/go/issues/32825#issuecomment -507368167 : panic
๋ _์ ํํ_ ์์ธ์ด๋ฉฐ ์ง์ฐ๋ ํจ์ ๋ด๋ถ์ recover
๋ ๋ณธ์ง์ ์ผ๋ก catch
. Go์์๋ ์์ธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ํ๋ก๋์
์ฝ๋์์ ์ฐพ๊ธฐ๊ฐ ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์์ธ์ ์ธ ์ํฉ์์๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ ์ด ํ๋ฆ ๊ตฌ์กฐ์ ์์ ๊ด๋ จํ์ฌ: ์ ์์ try
์ด ๋จ์ํ ๊ตฌ๋ฌธ์์ ์คํ์ด๋ฉฐ ๋ค๋ฅธ ๊ฒ์ด ์๋๋ผ๋ ๊ฒ์ด ๋งค์ฐ ๋ถ๋ช
ํฉ๋๋ค.
์ด ์ค๋ ๋์ ๋ํ ์ด ์ค๋ ๋์ ์ต๊ทผ ๋๊ธ์ ๋ต๋ณํ๋ ค๊ณ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ try
๋ฌธ์ #32437(์ค๋๋ถํฐ ๋ค์ ์ ๊ธ ํด์ ๋จ)์์ try
์ ์์ ๋ํ ์๋ก์ด ์๊ฒฌ์ ๊ณ์ํด ๋ณด๊ฒ ์ต๋๋ค. leave err != nil alone
ํ ๋ก ์ ์ํด ์ด ๋ฌธ์ ๋ฅผ ๋จ๊ฒจ๋์ญ์์ค. ๊ฐ์ฌ ํด์.
@cstockton https://github.com/golang/go/issues/32825#issuecomment -507306652์ ๋ํ ๋ ๋ค๋ฅธ ์๊ฒฌ : ์ด๊ฒ์ ๊ตฌํํ๋ค๋ฉด
func f() int { ... }
...
x := f()
๊ทธ๋ฆฌ๊ณ ๋ณ๊ฒฝ
func f() (int, error) { ... }
x := f()
์ด ๊ฐ์๊ธฐ ๊ทธ๋ฆฌ๊ณ ์กฐ์ฉํ ๋งค์ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
@lpar ๊ฐ ๋ชจ๋ go ๋ฆฌํฌ์งํ ๋ฆฌ์์ ์ํํ ๊ฒ๊ณผ ์ ์ฌํ ๋ช ๊ฐ์ง ์คํ์ ์คํํ์ต๋๋ค. ๊ฒฐ๊ณผ๋ ์ด ์์ง์ ์์ต๋๋ค: https://gist.github.com/freeformz/55abbe5da61a28ab94dbb662bfc7f763
@ianlancetaylor ๋๋ ์ค์ ๋ก ์ด๊ฒ์ด ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ๋งค์ฐ ์ ์๋ํ๊ณ ๋ ๋์ ์ค๋ฅ ๋ณด๊ณ ๋ฅผ ๋์ ํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ํฅ๋ ฅ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ ๊ฐ์ง ์ฃผ์ ๊ฒฝ์ฐ์ ๋ํ ์ ์ฒด ์๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ๋จผ์ ํธ์ถ์๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
func f() int { ... }
func a() error {
x := f() // if f() is updated to return an error, we get automatic error propagation by default
...
}
func b() {
x := f() // if f() is updated to return an error, we get the same compiler error
// assignment mismatch: 1 variable but pkg.f returns 2 values
}
์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ์ด๊ฒ์ด ์ด ์ ๊ทผ ๋ฐฉ์์ ์ข์ ์ด์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ์ฝ๋ ์ผ์ด์ค๋ ์ด๋ฏธ ์ทจ์ฝํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ์๊ฐํ ์ ์๋ ์ ์ผํ ๊ฒ์ ๋ฎคํ ์ค ๊ต์ฐฉ ์ํ์ ๋๋ค.
func (t *T) a() error {
t.mu.Lock()
x := f() // if f() is updated to return an error, we get automatic error propagation by default
if x > 15 {
t.mu.Unlock()
return errors.New("t > 15")
}
...
}
๊ทธ๋ฌ๋ ๊ทธ๋ ๊ฒ ์์ฑ๋ ์ฝ๋๋ ์ ํจํ ํ๋ก๊ทธ๋จ ์ํ๋ฅผ ๊ฐ๊ธฐ ์ํด ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์ถ์ ์์กดํ๋ ๊ฒฝ์ฐ ์ด๋ฏธ ๊ต์ฐฉ ์ํ์ ์ทจ์ฝํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํจ๋์ ๋์ด ์ด ์ ์๋ ๋ฒ์์ ์ ์ฅ๋ ๊ฒฝ์ฐ ๋์ผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ NPE๋ฅผ ํตํด ๋ฐํ์ ํจ๋์ด ๋ฐ์ํ๋ฉด ๊ต์ฐฉ ์ํ๊ฐ ๋ ์ ์์ต๋๋ค. ๋ํ ์ด์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋ ์ฃผ์ ๋๊ธฐ๋ ํ์ ์กด์ฌํ๋ ์ฐ๊ธฐ์ ์ญ์ฌ์ ๋น์ฉ์ ๋๋ค. ์คํ์ ์๋ ๋จ์ผ ์ง์ฐ์ ์ฑ๋ฅ ํฅ์์ผ๋ก ์ธํด ์ด๋ฌํ ์ฝ๋๋ ์ค์ ๋ก ํ์ํ์ง ์์ต๋๋ค. ๋๋ ์ด๋ฌํ ์ ํ์ ์ค๋ฅ๋ฅผ ์ฝ๊ฒ ์ ๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ํด๋ง์ผ๋ก "์๋"์ ๋จ์ ์ ๋ท๋ฐ์นจํ๋ ์ฃผ์ฅ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๊ธฐ์๋ ์ ์ฉ๋ ์ ์์ต๋๋ค. go-modules์ ์ฑํ์ด ์ฆ๊ฐํ์์ ๊ฐ์ํ ๋ "๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๊ทธ๋ ์ด๋ ๋ฆฐํธ" ๋จ๊ณ๋ฅผ ์ฝ์ ํ์ฌ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ์ฌ์ฉ์ ์์ ๋ช ํํ๊ฒ ํ์ํ ์ ์๋ ์ข์ ๊ธฐํ๊ฐ ์์ต๋๋ค.
@griesemer
์ ์ด ํ๋ฆ ๊ตฌ์กฐ์ ์์ ๊ด๋ จํ์ฌ: ์ ์์ try๊ฐ ๋จ์ํ ๊ตฌ๋ฌธ์ ์คํ์ด๋ฉฐ ๋ค๋ฅธ ๊ฒ์ด ์๋๋ผ๋ ๊ฒ์ด ๋งค์ฐ ๋ถ๋ช ํฉ๋๋ค.
์ค๋กํฉ๋๋ค. ํ์ง๋ง try
๋ ๋งคํฌ๋ก(C์ ๊ฐ์)๊ฐ ๋์ง ์์ ๊ฒ์ด๋ฏ๋ก ์ฌ์ค์ ์ต์ข
์ฌ์ฉ์์๊ฒ๋ ํ๋ฆ ๋ฌธ์ ๋ ๋ค๋ฅธ ์ ์ด์ผ ๋ฟ์
๋๋ค.
์ด ์์ ์์ ๊ฐ๊ด์ ์ธ ์ฃผ์ฅ์ด ์๋ค๊ณ ์๊ฐํ๋ฏ๋ก ๋ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ ์์์ ์ธ์ ํ์ง๋ง try
๊ฐ ์ต์์ ์๋ฃจ์
์ด ์๋ ์๋ ์์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง, ์ด๊ฒ๋ค์ ์ ์๊ฒฌ์ด๋ฉฐ ์ ๋ ๋จ์ง ๊ทธ๊ฒ๋ค์ ๋ํํ ๋ฟ์ ๋๋ค. ๋๋ ๋ฐ๋ ํ์ด ๋๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์๊ฐ์ ํ๋ค๊ณ ํ์ ํ๋ค.
์ธก๋ฉด: try
์ ์์(#32437)์๋ 279๊ฐ์ ๋ฐ๋ ํฌํ๊ฐ ์๋ ๋ฐ๋ฉด ์ด ๋ฌธ์ ์๋ 1335๊ฐ์ ์ฐฌ์ฑํ๊ฐ ์๋ค๋ ๊ฒ์ด ์ด์ ํฉ๋๋ค . ๋๋ ์ด๊ฒ์ ์ฐฌ์ฑํ๋ ์ฌ๋๋ค์ด try
์ ์์ ๋ฐ๋ ํฌํ๋ฅผ ํ๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์ด ๋ ์ ์์ ์ํธ ๋ฐฐํ์ ์ด๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํ ์ปค๋ฎค๋ํฐ์ ๊ฐ์ ์ด ๋ ๋ถ๋ช
ํด์ง๋๋ค.
@griesemer
์ค๋ฅ ์ฒ๋ฆฌ๋ ์ด๋ฏธ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋๋ก๋ ์ค๋ฅ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ฐํํ๊ณ , ์ฅ์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ณ , ๋๋ก๋ ์ค๋ฅ์ ๋ํด ์กฐ์น๋ฅผ ์ทจํ๊ณ , ๋๋ก๋ (์ ํํ๊ฒ) ์ค๋ฅ๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค.
๊ฑฐ๊ธฐ์ ๋์ํ๋ฉด ๊ทธ ์ ๋๋ ๋ถ๋ช ํฉ๋๋ค.
๊ทธ๋ค์ด ๊ณต์ ํ๋ ์ ์ผํ ๊ฒ์(์ค๋ฅ๋ฅผ ๋ฌด์ํ ๋๋ฅผ ์ ์ธํ๊ณ )
err != nil
ํ ์คํธ์ ๋๋ค(์ด๋ฏธ ํ ๊ฐ์ง ์ด์์ ๋ฐฉ๋ฒ์ผ๋ก ์ํํ ์ ์์). ์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ์ด ์ด๋ฌํ ๋ชจ๋ ๊ฒฝ์ฐ(๋๋ ๊ทธ ์ค 95%)๋ฅผ ์บก์ฒํ๋ ๊ฒ์ด ์ข์ ๋งํผ, ๊ทธ๋ฌํ ๊ตฌ์ฑ์ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ๋ค๋ฅธ ์ ์ด ๊ตฌ์ฑ๊ณผ ์ง๊ตํ์ง ์์ ๋ฐฉ์์ผ๋ก ๊ฐ์ญํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ฆ, ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ ์ ์๋ ์ต์ ์ ์ด๋ฌํ ๊ฒฝ์ฐ ์ค ์ผ๋ถ(20%, 50%)๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ ๋๋ค.
์ ์๋ try()
๋ฌธ์ ๋ํ ๋น์ง๊ต ๋ฐฉ์์ผ๋ก if
๋ฐ return
๋ฅผ "๊ฐ์ญ"ํ๋ฏ๋ก ๊ทธ ์ฃผ์ฅ์ด ์ณ์ง ์๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ์ฌ๊ธฐ์ ์๋ ์ด๋ค ์ฌ๋๋ค์ ๋ฐ๋ก ๊ทธ ์ด์ ๋ก try()
๋ฅผ ์ซ์ดํ์ง๋ง ์ ๋ ๋์ํ์ง ์์ต๋๋ค. Go๋ Oberon์ด ์๋๋๋ค. ๋จ์ํ์ง๋ง ๋ฏธ๋๋ฉํ์ง ์์ต๋๋ค. Go๋ ๋ ์ค์ฉ์ ์
๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋์ํ์ง ์๋ ๋ถ๋ถ์ ๋น์ ์ด ์ค์ค๋ก ์ธ์ ํ ๋ฐ์ ๊ฐ์ด ์ฌ์ฉ๊ณผ ์ ์ฉ ๊ฐ๋ฅ์ฑ์ด ์ ํ์ ์ด๋ฉฐ ์ด๋ฏธ if
๋ฐ return
์ฌ๋ฐ๋ฅด๊ฒ ์ํํ ์ ์๋ ์ธ์ด ๊ตฌ์ฑ์ผ๋ก ๊ท์ฐฎ๊ฒ ํ ๊ฐ์น๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค try()
๋๋ฌด ์๋ ๋์ด ์์ ๊ฐ์ง ์์ผ๋ ค๊ณ ํฉ๋๋ค. ๋ฆฌํด๊ณผ ์ง๊ตํ์ง ์๋๋ผ๋ ๋ ๊ฐ๋ ฅํ๊ณ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉํ try()
๋ ์๋ง๋ ๋๋ถ๋ถ์ Go ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ณด๊ณ ์ถ์ดํ๋ ๊ฒ์
๋๋ค.
@๋ฒ ์ค๋
"๋ ๊ฐ๋ ฅํ๊ณ " "๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉํ" try()
์ํ๋ค๊ณ ์ผ์ต๋๋ค.
@griesemer ๋ 4๊ฐ์ง ์ํฉ์ ์ธ๊ธํ์ต๋๋ค.
try()
๋ ์๋์ ์ผ๋ก 1์ ํด๊ฒฐํฉ๋๋ค. ๋ง ๊ทธ๋๋ก if err != nil { return ..., err }
์ ์ง๋ฆ๊ธธ์
๋๋ค.
๊ธฐ์กด ์ธ์ด ๊ตฌ์กฐ๋ 3๊ณผ 4๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ if err != nil { ... }
๋ก ์ค๋ฅ์ ๋์ฒํ ์ ์์ผ๋ฉฐ ์ด ๊ฒฝ์ฐ ๋ ๊ฐ๊ฒฐํ ๊ตฌ์กฐ๋ฅผ ์ฐพ๊ธฐ๊ฐ ์ด๋ ค์ธ ๊ฒ์
๋๋ค. ์ด๋ฏธ _
์ค๋ฅ๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ 2๋ฅผ ๋จ๊น๋๋ค(๋ฐ์ฝ๋ ์ดํ
๋ ์ค๋ฅ๋ฅผ ๋ฐํ). try()
์ ์์ defer ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฅ์ํ๊ฑฐ๋ ๊ฐ ์ค๋ฅ๋ฅผ ๋ค๋ฅด๊ฒ ์ฅ์ํด์ผ ํ๋ ๊ฒฝ์ฐ ํ์ค if err != nil { ... }
๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋๋ก ์ ์ํฉ๋๋ค.
์ ์์ ์ด ๋ถ๋ถ ์์ ์ถ๋ก ์ด ์ ์ค๋ช ๋์ด ์์ต๋๋ค.
์ด ์ ์์ ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต์ ์ฐ์ฐ์ ๋์ ๋ด์ฅ์ ์ฌ์ฉํ๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ํต์ฌ ๋ถ๋ถ ๊ณผ ์๋ก์ด ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ ์ธ์ด ๊ตฌ์ฑ ๋์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ์ผ๋ฐ Go ํจ์์ ๋ ๊ฐ์ง ์์ด๋์ด์์ ์๊ฐ์ ๋ฐ์์ต๋๋ค. ๊ทธ ๊ฒ์๋ฌผ๊ณผ ๋ฌ๋ฆฌ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ ๋ฌธ์ ๋ฅผ ๋จ์ํํ๊ธฐ ์ํด ๊ณ ์ ๋ ํจ์ ์๋ช
func(error) error
์ ๊ฐ์ก์ต๋๋ค. ์๋ฌ ํธ๋ค๋ฌ๋try
๋๋ฌ์ธ๋ ํจ์์์ ๋ฐํ๋๊ธฐ ์ง์ ์ ์๋ฌ๊ฐ ์์ ๋try
์ ์ํด ํธ์ถ๋ฉ๋๋ค. ๋ค์์ ์์ ๋๋ค.handler := func(err error) error { return fmt.Errorf("foo failed: %v", err) // wrap error } f := try(os.Open(filename), handler) // handler will be called in error case
์ด ์ ๊ทผ ๋ฐฉ์์ ํจ์จ์ ์ธ ์ฌ์ฉ์ ์ ์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ์ ์ฌ์์ ํ์ฉํ์ง๋ง ๋ถ๋ช ํ ์ ๋ต์ด ์๋ ๋ง์ ์ง๋ฌธ์ ์ด์์ต๋๋ค. ์ฒ๋ฆฌ๊ธฐ๊ฐ ์ ๊ณต๋์์ง๋ง nil์ด๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
try
ํจ๋์ ์ผ์ผํค๊ฑฐ๋ ๊ฒฐ์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๊น? ํธ๋ค๋ฌ๊ฐ nil์ด ์๋ ์ค๋ฅ๋ก ํธ์ถ๋ ๋ค์ nil ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ด๊ฒ์ ์ค๋ฅ๊ฐ "์ทจ์๋จ"์ ์๋ฏธํฉ๋๊น? ์๋๋ฉด ๋๋ฌ์ธ๋ ํจ์๊ฐ nil ์ค๋ฅ์ ํจ๊ป ๋ฐํ๋์ด์ผ ํฉ๋๊น? ๋ํ ์ ํ์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ํ์ฉํ๋ฉด ํ๋ก๊ทธ๋๋จธ๊ฐ ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ ํ ๋ฌด์ํ๊ฒ ๋ ๊ฒ์ธ์ง๋ ๋ถ๋ช ํ์ง ์์์ต๋๋ค. ๋ํ ๋ชจ๋ ๊ณณ์์ ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ํํ ์ ์์ง๋งtry
์ ๋จ์ผ ๋ฐ์์ ๋์น๊ฒ ๋ฉ๋๋ค. ๊ธฐํ ๋ฑ๋ฑ.๋ค์ ๋ฐ๋ณต์์๋ ์ค๋ฅ ๋ํ์
defer
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ ์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ์ต๋๋ค. ์ด๊ฒ์ ์ฝ๋์์ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ํจ์ฌ ๋ ์ ๋ณผ ์ ์๊ฒ ํ๊ธฐ ๋๋ฌธ์ ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ฒ๋ผ ๋ณด์์ต๋๋ค. ์ด ๋จ๊ณ์์๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ก์์ ์ ํ์ ๊ธฐ๋ฅ์ ๋ํ ๋ชจ๋ ์ง๋ฌธ์ ์ ๊ฑฐํ์ง๋ง ์ก์ธ์ค๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ค๋ฅ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ ์ง์ ํด์ผ ํ์ต๋๋ค(์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ๊ด์ฐฎ๋ค๊ณ ๊ฒฐ์ ํ์ต๋๋ค).[...]
๋ช ์์ ์ผ๋ก ์ ๊ณต๋๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ ํจ์์ ํ์์ด๋ ํด๋น ๋ฌธ์ ์ ๋ํ ๋ค๋ฅธ ์ถ๊ฐ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ข์ ์๊ฐ์ด๋ผ๊ณ ํ๋จ๋๋ฉด ํด๋น ์ถ๊ฐ ์ธ์๋ฅผ try ํธ์ถ์ ์ ๋ฌํ๋ ๊ฒ์ด ๊ฑฐ์ ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ ผ๋ฆฌ์ ๋์ํ์ง ์์ต๋๊น?
๋๋ ์ ์์ ์ด ๋ถ๋ถ์ ์๊ณ ์๊ณ ๊ทธ๊ฒ์ ๋์ํ์ง ์์ต๋๋ค. ์๋ํ๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ๋ฌํ๋ค๋ ์์ด๋์ด๋ก ์ธํด ์ง๋ฌธ์ด ์ด๋ ธ๋ค๋ ์ฌ์ค์ด ๊ทธ๋ฌํ ๊ธฐ๋ฅ์ด ํ์ํ์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ํฉ๋ฆฌ์ ์ธ ๋ฐฉ์์ผ๋ก ๊ทธ๋ฌํ ์ง๋ฌธ์ ๋ตํ๊ธฐ ์ํด ์ ์๊ฐํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ํ, ์ด์ ์ฐ๋ฆฌ๋ ๋๋ฆฌ ์ดํด๋๊ณ ์ผ๊ด๋ Go ๊ด์ฉ๊ตฌ์ธ if err != nil
๋ฌธ์ผ๋ก 4๊ฐ์ง ์ค๋ฅ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํฉ๋๋ค. ์ฌ๋ก 1์ ๋ํด try()
๋ง ์ฌ์ฉํ๊ณ , ๊ฒฝ์ฐ์ ๋ฐ๋ผ 2์ ๋ํด defer ๋ฌธ์์ ์ค๋ฅ ๋ํ์ ์ํํ๋ ์ค๋ฒํค๋์ ์ ๊ฒฝ ์ฐ์ง ์๋๋ค๋ฉด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ฝ๋๊ฐ if
๋ก ๋ถํ ๋จ์ ์๋ฏธํฉ๋๋ค try
์ผ๊ด๋์ง ์๊ณ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ ์ฌ์ด๋ฅผ ์ ํํด์ผ ํฉ๋๋ค.
๋ชจ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋ ๋ ๊ฐ๋ ฅํ try()
๋ฒ์ ์ ์ฌ์ฉํ๋ฉด ๊ฑฐ์ ํญ์ try()
๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ Go์ ๋ํ ์๋กญ๊ณ ์ผ๊ด๋ ์ค๋ฅ ์ฒ๋ฆฌ ๊ด์ฉ๊ตฌ๊ฐ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ง๊ธ๊ณผ ๊ฐ์ด try()
๋ฅผ ์ฌ์ฉํ๋ฉด ์ถฉ๋ถํ ๋๋ฆฌ ์ ์ฉํ ์ ์์ผ๋ฉฐ ์์ ์ธ๊ธํ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ถ์ผ์น๋ฅผ ์ฝ๋ ๊ธฐ๋ฐ์ ๋์
ํ ๋งํผ์ ํธ์์ฑ์ด ์ถฉ๋ถํ์ง ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ์ฌ์ try()
์ ์์ ์๋๋นํ๊ณ ์๋ฌด๊ฒ๋ ํ์ง ์๋ ๊ฒ์ด ๋ซ๋ค๊ณ ์๊ฐํ๋ ์ด์ ์
๋๋ค.
@beoran ์ฌ๋ก 1๊ณผ 2๋ ๊ณตํต์ ์ผ๋ก ํจ์์์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ค๊ณ ์๊ฐํฉ๋๋ค(๊ฐ๊ฐ ์ฅ์์ด ์๊ฑฐ๋ ์๋ ๊ฒฝ์ฐ). ๋ฐ๋ฉด ์ฌ๋ก 3๊ณผ 4๋ ๊ทธ๋ ์ง ์์ต๋๋ค(๊ฐ๊ฐ ์ค๋ฅ์ ๋ํด ์กฐ์น๋ฅผ ์ทจํ๊ณ ์ค๋ฅ๋ฅผ ๋ฌด์ํจ). ๋๋ 'try()' ์ด์ ์ด ์ฌ๋ก 1๊ณผ 2์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ํ์ ์ฒ๋ฆฌ๊ธฐ ๊ธฐ๋ฅ์ ์๋ฝํ์ฌ try()
์ ์์ ๊ฐ์ ํ์ฌ ์ฌ๋ก 1 ๊ณผ 2๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค๋ฉด ์ด๋จ๊น์? ๋ฌผ๋ก ์ด๋ฅผ ์ํด์๋ ์ ์์์ ๋์ด๋ ์ง๋ฌธ์ ๋ํ ํฉ๋ฆฌ์ ์ธ ๋ต๋ณ์ ์ฐพ์์ผ ํ์ง๋ง ๋ค๋ฃจ๊ธฐ ์ฌ์ด ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฐ๊ฑฐ ์ง์ํด์ค๋?
์ฌ๊ธฐ ๋์. ์ด์ ๋ํ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ค๋ฅ๋ฅผ ํ์ธํ๊ธฐ๋ฅผ ์ํ๋ฉด ํ์ธ๋ ์ค๋ฅ(ํ์ธ๋ ์์ธ์ ๊ฐ์ ์ข ๋ฅ)๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ๊ฐ๋ฅํ ํ ๋ช ์์ ์ด๋ฉฐ ์ฌ์ฉ์๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ํ์ธํ๊ณ ์์์ ์ ์ ์์ต๋๋ค.
์ง์งํ๊ฒ ๋งํด์, ๋ด๊ฐ ์ด๋ฌํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐฐํ์ ์์๋ค๋ฉด Kotlin ?
์ฐ์ฐ์๋ Rust unwrap()
๋์๊ณผ ๊ฐ์ ๊ฒ์ ์ฉ๋ ๋ณ๊ฒฝํ๊ณ ์ถ์ต๋๋ค.
๋ค์ ์ค ํ๋๊ฐ ๊ฐ์ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
getFile()?.getPath()?.toString()
๋น์ ์ด ์ป์ ์ด๋ nil
๋ค์ ๊ธธ์ ๋ฐ๋ผ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ ๋๋
get_file().unwrap().get_path().unwrap().lossy_to_string()
์ค๋ฅ๊ฐ ์์ผ๋ฉด ์ค๊ฐ์ ํญ๋ฐํฉ๋๋ค. Rust๋ ์ค๋ฅ๋ฅผ ์ฒ ์ ํ๊ฒ ๊ฒ์ํ๊ณ ๊ฐ๊ฐ์ ๊ฐ๋ณ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ํํ์ ์ธ match
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ฒ์งธ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
19๋ 7์ 2์ผ Nicolas Grilly [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@beoran ์ฌ๋ก 1๊ณผ ์ฌ๋ก 2์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ค๋ ๊ณตํต์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ธฐ๋ฅ(๊ฐ๊ฐ ์ฅ์ ์์ ๋ฐ ์์), ๊ฒฝ์ฐ 3 ๋ฐ 4
ํ์ง ๋ง์ญ์์ค(๊ฐ๊ฐ ์ค๋ฅ์ ๋ํด ์กฐ์น๋ฅผ ์ทจํ๊ณ ์ค๋ฅ๋ฅผ ๋ฌด์ํจ). ๋๋ '์๋()'๋ผ๊ณ ์๊ฐํ๋ค.
์ฌ๋ก 1๊ณผ 2์ ์ค์ ์ ๋ก๋๋ค.๋ด ์ ์์ ๋ํ ๋ ๋ง์ ํ ๋ก ์ ๋ณผ ์ ์๋ค๋ ๊ฒ์ด ๋ค์ ์ค๋ง์ค๋ฝ์ต๋๋ค.
"์ค๋ฅ ๋ฐํ"์ "๋ฐํ" ๋ถ๋ถ์
"์ค๋ฅ" ๋ถ๋ถ์ด ์๋๋ผ ํด๊ฒฐ๋์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ ๊ณต์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋์ด์ผ ํ์ ์๋ ์์ต๋๋ค. ๋๋
๋จ์ํ ์ ์์ ๊ณต์ํํ๋ ๋ฐ ๋ฅ์ํ์ง ์์ต๋๋ค.
์ฅ์.
์ฌ๋ก 1๊ณผ 2๋ ์ ์๊ฐ์ "์คํจ" ๋ช
๋ น์ผ๋ก ๋ ์ ์ ๊ณต๋ฉ๋๋ค.
(์ผ๋ถ ์ต์ํด์ง ํ) ๋ช
ํํ๊ฒ ๋ํ๋ด๋ ํค์๋
ํ๋ก๊ทธ๋จ ํ๋ฆ์ ๋ณ๊ฒฝ ์ฌํญ์ด๋ฉฐ ์ด๋ ํ ์ํฅ๋ ๋ฐ์ง ์์ต๋๋ค.
์ ์ฒด ๊ตฌ๋ฌธ๊ณผ ๊ด๋ จํ์ฌ ๋ถํธํ ์ ํต.
๊ทธ๋ฌ๋ ๊ทธ ๊ฒฐ๊ณผ ์ฐ๋ฆฌ๊ฐ ์ข๋ ์ซ๋
๋ง์ง๋ง ๋ฐํ ๋งค๊ฐ๋ณ์๋ก "err"์ ์์น๋ ๊ณง
๊ด์ต์ด ์๋๋ผ ๋ฒ์ด ๋๋ค. ๊ทธ๊ฒ์ ๋ง์ "์๋ํ์ง ์์"๋๋
๊ณ ๋ คํด์ผ ํ "๋ถ์์ " ๊ฒฐ๊ณผ.
์ต์ํ์ ๊ฒ์์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ง์ด ์์ ๊ฒ์
๋๋ค.
๋น์ฐธํ, ์ผ๋ถ๋ ๊ธฐํ์ฃผ์์ ์ผ๋ก
์ ์. ๋๋ ๊ฐ์ธ์ ์ผ๋ก ์กฐ์ฌํ๋ ํธ์์ ์ค์ํ ๊ฒ์ด๋ค.
๋ฐ๋ํ๊ณผ ๋ก๋ฒํธ๊ฐ ํนํ ์ถ๊ตฌํ๋ ์ด์ ๋ฅผ ์ดํดํ์ญ์์ค.
์ ํญ์ด ๊ทธ๋ ๊ฒ ๋ฐํ์ก๋ค๋ ๊ฒ์ ์์ฌ์ ์ฌ์ง๊ฐ ์์ต๋๋ค.
์์ฒญ๋.
์ ์น์ ์ด๋
์ ์ถฉ๋, ์๋ง๋ ์ฐ๋ฆฌ๋ ๋ง์ด ํํค์ณ์ผ ํ ๊ฒ์
๋๋ค.
์์์ ๊ด์ฌ์ด ํ์ํ ์ง์ ํ ๋ฟ๋ฆฌ๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ ๊น์ด ์์ต๋๋ค.
@lootch try
๊ฐ ์๋ํ๋ ค๋ฉด ๋ง์ง๋ง ๋ฐํ ๋งค๊ฐ๋ณ์๊ฐ ๋์ด์ผ ํ๋ ์ค๋ฅ์ ๋ํด ํน๋ณํ ์ฐ๋ คํ๊ณ ์์ต๋๊น? ์ด๋ฏธ ์ฌ์ค์์ ํ์ฝ ์๋๊ฐ์?
(์ ์ณ๋๊ณ , ์ฐ๋ฆฌ๋ ์ ํญ์ ๋ํด "์์ฒ"ํ์ง ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ณผ๋ํ ๋ฐ์์ ๋ํด ๋นํฉํฉ๋๋ค.)
@griesemer ์ค๋๋ ์๋์ฐจ ๋น์ ์ ๋ํด ์ ๊ฐ์ค๋ฝ๊ฒ ์๊ฐํ์ง๋ง ์ ์์ "์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฐ์๋ฆฐ ์๋์ฐจ์ ๋์ ค ์ฐ๋ฃ ์์คํ ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ชจ๋ ๊ฐ์๋ฆฐ ์๋์ฐจ์ ๋ฐฐํฐ๋ฆฌ์ ์ ๊ธฐ ๋ชจํฐ๋ฅผ ์ถ๊ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค." Go์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ถฉ๋ถํฉ๋๋ค. ์ถ๊ฐ๋ ๋ถ๊ฐ๊ฐ์น๊ฐ ์๋ก์ด ์ด๊ธฐ ๋ฐ ์ ์ ์ ์ค๋ฒํค๋๋ฅผ ํฌํจํ์ฌ ๋น์ฉ๋ณด๋ค ์ ์์ง ๊ฑฑ์ ๋ฉ๋๋ค.
Go๋ฅผ ๋ง์ด ์์ฑํ๊ธฐ ๋๋ฌธ์(์ ๋ 2009๋ ์ฒซ ๊ณต๊ฐ ๋ฆด๋ฆฌ์ค ์ดํ๋ก Go๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ github ์ฐธ์กฐ) ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ์ธ์ฒด ๊ณตํ์ ๊ฐ์ ํ๋ ๊ฒ์ ํ์ํฉ๋๋ค. Go์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ๋ช ํํ๊ธฐ๋ ํ์ง๋ง ์์ฐจ ์ฝ๋์์๋ ๊ณจ์นซ๊ฑฐ๋ฆฌ์ด๊ธฐ๋ ํฉ๋๋ค. ๋ด ๊ฒฝํ์ ์ค์ ๊ฐ ์์ฒด์ ๋ํ ์ฑ์ฐฐ๊ณผ ํ์ดํ์ ๋ถ์กฑ์ ์ค์ ๋ก ํ๋ก๊ทธ๋จ์ ํ๋ ฅ์ฑ์ ํฅ์์ํค์ง ์์ต๋๋ค.
๋๋ ๋ช ๋ ์ ์ ์ด๊ฒ์ ์ถฉ๋ถํ ์ง์ฆ์ด ๋ฌ๊ณ ์ค์ ๋ก ๊ณตํฉ๊ณผ ๊ด๋ จํ์ฌ ์ฝ๊ฐ์ ์คํ์ ์ผ๊ณ ํ์ธ๋์ง ์์ ์์ธ์ฒ๋ผ (๋๋ถ๋ถ) ์๋ํ๋๋ก ๋ณต๊ตฌํ์ต๋๋ค. https://hackthology.com/exceptions-for-go-as-a-library. HTML . ์ค์ ๋ก ํด๋น ๋ํผ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ปค๋ฎค๋ํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋์ ์๊ฐ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ด๋ จํ์ฌ ์ธ์ฒด ๊ณตํ์ ๊ฐ์ ํ๋ ๊ฒ์ด ์น๋ฆฌ๋ผ๊ณ ๊ณ์ ๋ฏฟ์ต๋๋ค.
์ฌ๋๋ค์ด ์ค๋ฅ ์กฐ๊ฑด์ ์ ํํ๋ ๋ฐ ๋งค์ฐ ์ฅํฉํ์ง๋ง ๋์์ด ๋์ง ์๋ ๋ฐฉ๋ฒ์ ์ ์งํ๊ธฐ ์ํด ์ด๋ ฌํ ๋
ผ์ํ๋ ๊ฒ์ ๋ฏธ์น ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ๋๋ค์ด if err != nil
์กฐ๊ฑด์ ์๋ง์ผ๋ก ๋ง๋ค๊ณ ๋ฒ๊ทธ๋ฅผ ๋ง๋ ์ฝ๋(๋ฐ ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋)์์ ์ค์ ๋ฒ๊ทธ๋ฅผ ์์ฑํ๊ณ ์ฐพ์์ต๋๋ค. ์ด๋ฌํ ๋ฒ๊ทธ๊ฐ ์์ฑ๋ ์ด์ ๊ฐ ์์ต๋๋ค. ์ ์ ๊ฒ์ฌ๋ ์ด๋ฌํ ๋ฒ๊ทธ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ง๋ง ์ ๊ฑฐํ ์๋ ์์ต๋๋ค.
๋๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ์ธ์ฒด ๊ณตํ์ ๊ฐ์ ํ๊ธฐ ์ํ ์ ์์ ์ง์งํฉ๋๋ค.
์ ์ ํ๋ก์ธ์ค๋ https://golang.org/s/proposal ์ ์ธ์ฉํ์ฌ "Go๋ก์ ๋ณ๊ฒฝ ์ ์"์ ์ํ ๊ฒ์
๋๋ค.
์ด ๋ฌธ์ ๋ ๋ณ๊ฒฝ์ ์ ์ํ๋ ๊ฒ์ด ์๋๋ฏ๋ก ์ค์ ๋ก๋ ์ฝ๊ฐ์ ๋ฒ์ฃผ ์ค๋ฅ์
๋๋ค.
๋๊ตฐ๊ฐ๊ฐ "์ ํ๋ง ๋จ๊ฒจ๋๊ธฐ"๋ผ๋ ์ ๋ชฉ์ ์ ์์๋ฅผ ์ ์ถํ๋ค๋ฉด ์ ์์๊ฐ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ์ฌ ๋ซ์ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ ์ค์ ๋ก ์ด ๋ฌธ์ ๋ #32437๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ฌธ์ ์ ๋ํ ๋ ผ์์ ํ์ฅ์ผ ๋ฟ์ด๋ฏ๋ก "์๋ฌด๊ฒ๋ ํ์ง ์์"์ ๋ํด ๋ ผ์ํ๊ธฐ์ ์ข์ ์ฅ์๋ก ๋จ๊ฒจ๋๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์๋ ํน์ ๊ฒฐ์ ์ด ์๊ณ ๋ฉํ ๊ฒฐ์ ์ ๊ฐ๊น๋ค๋ ๊ฒ์ ๋ํ๋ด๊ธฐ ์ํด ์ ์ ๋ณด๋ฅ๋ก ํ์ํ์ต๋๋ค.
์ธก๋ฉด:
try
์ ์์(#32437)์ _๋ง_ 279๊ฐ์ ๋ฐ๋ ํฌํ๊ฐ ์๋ ๋ฐ๋ฉด ์ด ๋ฌธ์ ์ 1335๊ฐ์ ์ฐฌ์ฑํ๊ฐ ์๋ค๋ ๊ฒ์ด ์ด์ํฉ๋๋ค.
์๋ ์ ์์ ๋ด๊ฐ ๊ทธ๊ฒ์ ์๊ฒ ๋์์ ๋ ์ ๊ฒจ ์์๊ณ ๊ทธ๋์ ๋๋ ๊ทธ๊ฒ์ ๋ฐ๋ํ ์ ์์์ต๋๋ค. ์ด ์ ์์ด ์ฒ์๋ถํฐ ์์๋ ์ด์ ์ด๊ธฐ๋ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
19๋ 7์ 2์ผ์ Robert Griesemer [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@loot ๋ง์ง๋ง์ด ๋์ด์ผ ํ๋ ์ค๋ฅ์ ๋ํด ํน๋ณํ ์ฐ๋ ค๊ฐ
try
๊ฐ ์๋ํ๋๋ก ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐํํ์๊ฒ ์ต๋๊น? ์ด๋ฏธ ์ฌ์ค์ ํ์ ์๋๊ฐ์
ํ์ฝ?๋๋ ๊ทธ๊ฒ์ด "์ฌ์ค์" ๋๋ก ์ฃผ์กฐ๋ ๊ฒ์ด ๋๋ค๋ฉด,
๊ทธ ๋ฌธ์ ํ์ง ์ด๋ ค์ผ ํ๊ณ "์ค๋ฅ"๋ฅผ ์ ํ์ ์ด๊ณ ํน๋ณํ๊ฒ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
๋ชจ๋ ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ์ ๋ํด
์ข ์ข ์๋ชป๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์์ฃผ, ๊ทธ๋ค์ ๋ํ ๊ทธ๋ ๊ฒ ๋ ์ ์์ต๋๋ค
ํน๋ณํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
"๋ฐํ" ๋ฌธ์ ์กฐ์ฌํด์ผ ํ๋ค๋ ์๊ฐ์ด ๋ค๋ฉด
๋ ๊น์ด (๊ทธ๋ฆฌ๊ณ ์๋ ์ ์์ ๊ทธ๊ฒ์ ์์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค
๋ฐฉํฅ), ์ค๋ฅ ์กฐ๊ฑด์ ๋ ์ด์ "๋จ์ํ ๊ฐ ๋ฐ
Go์ ์ ๊ทผ ๋ฐฉ์์ ์ต๊ณ ์ ์นด๋ ํ์ฐ์ค์ ์ ์ฌํ๊ธฐ ์์ํฉ๋๋ค.
๋ ์ง, ๊ทธ๋ฌ๋ ์นด๋์ ์ง, ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ .
๋๋ ๋ช ๊ฐ์ง Go์ ๋ ์๋ฆฌํ ํธ๋ฆญ์ ๊บผ๋ คํ๋ ์ฌ์ฉ์์
๋๋ค(์ ๋
๋ค๋ฅธ ๊ณณ์์ x++ ๋ฐ x-- ๊ธฐ๋ฅ์ด ์๋ค๊ณ ์ธ๊ธํ์ต๋๋ค.
๋๋๋ก - ๋ด ์ฝ๋์์) "์๋"๋ ๋์๊ฒ ๊ทธ ์ค ํ๋๋ก ๋จ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋๋ ์์น์ ์ผ๋ก ๋์
์ ๋ฐ๋ํ์ง ์๋๋ค.
๋๋ฌด ๋ง์ด ๋งํ์ง๋ง ์ฌ์ ํ ๊ฐ๋ฅํ ๋ชจ๋ ๋จ์ ์ ๊ทธ๋ ์ง ์์ ์ ์์ต๋๋ค.
(๋ด๊ฐ ๋ณด๋ ๊ฒ์ ์๋ํ์ง ์์ ๊ฒฐ๊ณผ๊ฐ
๊ถ๊ทน์ ์ธ ์ ์น์ ๊ฒฐ์ ). ๊ทธ๊ฒ์ ํ
์คํธํ๋ ๊ฒ์ด ์ข์ ์ ์์ต๋๋ค.
๋๋ ๋์.
๋ด๊ฐ ๋ณธ ๊ฒ์ ํจ๋/๋ฆฌ์ปค๋ฒ๊ฐ ๋์ ๋ฉ๊ณผ ๊ทธ๊ฒ์ ๋ถ๋นํจ์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์
๋๋ค
์ฐ๋ฆฌ๋ฅผ ๊ดด๋กญํ๊ธฐ ์ํด ๋ค์์ค๊ณ ์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง, ๋๋ ์์ง ๋ ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ง ์์๊ณ ๋๋
๋๋ ํญ์๋ฆฌ์์ ๊ฐ์ฅ ๋ ์นด๋ก์ด ์ฟ ํค๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋ด๊ฐํด์ผ ํ ๋ ์ด ๋๋ ค์
๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ด ๋งค์ฐ ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ด์ง๋ง, ํจ๋/ํ๋ณต์ด ๊ถ์ฅ๋์์ต๋๋ค
๋๋ฌธ ๊ฒฝ์ฐ์ ์ ํฉํ ๊ฒฝ์ฐ(๊ทธ๋ค ์ค ๋๊ตฌ๋
๋กญ ํ์ดํฌ(Rob Pike)๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๋ํ ๋ฉ์ง ํ๋ ์ ํ
์ด์
์ ํ์ต๋๋ค.
๊ฐ, ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ธฐ์ตํ๋ค๋ฉด), ๊ทธ๊ฒ์ ๋ชจ๋ ๊ฒ์ ํจ์ฌ ๋ ๋ถ๋ช
ํ ๊ฒ์
๋๋ค
Go๋ ์ด๋ฏธ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ณ ํ์ ์์ด ์์ํ ์ ์์ต๋๋ค.
๊ฐ๋ฅํ ์ต์
์ ๋ช์ ํํํ๊ธฐ ์ํด
๊ฒฝ๊ณ.
์ฆ, ํ
์คํธ๋ฅผ ์๋ํ๋ ๊ฒ๋งํผ์ด๋ ์๋ฏธ๊ฐ ์์ต๋๋ค.
๋ชจ๋, ์ ํ์ ๊ธฐ๋ฅ์
๋๋ค. ๊ทธ๋ฌ๋ ํ ๊ฐ์ง ๋ถ์์ฉ์ ์ด๊ฒ์ด
๊ตํ์ "์ฌ์ค์"์ ๊ฒฐ๊ณผ์ ๊ดํ ๊ฒ์
๋๋ค.
"์ค๋ฅ" ์ ํ ์ธ์๋ฅผ ๊ฐ๋ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ํจ์
๋ฐํ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ ๋์? ๊ทธ๊ฒ ์ด๋ป๊ฒ ๋ฐ๋๊น
"์ค๋ฅ๋ ๊ฐ์ผ๋ฟ"์ด๋ผ๋ ์ธ์? ์ ์ด๋ป๊ฒ ๋ง๋ฌผ๋ฆด ๊ฒ์ธ๊ฐ
์ด์ ํจ์ฌ ๋ ์ ์ฌํ "์ผํ ํ์ธ" ํจ๋ฌ๋ค์? ์ด๊ฑด ๋ ๋ญ์ง
์๋ก์ด ์๋ฆฌ๋ฅผ ์ผ์ผํค๋ค?
๋ฌด์๋ณด๋ค ์ด ๋๋์ง ์ธ๋์ผ๋ก ๋ง๋ค์ด์ง ์ฐ์
๋ฐ๋์ด ์ธ์์ ๋ฐ๊พธ๋ ์ด์ ํ์ ๋๋ฌํ์์ ๋ํ๋
๋๋ค. ๊ฑฐ์
ํ์คํ, 2013๋
์ ์ฌ์ค์ด์๋ ๊ฐ์ ์ด ๋ ์ด์
์ก๊ณ ์๋ค. ๊ทธ๊ฒ์ ๋๊ตฌ์๊ฒ๋ ๋ด์ค๊ฐ ์๋์ง๋ง Go2๊ฐ
์ด์ ์ฒ๋ผ Go1๊ณผ ์ญํธํ๋๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค.
๋๋ฌด ๋จํธํ๊ฒ ์ ์ํ์ต๋๋ค(๋ด ์๊ฒฌ์ผ๋ก๋).
@loot ์์ธํ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค. ๊ธฐ์กด ์ธ์ด๋ฅผ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๋ฐฉ์์ผ๋ก ํ์ฅํ๋ ๊ฒ์ ์ค์ ๋ก ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ๋ฐ๋ผ์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋ค๋ ์ ์ ๋์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ณง (๋ชจ๋์ด ์ผ๋ฐํ๋๋ฉด) ์๊ฒฉํ ์ญํธํ์ฑ์ ์๊ตฌํ์ง ์๋ ์ธ์ด ๋ณ๊ฒฝ์ ํ ์ ์์ ๊ฒ์ ๋๋ค.
๋น์ ์ด ๋งํ๋ฏ์ด try
๋ ์ ํ์ ์ธ ๋ฉ์ปค๋์ฆ์ด๋ฉฐ - ๋ฐ๋ณตํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค - ์ฃผ๋ณ์ ๋ชจ๋ ๋๋ฆฌ์๋ ๋ถ๊ตฌํ๊ณ ๊ธฐ์กด Go ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ์ค๋ช
ํ ์ ์๋ ๋งค์ฐ ๊ฐ๋จํ ๋ฉ์ปค๋์ฆ์
๋๋ค. t Go์์ ํจ์๋ก try
๋ฅผ ์์ฑํฉ๋๋ค(๊ทธ๋ฆฌ๊ณ ์ ๋ค๋ฆญ๋ ๊ทธ ๋ฌธ์ ์ ๋ํด ๋์์ด ๋์ง ์์ต๋๋ค). ๊ฐ๋ฅํ๋ค๋ฉด ๊ธฐ์กด ์ฝ๋์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด try
์ ๊ฐ์ ๋์ฐ๋ฏธ ํจ์๋ฅผ ๋ณด๋ ๊ฒ์ด ๋งค์ฐ ์ผ๋ฐ์ ์ผ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ์ค๋ฅ๊ฐ ๊ฐ์ด๋ผ๋ Rob Pike์ ์ด์ผ๊ธฐ๋ ๊ฒฐ๊ตญ ์ค๋ฅ๊ฐ ์๋ ํ๋ก๊ทธ๋๋ฐ์
๋๋ค.
๋ชจ๋ ์ฌ๋์ด ์์ ๋กญ๊ฒ ๋ฌด์ํ ์ ์๋ ์์ฃผ ์์ ๋์ฐ๋ฏธ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ๋๋ฆฌ๊ฐ ๋ฌ์ง๋ง ์ฌ๋๋ค์ ํน์ ์คํ์ผ์ ๊ฐ๋ ฅํ๊ฒ ์ ์ํ๋ on error
์ ๊ฐ์ ์ค์ํ ์ธ์ด ๋ณ๊ฒฝ์ ์ฌ๊ฐํ๊ฒ ๊ณ ๋ คํ๊ณ ์๋ค๋ ๊ฒ์ด ์ฌ์ ํ ๋งค์ฐ ๋๋์ต๋๋ค
๊ทํ์ ์๊ฒฌ์ ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด๊ฒ์ ๋ชจ๋ ๋งค์ฐ ํฅ๋ฏธ ๋กญ์ต๋๋ค.
์ด ์ ์์ด ํ ๋ก ํ๊ธฐ์ ์ ํฉํ ์ฅ์์ธ์ง ํ์คํ์ง ์์ง๋ง ์ด ์ค๋ ๋์์ try ํค์๋์ ๋ํ ์์ํ ํ ๋ก ์ด ์ด๋ฏธ ์๊ธฐ ๋๋ฌธ์ ์ง๊ธ์ ์ฃผ์ ๋ก ๊ณ ๋ คํ ๊ฒ์ ๋๋ค. :)
Google ์ง์์ด ๋ด๋ถ Golang ๋ฆฌํฌ์งํ ๋ฆฌ์์ try ํค์๋๋ฅผ ๊ธฐ๊บผ์ด ๊ตฌํํ๊ณ ์ดํ์ ํด๋น ํค์๋๋ฅผ ์ฌ์ฉํ๋๋ก ๊ธฐ์กด Google ์ฝ๋ ๊ธฐ๋ฐ์ ๋ณํํ ์ํฅ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค. ๋ด๋ถ ์ ์ฉ์ผ๋ก ์ ์งํจ์ผ๋ก์จ ์ฝ๊ฒ ๋๋๋ฆด ์ ์์ต๋๋ค(์ฆ, ์ ์ฒด ์ปค๋ฎค๋ํฐ๊ฐ ์๋๋ผ ๋จ์ผ ํ์ฌ์ ๋ถ๋ด์ด ์์).
์ด๋ฅผ ํตํด ์ค์ high-sloc ์ฝ๋ ๊ธฐ๋ฐ์์ ์ด ๊ธฐ๋ฅ์ ๋ํ ์ฝ๊ฐ์ ์ฌ๋ก ์ฐ๊ตฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค. Facebook์ ๊ณผ๊ฑฐ์ PHP ๊ธฐ๋ฅ๊ณผ ์ ์ฌํ ์์ ์ ์ํํ์ฌ ์ปค๋ฎค๋ํฐ์ ์ ์ํ๊ธฐ ์ ์ ํน์ ๊ธฐ๋ฅ์ ๋ฏธ์ธ ์กฐ์ ํ ์ ์์์ต๋๋ค.
try ํค์๋๊ฐ _์ค์ ๋ก ์ฌ์ฉ๋ ๋ฐฉ์๊ณผ ์ค์ ์ํ์์ ์ถ๊ฐ๋ ๊ฐ์น์ ๋ํ ์ฌ๋ก ์ฐ๊ตฌ๋ฅผ ์์ฑํ๋ค๋ฉด ์ค๋๋ ฅ ์๋ ์ฌ๋ก๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. (๊ฐ์์ ์ผ๋ก) ์ค์ ๊ฐ์น๋ฅผ ์ ๊ณตํ์ง ์๋ ๊ฒฝ์ฐ์๋ ์์๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๋ก๋ ๋ฌธ์์์ผ๋ก๋ ์ ๋ง ์ข์ ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ ์ ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๋๋ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
@Freeaqingme ์ฐ๋ฆฌ๋ ์ด๋ฏธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ try
๊ฐ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ๋ณด์ฌ์ฃผ๋ ์์ CL์ ์์ฑํ์ต๋๋ค. https://go-review.googlesource.com/c/go/+/182717 (๊ฑฐ์ง์ด ์์ ์ ์์ต๋๋ค. ๊ธ์ ์ ์ด์ง๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ ๋งค์ฐ ๋๋ญ
๋๋ค). ์ฐ๋ฆฌ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ์๋ฐฉํฅ์ผ๋ก ๋ณํํ ์ ์๋ ๋๊ตฌ๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ๊ณ ์์ต๋๋ค.
๋ํ ์ฝ๋ ๊ธฐ๋ฐ์์ tryhard
๋ฅผ ์ฌ์ฉํ๊ณ ๋ค์ ๋ณด๊ณ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ฐ์ฌ ํด์.
@griesemer ๋ด๊ฐ ๋ช ํํ๊ฒ ๋ฐํ์ง ์์์ ์ ์์ต๋๋ค. Google์ด ๋ด๋ถ์ ์ผ๋ก ์์ฒด Go ๋น๋๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ ์ ์์ ์์์ ๋งํฌํ ํจ์น๋ฅผ ๋ด๋ถ Google ๋น๋์ ์ ์ฉํ ๋ค์ Google ์ฝ๋ ๋ฒ ์ด์ค(stdlib๋ฟ๋ง ์๋๋ผ ํนํ Go๋ก ์์ฑ๋ ๋ด๋ถ ํ๋ก์ ํธ)๋ฅผ ๋ณํํ๋ ๊ฒ์ ๋๋ค. Google ์์ง๋์ด๊ฐ ์ค์ ์ํฉ์์ ๋์ด ๋ฌ ๋์ ์ฌ์ฉํ๋ค๋ฉด ์ค์ ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ์ข์ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
๋ถ๋ช ํ ๋ ์์ ๋ ์ ์ฉํ ์ ์๊ณ ๋ด ์์ ์ ์ฝ๋ ๊ธฐ๋ฐ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ ๋ ๋น๊ต์ ์์ ์ฝ๋ ๊ธฐ๋ฐ์ ๊ฐ์ง ๋จ์ผ ๊ฐ๋ฐ์์ผ ๋ฟ์ด๋ฏ๋ก ๋ง์ Google ์ง์์ด ์ฌ์ฉํ๋ค๋ฉด ๋ํ์ฑ์ด ์์ ๊ฒ์ ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ ์ฌ์ ํ ์ด ๊ธฐ๋ฅ์ ๋ํด ๊ฒฝ๊ณํ๊ณ ์์ต๋๋ค. ํํธ์ผ๋ก๋ ๋งค๋ฒ ๋ช ๋ฒ์ ํค ์ ๋ ฅ์ ์ ์ฝํ ์ ์๋ค๋ ์ฌ์ค์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋๋ก ๋๋ ๊ฒ์ผ๋ฅด๋ฉฐ(๊ฒฐ๊ตญ ์ ๋ ์ธ๊ฐ์ ๋๋ค) ๊ฐ๋ฅํ ํ ๋ง์ try ๋ฌธ์ ์ค์ฒฉํ ์ ์์ต๋๋ค. ์ด์ ์ด ๊ธฐ๋ฅ์ด ์๋ ๊ฒฝ์ฐ ์ข ๋ ํ๋ จ์ ๋ฐ์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ๊ทธ๋ฌ๋ค๊ณ ํด๋ ๋ด ์ฝ๋ ๊ธฐ๋ฐ์ด ์ด ํค์๋๋ก ๊ณ ํต๋ฐ๋ ๋์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด ํค์๋๋ฅผ ๋จ์ฉ/๋จ์ฉํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค(๋๋ฒ๊น ๊ฐ๋ฅ์ฑ, ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ฅ์ฑ ์ธก๋ฉด์์).
@Freeaqingme ์๊ฒ ์ต๋๋ค. ๋ด๋ถ ์ ์ฅ์๋ฅผ ํตํด try
๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๋ณํํ๊ณ ๋ค์ ๋ณํํ ์ ์๋์ง ํ์คํ์ง ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์๋นํ ๋น์ฉ์ด ๋ญ๋๋ค. ๋ํ ๋ด๋ถ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ณด๊ณ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ์คํ์ ๋ํ ์ง๊ณ(ํต๊ณ)๋ก๋ง ๋ณด๊ณ ํ ์ ์์์ต๋๋ค. ๊ทธ๊ฒ์ ์ปค๋ฎค๋ํฐ๊ฐ ์ฐ๋ฆฌ์ ์ฃผ์ฅ์ ์ฝ๊ฒ ํ์ธํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์
๋๋ค. ๋ง์ง๋ง์ผ๋ก Google์ ์ฝ๋ ๊ธฐ๋ฐ์ด ๋ํ์ฑ์ด ์๋ ์ ์์ต๋๋ค.
ํ์ง๋ง ๊ฐ์ฌํฉ๋๋ค.
@griesemer ๋น์ฉ์ด ๋ง์ด ๋๋ ๋ ธ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ ํ์ง ์์ ๊ฒ์ ๋๋ค. ๋จ์ํ ๋ ธ๋ ฅํ ํ๋ก์ ํธ๋ฅผ ์ ์ฉํ๋ ๋ฌธ์ ๋ผ๋ฉด ๋น์ฉ์ด ์ ํ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ๊ทธ๊ฒ์ Google ์ง์(์ ๋ ์๋๋๋ค)์ด ๊ฒฐ์ ํ ๋ฌธ์ ์ ๋๋ค.
๊ฐ๋ณ Google ํ๋ก์ ํธ ๋๋ ๋ด๋ถ ์ธํ๋ผ์ ๋ํด ๋ณด๊ณ ํ ์ ์๋ค๋ ์ ์ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ง๋ ๋ช ๊ฐ์ง ์ผํ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ์ธ์ ์ผ๋ก ํจ์ฌ ๋ ๊ฐ์น ์๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ์ผ๋ถ Google ์ง์์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ณด๊ณ ํ๋ ๊ฒ์ ๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช ํ์ง ์๊ณ "X๋ฅผ ์์ํ์ง๋ง A ๋ฐ BI์ ๊ฐ์ ์ฌ๋ก์ ๋ถ๋ช์ณค์ ๋ Y๊ฐ Y์์ ๋ฐ๊ฒฌํ์ต๋๋ค"์ ๊ฐ์ ์ง์ ์ ๋งค์ฐ ๊ฐ์น๊ฐ ์์์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ์ข ๋ฅ์ ๋ณด๊ณ ์๋ฅผ ํ์ธํ ํ์๊ฐ ์ ํ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก Google์ ์ฝ๋ ๊ธฐ๋ฐ์ด ๋ํ์ฑ์ด ์๋ ์ ์์ต๋๋ค.
๊ทธ๋ด ์๋ ์๊ณ ์๋ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Google์๋ ๋ง์ ์ฌ๋๋ค์ด ๊ทผ๋ฌดํ๊ณ ์์ผ๋ฏ๋ก ๋๋ถ๋ถ์ ์ฝ๋ ๊ธฐ๋ฐ์ ํ ๊ฐ์ธ์ด ์ด๋ป๊ฒ ์์ฑํ๊ธฐ๋ก ๊ฒฐ์ ํ๋์ง ๊ธฐ๋ฐ์ด ์๋๋ผ ๋ค์ํ ๊ธฐ์ฌ์(์ง์)์ ๊ธฐ์ฌ์ ์ ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ์ ์์ ๋๋ ์ฌ๋ฌผ์ด ์ป์ ์ ์๋ ํ ๋ํ์ฑ์ด ์์ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค. ์๋ง๋ 100% ๋ํ ์ฝ๋ ๋ฒ ์ด์ค์ ๊ฐ์ ๊ฒ์ ์์ ๊ฒ์ ๋๋ค.
๋ ๋์ ์๋ฃจ์
์ ์ฐพ์ ๋๊น์ง ๊ทธ๋๋ก ๋์ญ์์ค. try
์(๋) ์ฐ๋ฆฌ๊ฐ ์ฐพ๋ ๊ฒ์ด ์๋๋๋ค. ์ด์ ๋ํด ํธํฅ๋ ์กฐ์น๋ฅผ ์ทจํ ํ์๊ฐ ์์ต๋๋ค. ์๊ฐ์ ๋ด์ด Go Authors๋ก ์ด๋ํ์ธ์. ์ ๋ ๋งค์ผ ์ ์ธ๊ณ์ ๊ณ ํผ๋ค๊ณผ ์ด์ผ๊ธฐํ๋ ํ Go ์ปค๋ฎค๋ํฐ์ ๋๋ค์๊ฐ atm์์ try
์ ์์ ๋ฐ์๋ค์ด์ง ์๋๋ค๊ณ ๊ตณ๊ฒ ๋ฏฟ์ต๋๋ค.
์๋ก์ด ๊ตฌ๋ฌธ์ ๋์
ํ๋ค๋ ๊ฒ์ ๋ชจ๋๊ฐ Go ๋ฒ์ ์ ์
๊ทธ๋ ์ด๋ํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ด ์ํฌํ๋ก๊ฐ go get
ํญ๋ชฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ค์ ๋ช
๋ น์ค์์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ Go 1.10์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค(๋ด GOPATH
๋ ๋ด PATH
). . ์ต๊ทผ์ ๋ชจ๋์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ฌ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ go get
ํ๋ ค๊ณ ํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. .../v2
๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด๊ฒ์ ์ด๋ฏธ ์ฝ๋์ ๋ถํ ์ด ์์์ ์๋ฏธํฉ๋๋ค(Python 2์ 3์ ์๊ฐํด ๋ณด์ธ์). ๋์๊ฒ๋ Go 1.11 ์ด์ ๊ณผ Go 1.11 ์ดํ์ ์ธ๊ณ๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ์ฑ๊ฐ์ ์ผ์ด๋ฉฐ Go์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฟ๋ง ์๋๋ผ ์๋ํ๋ ๊ฒ์ ๋ํ ์๋ก์ด ๊ตฌ๋ฌธ์ ๋์
ํ๋ ๊ฒ์ ์ ํ ์ข์ ์ ์ถฉ์์ด ์๋๋๋ค. ๋ ๋ง์ ์กฐ๊ฐํ๋ฅผ ๋์
ํฉ๋๋ค.
7/4/19์ gonutz [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
์๋ก์ด ๊ตฌ๋ฌธ์ ๋์ ํ๋ค๋ ๊ฒ์ ๋ชจ๋๊ฐ Go๋ฅผ ์ ๊ทธ๋ ์ด๋ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
๋ฒ์ . ๋ด ์ํฌํ๋ก๊ฐ ์ฌ์ค์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ Go 1.10์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
go get
ํญ๋ชฉ์ ๋ง๋ ๋ค์ ๋ช ๋ น์ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค(๋ด
GOPATH
์(๋) ๋ดPATH
์์ต๋๋ค. ์ต๊ทผ์go get
์๋ํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋ชจ๋์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ฌ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ..../v2
์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ด๋ฏธ ์ฝ๋์ ๋ถํ ์ด ์์์ ์๋ฏธํฉ๋๋ค(
ํ์ด์ฌ 2์ 3). ๋์๊ฒ๋ Go 1.11 ์ด์ ๊ณผ Go 1.11 ์ดํ์ ์ธ๊ณ๊ฐ ์์ต๋๋ค.
์ด๊ฒ์ ๋งค์ฐ ์ฑ๊ฐ์๋ฉฐ ์๋ํ๋ ์๋ก์ด ๊ตฌ๋ฌธ์ ๋์ ํฉ๋๋ค.
Go์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ข์ ์ ์ถฉ์ ์ด ์๋๋๋ค. ๊ทธ๊ฒ
๋ ๋ง์ ์กฐ๊ฐํ๋ฅผ ๋์ ํฉ๋๋ค.์กฐ๊ธ์ด๋ผ๋ ์๋ก๊ฐ ๋๋ค๋ฉด ๋ ์ ํํ ๊ฐ์ ์ ์ฅ
๋ชจ๋์ ์ด๋ํฉ๋๋ค. ์นํด์ง ์๊ฐ๊ณผ ๊ธฐํ๋ฅผ ์ฐพ์ง ๋ชปํ๋ค
๊ทธ๋์ ์ ๋ Go1.10์ ๊ณ ์ํ๊ณ ์์ต๋๋ค. ์๋ง ๊ทธ๋์ผ ํ ๊ฑฐ์ผ
๊ฐ์น๊ฐ ์๋ ์ค๋ฌธ์กฐ์ฌ.
๋ฃจ์์ค.
--
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/32825#issuecomment -508372318
--
๋ฃจ์์ค ๋ฐ ๋
2 Piet Retief St
์ผ์คํ
(๋๋ถ ์์ ์ฃผ)
9860 ๋จ์ํ๋ฆฌ์นด ๊ณตํ๊ตญ
์ ํ: +27 58 653 1433
ํด๋์ ํ: +27 83 251 5824
ํฉ์ค: +27 58 653 1435
์ ๋ ์๋ก์ด golang ๊ฐ๋ฐ์์
๋๋ค(์์ง๋ go์ ๋ํด ๋ฐฐ์ฐ๊ณ ์์ต๋๋ค). ํ์ฌ์ ์๋ฌ ํธ๋ค๋ง์ ์๋ฌ๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์์ด์ ์ข์ ๊ฒ ๊ฐ์์. ์๋๋ก์ด๋ ๊ฐ๋ฐ์๋ก์ try-catch
๊ฐ golang์ if err != nil{ }
๋ณด๋ค ์ค๋ฅ๋ฅผ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋ ์ด๋ ต๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ช
์์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ณด๋ค ํญ์ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ถ์ . ๋ด ์ธ์ด์ ๋ํด ์ฃ์กํฉ๋๋ค.
๊ณ ์ฅ๋๊ฒ ์๋๋ค....
@Daniel1984 ๋ฐ์
๋ง๋ถ์ฌ์, try
์ ์์ if err != nil
๋ก๋๋ค. ์๋ฏธ๊ฐ ์๋ ์ถ๊ฐ ์ต์
์ ์ ๊ณตํ ๋ฟ์
๋๋ค.
๋๋ try
๊ฐ ํฌํจ๋์ด์๋ ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. try
:
์ฐฌ์ฑ
throws
์ ๋ฌ๋ฆฌ ๋ง๋ฒ์ด ์ผ์ด๋๋ ๊ณณ์ ๋ถ๋ช
ํฉ๋๋ค.nil
์ํ์ ๋ฐ๋ค๋ฅผ ๋ณผ ๋ ๋์ด ๋ ์ด์ ๋น๋์ง ์์ต๋๋ค.๋ฒ์ฃ์
try
๋ ๊ธฐ์กด ์์
์ ๋ํด ์ค๋ณต ๋ฉ์๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.try
๊ฐ ํ์ฌ ํจ์์์ ๋ฐํ๋๋ ๊ฒ์ ์์์น ๋ชปํ ์ผ์ด๋ฉฐ, ์ผ๋ช
๋ ๋ง์ ๋ง๋ฒ์
๋๋ค.try
์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋ง๋ก ์ค๋ช
ํ๊ธฐ์กฐ์ฐจ ์ด๋ ต์ต๋๋ค.@griesemer ๊ทธ๊ฒ ๋ฐ๋ก ๋ด๊ฐ ์ข์ํ์ง ์๋ ๊ฒ์
๋๋ค. ๋ชจ๋ ๊ฒ์ด ๋จ์ํด์ผ ํฉ๋๋ค. ๋์ผํ ๊ฒ์ ๋ฌ์ฑํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ ์ํด ์ธ์ด์ ๋ณต์ก์ฑ์ ์ถ๊ฐํ๊ณ ์ถ์ง ์์ต๋๋ค. ์ด if err != nil
์ฅํฉํจ์ ํผํ๊ธฐ ์ํ ํจํด์ด ์์ต๋๋ค. https://www.ardanlabs.com/blog/2019/07/an-open-letter-to-the-go-team-about-try.html
Go2 ์ ์ #32437์ ์ธ์ด์ ์๋ก์ด ๊ตฌ๋ฌธ์ ์ถ๊ฐํ์ฌ
if err != nil { return ... }
์์ฉ๊ตฌ๋ฅผ ๋ ๋ฒ๊ฑฐ๋กญ๊ฒ ๋ง๋ญ๋๋ค.๋ค์ํ ๋์ ์ ์์ด ์์ต๋๋ค: #32804์ #32811์ ์๋์ ๊ฒ๊ณผ ๊ฐ์ด ๋ณดํธ์ ์ผ๋ก ์ฌ๋๋ฐ์ง ๋ชปํฉ๋๋ค.
ํผํฉ์ ๋ค๋ฅธ ๋์์ ๋์ง๋ ค๋ฉด: ๊ทธ๋๋ก ์ ์งํ๋ ๊ฒ์ด ์ด๋ป์ต๋๊น?
๋๋
if err != nil
๊ตฌ์กฐ์ ๋ช ์์ ํน์ฑ์ ์ข์ํ๊ฒ ๋์๊ณ , ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ์ด์ ๋ํ ์๋ก์ด ๊ตฌ๋ฌธ์ด ํ์ํ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ ๋ง ๊ทธ๋ ๊ฒ ๋์๊ฐ์?
์์ฃผ ๋ง์ด ์ด๊ฒ. ๋ช ์์ ์ฝ๋๋ ์ฌ๋ฐ๋ฅธ ์ฝ๋์ ๋๋ค. ๋ด๊ฐ ์์ธ ํธ๋ค๋ฌ์์ ๋ณธ ๊ณตํฌ๋ ๊ทธ ๋์ฐํ ์ฝ์ ์ ์๋ ๊ตฌ์กฐ์์ ์์ํ ๋ ๋๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
์ฌ๋๋ค์ด ๋๊ธ๋ง ๋ฌ๊ธฐ ์์ํ๋ฉด์ ์์ฒญ๋ ์ง์ฐ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด์ ์ ์ ํ๋ค๋ ์ธ์์ ๋ฐ์ง ์์ ์ ์์์ต๋๋ค.
๊ทธ๋ค์๊ฒ ๋ด์ค.
๊ทธ๊ฒ๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ํฌ๋๋๋ฌด๋ ๋ถ๋ช
ํ
์๊ฐ๋ณด๋ค ๋น ๋ฆ
๋๋ค.
๋ฃจ์์ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ๋จํ ํธ๋๋ณผ๊ณผ ์ค๋ฅ๊ฐ ์๋ ๋จ์ผ ๋ผ์ธ if ๋ฌธ์ ํ์ฉํ๋๋ก gofmt๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
ํธ์ถ ๊ธฐ๋ฅ. ๊ทธ๊ฒ์ ๋ง์ ํผ๋์ ์ ๊ฑฐํฉ๋๋ค.
๋์ ์:
์ค๋ฅ = myFunction()
์ค๋ฅ != nil {์ธ ๊ฒฝ์ฐ
๋ฐํ ์ค๋ฅ
}
ํ์ฉํ๋ค:
์ค๋ฅ = myFunction()
if err != nil { return err}
๋ง๋ถ์ฌ์, try ์ ์์ if err != nil๋ง ๋จ์ต๋๋ค. ์๋ฏธ๊ฐ ์๋ ์ถ๊ฐ ์ต์ ์ ์ ๊ณตํ ๋ฟ์ ๋๋ค.
์ด ์ ํํ ์ ๋นํ๋ Go๊ฐ ๋ ๋ค๋ฅธ C++, C#, Scala, Kotlin ๋ฑ์ด ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค. "์ํ์ง ์์ผ๋ฉด ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค"๋ ๊ธฐ๋ฅ์ด ๋ถํ๋ ค์ง ์ธ์ด๊ฐ ๋ง๋ค์ด์ง๋ ๋ฐฉ๋ฒ์ ๋๋ค.
ํธ์ง - ์ด๊ฒ์ ์๋ชป๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ ์ ์์ต๋๋ค. ๋๋ try
๊ฐ Go๋ฅผ ๊ธฐ๋ฅ์ด ๋ถํ๋ ค์ง ์ธ์ด๋ก ๋ฐ๊ฟ ๊ฒ์ด๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค. ๋๋ ์ฌ๊ธฐ์ ์ ๋นํ์ ์ฝ๊ฐ์ ๊ฒฐํจ์ด ์๋ค๋ ๊ฒ์ ๋งํ๊ณ ์๋ค
@deanveloper "try"๋ก ์ดํดํ๊ธฐ ์ด๋ ค์ด ์ค๋ฅ ๋์์ ๋ํ ๋ช
ํํ ์๊ฐ ์์ต๋๋ค.
https://github.com/golang/go/issues/32437#issuecomment -498932961
์กฐ๊ธ ๋ฐ๋ณต์ ์ด๊ธด ํด๋ OP์ ๋์ํฉ๋๋ค.
๋ํ ์ ์๋ ๋ชจ๋ ๋์์ ์ธ๋ชจ์๋ ๋ณต์ก์ฑ์ ๋์
ํฉ๋๋ค.
๋ฒ์ ์์ ํ ์ค๋ง ์๋ ๊ฒฝ์ฐ ์ค๊ดํธ๋ฅผ ์๋ตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@gonuts
์ด๊ฒ์ ์ด๋ฏธ ์ฝ๋์ ๋ถํ ์ด ์์์ ์๋ฏธํฉ๋๋ค(Python 2์ 3์ ์๊ฐํด ๋ณด์ธ์). ๋์๊ฒ๋ Go 1.11 ์ด์ ๊ณผ Go 1.11 ์ดํ์ ์ธ๊ณ๊ฐ ์์ต๋๋ค.
์ ๋ ์ค๋ ์๊ฐ Python ํ๋ก๊ทธ๋๋จธ์ด๋ฉฐ Go ๋ชจ๋์ ๋ํด ์ธ๊ธํ "๋ถํ "์ Python 2์์ Python 3์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ์ฌ์์ ๋นํ๋ฉด ์๋ฌด ๊ฒ๋ ์๋๋๋ค.
์ด๊ฒ์ ๋งค์ฐ ์ฑ๊ฐ์ ์ผ์ด๋ฉฐ Go์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฟ๋ง ์๋๋ผ ์๋ํ๋ ๊ฒ์ ๋ํ ์๋ก์ด ๊ตฌ๋ฌธ์ ๋์ ํ๋ ๊ฒ์ ์ ํ ์ข์ ์ ์ถฉ์์ด ์๋๋๋ค. ๋ ๋ง์ ์กฐ๊ฐํ๋ฅผ ๋์ ํฉ๋๋ค.
try
๋ ์ ์์์ ๋ด์ฅ๋ ๊ธฐ๋ฅ์
๋๋ค. ์์ ํ ํ์ ํธํ๋ฉ๋๋ค. ์ฝ๋๊ฐ ์ด๋ฏธ try
๋ฅผ ์๋ณ์๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์๋ณ์๋ try
๋ด์ฅ์ ์๋์ฐํฉ๋๋ค.
@pongsatornw
ํ์ฌ์ ์๋ฌ ํธ๋ค๋ง์ ์๋ฌ๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์์ด์ ์ข์ ๊ฒ ๊ฐ์์. ์๋๋ก์ด๋ ๊ฐ๋ฐ์๋ก์ golang์ if err != nil{ }๋ณด๋ค try-catch๊ฐ ์ค๋ฅ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ ์ด๋ ต๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ช ์์ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ณด๋ค ํญ์ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ์์ ๋ฅผ ์์ ํ ์ฝ์ผ์
จ์ต๋๊น? try
๋ if err != nil { return ..., err }
์ ๋ฐ๋ณต ์ ์ ๊ฑฐํ๋ ๋ฐ ๋์์ด ๋๋ ๋ด์ฅ ํจ์์ผ ๋ฟ์
๋๋ค. Go์์ ์ค๋ฅ ์ฒ๋ฆฌ์ ์ผ๋ฐ์ ์ธ ๋
ผ๋ฆฌ๋ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค. ์ฌ์ ํ ๋ช
์์ ์ด๋ฉฐ ์ค๋ฅ๋ ์ฌ์ ํ ๊ฐ์ด๋ฉฐ try-catch(์์ธ๋ผ๊ณ ๋ ํจ)๊ฐ ์์ต๋๋ค.
@kroppt
try
๋ ๊ธฐ์กด ์์ ์ ๋ํด ์ค๋ณต ๋ฉ์๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
try
๋ ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ์ธ์๋ถํดํฉ๋๋ค. append
์ ๋์ผํฉ๋๋ค. ์ฌ๋ผ์ด์ค์ ์์๋ฅผ ์ถ๊ฐํ ๋๋ง๋ค ์ง์ ์์ฑํ ์ ์์ง๋ง append
๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค.
- ์ค๋ฅ ๊ฒ์ฌ์ ๋ถ์ผ์น๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.
[...:...]
์ฌ์ฉํ์ฌ "์๋์ผ๋ก" ์ฌ๋ผ์ด์ค๋ฅผ ์กฐ์ํ๊ฑฐ๋ ์ํํ๋ ์์
์ ๋ฐ๋ผ append
์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ถ์ผ์น๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ๋ค๋ฅธ ์์
์ ์ํ ๋ค๋ฅธ ๋๊ตฌ์ผ ๋ฟ์
๋๋ค. ๋น๋ฉดํ ์์
์ ๋ฐ๋ผ ์ผ๋ฐ if err != nil { ... }
๋๋ try
์ค๋ฅ์ ๋์ผํฉ๋๋ค.
try
๊ฐ ํ์ฌ ํจ์์์ ๋ฐํ๋๋ ๊ฒ์ ์์์น ๋ชปํ ์ผ์ด๋ฉฐ, ์ผ๋ช ๋ ๋ง์ ๋ง๋ฒ์ ๋๋ค.
์๋กญ๊ธฐ ๋๋ฌธ์ ์์ธ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ์ฉํ ์๋ก ์ต์ํด์ง๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ด ๋ง์ ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์๋์ ์ฌ์์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
- Go ๊ฒฝํ์ด ์๋ ํ๋ก๊ทธ๋๋จธ๋ ์ดํดํ ์ ์์ต๋๋ค.
try
์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋ง๋ก ์ค๋ช ํ๊ธฐ์กฐ์ฐจ ์ด๋ ต์ต๋๋ค.
๋ฐ๋ ๊ฒฝํ์ด ์๋ ํ๋ก๊ทธ๋๋จธ๋ chan
, defer
, 'go ,
iota ,
panic ,
recover ,
์ดํดํ์ง ๋ชปํ ๊ฒ์
๋๋ค ,
,
<- , type assertions, and many other things either without reading the documentation.
try`๋ ์ด๊ฒ์ ๋นํด ์ฝ์ต๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
if err != nil
๋ฅผ ๊ทธ๋๋ก ๋๋๋ก ์์ฒญํ๋ gophers์ ๋ฐ๋ฅด๋ฉด ์๋ง๋ ์ข์ ์ผ์
๋๋ค ;-)
@marcopeerboom
๋ช ์์ ์ฝ๋๋ ์ฌ๋ฐ๋ฅธ ์ฝ๋์ ๋๋ค. ๋ด๊ฐ ์์ธ ํธ๋ค๋ฌ์์ ๋ณธ ๊ณตํฌ๋ ๊ทธ ๋์ฐํ ์ฝ์ ์ ์๋ ๊ตฌ์กฐ์์ ์์ํ ๋ ๋๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
try
๋ ์์ธ ์ฒ๋ฆฌ์ ์ ํ ๊ด๋ จ์ด ์์ต๋๋ค. ์ ์ฒด ์ ์์ ์ฝ์ผ์
จ์ต๋๊น? ์๋ฅผ ๋ค์ด Java ๋๋ Python์์์ ๊ฐ์ด ์์ธ ์ฒ๋ฆฌ์ ๋น๊ตํ ์ ์๋ ๊ฒ์ ์์ต๋๋ค. try
๋ ๋ช
์์ ์
๋๋ค. ํจ์ ์๋ช
์ ์ค๋ฅ๊ฐ ์ธ๊ธ๋์ด์ผ ํฉ๋๋ค. ์ค๋ฅ๋ ํธ์ถ ์ฌ์ดํธ์์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์คํ ํด์ ๊ฐ ์์ต๋๋ค. ๋ฑ.
@gale93
๋ฒ์ ์์ ํ ์ค๋ง ์๋ ๊ฒฝ์ฐ ์ค๊ดํธ๋ฅผ ์๋ตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋๋ถ๋ถ์ ๊ณ ํผ๊ฐ ๊ฐ์ ์๊ฐ์ ํ์ ๊ฑฐ๋ผ ์๊ฐํ๊ณ ์ด์ ํธ๋์ปค์์ ๋น์ทํ ์ ์์ ์ฌ๋ฌ ๋ฒ ์ฝ์์ต๋๋ค. ํ์ง๋ง try
๋ณด๋ค ํจ์ฌ ๋ ํฐ ๋ณํ์
๋๋ค. if
๋ฌธ์ ๋ํด์๋ง ์ด ์์
์ ์ํํ๋ ๊ฒ์ ํฉ๋ฆฌ์ ์ด์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ธ๋ก์ด ํ์ฉ๋๋ ๋ชจ๋ ๊ณณ์์ ์ด๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ๋ธ๋ก์ ์์์ ํ์ํ๋ {
์์ผ๋ฉด ์กฐ๊ฑด์์ ๋์ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํด์ผ ํฉ๋๋ค. ๋ฌธ๋ฒ, ํ์, gofmt ๋ฑ์ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ธ์ด ํ๋ฉด์ด ์์ ํ ๋ณ๊ฒฝ๋ฉ๋๋ค.
@ngrilly
์ค์ฌ์ ์ธ์ด๋ฅผ ๋จ์ํ๊ฒ ์ ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋น์ ์ด ์ฌ์ฉํ ์ฃผ์ฅ ์ค ์ผ๋ถ๋ ์ฌ์์ ๋ํ ๋ง์ ๋ณ๊ฒฝ์ ์ ๋นํํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๊ธ์ ์ ์ธ ์ ๋ง ์๋ ๊ฒ์ ์๋๋๋ค.
๋๋ ๊ทธ ๊ฒฐ์ ์ด ๋์์ด ๋ ์ง, ์์ฒ๊ฐ ๋ ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๊ฐํ๋ ๊ฒ์ด์ง, ๋ฐ๋์ ์ด๋ค ์ฒ ํ์ ์์ ํ ์ํํ ํ์๋ ์๋ค. ์ฌ์์ ์ผ๋ถ ํญ๋ชฉ์ด go
์ด ๋ ํน์ ์์น์ ์๋ฐํ ๊ฒ์ด ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๋ชจ๋ ์กฐ์ ์ ๊ดํ ๊ฒ์
๋๋ค. ์ด ๋ณํ๋ ๋ถ์ ์ ์ธ ์ํฅ์ ๊ฒฌ๋ ๋งํผ ๋์๊ฒ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
์๋ ํ์ธ์ @kroppt ์ ๋๋ค .
์ธ์ด๋ฅผ ๋จ์ํ๊ฒ ์ ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค
๋๋ ๋์ํ๊ณ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ด๊ฒ์ ์ํด ๋ ธ๋ ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๊ทธ ๊ฒฐ์ ์ด ๋์์ด ๋ ์ง, ์์ฒ๊ฐ ๋ ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๊ฐํ๋ ๊ฒ์ด์ง, ๋ฐ๋์ ์ด๋ค ์ฒ ํ์ ์์ ํ ์ํํ ํ์๋ ์๋ค.
์ฐ๋ฆฌ ๋ชจ๋๋ ์ด์ ๊ณผ ๋น์ฉ์ ๊ธฐ์ค์ผ๋ก try
๋ฅผ ํ๊ฐํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋
ผ์๋ ์ด๋ฌํ ํํ๊ณผ ๋น์ฉ์ ๋ํ ์ฌ์ค์ ๊ธฐ๋ฐํ ํฉ์๋ฅผ ์ ์ํ๊ณ ์ฐพ๋ ๊ฒ์ ๊ดํ ๊ฒ์
๋๋ค.
์ฌ์์ ์ผ๋ถ ํญ๋ชฉ์ด go๊ฐ ์ค๋ฆฝ๋ ํน์ ์์น์ ์๋ฐํ๋ ๊ฒ์ด ๋ง์ต๋๋ค.
์ง๋ ๋ช ๋
๋์ ๋๋ Go ํ์ด Go์ ๊ทธ ๋์์ธ์ ๋ํด ์ถํํ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ ์ฝ์์ง๋ง In์ โโ๋น์ ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. try
์ ์์ด ๋ฐ๋์ ๊ธฐ๋ณธ ์์น์ ์๋ฐํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
@ngrilly
https://talks.golang.org/2012/splash.article ์ go
์ฐจ๋ณํํ๋ ๋ช ๊ฐ์ง ๊ฐ๋
, ์ฆ ๋ช
ํ์ฑ๊ณผ ๋จ์์ฑ์ ์ค๋ช
ํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ์ฐ๋ฆฌ ์ค ์ผ๋ถ๊ฐ ์ด ์๋ก์ด ๋ณํ์์ ๋ณด๊ฒ ๋๋ ๊ฐ๋ฑ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ ๊ฐ๋จํ์ง๋ง ๋ ๋ช
ํํฉ๋๋ค. ๋ด๊ฒ๋ ๋จ์ํจ์ ์ด๋์ด ๋ช
๋ฃํจ์ ์์ค๋ณด๋ค ์์ ๊ฒ ๊ฐ๋ค. ์ ๊ฐ ํ๋ ธ์ ์๋ ์๊ณ ์กฐ์ฌ์ค๋ฝ์ต๋๋ค.
@kroppt ์ด ๊ธฐ์ฌ๋ฅผ ์์ญ ๋ฒ ์ฝ์์ต๋๋ค ;-) try๊ฐ ์ฝ๋๋ฅผ ๋๋ ํํ๋ค๋ ์๊ฐ์ ๋์ํ์ง ์์ต๋๋ค. try๋ ์ผ๋ถ ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฅผ ์ธ์๋ถํดํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ด์ฅ ํจ์์ผ ๋ฟ์ ๋๋ค. ์ฐ๋ฆฌ๋ ํ๋ก๊ทธ๋๋จธ๋ก์ ํญ์ ๊ทธ๋ ๊ฒ ํฉ๋๋ค. ๋ฐ๋ณต์ ์ธ ํจํด์ ์๋ณํ๋ฉด ์๋ก์ด ๊ธฐ๋ฅ์์ ์ด๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ชจ๋ ์ฝ๋๊ฐ ์ธ๋ผ์ธ๋ ํ๋์ ๊ธด main() ํจ์๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
@ngrilly
๋น์ ์ด ์ค๋ช
ํ๋ ๊ฒ์ ๋ด "ํ๋ก"์น์
์ ์์ต๋๋ค.
- ํ๋ก๊ทธ๋๋จธ๋ ํค ์ ๋ ฅ ํ์๋ฅผ ์ค์ ๋๋ค.
- ํ๋ก๊ทธ๋๋จธ๋ ๋งคํฌ๋ก๋ก ํ์ฌ ๊ธฐ๋ฅ์์ ๋ณต๊ทํ๊ธฐ ์ํ ์ฝ์นญ์ ๊ฐ์ง ์ ์์ต๋๋ค.
nil
์ํ์ ๋ฐ๋ค๋ฅผ ๋ณผ ๋ ๋์ด ๋ ์ด์ ๋น๋์ง ์์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง, ๋๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋ณดํธ์ ์ผ๋ก ์ ์ฉํ์ง ์์ ๋ ์๋ฆฌ์ ๋ณดํธ์ ์ ์ฉ์ ์ธ๊ธํ๋ ์์ ์ ๋ณด์ง ๋ชปํฉ๋๋ค.
๋๋ ์๋๊ฐ ์ฝ๋๋ฅผ ๋๋ ํํ๋ค๋ ์๊ฐ์ ๋์ํ์ง ์์ต๋๋ค.
๋ณ๊ฒฝ ์ฌํญ์ ์ฝ๋๋ฅผ ๋๋ ํ/์จ๊ธฐ๊ธฐ/๋จ์ํ/ํ์ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ ์ค๋ฅ ๊ฒ์ฌ ๋ธ๋ก์ด ํ์๋ฉ๋๋ค. ๋ฌธ์ ๋ ๊ทธ๊ฒ์ด ์๋ฏธ๋ฅผ ๋ ๋ช ํํ๊ฒ ๋ง๋๋์ง ์ฌ๋ถ์ ๋๋ค.
go
์๋ ๋ช
๋ฃํจ์ ํผ์ํ๊ธฐ ๋ณด๋ค๋ ๊ธฐ์ฌํ๋ ์ง์ ๊น์ง ๋จ์ํจ์ ํ๋ฅญํ ๊ท ํ์ ์ ์งํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๊ทธ๋ค์ด ๊ทธ๊ฒ์ ์ด๋ป๊ฒํ๋์ง ์ค๋ช
ํ ์ ์์ง๋ง ๋ด ์๊ฐ์ try
๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ์ฅํฉํ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํด์ผํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฝ๋๋ ์ปดํจํฐ๋ณด๋ค ์๊ฐ์ด ๋ ๋ง์ด ๋๋ ์ธ๊ฐ์ด ์ฝ๊ณ ์ดํดํ ์ ์์ด์ผ ํ๋ฉฐ _์ดํด_๋ ์ด๋ ต๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๋ถ๋ถ์ ๋๋ค.
go ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ค์ฌ์ฐ๊ธฐ ๊ตฌ์กฐ๊ฐ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋ชจ๋ ์ค๋ฅ ๊ฒ์ฌ๋ ๋ช ์์ ์ ๋๋ค. ๋๋ถ๋ถ์ ์ฒ๋ฆฌ๋์ง ์์ ์ค๋ฅ๋ ๋ช ์์ ์ ๋๋ค. ์ด๊ฒ์ ๋๋ฅผ ์ํด ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
๋ํ if err != nil
์ํ๊ฐ ์ง๋ฃจํด ๋ณด์ผ ์ ์์ง๋ง ์ค์ ๋ก _์
๋ ฅ_ํ ํ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํธ์ง์์๊ฒ๋ง ํ๋ฉด ๋ฉ๋๋ค.
@kroppt
๋ณ๊ฒฝ ์ฌํญ์ ์ฝ๋๋ฅผ ๋๋ ํ/์จ๊ธฐ๊ธฐ/๋จ์ํ/ํ์ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ ์ค๋ฅ ๊ฒ์ฌ ๋ธ๋ก์ด ํ์๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ชจ๋ ํจ์ ํธ์ถ์ ์ด ์ธ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค! strings.HasPrefix("foobar", "foo")
ํธ์ถํ๋ฉด ์ฝ๋๊ฐ ๋๋
ํ๋ฉ๋๊น? l := len("foo"); len("foobar") >= l && s[0:l] == "foo"
์ฐ๊ธฐ์ ์ฝ๊ธฐ๋ฅผ ์ ํธํ์ญ๋๊น?
@rossmcf
๋ชจ๋ ์ค๋ฅ ๊ฒ์ฌ๋ ๋ช ์์ ์ ๋๋ค.
try๋ ์ฌ์ ํ ๋ช ์์ ์ผ๋ก ์ค๋ฅ๋ฅผ ํ์ธํ๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ์๋์ ์ด์ ์ ๋๋ค.
๋ํ err != nil ๊ฒ์ฌ๊ฐ ์ง๋ฃจํด ๋ณด์ผ ์ ์์ง๋ง ์ค์ ๋ก ์ ๋ ฅํ ํ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ์ดํํ๋ ๊ฒ์ ์ง๋ฃจํ์ง ์์ต๋๋ค. ๋์ฒ์ ๋์ผํ 3์ค์ด ์์ ๋ ์ฝ๊ธฐ๊ฐ ์ง๋ฃจํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ฐ๋ณต์ด๋ฉฐ ํ๋ก๊ทธ๋๋จธ์ธ ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ ๊ณ ๋ คํ์ง ์๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. try
์๋ ๋ค๋ฅธ ๋จ์ ์ด ์์ ์ ์์ง๋ง ์ ์๊ฐ์๋ ์ด ๋จ์ ์ด ์๋๋๋ค.
try๋ ์ฌ์ ํ ๋ช ์์ ์ผ๋ก ์ค๋ฅ๋ฅผ ํ์ธํ๊ณ ์์ต๋๋ค.
try
์ถ์ํ์ strings.HasPrefix์ ์ฐจ์ด์ ์try
์์์ ์ผ๋ก ๋ฐํ๋๋ค๋ ๊ฒ์ ๋๋ค.
go ์ฝ๋๋ฅผ ์ฝ์ ๋ ์คํ ํ๋ฆ์ด ๋ค์์ ์ํํ ๋๊น์ง ๋ด ํจ์ ๋ด์์ ์ ์ง๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
- ๋ฐํ ์ ํ์ด ์๋ ํจ์์ ๋ซ๋ ๋๊ดํธ ์ฝ๊ธฐ
return
,panic
ํค์๋ ์ฝ๊ธฐsyscall.Exit(code)
์ฝ๊ธฐ
try
ํ๋ฉด ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์ฝ์ ์ ์์ต๋๋ค. ์ค์ ์๊ฐ์ ์ผ๋ก ์ค์บํ๊ณ "๋ฐํ" ๋ฌธ์ด 0์ธ ๊ฒฝ์ฐ ๋ ์ด์ "์ด ์ค์ด ๋ชจ๋ ์คํ๋๊ฑฐ๋ ํ ๋ธ๋ก์ด ์คํ๋์ง ์๊ฑฐ๋ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋จ"์ ์๋ฏธํ์ง ์์ต๋๋ค.
@ngrilly ์ฐธ๊ณ ๋ก ํ ๊ฒ์๋ฌผ์ 2๋ช
์ด์์๊ฒ ๋ต๊ธ์ if err != nil
์
๋ ฅ์ ๋ฐฉ์งํ๋ ๋จ์ผ ์ด์ ์ ๋ณด์์ต๋๋ค. ์ด๊ฒ์ ๋ฆฌ์์ค ๋ฅผ ๋์ถํ๋ ์๋ก์ด ๋ฐฉ๋ฒ, ๋ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฅ๋ ฅ, ๊ทธ๋ฆฌ๊ณ ์ต์
์ ๊ฒฝ์ฐ try ์ค์ฒฉ์ ํ์ฉ ํ๋ ๊ธฐ๋ฅ์ ๋์
ํ๋ ๋๊ฐ๋ฅผ ์น๋ฌ์ผ
๋๋ ์ ์์๋ค์ด ๋ง๋ ์ฌ์๊ณผ ์ฃผ์ฅ์ด ์คํด์ ์์ง๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ ์ต์
์ ์ฌ๋ก๋ ๋ณด์ฌ์ฃผ์ง ์๊ณ ์ต๊ณ ์ ์ฌ๋ก๋ง ์ ๊ณตํ๊ณ ์์ต๋๋ค. ์์ ๋ถ์ ์ ์ธ ๋จ์ ์ด๋ ์ ์ฌ์ ์ธ ์ํ ์์๋ฅผ ํ๊ฐํ๊ฑฐ๋ ์ธ๊ธํ์ง ์์ต๋๋ค. ์ ์ ๋ฐ ์์ฐ๋ ์ฌ์ฉ์ผ๋ก ์๋์ ๊ตฌํ์ ์ ํํ์ง ์๋ ์ด์ ๋ฅผ ์ ๋นํํ์ง ์์ต๋๋ค. tryhard
๋๊ตฌ๋ ์ด๋ค ์ฌ๋๋ค์๊ฒ ์ฃผ๊ด์ ์ผ๋ก ๋ ๋์ ๋ฏธํ์ ์ ๊ณตํ๋ ๋ณด๋ค ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. trytoohard
๋๊ตฌ๊ฐ ์ํํ ์ ์๋ ๋ชจ๋ ๊ธฐ๋ฅ(์: ๊น๊ฒ ์ค์ฒฉ๋ ์๋)์ ๋ณด์ฌ ์ฃผ๋ ๋๊ตฌ ์์ด ์ง์ . ๋ง์ง๋ง์ผ๋ก ์ด๋ฆ ์์ฒด๋ ํ๋ก๊ทธ๋๋ฐ ์ธ๊ณ์์ ์์ธ๊ฐ ์๋ ์ ๋น์ฟผํฐ์ค์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ ์ค์ฒฉ ๊ฐ๋ฅํ๊ณ ์ค๋ฅ์ ๊ด๋ จ๋๋๋ก ํ์ฉํ๊ณ ๊ด๋ จ ์๋ ๋ณต๊ตฌ ๋ฐ ํจ๋์ ๋ด์ฅ์ผ๋ก ์ธ์ ํ๊ฒ ๋ฐฐ์นํ์ฌ ๋จ์ํ ์ ์๋ฆฌ๋ฅผ ์ฐพ์ง ๋ชปํ๊ฒ ํฉ๋๋ค. ๋๋ Go ์์ฑ์๊ฐ ๋ ๋์ ๊ฒ์ ์๊ฐํด ๋ผ ์ ์๋ ๋ฅ๋ ฅ์ ๋ฏฟ๊ณ ์ ๋ขฐํฉ๋๋ค.
์ฌ๊ธฐ์๋ ๋จ์ผ ๊ฐ์น ์ถ๊ฐ๋ก ์ ๋นํํ๊ธฐ์๋ ๋๋ฌด ๋ง์ ๋น์ฉ์ด ์์ต๋๋ค. ์ง์ง์๋ค์ "๋ ์ด์ if err != nil
๋ฅผ ์
๋ ฅํ ํ์๊ฐ ์์ต๋๋ค." ์ ์ฒด Go ์ปค๋ฎค๋ํฐ์ ๊ฐ์น์
๋๋ค. if err != nil
์ฌ์ฉํ์ฌ ์์ฑ๋ ์ฝ๋๊ฐ 10๋
๊ฐ๊น์ด ๋์์ต๋๋ค. ๋์์ ๊ฐ์ฅ ์ฃผ๋ชฉํ ๋งํ ๊ธฐ์ ๋ฐ์ (docker, k8s, ...) ์ค ์ผ๋ถ๊ฐ ๋ชจ๋ ํฐ ์ฑ๊ณต์ ๊ฑฐ๋์์ต๋๋ค.
if err != nil
๋ซ๋ ๊ฒ์ ๋ด์ฅ์ผ๋ก ์จ๊ธฐ๋ ๋ถ๋ด์ด ์๋์ง๋ง ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ธ์ด ์ฑ๊ณต์ ํต์ฌ ์์๋ก ์ธ์ํด์ผ ํ๋ ๊ฒ์
๋๋ค. ์ง๋จ์ ์ผ๋ก ๋ถ๋ด์ผ๋ก ๋ฐ์๋ค์ธ๋ค ํด๋ ๊ทธ๊ฒ์ ์ ๊ฑฐํ๋ ๊ธฐ์ค์ ๋๊ณ ํํ์ด ์์ด์ผ ํฉ๋๋ค. ์ง๊ธ ์๋์ ๋๋ฌด ๋ง์ ์ธก๋ฉด์ด ํํ์
๋๋ค.
์ด๋ค ๋ฐฉ๋ฒ์ด ๋ ์ฝ๋ค๋ ์๊ฒฌ๋ ์์ง๋ง ์๊ฒฌ๋ ์์ต๋๋ค. ์ฃผ์ด์ง try๋ ๊ฐ๋จํ๊ณ ํ์ฌ์ ๋ช ์์ ๊ฒ์ฌ๋ ๊ฐ๋จํฉ๋๋ค. ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ ๊ฐ๋จํฉ๋๋ค. ๋์๊ฒ ๋ฌธ์ ๋ ์ฃผ์ด์ง ์ฝ๋์ ๋ ์์ ์์ฑ์ ๋ชจ๋์ ์ธ์ง ๋ถํ๋ฅผ ์ฆ๊ฐ์ํจ๋ค๋ ๊ฒ์ ๋๋ค. ์ด์ ๋ ๋ค ์ผ์ ์ํํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํด์ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๊ฐ๋ ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ ๋ฐ/๋๋ ์์ ์ค์ธ ํจํค์ง ๋๋ ํ๋ก์ ํธ์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์์ ์ ์ํํ ์ํ์ ์ ํํด์ผ ํฉ๋๋ค. ์๋๊ฐ ๋ช ์์ ๊ฒ์ฌ๋ฅผ ๋์ฒดํ๋ ๊ฒฝ์ฐ ํ์ฑํ ๋ ๋ค๋ฅธ ๊ฒ์ผ๋ก ์์์ ๋ฐํ์ผ๋ก ์ธํด ์ธ์ง ๋ถํ๊ฐ โโ์ฌ์ ํ ์ฆ๊ฐํฉ๋๋ค.
_์ด ๋ชจ๋ ๊ฒ์ ์ ์ ์ ์ณ๋๊ณ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋๊ฐ์ด ๊ฐ๋จํ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๊ฐํ๋ฉด ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค._ ๋จ์ํจ ์ ๋ ์ด์ ์ฝ์ง ์์ต๋๋ค . ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ผ์ ๋ํ ๋ฌธ์ ์ด์ด์ฃผ๋ ๊ฒ์ ํผํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
์ด์ ๊ฐ์ ๊ฒ์ ์ถ๊ฐํ๋ ๊ธฐ์ค์ ํจ์ฌ ๋ ๋์์ผ ํ๋ฉฐ, ํ์ฅ์ ๋ฐ์ดํฐ๊ฐ ๋ ์ข๋ค๋ ๊ฒ์ ์ฆ๋ช ํ๊ธฐ ์ํด ์ค๋ ๊ธฐ๊ฐ ๋์ ์คํ์ ์ด์ด์ผ ํฉ๋๋ค.
@cstockton
์ฐธ๊ณ ๋ก ํ ๊ฒ์๋ฌผ์ ํ ๋ช ์ด์์ ์ฌ๋์๊ฒ ๋ต์ฅ์ ๋ณด๋ผ ์ ์์ต๋๋ค. ๋ช ์๊ฐ์ 10๊ฐ, ํ ์ง์ ์์ 5๊ฐ ์ฐ์์ผ๋ก ๋ต๊ธ์ ๋ฌ๋ฉด ํ ๋ก ์ ๋ฐ๋ผ๊ฐ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
Ian ์ 7์ผ ์ ์ ์ด ํ ๋ก ์ golang-nuts๋ก ์ฎ๊ธฐ๋ ๊ฒ์ด ๋ฐ๋ก ์ด๋ฌํ ์ด์ ๋ก ์ ์ํ์ต๋๋ค(ํน์ ์๊ฒฌ์ ๋ต์ฅํ ๋ฐฉ๋ฒ ์์, ์ค๋ ๋ฉ ์์). ํ ๋ก ์ด "๊ณต์์ "์ด๋๋ก ํ๊ธฐ ์ํด ๊ธฐ๊ฐ๋ ์ ์์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์์ฒญํ ๊ฒ์ด ์์ต๋๋ค.
@therealplato
try ์ถ์ํ์ strings.HasPrefix์ ์ฐจ์ด์ ์ try๊ฐ ์์์ ์ผ๋ก ๋ฐํํ๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๊ฑด ์ฌ์ค์ด์ผ. ํจ์๋ฅผ ์ฝ๊ณ "์ข ๋ฃ" ์ง์ ์ ์ฐพ์ ๋ ๋ฐํ, ํจ๋, log.Panic, os.Exit, log.Fatal ๋ฑ์ ์ฐพ๊ณ ์๋ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๊น? ํจ์์ ์ข ๋ฃ์ ์๋ ๋์ผํ๊ฒ ์ ์ง๋๋ฉฐ ์๋ ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ช ์์ ์ผ๋ก ํ์๋ฉ๋๋ค.
ํค์๋ return, ํจ๋ ์ฝ๊ธฐ
ํจ๋์ ํค์๋๊ฐ ์๋๋๋ค. ๋ด์ฅ ํจ์์ ๋๋ค. ์ฐ๋ฆฌ ์ค ๋๊ตฌ๋ณด๋ค ์ธ์ด ๋์์ธ์ ๋ ๋ฅ์ํ ๋ฐ๋ ํ์ ์ ์์ ๋นํํ๋ ค๋ฉด ์ ์ด๋ ์ ๋๋ก ์ ์ํ๋ ์ชฝ์ ๊ทธ๋ค์๊ฒ ํธ์๋ฅผ ๋ฒ ํ์ด์ผ ํฉ๋๋ค. ๐
ํจ์๋ฅผ ์ฝ๊ณ "์ข ๋ฃ" ์ง์ ์ ์ฐพ์ ๋ ๋ฐํ, ํจ๋, log.Panic, os.Exit, log.Fatal ๋ฑ์ ์ฐพ๊ณ ์๋ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
try
ํํ์์ด ๋ํ๋ ์ ์๋ ๋ชจ๋ ์์น์ ๋ฌธ์ ๊ทธ๋๋ก ๋ํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์
๋๋ค. Go์ ๋ชจ๋ ๋จ์ผ ์ข
๋ฃ์ ์ _only_ ๋จ์ผ ๋ช
๋ น๋ฌธ์ผ๋ก ๋ฐ์ํ ์ ์์ต๋๋ค. try
๋ ํํ์์ผ๋ก ๋ํ๋ ์ ์๋ ์ ์ผํ ๊ฒ์
๋๋ค.
@ngrilly
Ian์ 7์ผ ์ ์ ์ด ํ ๋ก ์ golang-nuts๋ก ์ฎ๊ธฐ๋ ๊ฒ์ด ๋ฐ๋ก ์ด๋ฌํ ์ด์ ๋ก ์ ์ํ์ต๋๋ค(ํน์ ์๊ฒฌ์ ๋ตํ ๋ฐฉ๋ฒ ์์, ์ค๋ ๋ฉ ์์). ํ ๋ก ์ด "๊ณต์"์ด ๋๋๋ก ํ๊ธฐ ์ํด ๊ธฐ๊ฐ๋ ์ ์์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์์ฒญํ ๊ฒ์ด ์์ต๋๋ค.
์์ ๋ฉ์์ง
@ user1
๋ต์ฅ 1
@ user2
๋ต์ฅ 2
์ข ๋ฃ ๋ฉ์์ง
์ด๊ฒ์ด ์๋ฏธํ๋ ๋ฐ์์ต๋๋ค.
@cstockton
if err != nil ์ ๋ ฅ์ ๋ฐฉ์งํ๋ ๋จ์ผ ์ด์ ์ ๋ณด์์ต๋๋ค.
try
๋ if err != nil
๋ฟ๋ง ์๋๋ผ if err != nil { return ..., err }
(3์ค ํ์) ์ ๋ฐ๋ณต์ ์ธ ํ์ดํ ๊ณผ ์ฝ๊ธฐ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
์ด๊ฒ์ ๋ฆฌ์์ค๋ฅผ ๋์ถํ๋ ์๋ก์ด ๋ฐฉ๋ฒ, ๋ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ๋ฅ๋ ฅ, ๊ทธ๋ฆฌ๊ณ ์ต์ ์ ๊ฒฝ์ฐ try ์ค์ฒฉ์ ํ์ฉํ๋ ๊ธฐ๋ฅ์ ๋์ ํ๋ ๋๊ฐ๋ฅผ ์น๋ฅด๊ฒ ๋ฉ๋๋ค.
์ธ๊ธํ ๋ฆฌ์์ค ๋์ถ ์ํ์ vet
๋ฐ lint
๋ก ๋ฐฉ์งํ ์ ์์ต๋๋ค.
"๋ ๊ฐ๊ฒฐํ ์ฝ๋"์ ๋ํด try
์์ ์ ๋ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ฏ๋ก ๊ทํ์ ์ฃผ์ฅ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
๊ณผ๋ํ ํจ์ ํธ์ถ ์ค์ฒฉ์ ์ํ์ try
์๋ง ๊ตญํ๋์ง ์์ต๋๋ค. ๋ชจ๋ ํจ์ ํธ์ถ์ ์ง๋์น๊ฒ ์ค์ฒฉ๋ ์ ์์ต๋๋ค. ํญ์ ๊ทธ๋ ๋ฏ์ด ์ฝ๋ ๋ฆฌ๋ทฐ์ ๋ฆฐํธ๊ฐ ๋์์ด ๋ ๊ฒ์
๋๋ค.
๋๋ ์ ์์๋ค์ด ๋ง๋ ์ฌ์๊ณผ ์ฃผ์ฅ์ด ์คํด์ ์์ง๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ ์ต์ ์ ์ฌ๋ก๋ ๋ณด์ฌ์ฃผ์ง ์๊ณ ์ต๊ณ ์ ์ฌ๋ก๋ง ์ ๊ณตํ๊ณ ์์ต๋๋ค.
์๋ง๋ ์ด ๊ฐ์ ์ ์ํธ ์์ฉํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ฌ๋์ค๋ฌ์ด ๊ณ ํผ์ ๋๋ค. ๊ฐ์นํ๋จ์ ๋น ์ง์ง ๋ง์ ;-)
์ง์ง์๋ค์ ๋ต๋ณ์์ ์ญ๋ฅํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค. "๋ ์ด์ err != nil์ ์ ๋ ฅํ ํ์๊ฐ ์์ต๋๋ค."
๋ค์ ๋งํ์ง๋ง ๋ ์ด์ l := len("foo"); len("foobar") >= l && s[0:l] == "foo"
๋ฅผ ์
๋ ฅํ ํ์๊ฐ ์์ต๋๋ค.
๋์ strings.HasPrefix("foobar", "foo")
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
try
์ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ์?
์ด์ ์ check
๋ผ๋ "์ ํ๋" try
์ ์๋ฝํ๊ณ ์ค์ฒฉ์ ๊ธ์งํ๋ค๋ ๋ด์ฉ์ ์ฝ์์ต๋๋ค.
if err != nil - ๊ฐ์ฅ ์ฃผ๋ชฉํ ๋งํ ๊ธฐ์ ๋ฐ์ (docker, k8s, ...) ์ค ์ผ๋ถ๊ฐ ๋์์ ํฐ ์ฑ๊ณต์ ๊ฑฐ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ ์ฝ๋๊ฐ 10๋ ์ ์ด๋ฅด๋ ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ํ C, C++, Java ๋ฑ์ผ๋ก ์์ฑ๋ ํ๋ฅญํ ์ฝ๋๋ฅผ ๋ง์ด ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์ถ๋ก ์ผ๋ก๋ Go๊ฐ ์์ ๊ฒ์ ๋๋ค.
Go์์ ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ํ ๋ก ์ ์ฝ์ ๋ try
์ ์์ ๋ํด ๋ชจ๋ ์ฌ๋์ด ๊ฐ์ ํ์ด์ง์ ์๋ค๊ณ ์๊ฐํ์ง ์์๊ธฐ ๋๋ฌธ์ try
๊ฐ ์ด๋ป๊ฒ ํ ์ ์๋์ง ๋ณด์ฌ์ฃผ๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ฑํ๊ธฐ๋ก ํ์ต๋๋ค. ์ฌ์ฉ: https://faiface.github.io/post/how-to-use-try/
Reddit ๊ด๋ จ ํ ๋ก : https://www.reddit.com/r/golang/comments/c9eo3g/how_to_use_try_faiface_blog/
์ด ๋ฌธ์ ๊ฐ try
์ ๋ํ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋ด ๊ฒ์๋ฌผ์ด ์๋ก์ด ๊ด์ ์ ์ ์ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. :)
Go๋ ๋จ์ํ๋ค๋ ์๊ฐ์ ๋ํด ๋ง์ ์ ์ด ๊ฑฐ๋ ๋ ผ๋ฆฌ์ ์ธ ๊ฒ ์ฌ์ด์์ ๋งํ ๊ณ ๊ตฐ๋ถํฌํ๊ณ ์์ต๋๋ค.
์ฅ์ :
๋จ์ :
if != nil
๋ก ๋
๋จ์ ์ด๋ฉฐ ์ค์ฉ์ ์ด์ง๋ง try
์ฌ์ฉํ ์ ์์ต๋๋ค.๋๋์ด ์ปค๋ฎค๋ํฐ esp์ฒ๋ผ ๋๋๋๋ค. ์ฌ๊ธฐ์์ Go Survey [1] ์์ ํฌํํ ์ฌ๋๋ค๊ณผ ๋ค๋ฆ
๋๋ค.
์ ๊ถ์๋ค์ ์ด๊ฒ์ ์ฃผ์ ๊ด์ฌ์ฌ๋ก ์ ํํ์ง ์๊ณ ํฅํ ๊ณ ๋ ค ์ฌํญ์ ์ํด ๋จ๊ฒจ๋ ์ ์์ต๋๋ค.
ํ์ง๋ง ๋ฐฐ์น๋ก ์ธํด ์ํฅ์ ๋ฏธ์น ๊ฒ์ผ๋ก ์ฌ๊ฒจ์ก๋ค.
IMO, ์ธ์ด ๊ธฐ๋ฅ ์ถ๊ฐ๋ ์ค๋๋์๊ณ ํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ Emmet ๋๋ ์ธ์ด ์ค๋ํซ, ์ฝ๋ ์ ๊ธฐ ๋ฐ ์์ ์ง์ , ๋ฆฌํฉํ ๋ง ๋ฐ ํ์ ์ง์ , ๋๋ฒ๊น
๋ฐ ํ
์คํธ, ์ค๋ฅ์ ๋ํ ์๋ฃจ์
์ ์ ๋ฐ godoc ๋๋ ์คํ ์ค๋ฒํ๋ก ์ธ์ฉ๊ณผ ๊ฐ์ ํธ์ง๊ธฐ์ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. , ์์ค ์ฝ๋ ์์ UI๋ฅผ ํ์ํ๊ณ ์์ค ์ฝ๋๋ฅผ ์ฅํฉํ๊ฒ ๋ก๋๋ค.
์ฝ๋ if err != nil
๋ฅผ try
๋ก ์ ์ต๋๋ค.
@ngrilly
try ๋ if err != nil ๋ฟ๋ง ์๋๋ผ if err != nil { return ..., err }(3์ค๋ก ํ์ํ๋จ)์ ๋ฐ๋ณต์ ์ธ ํ์ดํ๊ณผ ์ฝ๊ธฐ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
"๊ทธ๊ฒ์ ๋น์ ์ด err != nil์ด๋ผ๋ฉด ํ์ดํํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค"๋ผ๋ ๋ง์ ๋ด๊ฐ ์ฐ๋ฆฌ๊ฐ ์ ๋ ฅํ๋ ์ฝ๋๋ ์ฝ๋๋ค๋ ๊ฒ์ ์์ ํ ์์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค๊ณ ๋ฏฟ์ต๋๊น?
๋น์ ์ด ์ธ๊ธํ ์์ ๋์ถ์ ์ํ์ ์์์ฌ์ ๋ณดํธ๋ผ๊ธฐ๋ก ์๋ฐฉํ ์ ์์ต๋๋ค.
๋๋ ์ ์์์ฌ์ ๋ณดํธ๋ผ๊ธฐ๊ฐ ํฉ๋ฆฌ์ ์ธ ์ ํ์ด ์๋๋ผ๊ณ ์๊ฐํ๋์ง ํ ๋ก ์ ์ฐ๊ฒฐํ์ต๋๋ค.
"๋ ๊ฐ๊ฒฐํ ์ฝ๋"์ ๋ํด ์๋์ ์์ ์ ๋ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ฏ๋ก ๊ทํ์ ์ฃผ์ฅ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
์, " ๋ ๊ฐ๊ฒฐํ ์ฝ๋ ๋ฅผ
๊ณผ๋ํ ํจ์ ํธ์ถ ์ค์ฒฉ์ ์ํ์ ์๋์๋ง ๊ตญํ๋์ง ์์ต๋๋ค. ๋ชจ๋ ํจ์ ํธ์ถ์ ์ง๋์น๊ฒ ์ค์ฒฉ๋ ์ ์์ต๋๋ค. ํญ์ ๊ทธ๋ ๋ฏ์ด ์ฝ๋ ๋ฆฌ๋ทฐ์ ๋ฆฐํธ๊ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
ํฅ๋ฏธ๋กญ๊ฒ๋ ์ด๊ฒ์ ์ค์ ๋ก ๋ถํดํด ๋ณด๊ฒ ์ต๋๋ค.
1) ๊ณผ๋ํ ํจ์ ํธ์ถ ์ค์ฒฉ์ ์ํ์ ์๋์๋ง ๊ตญํ๋์ง ์์ต๋๋ค.
์, ์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋๋ค์ ๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํฉ๋๋ค.
2) ๋ชจ๋ ํจ์ ํธ์ถ์ ์ง๋์น๊ฒ ์ค์ฒฉ๋ ์ ์์ต๋๋ค.
์, ์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋๋ค์ ๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํฉ๋๋ค.
3) ํญ์ ๊ทธ๋ ๋ฏ์ด ์ฝ๋ ๋ฆฌ๋ทฐ์ ๋ฆฐํ ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์, ๋น์ ์ ์ด๋ฏธ lint ์ธ์๋ฅผ ๋ง๋ค์๊ณ "์ฝ๋ ๋ฆฌ๋ทฐ ์ธ์"๋ ๋ด๊ฐ ๋น์ ์๊ฒ ๋งํฌํ ๊ฒ์๋ฌผ์์ ๋ง๋ค์ด์ง ๋ ๋ค๋ฅธ ์ธ๋ถ ์ธ์ด ์ ์ด์ ๋๋ค.
์๋ง๋ ์ด ๊ฐ์ ์ ์ํธ ์์ฉํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ฌ๋์ค๋ฌ์ด ๊ณ ํผ์ ๋๋ค. ๊ฐ์นํ๋จ์ ๋น ์ง์ง ๋ง์ ;-)
์ดํด๊ฐ ์ ๋ผ์? ์ ์์์๋ ๊ตฌํ์ด ์ ๊ณตํ๋ ์ ์ฒด ๊ธฐ๋ฅ์ ์๊ฐ ์์ผ๋ฉฐ ์๋๋ ์ฉ๋๋ง ์์ต๋๋ค. ์ ์์ ์ํฅ์ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ tryhard
๋๊ตฌ๋ ๊ฐ์ฅ ์ ํ์ ์ด๊ณ ํฉ๋ฆฌ์ ์ธ ํ์์ผ๋ก try
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๊ฒ์ ๋จ์ํ ์ฌ์ค์
๋๋ค.
๋ค์ ๋งํ์ง๋ง ๋ ์ด์ l := len("foo"); len("foobar") >= l && s[0:l] == "foo".
๋์ string.HasPrefix("foobar", "foo")๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋์ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ์?
๋๋ ๊ฐ๊ฐ์ ๋ฐ๋ ๊ฒฌํด์์ ์ ์ฅ์ ์ถ์ถํ๊ธฐ ์ํด ์ต์ ์ ๋คํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ๊ฒ์ ํด์ฒดํ๊ธฐ ์ํ ๋ ผ๊ฑฐ๋ฅผ ํ์ฑํ ์ ์์ต๋๋ค. ์ ๋ง ์ฌ๊ธฐ์์ ๋ณผ ์ ์์ต๋๋ค, ์ฃ์กํฉ๋๋ค. ๋๋ ์ด๊ฒ์ ๋ด๊ฐ ์ดํดํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ผ๋ก ํด์ํ ๊ฒ์ ๋๋ค. ๋ฌธ์ ๊ทธ๋๋ก.
try
์ (strings.HasPrefix
) ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ์?
ํจ์ HasPrefix
func HasPrefix(s, ์ ๋์ฌ ๋ฌธ์์ด) bool
HasPrefix๋ ๋ฌธ์์ด s๊ฐ ์ ๋์ฌ๋ก ์์ํ๋์ง ํ ์คํธํฉ๋๋ค.
func
try
๋ try with signature(์์ฌ ์ฝ๋)๋ผ๋ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ์ ์ฌํ ๋ด์ฅ์ ๋๋ค.func try(expr) (T1, T2, โฆ Tn)
์ฌ๊ธฐ์ expr์ T1, T2, ... Tn ์ ํ์ n+1 ๊ฒฐ๊ณผ ๊ฐ๊ณผ ๋ง์ง๋ง ๊ฐ์ ๋ํ ์ค๋ฅ๋ฅผ ์์ฑํ๋ ๋ค์ด์ค๋ ์ธ์ ํํ์(์ผ๋ฐ์ ์ผ๋ก ํจ์ ํธ์ถ)์ ๋ํ๋ ๋๋ค. expr์ด ๋จ์ผ ๊ฐ์ผ๋ก ํ๊ฐ๋๋ฉด(n์ 0) ํด๋น ๊ฐ์ ์ค๋ฅ ์ ํ์ด์ด์ผ ํ๋ฉฐ try๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค. ์ค๋ฅ ์ ํ์ ๋ง์ง๋ง ๊ฐ์ ์์ฑํ์ง ์๋ ํํ์์ผ๋ก try๋ฅผ ํธ์ถํ๋ฉด ์ปดํ์ผ ์๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
try ๋ด์ฅ ๊ธฐ๋ฅ์ ๋ง์ง๋ง ๊ฒฐ๊ณผ๊ฐ ์ค๋ฅ ์ ํ์ธ ๊ฒฝ์ฐ ํ๋ ์ด์์ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ํจ์ ๋ด์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ปจํ ์คํธ์์ try๋ฅผ ํธ์ถํ๋ฉด ์ปดํ์ผ ์๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
(์์ฌ ์ฝ๋)์์์ ๊ฐ์ด f() ํจ์ ํธ์ถ๋ก try ํธ์ถ
x1, x2, โฆ xn = try(f()) turns into the following (in-lined) code: t1, โฆ tn, te := f() // t1, โฆ tn, te are local (invisible) temporaries if te != nil { err = te // assign te to the error result parameter return // return from enclosing function } x1, โฆ xn = t1, โฆ tn // assignment only if there was no error
์ฆ, "expr"์ ์ํด ์์ฑ๋ ์ค๋ฅ ์ ํ์ ๋ง์ง๋ง ๊ฐ์ด nil์ธ ๊ฒฝ์ฐ try๋ ๋ง์ง๋ง nil ์ค๋ฅ๊ฐ ์ ๊ฑฐ๋ ์ฒ์ n๊ฐ์ ๊ฐ์ ๋ฐํํฉ๋๋ค. "expr"์ ์ํด ์์ฑ๋ ๋ง์ง๋ง ๊ฐ์ด nil์ด ์๋ ๊ฒฝ์ฐ, ๋ฐ๊นฅ์ชฝ ํจ์์ ์ค๋ฅ ๊ฒฐ๊ณผ ๋ณ์(์์ ์์ฌ ์ฝ๋์์๋ err๋ผ๊ณ ํ์ง๋ง ๋ค๋ฅธ ์ด๋ฆ์ ๊ฐ์ง ์ ์๊ฑฐ๋ ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ์ ์์)๋ nil์ด ์๋ ์ค๋ฅ ๊ฐ์ผ๋ก ์ค์ ๋๊ณ ๋๋ฌ์ธ๋ ํจ์๊ฐ ๋ฐํ๋ฉ๋๋ค. ๋๋ฌ์ธ๋ ํจ์๊ฐ ๋ค๋ฅธ ๋ช ๋ช ๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ํด๋น ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ ์ด๋ค ๊ฐ์ด๋ ์ ์งํฉ๋๋ค. ํจ์๊ฐ ๋ค๋ฅธ ์ด๋ฆ ์๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ํด๋นํ๋ 0 ๊ฐ์ ๊ฐ์ ํฉ๋๋ค(์ด๋ฏธ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ ์ ์งํ๋ ๊ฒ๊ณผ ๋์ผ).
์ด ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ค์ค ํ ๋น์์ try๊ฐ ์ฌ์ฉ๋๊ณ nil์ด ์๋ ์ค๋ฅ๊ฐ ๊ฐ์ง๋๋ฉด ํ ๋น(์ฌ์ฉ์ ์ ์ ๋ณ์์ ๋ํ)์ด ์คํ๋์ง ์๊ณ ์ผ์ชฝ์ ์๋ ๋ณ์๊ฐ ์์ต๋๋ค. ํ ๋น์ด ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ฆ, try๋ ํจ์ ํธ์ถ์ฒ๋ผ ์๋ํฉ๋๋ค. ๊ฒฐ๊ณผ๋ try๊ฐ ์ค์ ํธ์ถ ์ฌ์ดํธ๋ก ๋ฐํ๋๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค(๋๋ฌ์ธ๋ ํจ์์์ ๋ฐํํ๋ ๊ฒ๊ณผ ๋ฐ๋). ๊ฒฐ๊ณผ์ ์ผ๋ก ์ผ์ชฝ์ ์๋ ๋ณ์์ ์ด๋ฆ์ด ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ธ ๊ฒฝ์ฐ try๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋๋ ๋ณผ ์ ์๋ ์ผ๋ฐ์ ์ธ ์ฝ๋์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, a, b ๋ฐ err์ด ๋ชจ๋ ๋๋ฌ์ธ๋ ํจ์์ ๋ช ๋ช ๋ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์์ธ ๊ฒฝ์ฐ ์ด ์ฝ๋๋
a, b, err = f() if err != nil { return }
f()๊ฐ ์ค๋ฅ๋ฅผ ๋ฐํํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ํญ์, b ๋ฐ err์ ์ค์ ํฉ๋๋ค. ๋์กฐ์ ์ผ๋ก
a, b = try(f())
์ค๋ฅ์ ๊ฒฝ์ฐ ๋ฐ b๋ ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ๋ก๋๋ค. ์ด๊ฒ์ ๋ฏธ๋ฌํ ์ฐจ์ด์ง๋ง, ์ฐ๋ฆฌ๋ ์ด์ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ๋ค๊ณ ๋ฏฟ์ต๋๋ค. ํ์ฌ ๋์์ด ์์๋๋ ๊ฒฝ์ฐ if ๋ฌธ์ ์ ์งํฉ๋๋ค.
try ์ค๋ช ์ ์๋ ์ ์ฒด ํ ์คํธ๊ฐ string.HasPrefix์ ์กด์ฌํ์ง ์๋๋ค๋ ์ ์์ ๋ค๋ฆ ๋๋ค. ๋ ๋์ ์ง๋ฌธ์ ์ ์ฌ์ฑ์ด ์ด๋ป๊ฒ ๋๋์ง์ ๋๋ค. ๋ ์ฌ๋ ๋ชจ๋ ํตํ์ ์ผ๋ถ ์ธก๋ฉด์ ๊ณต์ ํ๊ณ ๋ค๋ฅธ ๊ฒ์ ๊ณต์ ํ์ง ์๋๋ค๊ณ ๋ตํ๊ฒ ์ต๋๋ค.
๋๋ ๋น์ ์ด ๊ฒ์ฌ๋ผ๋ ์ด๋ฆ์ด ๋ถ๊ณ ์ค์ฒฉ์ ๊ธ์งํ๋ "์ ํ๋" ์๋๋ฅผ ์๋ฝํ ๊ฒ์ด๋ผ๊ณ ์ด์ ์ ์ฝ์์ต๋๋ค.
try์ ๋ํ ์ ํต์ฌ ์ฃผ์ฅ์ ์ฝ์ด์ฃผ์ ์ ๊ธฐ์ฉ๋๋ค. ๊ตฌํ์ด ์ถฉ๋ถํ ์ ํ์ ์ด์ง ์์ต๋๋ค. ๊ตฌํ์ด ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ๋ชจ๋ ์ ์ ์ฌ์ฉ ์์ ์ผ์นํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
__๋๋_ ์ ์์์๋ ๊ตฌํ๊ณผ ์ผ์นํ๋ ์์ ๊ฐ ํฌํจ๋์ด์ผ ํ๋ฏ๋ก ์ด๋ฅผ ๊ณ ๋ คํ๋ ๋ชจ๋ ์ฌ๋๋ค์ด Go ์ฝ๋์ ๋ถ๊ฐํผํ๊ฒ ํ์๋๋ ๋ด์ฉ์ ๋ ธ์ถ๋ ์ ์์ต๋๋ค. ๋ชจ๋ ์ธ์ด/ํ๊ฒฝ์์ ๋ฐ์ํ๋ ์ด์์ ์ผ๋ก ์์ฑ๋์ง ์์ ์ํํธ์จ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ์ง๋ฉดํ ์ ์๋ ๋ชจ๋ ์ฝ๋ ์ผ์ด์ค์ ํจ๊ป. ์ฌ๋ฌ ์ค์ฒฉ ์์ค์์ ์คํ ์ถ์ ์ด ์ด๋ป๊ฒ ๋ณด์ผ์ง์ ๊ฐ์ ์ง๋ฌธ์ ๋ตํด์ผ ํฉ๋๋ค. ์ค๋ฅ ์์น๋ฅผ ์ฝ๊ฒ ์ธ์ํ ์ ์์ต๋๊น? ๋ฉ์๋ ๊ฐ, ์ต๋ช ํจ์ ๋ฆฌํฐ๋ด์ ์ด๋ป์ต๋๊น? fn() ํธ์ถ์ด ํฌํจ๋ ์ค์ด ์คํจํ๋ฉด ์๋์์ ์์ฑํ๋ ์คํ ์ถ์ ์ ํ์ ๋ฌด์์ ๋๊น?
fn := func(n int) (int, error) { ... }
return try(func() (int, error) {
mu.Lock()
defer mu.Unlock()
return try(try(fn(111111)) + try(fn(101010)) + try(func() (int, error) {
// yea...
})(2))
}(try(fn(1)))
๋๋ ํฉ๋ฆฌ์ ์ธ ์ฝ๋๊ฐ ๋ง์ด ์์ฑ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ ์๊ณ ์์ง๋ง, ์ง๊ธ ์ฐ๋ฆฌ๋ ์ด์ ์ ์กด์ฌํ์ง ์์๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ๋ฐ๋ก ๋ช ํํ ์ ์ด ํ๋ฆ ์์ด ์ ์ฌ์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. ๊ทธ๋์ ์ ๋ ์ฐ๋ฆฌ๊ฐ ์ฒ์์ ๊ทธ๊ฒ์ ํ์ฉํ๋ ์ด์ ๋ฅผ ์ ๋นํํ๊ณ ์ถ์ต๋๋ค. ์ ๋ ์ด๋ฐ ์ข ๋ฅ์ ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๋ ๋ฐ ์๊ฐ์ ๋ญ๋นํ๊ณ ์ถ์ง ์์ต๋๋ค. ๋ด๊ฐ ํ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ธฐ ๋๋ฌธ์ ๊ฒฝํ์ ํตํด ๋๊ตฐ๊ฐ๊ฐ ํ์ฉํ๋ฉด ๊ทธ๋ ๊ฒ ํ ๊ฒ์ด๋ผ๊ณ ๋ฐฐ์ ์ต๋๋ค. ๋๊ตฐ๊ฐ๋ ์ข ์ข ๋์๊ฒ ์ ๋ณด๊ฐ ์์ต๋๋ค.
Go๋ ์ฐ๋ฆฌ๊ฐ ๋์ผํ ํ๋ฒํ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋๋ก ์ ํํจ์ผ๋ก์จ ๋ค๋ฅธ ๊ฐ๋ฐ์์ ๋ด๊ฐ ์๋ก ์๊ฐ์ ๋ญ๋นํ ์ ์๋ ์ต์ํ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์๋์ ์ธ ํํ ์์ด ๊ทธ๊ฒ์ ์๊ณ ์ถ์ง ์์ต๋๋ค. ๋๋ "try๊ฐ ํจ์๋ก ๊ตฌํ๋๊ธฐ ๋๋ฌธ์" ์๋์ ์ธ ์ด์ ์ด ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ ์ด์ ๋ฅผ ์๋ ค์ฃผ์ค ์ ์๋์?
์ด ์ค๋ฅ ์ฒ๋ฆฌ ๋ฌธ์ ์ ์๊ฐ์ ๋ญ๋นํ์ง ๋ง์ญ์์ค. ์ ๋ค๋ฆญ์ ์ ๊ณตํ๋ฉด Rust์ ๊ฒฐ๊ณผ์ ๊ฐ์ ๊ฒ์ ์์ฑํ ๊ฒ์ ๋๋ค.
Go๋ ๋จ์ํ๋ค๋ ์๊ฐ์ ๋ํด ๋ง์ ์ ์ด ๊ฑฐ๋ ๋ ผ๋ฆฌ์ ์ธ ๊ฒ ์ฌ์ด์์ ๋งํ ๊ณ ๊ตฐ๋ถํฌํ๊ณ ์์ต๋๋ค.
์ฅ์ :
- ์์ฉ๊ตฌ ์ค์ด๊ธฐ
- ๋จ์ํ
- ๋ค๋ฅธ ์ธ์ด ์ค ๊ธฐ์กด ํจํด
- ์ ํ ๊ณผ๋ชฉ
๋จ์ :
- ํ์ต ๊ณก์
- ๊ธฐ๋ณธ ๋ง๋ฒ
- ์๋ก์ด ์ข ๋ฅ์ ๋ฒ๊ทธ
- Go๋
if != nil
๋ก ๋ ๋จ์ ์ด๋ฉฐ ์ค์ฉ์ ์ด์ง๋งtry
์ฌ์ฉํ ์ ์์ต๋๋ค.๋๋์ด ์ปค๋ฎค๋ํฐ esp์ฒ๋ผ ๋๋๋๋ค. ์ฌ๊ธฐ์์ Go Survey [1] ์์ ํฌํํ ์ฌ๋๋ค๊ณผ ๋ค๋ฆ ๋๋ค.
์ ๊ถ์๋ค์ ์ด๊ฒ์ ์ฃผ์ ๊ด์ฌ์ฌ๋ก ์ ํํ์ง ์๊ณ ํฅํ ๊ณ ๋ ค ์ฌํญ์ ์ํด ๋จ๊ฒจ๋ ์ ์์ต๋๋ค.
ํ์ง๋ง ๋ฐฐ์น๋ก ์ธํด ์ํฅ์ ๋ฏธ์น ๊ฒ์ผ๋ก ์ฌ๊ฒจ์ก๋ค.IMO, ์ธ์ด ๊ธฐ๋ฅ ์ถ๊ฐ๋ ์ค๋๋์๊ณ ํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ Emmet ๋๋ ์ธ์ด ์ค๋ํซ, ์ฝ๋ ์ ๊ธฐ ๋ฐ ์์ ์ง์ , ๋ฆฌํฉํ ๋ง ๋ฐ ํ์ ์ง์ , ๋๋ฒ๊น ๋ฐ ํ ์คํธ, ์ค๋ฅ์ ๋ํ ์๋ฃจ์ ์ ์ ๋ฐ godoc ๋๋ ์คํ ์ค๋ฒํ๋ก ์ธ์ฉ๊ณผ ๊ฐ์ ํธ์ง๊ธฐ์ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. , ์์ค ์ฝ๋ ์์ UI๋ฅผ ํ์ํ๊ณ ์์ค ์ฝ๋๋ฅผ ์ฅํฉํ๊ฒ ๋ก๋๋ค.
์ฝ๋if err != nil
๋ฅผtry
๋ก ์ ์ต๋๋ค.
๋๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ง ์๊ณ ๋ ์๊ฒฉํ ์ค๋ฅ ์ฒ๋ฆฌ์ ํฌํํ ์ฌ๋์ด์์ต๋๋ค. ์๋์ฉ์ด ์๋๋๋ค.
Rust์ Result
์ ํ๊ณผ ๊ฐ์ ๊ฒ์ ์๊ฒฉ์ผ๋ก ๋ฆฌ๋ฉ์ดํฌํ๋ ค๋ฉด ์ ๋ค๋ฆญ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ๊ฒ์ด ํ์ํ ๊ฒ์
๋๋ค. Result
์ ํ์ด ์ ๋ค๋ฆญ์ผ๋ก๋ง ๋ง๋ค์ด์ง ์ ์๋ ๊ฒฝ์ฐ์๋ _if_ ์ด๋ณด์ ํ๋ก๊ทธ๋๋จธ๋ ์ค๋ฅ๋ฅผ ์ ๋๋ก ์ฒ๋ฆฌํ๊ฑฐ๋ " Result
๋ฐฉ์์ผ๋ก" ํจ์์์ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ธฐ ์ ์ ์ ๋ค๋ฆญ์ ์์์ผ ํฉ๋๋ค. "
@deanveloper , ์ ์์ ์ "๊ตฌ๋ฌธ ๋ณ๊ฒฝ"๋ณด๋ค ์ ๋ค๋ฆญ์ ์ด์ ์ด ํจ์ฌ ๋ ๋ง์ผ๋ฉฐ ์ปค๋ฎค๋ํฐ์์๋ ๋ง์ฐฌ๊ฐ์ง๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@txgruppi ์ ๋ค๋ฆญ์ด ๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค๋ ๋ฐ ๋์ํ ์ ์์ต๋๋ค. ์ ๋ค๋ฆญ์ด ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋์ฒดํ ์ ์๋ ์ข์ ๋์์ด ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@deanveloper , ์ ์๊ฐ์๋ ์ด ์ค๋ฅ ์ฒ๋ฆฌ ๋ฌธ์ ๋ ์ธ๊ด์ ๋ฌธ์ ์ผ ๋ฟ์
๋๋ค. ์ฌ๋๋ค์ ๋ช ๊ฐ์ง ์ถ๊ฐ ์ฝ๋๋ฅผ ์
๋ ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ ์ ์ด๊ณ ์ ์๋ํ๋์ง ๋
ผ์ํ๋ ๋ฐ ์๊ฐ์ ๋ณด๋ด๊ณ ์์ต๋๋ค. ๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ๋์์ธ ๋ณ๊ฒฝ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ญ์์ค.
๋๊ตฐ๊ฐ๊ฐ Generics๊ฐ ๋ ๋์ ์ฝ๋๋ก ์์ ํ๊ธฐ ์ฝ๋ค๊ณ ๋งํ๊ธฐ ์ ์: ์ปดํ์ผ ์๊ฐ ์ค๋ฅ...
์ค๋ํซ์ด๋ ํค๋ณด๋ ๋งคํฌ๋ก๋ก ํด๊ฒฐํ ์ ์์ต๋๊น? ๊ทธ๋ฌ๋ฉด ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
@txgruppi
๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ๋์์ธ ๋ณ๊ฒฝ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ญ์์ค.
Robert Griesemer๊ฐ tryhard
๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฒ ๋ ๊ฒ์ฒ๋ผ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋ ์ค 70%๊ฐ ํ์ฌ try
์ ํฉํฉ๋๋ค. (์์ง ์กด์ฌํ์ง ์๋) fmt.HandleErrorf
๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ ๋ง์ ๊ฒ์ด ์ ํฉํฉ๋๋ค. ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ์ฝ๋๋ผ๊ณ ๋ถ๋ฅด๊ณ ์ถ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ค๋ํซ์ด๋ ํค๋ณด๋ ๋งคํฌ๋ก๋ก ํด๊ฒฐํ ์ ์์ต๋๊น? ๊ทธ๋ฌ๋ฉด ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋ํ ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒ์ ๊ดํ ๊ฒ์
๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ thing.Thing thing = new thing.Thing(thing.THING);
์ข์ํ์ง ์์ต๋๋ค.
@faiface , 'if err != nil'์ด ์์ง์ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋๋์? ๋๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์๋๋ค.
Generics์ ๋ถ์กฑ์ด ์์ง์ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋ฉ๋๊น? ์, ๊ทธ๋ ์ต๋๋ค.
๋ด๊ฐ ๋ณด๊ธฐ์๋ ์ ๋ค๋ฆญ์ ๊ตฌํํ ์ง์์ด ์ถฉ๋ถํ์ง ์์ ๊ตฌํํ ์ฌ๋์ด ํ์ํ์ง๋ง ์ด ์ค๋ฅ ์ฒ๋ฆฌ ์์ ์ ์ ๋ค๋ฆญ์ ํ์ค๋ก ๋ง๋ค ์ ์๋ ์ฌ๋๋ค์๊ฒ ์๊ฐ ๋ญ๋น์ผ ๋ฟ์ ๋๋ค. ๋๋ ์ด ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ๋์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ํ๋ ๊ฒ์ด ์๋๋ผ ํด๊ฒฐํด์ผ ํ ๋ ์ค์ํ ๊ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ํฉ๋๋ค.
@faiface ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค์ Go ์ฝ๋๋ฅผ ์ ํํํ์ง ๋ชปํฉ๋๋ค. ์ด๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ๋จ์ํ ์ค๋ฅ๋ฅผ ์ ๋ฌํ ๊ฐ๋ฅ์ฑ์ด ํจ์ฌ ๋ ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ์๋ฅผ ๋ค์ด io/ioutil
๋ ์ค์ ๋ก ์ค๋ฅ๋ฅผ ์ฅ์ํ ํ์๊ฐ ์์ผ๋ฉฐ io
์์ ๋ฐ์ํ ์ค๋ฅ๋ฅผ ๋จ์ํ ์ ๋ฌํ ์ ์์ต๋๋ค.
@deanveloper @faiface Go Corpus ์ ๋ํด ์คํํ ๋ :
--- stats ---
401679 (100.0% of 401679) func declarations
97496 ( 24.3% of 401679) func declarations returning an error
991348 (100.0% of 991348) statements
217490 ( 21.9% of 991348) if statements
88891 ( 40.9% of 217490) if <err> != nil statements
485 ( 0.5% of 88891) <err> name is different from "err" (-l flag lists details)
59500 ( 66.9% of 88891) return ..., <err> blocks in if <err> != nil statements
29391 ( 33.1% of 88891) complex error handler in if <err> != nil statements; cannot use try (-l flag lists details)
596 ( 0.7% of 88891) non-empty else blocks in if <err> != nil statements; cannot use try (-l flag lists details)
52810 ( 59.4% of 88891) try candidates (-l flag lists details)
๋ฐ๋ผ์ ์ค์ ์ฝ๋์์ if ๋ฌธ์ 40%๋ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ์ํด ์์ฑ๋๊ณ try
๋ ์์์์ 59%๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
๋๋ ๋์ํ๋ค. if err != nil์ด๋ฉด ๊ด์ฐฎ์ต๋๋ค. ๋จ์ผ ์ค๋ฅ ๊ฐ์ ๋ฐํํ๋ ํจ์์ ๊ฒฝ์ฐ ๊ฐ๋จํ๊ณ ๊นจ๋ํฉ๋๋ค. ๋๋ ๋ํ ์ค๋ฅ์ ์ปจํ ์คํธ๊ฐ ์ค์ํ ๋ ์ค๋ฅ ํจํค์ง์ ๊ทธ ์์ธ/๋ฉ ๊ธฐ๋ฅ์ ์ข์ํฉ๋๋ค. (๋ด๊ฐ ์๋ ํ) ์ฝ๋ ์์ฑ๊ณผ ํจ๊ป ์ฌ์ฉ์ ์ ์ ์ค๋ฅ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํ์ ์ด์ค์ ์ ์ํํ๊ฑฐ๋ ํ์ค ์ค๋ฅ ์ธํฐํ์ด์ค ๋์ ์ ๋ฌด์ธ๊ฐ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด๋ ์ชฝ์ด๋ , ๋๋ Go ์ฝ๋๋ฅผ ์ฝ๊ฑฐ๋ ์์ฑํ๊ณ ํ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํด ์ด๋ค ์ข ๋ฅ์ ์ฑ๊ฐ์ฌ์ ๋๋ ์ ์ด ์์ต๋๋ค. ๋ด๊ฐ ๊ฒช์๋ ์ฑ๊ฐ์ฌ์ ํญ๋ชฉ ๋ชจ์์ ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ ์ฌ๋ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฒฝ์ฐ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ธ์ด์ ๋ฌธ์ ๊ฐ ์๋๋ผ ๋์์ธ์ ๋ฌธ์ ์ ๋๋ค.
"์ค๋ฅ ์ปจํ ์คํธ๊ฐ ์ค์ํ ๊ฒฝ์ฐ"๋ผ๊ณ ๋งํ ๋ ๋คํธ์ํฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ๋ค์ ์๋ํ๊ณ ์ถ๊ฑฐ๋ "์ฐพ๊ธฐ" ์ ํ ํธ์ถ์ ๊ฒฐ๊ณผ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์์ ์ํฉ์ ๋งํ๋ ๊ฒ์ ๋๋ค. ์ค์ ๋ก ์์, ๋๋ ๋ด ๊ฒฝ๋ จ ์๊ฐ๋ฝ์ด ๋ด SQL ์ฟผ๋ฆฌ์ ์์์ '''๋ฅผ ์ถ๊ฐํ์ฌ ํญ๋ฐํ๊ฒ ๋ง๋ญ๋๋ค(์ด๋ ๋์๊ฒ ์์ฃผ ๋ฐ์ํฉ๋๋ค... ์๋ง๋ ์ ๊ฒฝ ์์์ ํ์ธํด์ผ ํ ๊ฒ์ ๋๋ค).
19๋ 7์ 5์ผ Nicolas Grilly [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@kroppt ๋๋ ์์ญ ๋ฒ ์ฝ์์ต๋๋ค ;-) ๋๋ ์๋ํ๋ค๋ ์๊ฐ์ ๋์ํ์ง ์์ต๋๋ค
์ฝ๋ ๋๋ ํ. try๋ ์ผ๋ถ๋ฅผ ์ธ์๋ถํดํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ด์ฅ ํจ์์ผ ๋ฟ์ ๋๋ค.
๋ฐ๋ณต์ ์ธ ์ฝ๋. ์ฐ๋ฆฌ๋ ํ๋ก๊ทธ๋๋จธ๋ก์ ํญ์ ๊ทธ๋ ๊ฒ ํฉ๋๋ค. ์๋ณํ ๋
๋ฐ๋ณต์ ์ธ ํจํด, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์๋ก์ด ๊ธฐ๋ฅ์์ ์ ์ธํฉ๋๋ค. ๊ทธ๋ ์ง ์์๋ค๋ฉด ์ฐ๋ฆฌ๋
๋ชจ๋ ์ฝ๋๊ฐ ์ธ๋ผ์ธ๋ ํ๋์ ๊ธด main() ํจ์๊ฐ ์์ต๋๋ค.๋๋ ๋น์ ์ ์ ์งํ์ง ์๋ค๊ณ ๋ถ๋ฅด๊ณ ์ถ์ง๋ง Ian Lance Taylor์ ๋ง์ ์กด๊ฒฝํฉ๋๋ค.
ํ ๋ก ์ ์ ์คํ๊ฒ ์ ์งํ๋ ค๋ ์ด์ธ๊ฐ์ ์ธ ๋ ธ๋ ฅ๊ณผ ๋๋ ์ ๋ง๋ก ํ ์ ์์ต๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ์ด ํฌ๋ผ์ ์๋์ ์ผ๋ก ๊ฑฐ์ง๋ง์ ํจ์ผ๋ก์จ ์ป์ ์ ์๋ ๊ฒ์ ๋ณด์ญ์์ค.
์ฆ, "๋ฐ๋ณต์ ์ธ ํจํด์ ์๋ณํ ๋
์๋ก์ด ๊ธฐ๋ฅ์
๋๋ค." ๋ฌผ๋ก ์ด์ง๋ง ์ถฉ๋ํ๋ ๊ตฌ์ฑ์ ์ ๊ณตํ๋ ๊ฒ์ ์๋๋๋ค.
๋ฐ๋ ๊ฐ๋ฐ์ ์ด ๋ฆ์ ๋จ๊ณ์์ ๋ ๊ฐ์ง
์จ๊ฒจ์ง ๊ธฐ๋ฅ: ์ฒซ ๋ฒ์งธ๋ "๋ฐํ
์ธ์ ๋ชฉ๋ก์ error
๊ฐ์ผ๋ก ๋๋ฉ๋๋ค."
์๋ฏธ ์ค๋ฅ๋ก) ๋ ๋ฒ์งธ๋ ์จ๊ฒจ์ง ์ ์ด ํ๋ฆ์ ์ ๊ณตํฉ๋๋ค.
"๊ทํ"๊ณผ ์ ์ฌํ์ง๋ง ์์ ํ ๋์ผํ์ง ์์ ์ฐํ
์ฑ๋ช
.
"์ง์ฐ"์ ์ฌ์ฉํ์ฌ ๊ฑฐ๋๋ฅผ ์ ๋ํ๋ ๋ถํ๋ ๊ณ ๋ฆฌ๋ฅผ ์ ๊ฒฝ ์ฐ์ง ๋ง์ญ์์ค.
"์๋ - ์์ฌ ํจ์"์ ๋ ๋ํดํ ์ฌ์ฉ์ผ๋ก. ์ด๋ค ์ฌ๋
๋ค๋ฅธ ๊ณณ์์๋ ๋๋ต "์ฝ๋์์ try
๋ฅผ ๋ง๋๊ณ ์ถ์ง ์์ต๋๋ค.
์ฝ์์ต๋๋ค." ๊ฐ์ ์๊ฐ์ด ๋๋๋ฐ ํฉ์ธ๋ ค์๋ ์ ๋ฉ๋๋ค.
์ํ์.
๋๋ "์ค๋ฅ ๋ฐํ"์ "๋ฐํ"์ธก๋ฉด์ด๋ผ๊ณ ๋งํ์ต๋๋ค.
์ฒ๋ฆฌํด์ผ ํ๋ฉฐ "์ค๋ฅ ๋ฐ์" ์ ์์ด
๊ทธ ์์น์ ๋ํ ๊ท์น์ ๋ค์ ๊ตฝํ๊ธฐ๋ ํฉ๋๋ค. ๋ด ์์ ๋ ๋ง์ฐฌ๊ฐ์ง์ผ
"์คํจ" ์ ์(๋ง์ง๋ง ์ธ์๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ด๋ํฉ๋๋ค.
๋๋ฅผ ๋ถํํ๊ฒ ๋ง๋๋).
๋ ๊น์ด, SNOBOL์ ์ ์ธํ๊ณ ๋ ์ด๋ค ์ธ์ด๋ ๊ฐ๋ฅํ์ง ์์ต๋๋ค.
๋ด๊ฐ ์ ์๊ณ ์๋ ๊ฒ์ Rob Pike๊ฐ ๋ฌ์ฌํ ๋์ฝ์ ํ์ต๋๋ค.
"์ค๋ฅ๋ ๊ฐ์
๋๋ค" Go๊ฐ ๊ฐ์ง๊ณ ์์ง๋ง ๋ฌด์ธ๊ฐ๋ฅผ ์์ด ๋ฒ๋ ธ์ต๋๋ค.
ํ๋ก์ธ์ค์์: ์ค๋ฅ "์กฐ๊ฑด"์ ๊ฐ์ด "์๋๋๋ค". ์ฑ๊ณต์ ์ธ
ํจ์์ ์๋ฃ๋ ํน๋ณํ ๊ฒฝ์ฐ์ด๋ฏ๋ก ๊ฐ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์คํจ.
๊ฐ๊ฐ(๊ทธ๋ฆฌ๊ณ ์ฑ๊ณต์ ์ธ ์๋ฃ์ ์ ์ฉ๋๋ฉฐ,
๋ ์ด์๋) ๊ทธ ์ฅ์ ์ ๋ฐ๋ผ ์ฒ๋ฆฌํด์ผ ํ์ง๋ง ์ฐ๋ฆฌ๋
ํธ์ถ๋ ํจ์๊ฐ ๋ค์๊ณผ ๊ด๋ จ๋ ์๊ฒฌ์ ์๋ ค์ผ ํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
์ถ์ฝ๋ ํํ์ ์์ฑ๋,
๊ทธ๊ฒ์ ์์ํ ์ด๋ฃจ์ด์ก๊ณ Rob์ ์คํด๋ฅผ ํ๊ณ ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
์์ ์ ์ค๋ช
ํ๊ธฐ ์ํด Reader์ ๋ฐํ ๊ฐ์ ๊ณ ๋ คํ์ญ์์ค.
io.EOF๋ ๋๋ก๋ ์ฑ๊ณตํ๊ณ ๋๋ก๋
์คํจํ์ง๋ง Go ํ์ค์ ๋ฐ๋ฅด๋ฉด ์๋์ค๋ฝ๊ฒ๋ ์ค๋ฅ์
๋๋ค("io.Err != nil").
์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ถ์ฝํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๊ฑฐ์ ํ์คํ๋ค
์ฐ๋ฆฌ๋ ๊ทธ "์๋ชป"์ "์ฉ์"ํ๋ ๋ฐ ์ต์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋น์ทํ "์ํ" ๋๋
์กฐ๊ฑด ์ฝ๋(๊ฒ์์ ๋ฐ๊ฒฌ๋ ๊ฐ ๋๋ ์คํจ๋ก ๋๋ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์ผ์ ํ๊ณ ์ถ๋ค๋ฉด ๋ฌด์์ ๋งํฉ๋๊น? ํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ฉด
์ง์์ด ์ด๋ฏธ ์๋ ๊ณณ - ๋์ผํ ๋ฌธ์ , ๋ค๋ฅธ
๋ฌธ๋งฅ).
์ด๊ฒ์ ์ ํต์ ์ธ ์ธ์ด์ ๋ํ ์ค์ง์ ์ธ ๊ฐ์ ์ฌํญ์
๋๋ค. ๋ณด์ผ๋ฌ ๊ฐ์
๊ทธ์ ๋นํด ์ ์๋ ํฐ๋ฌด๋์๋ค.
๊ทธ๋ฆฌ๊ณ ์ผํญ ์ฐ์ฐ์์์ ๋น๊ต๋ ๋์ผํ๊ฒ ์ ํจํฉ๋๋ค. if ?:
"๋จ์ฉ๋์ง ์๋๋ก" ํ์ฉ๋์ง ์์ผ๋ฉด ์๋๊ฐ ํ์ฉ๋์ง ์์์ผ ํฉ๋๋ค.
์ ์ด๋ ๊ทธ ๊ทผ๊ฑฐ์์.
์์งํ ์๋๋ ์ข
๋ฌ์์
๋๋ค. ๊ทธ๊ฒ์ Go๋ฅผ ์๋ชป๋ ์ฌ๋์๊ฒ ๋ ๋งค๋ ฅ์ ์ผ๋ก ๋ง๋ญ๋๋ค.
์ฒญ์ค. ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ ์ํ์ฑ ์์ - ๋๊ฐ ์๋ชป๋ ์ฌ๋์ ์ํ๋๊ฐ
์ฐ๋ฆฌ ์ปค๋ฎค๋ํฐ์ ๊ฐ์
ํ๋ ค๋ฉด? - ํ๋ก์ ์์ ์ด ์๋ค.
์๋ํ์ง ์์ ๊ฒฐ๊ณผ. ๋๋ "์คํฌ๋ฉ"์ด๋ผ๊ณ ๋งํ๊ณ ๊ทธ๊ฒ์ ๋ฐ์ ๋ค์ธ๋ค.
์ฐ๋ฆฌ๋ ์์ง ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด ๊ฐ๋ฅํ ์ง์ ์ ๋๋ฌํ์ง ์์์ต๋๋ค.
๋ฌด์๋๋ฏ๋ก ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ฅํฉํ๊ฒ ๋จ์ ์์ด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๊ณตํฉ/ํ๋ณต์ด ์๊ณ ๊ทธ๊ฒ์ ์ผ๋ฅ์์ ์น๊ฒฉํ ํ์๊ฐ ์์ต๋๋ค.
๋ชจ๋ ์ค๋ช
๊ณผ ํจ๊ป ์๋ฏผ์ด ๊ธฐ๊บผ์ด ๋์์ค ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ์ด๋ณด์๋ฅผ (๊ทธ๋ฆฌ๊ณ ๋, ๋๋ ๊ทธ๊ฒ์ ๋๋ ค์ํ๋ค๋ ๊ฒ์ ์ธ์ ํฉ๋๋ค) ๋ ๋ง์ด ๋ง๋ญ๋๋ค.
์์ ์๊ฒ ์ฌ์ฉํฉ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ ๋ด์ "์ง์ฐ" ๊ตฌ์ฑ(๋ด๊ฐ ์ฑํํ -
๋ค๋ฅธ ๊ณณ์์ ์์
์ ๊นจ๋ซ์ง ์๊ณ - ์ผ๊ด๋๊ฒ ๋ง๋ฌด๋ฆฌ
SQL ํธ๋์ญ์
: tx.Rollback/tx.Commit)๋ ์ ์๊ฒ ๊ณ์์์ต๋๋ค.
"๋ฒ์ ๋ด์์" ๋ฐฐ์ธ ์ ์๋ ๋ ๋ง์ ์์น์ด ์์ ์ ์์ต๋๋ค.
Go๊ฐ ์ด๋ฏธ ์ ๊ณตํ๋ ๊ฒ: ์ง๊ธ์ ๊ทธ ์์ ์์ ๋จธ๋ฌผ์.
์ปคํ์์ ๋ฒ์ด๋ ํ ๊ฐ์ง๋ ์ค๋ฅ ๋ณด๊ณ ์ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค.
์ผ๋ฐ์ ์ธ ์กฐ๊ฑด์์ ์คํ๋ "error.Methods"์ ๊ธฐ๋ฅ ๋ชฉ๋ก
๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ๋ ๋์ ์กฐ๊ฑด(io.EOF, sql.ErrNoRows)
ํ๋ฐฑ์ผ๋ก. ํ์ง๋ง ๋๋ ๊ทธ๋ฐ ๋ฌธ์ ์ ์์ด ํ๊ต๋ฅผ ๋ค๋์ง ์์์ด, ๋ด ์ ์
๋๋ฌด ์์งํด ๋จ๋ค์ด (๋ก์ , ๋ฃ๊ณ ์๋?)
์์ด๋์ด๋ฅผ ์คํํฉ๋๋ค.
๋ฃจ์์ค.
"ํ์๋ฅผ ์น๋ ๊ฒ์ ์ง๋ฃจํ์ง ์๋ค. ์ฐ๋ฆฌ๊ฐ ๊ฐ์ ๊ฒ์ ๊ฐ์ง๊ณ ์์ ๋ ์ฝ๋ ๊ฒ์ ์ง๋ฃจํ๋ค.
๊ณณ๊ณณ์ 3์ค. ๊ทธ๊ฒ์ ๋ฐ๋ณต์ด๊ณ ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ก๊ทธ๋๋จธ๋ก์
์ด๊ฒ๋ค์ ๋ฐฐ์ ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์๋์๋ ๋ค๋ฅธ ๋จ์ ์ด ์์ ์ ์์ง๋ง ์ด๊ฒ์ ์๋๋๋ค.
๋ด๊ฐ ์๊ฐํ๋ ํ๋."
๋ค์ ๋งํ์ง๋ง, ๋ถ์ ์งํ๊ฑฐ๋ ์ต์ํ ํฉ๋ฆฌํํฉ๋๋ค. ๋๋ ๊ทธ
์ธ ์ค์ ์ฐ์ฌ์ง ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ด ์ฝํ์ง๋ง,
Griesemer๊ฐ ์ํํ๋ ค๋ ๊ณ ํต์ ์ฝ๊ธฐ๊ฐ ์๋๋ผ ์ฐ๊ธฐ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ "err != nil"์ ๋งค์ฐ ์น์ํ ํ์์ด๋ฉฐ "์ฝ์ ๋" - ๋ค์๊ณผ ๊ฐ์ด
ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ "๊ฒ์"ํ๋ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ผ๋ก ํด๋น ํจํด์
์คํ ๋ฐ ์ทจ์ํ๊ธฐ ์ฝ์ต๋๋ค. ํฉํ ๋ง์ ๋์ผํ์ง ์์ต๋๋ค.
์ ํ ๋ฆฌ๊ทธ. ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฒฉ์ด ํ๋ฆฝ๋๋ค.
"ํ๋ก๊ทธ๋๋จธ๋ก์์ ์ฐ๋ฆฌ"๋ ๋ ๋ณต์กํ ํจํด์ ๋จผ์ ๊ณ ๋ คํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
๋๋ฌผ๊ฒ ๋ฐ์ํ๋๋ผ๋. ์ฐ๋ฆฌ๋ ๋ํ "if err != nil { return
err }"๋ ๋งค์ฐ ๊ฐ๋จํ ๋ช
๋ น์ด ์ํ์ค๋ก ์ปดํ์ผ๋ฉ๋๋ค.
๋๊ตฌ๋ ์ง ์ฌ๊ธฐ์์ ์์ ๋ค๊ฒ ๋ด๋ฒ๋ ค ๋์ญ์์ค. ํ๋๊ฐ ํ๋ฑ ํ ์ ์์ต๋๊น
"์๋ - ๊ธฐ๋ฅ"๊ณผ ํจ๊ป ์ผ์ด๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํ์ญ๋๊น?
๋ฃจ์์ค.
@lootch ์ด๋ด, ์ฌ๋๋ค์
์ฐ๋ฆฌ๋ ํ๋ก๊ทธ๋๋จธ๋ก์ ๋ฐ๋ณต์ ์ธ ํจํด์ ๋ฐฐ์ ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ ๋์ ์ผ๋ก ์ฌ์ค์ ๋๋ค.
๋ฐ๋ณต์ ์ธ ์ฝ๋๊ฐ ๋ง์ผ๋ฉด ์ฝ๊ธฐ ์๋๊ฐ ๋๋ ค์ง๋ฏ๋ก ๊ทธ๊ฒ์ด ์ผ๋ง๋ ๋ถ์ ์งํ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด์ ๋ํ ๊ทํ์ ๋ฐ๋ก ์ ๊ธฐ๋ณธ์ ์ผ๋ก "์ด๋ด, ๊ทธ๋ ๊ฒ ํฐ ๋ฌธ์ ๊ฐ ์๋๋ค"์ ๋๋ค. ๊ธ์, ๋ง์ ์ฌ๋๋ค์๊ฒ ๊ทธ๋ ์ต๋๋ค.
๋๊ฐ ์๋ชป๋ ์ฌ๋๋ค์ด ์ฐ๋ฆฌ ์ปค๋ฎค๋ํฐ์ ํฉ๋ฅํ๊ธฐ๋ฅผ ์ํฉ๋๊น?
์ด๊ฒ์ ๋งค์ฐ ์ค๋งํ ๊ฒ์ดํธ ํคํ์
๋๋ค. ๋ํ tryhard
๋๊ตฌ๋ try
๊ฐ ์ค๋๋ ์ Go ์ฝ๋๋ฒ ์ด์ค์ ๋ง์ ๋ถ๋ถ์ ์ง์ ์ ์ฉํ ์ ์์์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋์ 70%์ ์ง์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ฝ๋ ๋ณ๊ฒฝ( defer
๋ฑ์ ์ฌ์ฉํ์ฌ ์ค๋ฅ ์ฅ์ ์ฌ์ฉ)์ผ๋ก ๋ชจ๋ Go ์ฝ๋์์ ์ค๋ฅ ์ฒ๋ฆฌ์ 80% ์ด์์ ์ ์ฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋์ํฉ๋๋ค. ์ฌ๊ธฐ์์ ๋ชฉํ๋ฅผ ์ด๊ณผํ๊ณ ์์ต๋๋ค. ๋๋ ์ฌ๊ณผ.
์ด ํ ๋ก ์ผ๋ก ์ธํด ์ฐ๋ฆฌ ์ค ์ผ๋ถ๋ ์นผ๋ผ ์๋ ๋จ๊ฑฐ์์ง๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์์ ๊ทธ๋ฆฌ๋ฉฐ ๋์๋ค๋๋๋ค.
19๋ 7์ 7์ผ์ Michal ล trba [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@lootch ์ด๋ด, ์ฌ๋๋ค์
๊ทธ๋ค์ ๋น์ ์ด ๊ทธ์ ๊ฐ์ด ํ์ํ ์ง์ ๊ณผ ๊ฐ์ง ์๋ค๊ณ ํ์ ํฉ๋๋ค.
ํฉ๋ฆฌ์ ์ธ.์ฐ๋ฆฌ๋ ํ๋ก๊ทธ๋๋จธ๋ก์ ๋ฐ๋ณต์ ์ธ ํจํด์ ๋ฐฐ์ ํฉ๋๋ค.
์ง์ค.๋ฐ๋ณต์ ์ธ ์ฝ๋๊ฐ ๋ง์ผ๋ฉด ์ฝ๊ธฐ ์๋๊ฐ ๋๋ ค์ง๋ฏ๋ก ์ด๋ป๊ฒ ๋๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ถํฉ๋ฆฌํ๊ฑฐ๋.์ด์ ๋ํ ๊ทํ์ ๋ฐ๋ก ์ ๊ธฐ๋ณธ์ ์ผ๋ก "์ด๋ฐ ์ผ์ด ์๋๋๋ค.
ํฐ์ผ์ ๋๋ค." ๊ธ์์, ๋ง์ ์ฌ๋๋ค์๊ฒ ๊ทธ๋ ์ต๋๋ค.๋๊ฐ ์๋ชป๋ ์ฌ๋๋ค์ด ์ฐ๋ฆฌ ์ปค๋ฎค๋ํฐ์ ํฉ๋ฅํ๊ธฐ๋ฅผ ์ํฉ๋๊น?
์ด๊ฒ์ ๋งค์ฐ ์ค๋งํ ๊ฒ์ดํธ ํคํ์ ๋๋ค. ๋ํ
tryhard
๋๊ตฌ๋
try
๋ ์ค๋๋ ๋๋ถ๋ถ์ Go ์ฝ๋๋ฒ ์ด์ค์ ์ง์ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ ์ ์๋ค
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋์ 70%์ ์ง์ ์ ์ฉ๋ฉ๋๋ค. ์ ํจ๊ป
์ฝ๋ ๋ณ๊ฒฝ(defer
๋ฑ์ ์ฌ์ฉํ์ฌ ์ค๋ฅ ์ฅ์ ์ฌ์ฉ)
๋ชจ๋ Go ์ฝ๋์์ ์ค๋ฅ ์ฒ๋ฆฌ์ 80% ์ด์์ ์ ์ฉํ ์ ์์ต๋๋ค.--
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/32825#issuecomment -508971768
--
๋ฃจ์์ค ๋ฐ ๋
2 Piet Retief St
์ผ์คํ
(๋๋ถ ์์ ์ฃผ)
9860 ๋จ์ํ๋ฆฌ์นด ๊ณตํ๊ตญ
์ ํ: +27 58 653 1433
ํด๋์ ํ: +27 83 251 5824
ํฉ์ค: +27 58 653 1435
@loot ์์์์ด ๊ฐํฉ๋๋ค ! ํ ๋ก ์ด ์์ผ๋ก ์งํ๋๋ ๊ฒ์ ๋ณด๋ ์ข์ ๊ฐ์ ์ดํดํ ์ ์์ต๋๋ค.
์ ๋ ๋น์ทํ ๋งฅ๋ฝ์ผ๋ก ๋ณด๊ณ ์์ต๋๋ค.
์๋ง๋ ์์ธก์ ์๋ก๋ฅผ ์ดํดํ์ง ๋ชปํ๊ณ ์์ ๋ฟ์ ๋๋ค. '์๋'๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ด๋ผ๋ ๋ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์ฝ์
19๋ 7์ 7์ผ์ Michal ล trba [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
[ ... ]
์ด์ฉ๋ฉด ์์ชฝ ๋ชจ๋ ์๋๋ฐฉ์ ์ดํดํ์ง ๋ชปํ๊ณ ์๋ ๊ฒ์ผ ์๋ ์์ต๋๋ค. ๋น์ ์
์ฌ์ฉ ๋ฐฉ๋ฒ ์ด๋ผ๋ ๋ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์ฝ๊ธฐ '๋ ธ๋ ฅํ๋ค'? ๋ด๊ฐ ์๋ํ๋ ๊ณณ
'์๋'๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ ๋ก ์ด๋ป๊ฒ ๋ณด์ด๋์ง ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ต์ ์ ๋คํฉ๋๋ค.
ํธ๊ฒฌ ์๋?๋๋ ๊ทธ๋ ์ง ์์๋ค๊ณ ๊ณ ๋ฐฑํฉ๋๋ค. ์ ๋ ๊ทธ๋ด ํ์๊ฐ ์๊ธฐ๋ฅผ ๊ฐ์ ํ ๋ฐ๋ผ๊ณ ์์ต๋๋ค :-)
Stockton์ด ์ ๊ธฐํ๋ค๊ณ ์๊ฐํ๋ ์ธก๋ฉด์ ๊ณ ๋ คํ์ต๋๊น?
์๋์ ์ฅ์ ์ด ํ์๋๊ณ ๊ทธ๋ ๋ถ๋๋ฌ์ด ํ๋ณต๋ถ๊ฐ
๋๋ ๋ฐํ? ๋๋ ๊ทธ์ ๋์ํ๊ณ - ๋ชจ์์ ์๋๊ฐ ์์ต๋๋ค -
๊ทํ์ ๋ธ๋ก๊ทธ๊ฐ ๋์ผํ ๋จ์ ์ผ๋ก ๊ณ ํต๋ฐ์ ์ ์์ต๋๋ค.
๊ทธ๋ ์ง ์๋ค๋ฉด ๋๋ฅผ ์๊ทนํ์ญ์์ค. ์ข์ ๋
์๋ ํน๋ณํ ์ฅ์๊ฐ ์์ต๋๋ค.
๋ด ์ธ์์์ :-)
๋ฃจ์์ค.
@lootch ์ ๋ ์งง์ ์์ ์ฝ๋๋ก ๊ฐ๋ฅํ '์๋'์ ๋ง์ ์ธก๋ฉด(์ฆ, ์ ์ฉํ ๋์ ์ ์ฉํ์ง ์์ ๋ ๋ชจ๋)์ ๋ณด์ฌ์ฃผ๊ณ ์ต๋ํ ํธํฅ๋์ง ์๊ณ ํ์ค์ ์ด๊ฒ ๋ง๋ค๊ธฐ ์ํด ์ต์ ์ ๋คํ์ต๋๋ค. ํ์ง๋ง ๋ฌผ๋ก , ๋ด ๋ง์ ๋ฏฟ์ง ๋ง์ธ์ :)
์ด๊ฒ์ ๊ด๋ จ Reddit ํ ๋ก ์์ ๊ฐ์ฅ ๋ง์ด ํฌํ๋ ๋๊ธ์ด์์ต๋๋ค.
์ด๊ฒ์ ํธํฅ๋์ง ์์ ์ ์ฉํ ๊ฐ์์ ์์ ๋๋ค. ๋ํ์ "๊ทธ์ ์ง์ฆ๋๋ ์ผ"์ด ์๋ ๊ฑด์ค์ ์ธ ๋ด์ฉ์ ์ถ๊ฐํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
@lootch ์ ๋ ์งง์ ์์ ์ฝ๋๋ก ๊ฐ๋ฅํ '์๋'์ ๋ง์ ์ธก๋ฉด(์ฆ, ์ ์ฉํ ๋์ ์ ์ฉํ์ง ์์ ๋ ๋ชจ๋)์ ๋ณด์ฌ์ฃผ๊ณ ์ต๋ํ ํธํฅ๋์ง ์๊ณ ํ์ค์ ์ด๊ฒ ๋ง๋ค๊ธฐ ์ํด ์ต์ ์ ๋คํ์ต๋๋ค. ํ์ง๋ง ๋ฌผ๋ก , ๋ด ๋ง์ ๋ฏฟ์ง ๋ง์ธ์ :)
์ด๊ฒ์ ๊ด๋ จ Reddit ํ ๋ก ์์ ๊ฐ์ฅ ๋ง์ด ํฌํ๋ ๋๊ธ์ด์์ต๋๋ค.
์ด๊ฒ์ ํธํฅ๋์ง ์์ ์ ์ฉํ ๊ฐ์์ ์์ ๋๋ค. ๋ํ์ "๊ทธ์ ์ง์ฆ๋๋ ์ผ"์ด ์๋ ๊ฑด์ค์ ์ธ ๋ด์ฉ์ ์ถ๊ฐํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ธ์๋ก ์ฌ์ฉํ๋ ํจ์? ์ด๊ฒ๋ง์ผ๋ก๋ ์ด ์ฝ๋๊ฐ ๋ด ๋ฆฌ๋ทฐ๋ฅผ ํต๊ณผํ์ง ๋ชปํ ๊ฒ์ ๋๋ค. ์ผ๋ถ ํ๋๊ฐ ๋๋ฝ๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ํฉ๋๊น? ์ฌ์ ๋ ฌ?
@sirkon ๋ฌผ๋ก ๋๋ฌด ๊ธธ์ง ์๋๋ก ์์ ๋ฅผ ๋จ์ํํ์ต๋๋ค. ์ ๊ธฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฉฐ, ์ด๊ฒ์ด ๋ฌธ์ ์ ์ ๋ถ์ ๋๋ค.
์ ๊ธฐํ ๋ฌธ์ ๋ฅผ ์์ ํ๋ ๋ฐ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
๊ทธ๋ ๊ฒ ๋งํ๊ธฐ ๋๋ฌธ์?
go
resp := Respondent{
Name: name,
Gender: try(parseField(s, &line, "gender")),
OS: try(parseField(s, &line, "os")),
Lang: try(parseField(s, &line, "lang")),
}
์ถ์ ๊ทํ์ repos๋ฅผ ์ดํด ๋ณด์์ต๋๋ค. Go๊ฐ ์์ ์ ์ข์ง ์์ ๋๊ตฌ๋ผ๋ ๊ฒ์ ์๊ณ ๊ณ์ญ๋๊น? ์ค์ Go์ ์์ฉ ์ฌ๋ก์์ ๊ฐ์ฅ ๋จผ์ ๋ก๊ทธ๋ฅผ ๋ณด๋ ์ฌ๋์ ๊ฐ๋ฐ์๊ฐ ์๋๋ผ ์ด์ ์์ง๋์ด๋ผ๋ ๊ฒ์ ์ดํดํด์ผ ํฉ๋๋ค. ์ ์ ํ ์ค๋ฅ ๋ฉ์์ง๋ ๋ฌธ์ ๋ฅผ ์ค์ค๋ก ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
@sirkon ์,
์ด๊ฒ์ด ์๋ชป๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ ์๊ณ ๊ณ์ญ๋๊น?
๊ทธ๊ฒ๋ค์ ๋ชจ๋ธ์ ์์ ํ ์ ํฉํฉ๋๋ค. ํ์์๋ ๋ชจ๋ ํ๋๊ฐ ์์๋๋ก ํฌํจ๋์ด์ผ ํฉ๋๋ค. ์ค๋ฅ ๋ฉ์์ง๋ ๋งค์ฐ ๋ช ํํ๊ฒ ์๋ ค์ค๋๋ค.
์ฝ๋์ ํ์ง์ ์ด์๋ฅผ ์ ๊ธฐํ๋ ค๋ฉด ํ์ง ํ์ค์ ๋ง๊ฒ ์ฝ๋๋ฅผ ๋ค์ ์์ฑํ์ง ์๊ฒ ์ต๋๊น? ๊ทธ๋ ๊ฒ ํ๋ฉด try
๋ฅผ ์ฌ์ฉํ๋๋ก ์ฝ๋๋ฅผ ๋ค์ ์์ฑํ๊ธฐ ์ํด ์ต์ ์ ๋คํ ๊ฒ์
๋๋ค.
์ถ์ ๊ทํ์ repos๋ฅผ ์ดํด ๋ณด์์ต๋๋ค. Go๊ฐ ์์ ์ ์ข์ง ์์ ๋๊ตฌ๋ผ๋ ๊ฒ์ ์๊ณ ๊ณ์ญ๋๊น?
๋ด ์์ ์ ๋ค๋ฅธ ๊ฒ์ ์ ์ํ์๊ฒ ์ต๋๊น? ๊ฝค ๋ง์ด ์ฌ์ฉํ์ต๋๋ค. Btw, ์ด๊ฒ์ ์ฃผ์ ์์ ๋ฒ์ด๋ฌ์ต๋๋ค.
@faiface
๋ด ์์ ์ ๋ค๋ฅธ ๊ฒ์ ์ ์ํ์๊ฒ ์ต๋๊น? ๊ฝค ๋ง์ด ์ฌ์ฉํ์ต๋๋ค. Btw, ์ด๊ฒ์ ์ฃผ์ ์์ ๋ฒ์ด๋ฌ์ต๋๋ค.
๋ น? C++?
@sirkon
๋ น? C++?
์ฐ๋ฆฌ๋ ๊ฑฐ๊ธฐ์ ๊ฐ. Go๋ก ์ ์ฐฉํ๊ธฐ ์ ์ ๋ ๋ค ์ฌ์ฉํ์ต๋๋ค. ๋๋ ๊ฒฐ์ฝ ๋ค๋์๋ณด์ง ์์๋ค.
@sirkon try
์ ํฐ ๊ฒฐํจ ์ค ํ๋๋ ์ค๋ฅ ์ฅ์์ ๋ฐฉํดํ๋ค๋ ๊ฒ์
๋๋ค. ์ด ๊ฒฝ์ฐ ํ๋ก๊ทธ๋๋จธ๋ try
์ ๊ฐ๋ฅํ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ณด์ฌ ์ฃผ๋ฏ๋ก ๋น์ฐํ ์ค๋ฅ ์ฅ์์ด ๋ง์ด ๋ฐ์ํ์ง ์์ ๊ฒ์
๋๋ค.
๋ํ, ๊ทธ๋ค์ด ์์ ํ ํ๋ก์ ํธ๋ฅผ ๊ทผ๊ฑฐ๋ก ์ฌ๋๋ค์ ํํํ๋ ๊ฒ์ ์์ ํ ์ฃผ์ ์ ๊ด๋ จ์ด ์์ผ๋ฉฐ ๋ถํ์ํ ์ผ์ ๋๋ค. ๋น์ ์ ์ง๋ ๋ช ๊ฐ์ ๋๊ธ์ ๋ํด ์๋นํ ๋ฌด๋กํ ํ๋์ ํ์ผ๋ฉฐ ์ ์ด๋ ๊ทธ ์ ์ ์์์ฃผ์ จ์ผ๋ฉด ํฉ๋๋ค.
@deanveloper ๋๊ธ ๊ฐ์ฌํฉ๋๋ค!
Btw
์ด ๊ฒฝ์ฐ ํ๋ก๊ทธ๋๋จธ๋ try์ ๊ฐ๋ฅํ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ณด์ฌ ์ฃผ๋ฏ๋ก ๋น์ฐํ ์ค๋ฅ ์ฅ์์ด ๋ง์ด ๋ฐ์ํ์ง ์์ ๊ฒ์ ๋๋ค.
๋ด ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ ์ค์ ๋ก @sirkon ์ด ์ํํ๋ ๊ฒ๊ณผ ๋๊ฐ์ ๋ฐฉ์์ด ์๋ ๋ง์ ์ค๋ฅ ์ฅ์์ด ์งํ๋๊ณ ์์ต๋๋ค. ๋ค์์ try
๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ ๋ช ๊ฐ์ง ์ค๋ฅ ๋ฉ์์ง์
๋๋ค.
parse respondnts.txt: open respondnts.txt: no such file or directory
parse respondents.txt: line 12: parse field gender: expected "gender:"
parse respondents.txt: line 9: expected empty line
parse respondents.txt: line 4: parse field lang: EOF
@faiface ๋ด ์ค์, ๋ ๊ตฌ์ฒด์ ์ด์ด์ผํ์ต๋๋ค. try
๋ ๋์ผํ ํจ์ ๋ด์์ ์ฌ๋ฌ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ํ ๋ ์ค๋ฅ ์ฅ์์ ๊ถ์ฅํ์ง ์์ต๋๋ค. check/handle
์ด์๊ณผ "๋ช
๋ช
๋ ํธ๋ค๋ฌ" ๋ฐ๋ ์ ์์ผ๋ก ์ด๋ฅผ ์ํํ ์ ์์์ต๋๋ค. ๊ฐ ๋ฉ์์ง ์ฃผ์์ ์ฅ์์ ์ถ๊ฐํ ์ ์๋ค๋ ๊ฒ์ด ์ง์ ๋ ํน์ ์ธ์คํด์ค(๊ตฌ์กฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ ๋์ try
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ)์์ ๋งค์ฐ ์ ์ฉํ์ ๊ฒ์ด์ง๋ง ๋ถํํ๋ ์๋ ์ ์์ผ๋ก ์ธํด ์ํํ๊ธฐ๊ฐ ์ฝ๊ฐ ์ด๋ ต์ต๋๋ค. ์์ ์ ๊ธฐ๋ฅ์ ์์ฑํ์ง ์๊ณ .
๊ทธ๋ฌ๋ ํน์ ๊ฒฝ์ฐ์๋ ํ์ธ/์ฒ๋ฆฌ๊ฐ ๋์์ด ๋์ง ์์์ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋์ ์ ์ ๋ ์์ด๋์ด catch
์ ๋ค๋ฅธ counterproposals try
์ถ๊ฐ ์ถ๊ฐ ์ฅ์์ผ๋ก์ผ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌ ํ ์ ์์์ ๊ฒ์ด๋ค.
@deanveloper ํ์ ํจ์๊ฐ ๊ณ ์ ํ ์ปจํ ์คํธ๋ฅผ ์ ๊ณตํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํจ์ ๋ด์ ๋ชจ๋ ์ค๋ฅ์ ๋ํด ๋์ผํ ์ฅ์์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋จ์ผ ํจ์์์ ๋ค๋ฅด๊ฒ ์ฅ์ํด์ผ ํ๋ ๊ฒฝ์ฐ try๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ ํ ์ฌ์ด ์๋ฃจ์ ์ด ์์ต๋๋ค.
..., err := functionThatCanFail(...)
try(errors.Wrapf(err, ...))
๋๋ ๋จ์ํ ํฐ ๊ธฐ๋ฅ์ ์ฌ๋ฌ ๊ฐ์ ์์ ๊ธฐ๋ฅ์ผ๋ก ๋๋๋๋ค.
๊ทธ ์์ ์์ ๋ด ๋์๋ @faiface if err != nil
์ฌ์ฉํด์ผํ์ง๋ง ์ ํธ๋์ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋๋๋ก (๊ตฌ์กฐ์ฒด ์ด๊ธฐํ์ ๊ฒฝ์ฐ์ ๊ฐ์ด) ์ฌ๋ฌ ํจ์๋ก ๋ถํ ํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด ์๋๋๋ค. ๊ทธ๋๋ ์ข ๊น๋ค๋ก์์ง๋ ๊ฒ ๊ฐ์์.
์ ๋ ์ฌ์ค try
์ ๋ํด ์ํผ๋ ์๋์ง๋ง, ๊ทธ๋ ๋ค๊ณ ํด์ ์ด๋ ฌํ ์ง์ง์๋ ์๋๋๋ค. ๋ค๋ฅธ ๋ ๋์ ์๋ฃจ์
์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@deanveloper
๊ทธ๋ฌ๋ ๋๋๋ก (๊ตฌ์กฐ์ฒด ์ด๊ธฐํ์ ๊ฒฝ์ฐ์ ๊ฐ์ด) ์ฌ๋ฌ ํจ์๋ก ๋ถํ ํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด ์๋๋๋ค.
์ฌ์ค์ด์ง๋ง ํ์ํ ๋ชจ๋ ํน์ ์ฅ์์ด parseField
์์ ๋์ค๊ธฐ ๋๋ฌธ์ ๋ค๋ฅด๊ฒ ์ฅ์ํ ํ์๋ ์์ต๋๋ค.
๋ค๋ฅธ ๋ ๋์ ์๋ฃจ์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ถฉ๋ถํ ๊ฐ๋ฅํฉ๋๋ค! ๋ ๋์ ์๋ฃจ์
์ด ๋ณด์ด๋ฉด try
๋ถ ์์
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ์ ํจ์๋ ๊ณ ์ ํ ์ปจํ ์คํธ๋ฅผ ์ ๊ณตํด์ผ ํ๋ฏ๋ก ํจ์ ๋ด์ ๋ชจ๋ ์ค๋ฅ์ ๋ํด ๋์ผํ ์ฅ์์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
@faiface ๋๋ ์ด ๋ง์ ๊ฐ๋ ฅํ๊ฒ ๋์ํ์ง ์์ต๋๋ค. ๋ชจ๋ ํจ์๋ ํธ์ถ ์คํ์ ์๋ ๋ค๋ฅธ ํจ์์ ํ์ ํจ์์ ๋๋ค. ์ด๋ ์ค๋ฅ ์ฒ๋ฆฌ ํ๋ฆ์์ ๋์ผํ ์ฑ ์์ด ์์์ ์๋ฏธํฉ๋๋ค(์ฆ, ์์ ๋ฒ์์ ์ค๋ฅ ์ปจํ ์คํธ๋ฅผ ์ ๊ณตํจ).
๋ ๊ฐ์ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ๋จ์ผ ํ์ผ์ ์ถ๊ฐํ๋ ํจ์๋ฅผ ์์ํด ๋ณด์ญ์์ค. 'ํ์ผ์ ์ธ ์ ์์' ๋ฌธ์ ๊ฐ์ ํ ๋ฐํํ๋ ๊ฒฝ์ฐ ํด๋น ์ถ๊ฐ ์ค ์ด๋ ๊ฒ์ด ์คํจํ๋์ง ์ด๋ป๊ฒ ๊ตฌ๋ณํ ์ ์์ต๋๊น?
์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ผ๋ฅธ ์กด์ฌ์ ๋๋ค. ๋๋ ํ ์๋ง ์๋ค๋ฉด ํ ๋ฒ ํด๋ณด๊ณ ์ถ๋ค. ๊ทธ๋ฆฌ๊ณ ์, Go๋ก ๋ชจํ์ ์์ํ ๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ฝ๊ฐ ๋ฒ๊ฑฐ๋กญ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๋ช ๋ ํ์ ๋ด ๊ฒฌํด๊ฐ 180๋ ๋ฐ๋์์ง๋ง ์ฐ์ตํฉ๋๋ค. Go์ ํ์ฌ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ฑ ์๊ฐ ์๋ ํ๋ก๊ทธ๋๋ฐ๊ณผ ์ข์ ๋์์ธ์ ์ด์งํ๋ค๊ณ ์๊ฐํฉ๋๋ค. IMHO ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฝํ์ํค๋ ๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ ์ถ๊ฐํ๋ ๊ฒ์ ํฐ ์คํจ์ ๋๋ค.
@mklimuk ๋ด ์๊ฒฌ์ ํต์ฌ ๋ถ๋ถ์ "๋๋ถ๋ถ์ ์๊ฐ"์
๋๋ค. ๋น์ ์ด ์ ๊ณตํ ์์ ๋ ์๋ง๋ if err != nil
์ํด ๊ฐ์ฅ ์ ์ฒ๋ฆฌ๋ ๊ฒ์
๋๋ค. ์ฌ๋ฌ ๋ฒ ์ธ๊ธํ๋ฏ์ด try
๋ ๋ชจ๋ ์ํฉ์ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ํฉ๋ง ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฆ๊ฑฐ์ ๋ฐ๋ฅด๋ฉด ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋์ 70%๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก try
์ฌ์ฉํ ์ ์๊ณ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋์ 59%๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์ผ์์.
@faiface try
๊ฐ ๋ช
์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋์ฒดํ ์ ์๋ค๋ ์ฌ์ค์ด ๋ฐ๋์ ๊ทธ๋์ผ ํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ์ ๊ฒฝ์ฐ์๋ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒ์ '๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ํฉ'์ด ์๋๋๋ค. ๋ฐ๋์
๋๋ค :)
์ด ์ค๋ ๋์ ์ฐฌ์ฑํ๋ ์ฌ๋๋ค์ ์ด ์๋ก์ด ์ง์ ์ด Go ์ฝ๋๋ฅผ ๋ ์ฅํฉํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ์๋ Go ๋์์ธ(๋จ์์ฑ, ๋ช ํ์ฑ ๋ฑ) ๋ค์ ์๋ ๋ชจ๋ ๋ ธ๋ ฅ์ ๋ง์น ๊ฒ์ด๋ผ๊ณ ์ฐ๋ คํ๊ณ ์์ต๋๋ค.
๋ฌผ๋ก ์
๋๋ค. ํ์ง๋ง try
๋ ์ปจํ
์คํธ ์์ด ์ค๋ฅ๋ฅผ ๋ฐํํ๊ธฐ ์ํ ๊ฒ์ด ์๋์ ์ดํดํ์๊ธฐ ๋ฐ๋๋๋ค. ์ค์ ๋ก ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ(ํจ์๋น ํ๋์ ์ปจํ
์คํธ)๋ try
ํฌ๊ฒ ๋จ์ํ๋ฉ๋๋ค.
func doSomething() (err error) {
defer fmt.HandleErrorf(&err, "doing something")
x := try(oneThing())
try(anotherThing(x))
// ...
}
๊นจ๋ฌ์์ผ ํ ๊ฒ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ oneThing()
๋ฐ anotherThing()
๊ฐ ์์ฒด์ ์ผ๋ก ์ถฉ๋ถํ ์ปจํ
์คํธ๋ฅผ ๋ฐํํ๋ฏ๋ก ๊ฐ๋จํ "doing something: ..."
๋ก ๋ํํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ๋ค๋ ๊ฒ์
๋๋ค.
์ฐธ๊ณ ๋ก _who_๊ฐ ์ฅ์์ ์ํํ๋ ๋ฐ ๋ช ๊ฐ์ง ๊ท์น์ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. stdlib์์ ์ผ๋ถ ํจ์๋ copy: x to y
๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ์ํํฉ๋๋ค. ์ธ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ธ์ ์ผ๋ก ํธ์ถ์์๊ฒ ์ฅ์์ ๋งก๊ฒผ์ต๋๋ค.
์๋ฅผ ๋ค์ด Copy()
๊ฐ ์๋ ๊ฒฝ์ฐ return errors.Wrap(err, "writing")
์ ๊ฐ์ ์์
์ ์ํํ๊ณ Copy()
์ฌ์ฉํ๋ ํธ์ถ์๋ errors.Wrapf(err, "copying from %v to %v", src, dst)
๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ผ๋ก ๋ํํฉ๋๋ค.
์ด ๋ ๊ฐ์ง๋ ๋๋ฌด ์ ์์ด์ง ์๊ณ ๋๋ก๋ ์ค๋ณต ๋ฌธ์์ด๋ก ๋๋ ์ ์์ต๋๋ค. stdlib ์คํ์ผ์ด ๊ด์ฉ์ ์ด๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๊น? ํ์ง๋ง ๋ชจ๋๊ฐ ์ด๋ฐ ํ๋์ ํ๋์ง๋ ๊ธฐ์ต๋์ง ์๋๋ค. ๋๋ ๊ทธ๊ฒ์ด @faiface ์ ์๊ฐ
๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ฅ์์ ํธ์ถ์์๊ฒ ๋งก๊ฒผ์ต๋๋ค. ์ธ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์. ์๋ฅผ ๋ค์ด HTTP ์์ฒญ์์ JSON ๋ณธ๋ฌธ์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ํค๋๋ฅผ ํ์ธํ๋ ๋ฑ์ ๊ธฐ๋ฅ์ ๊ณ ๋ คํ์ญ์์ค. ๊ตฌ๋ฌธ์ ์๋ชป๋ JSON์ด ์ ๊ณต๋๋ฉด ํด๋น ์ฑ ์์ ์ค์ ๋ก ํ ์ ์๋ ์ผ์ ์ค๋ฅ๋ฅผ ๋ค์ ๋ณด๊ณ ํ๋ ๊ฒ์ ๋๋ค. _caller_๋ API์ ์ด๋ค ๋ถ๋ถ์ด ํธ์ถ์ ์๋ํ๋์ง ์๊ณ ์์ผ๋ฉฐ, ์ฐจ๋ก๋ก ์ค๋ฅ๋ฅผ ์ฒด์ธ ์๋ก ์ ๋ฌํ๊ฑฐ๋ HTTP ์ค๋ฅ๋ฅผ ๋ฐํํ๊ธฐ ์ ์ ๊ทธ์ ๋ฐ๋ผ ์ค๋ฅ๋ฅผ ์ฅ์ํด์ผ ํฉ๋๋ค.
ํจ์๊ฐ ์ฌ๋ฌ ์์น์์ ์ฌ์ฉ๋ ์ ์๋ ๋ฒ์ฉ ์ฝ๋๋ฅผ ์ค์ ๋ก ์ ์ธํ๋ฉด ์ค๋ฅ๋ฅผ ์ฅ์ํ๋ ๋ฐ ํ์ํ ์ ๋ณด๊ฐ ์์ต๋๋ค. ๋ฐ๋๋ก ๋ชจ๋ ์ปจํ ์คํธ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋ ๋ฆฝ ์คํํ ํจ์๋ก ์๋ฏธ๊ฐ ์๋ ํจ์๊ฐ ์๋ ์ ์์ต๋๋ค. ์ฝ๋๋ฅผ ๋ถํ ํ์ฌ ์ค์ ๋ณด๋ค ๋ ์ ์ ๋ฆฌ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ ํจ์๋ฅผ ๋ง๋๋ ๊ฒ์ผ ๋ฟ์ ๋๋ค.
@lpar Mind๊ฐ ์ด์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์๋ฅผ ์ ์ํฉ๋๊น?
์ด๋ฏธ ๊ตฌ์ฒด์ ์ธ ์๋ฅผ ๋ค์์ต๋๊น? parseJSON ํจ์๊ฐ ์ค์ ๋ก ์ปจํ ์คํธ๋ฅผ ์๊ณ ์๊ณ ๋ณธ๋ฌธ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ API ์๋ํฌ์ธํธ ๋ฐ ํ๋ ํ๋ฆ์ ์ฅ์ํ ์ ์๋์ง ๊ณ ๋ คํ์ญ์์ค. ์ด๋ ํด๋น ์๋ํฌ์ธํธ์๋ง ํด๋น๋๊ฑฐ๋ ์ค๋ฅ๋ฅผ ๋ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋๋ก ์ ๋ณด๋ฅผ ์ ๋ฌํ์์ ์์ํฉ๋๋ค.
@lpar ์ข์ต๋๋ค. if err != nil
๊ฐ ๊ณ์ ์ฌ์ฉ๋๋ ๋ ๋ค๋ฅธ ์์
๋๋ค. ๋๋ ๋
ผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๊ธฐ๋ฅ์ผ๋ก ๋ถํ ํฉ๋๋ค.
๊ทธ๋ฌ๋ try
๊ฐ ์ ์ ํ์ง ์์ ์๋ฅผ ์ ์ํ๋ ๊ฒ์ try
์ ๋ํ ๋
ผ์์ด ์๋์ ์ดํดํ์ญ์์ค. try
๋ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋์ฒดํ๊ธฐ ์ํ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์
๋๋ค.
@abejide001 try
์ ์์ ๋ค๋ฅธ ๋ง์ ์ธ์ด์ ์ ํต์ ์ธ "try/catch"๊ฐ ์๋๋ผ Rust์ try!
๋งคํฌ๋ก์ ํจ์ฌ ์ ์ฌํฉ๋๋ค. ์ข์ ๋ฐ ๋กค
์ฃ์กํฉ๋๋ค. ์๋ชป๋ ๋ฌธ์ ์ ๊ฒ์๋์์ต๋๋ค. https://github.com/golang/go/issues/32437#issuecomment -509024693์ผ๋ก ์ด๋ํ์ต๋๋ค.
๋๋ ์ต๊ทผ์ try
๋งคํฌ๋ก๊ฐ ๊ฐ์ง๊ณ ์๋ ์ํํ ์ค์ฒฉ ๊ธฐ๋ฅ์ ๋ํ ๋ด ์๊ฒฌ ๋ถ์ผ์น์ ๊ธฐ๋ฐํ #32968 ์ ์์ ๊ฒ์ํ์ต๋๋ค. ์ฌ๊ฐํ ๊ฒฐ์ ์ด ์๊ธฐ๋ฅผ ๋ฐ๋ผ์ง๋ง, ๋๋ ์๊ฐ๋ก์ ์ด๋ค ๊ฒ๋ ๋ณผ ์ ์๋ ์ ์์๊ฐ ์๋๋ค. ๊ทธ๋์ ์ ๋ ์ _์๋ํ์ง ๋ง์ญ์์ค_ ์บ ํ(๋น์ :)์๊ฒ ๊ทธ๊ฒ์ ๋ณด๊ณ , ํ๊ฐํ๊ณ , ์๊ฒฌ์ ๋งํ๋๋ก ์์ฒญํ๊ณ ์ถ์ต๋๋ค.
๋ฐ์ท:
check
๋งคํฌ๋ก๋ ํ ์ค์ง๋ฆฌ๊ฐ ์๋๋๋ค .๋ด์ฅ๋์ด ์์ผ๋ฉฐ ํ ์ค์ ์ค์ฒฉ๋์ง ์์ผ๋ฉฐ try
๋ณด๋ค ๋ ๋ง์ ํ๋ฆ์ ํ์ฉํ๊ณ ๋ด๋ถ ์ฝ๋์ ๋ชจ์์ ๋ํด ๊ธฐ๋ํ์ง ์์ต๋๋ค. ๋ฒ๊ฑฐ๋ฒ์ ๋ฐํ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
// built-in 'check' macro signature:
func check(Condition bool) {}
check(err != nil) // explicit catch: label.
{
ucred, err := getUserCredentials(user)
remote, err := connectToApi(remoteUri)
err, session, usertoken := remote.Auth(user, ucred)
udata, err := session.getCalendar(usertoken)
catch: // sad path
ucred.Clear() // cleanup passwords
remote.Close() // do not leak sockets
return nil, 0, err // dress before leaving
}
// happy path
// implicit catch: label is above last statement
check(x < 4)
{
x, y = transformA(x, z)
y, z = transformB(x, y)
x, y = transformC(y, z)
break // if x was < 4 after any of above
}
๊ทธ๋ฌ๋
try
๊ฐ ์ ์ ํ์ง ์์ ์๋ฅผ ์ ์ํ๋ ๊ฒ์try
์ ๋ํ ๋ ผ์์ด ์๋์ ์ดํดํ์ญ์์ค.try
๋ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋์ฒดํ๊ธฐ ์ํ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ ์ try
๋ ๋ด ์ค๋ฅ ๋ฐํ์ ํ ์๋ฆฌ ๋ฐฑ๋ถ์จ(*)์๋ง ์ ํฉํ๋ฏ๋ก ๋ ๋์ ๊ฒ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
(*) ๊ทธ๋ฆฌ๊ณ ์ฌ์ค, ๋๋ ๋ค์ดํค๋ err
๋ฐํ ์ธ์คํด์ค๊ฐ ์์ ๋์ด์ผ ํ ์ค๋ฅ์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๊ณ ์๊ฐํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. "if err != nil"์ ๊ทธ๋๋ก ๋์ญ์์ค.
@abejide001
try
์ ์์ ๋ค๋ฅธ ๋ง์ ์ธ์ด์ ์ ํต์ ์ธ "try/catch"๊ฐ ์๋๋ผ Rust์try!
๋งคํฌ๋ก์ ํจ์ฌ ์ ์ฌํฉ๋๋ค. ์ข์ ๋ฐ ๋กค
์ด๊ฒ๋ง์ผ๋ก๋ ์ ์๊ฒ๋ ๊ฑฑ์ ๊ฑฐ๋ฆฌ์
๋๋ค. Go๋ ์ด๋ฏธ ์ด๋ณด์๋ค์๊ฒ ์์ํ ์ธ์ด์
๋๋ค. ์ด์ try
์ ๋ง์ถค ๋ก์ง์ด ์๋ ์ด์ ๋ฅผ ์ค๋ช
ํด์ผ ํฉ๋๋ค. FWIW, ๋๋ "Rust๊ฐ ๊ทธ๊ฒ์ ํด๋๋ค"๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ์ธ์ด์ ์ด๋ค ๊ฒ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ ๋นํํ๋ ๊ฑด์ ํ ์ด์ ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋จ์ง ์ ์๋ ค์ง์ง ์์์ ๋ฟ์
๋๋ค.
@ ๊ธฐ๋ฅ์ ์ ๋นํํ๊ธฐ ์ํด ๋งํ ๊ฒ์ด ์๋๋ผ ๊ธฐ๋ฅ์ด ๋ฌด์์ํ๋์ง ๋ช
ํํํ๊ธฐ ์ํด ๋งํ ๊ฒ์
๋๋ค. ์ ๋ try
์ ์์ ์ค๊ฐ์ ํ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ด ํฐ ์ฐจ์ด๋ฅผ ๋ง๋๋ ๊ฒ์ ์๋์ง๋ง ๋งคํฌ๋ก ๋์ ํค์๋๋ฅผ ์ฌ์ฉํ๋๋ผ๋ Swift์ ๊ธฐ๋ฅ์ด๊ธฐ๋ ํฉ๋๋ค.
์๋๊ฐ ์ ํํ ๋ฌด์์ ๋ฌ์ฑํ๋ ค๊ณ ํ๋์ง์ ๋ํด ์ฝ๊ฐ์ ํผ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. IMHO, ๋ฌธ์ ๋ ์ค๋ฅ๋ฅผ ํ์ธํ๋ ์ฌ๋ฌ if ๋ธ๋ก์ ์์ฑํ์ง ์๋ ๊ฒ์ ๋๋ค. ํ ๋ฒ ์์ฑํ๋ฉด ๋์ ๋๋ค. ๋ฌธ์ ๋ ์ด๋ฌํ ๋ธ๋ก์ด ์ฌ๋ฌ ๊ฐ ์๋ ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ฐ๊ธฐ๋ณด๋ค ์ฝ๊ธฐ๋ฅผ ๋ ๋ง์ด ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๋ธ๋ก์ ์ค์ ์ฝ๋์ ์ฝํ ์๊ธฐ ๋๋ฌธ์ ์ค์ ์ฝ๋๋ฅผ ๋๋ ํํฉ๋๋ค. ์ค์๊ฐ์์ผ๋ก ๋๋ถ๋ถ์ ๊ฒฝ์ฐ if ๋ธ๋ก ๋ด์ ์ด๋๊ฐ์ ์ฝ๊ฐ์ ๋ฌธ์์ด ์ฐจ์ด๋ง ์์ ๋ฟ ๊ฑฐ์ ๋์ผํฉ๋๋ค.
๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ค๋๋ ์ํ ์ฒ๋ฆฌ ์ด์์ ์ ํธํ์ง๋ง ์ด๊ฒ์ ์ ์ด๋ ์ค๋ฅ์ ๋น์ฆ๋์ค ๊ฒฝ๋ก๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐ ์ข์ ์ญํ ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์นจ๋ด ์ฐ๋ฆฌ๋ ๊ฐ ํธ์ถ์ ๋ํด ๋ฐ๋๋๋ ๋จ์ผ ํจ์ ๋ฒ์ ์ปจํ ์คํธ๋ฅผ ๊ฐ์ง ์ ์์ ๊ฒ์ ๋๋ค. ์ด๋ ํ์ฌ ์์ ์ค๋ฅ์ ๋์ผํ ๊ฒ์ ๋ฐ๋ณตํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
@icholy ๋ ๋ค์
๋ณด๋ค ๊ฐ์ํ๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๋ ์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ์ด ์๋์ ์ผ๋ก ๋ง์์ต๋๋ค(์ฐ๊ฐ ์ค๋ฌธ์กฐ์ฌ์์). Go ํ์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ต๋๋ค.
๋ฐฉ๊ธ ์ค๋ฌธ์กฐ์ฌ๋ฅผ ์ฌ๊ธฐ์์ ์ฐพ์์ต๋๋ค: https://blog.golang.org/survey2018-results
๋ถ๋ช ํ ์ง๋ฌธ์ "์ค๋ ๋ฐ๋์ ์ฌ์ฉํ๋ฉด์ ๊ฐ์ธ์ ์ผ๋ก ์ง๋ฉดํ ๊ฐ์ฅ ํฐ ๋์ ์ ๋ฌด์์ ๋๊น?"์์ต๋๋ค. ๊ฐ๋ฅํ ๋ต๋ณ "์ค๋ฅ ์ฒ๋ฆฌ"์ ํจ๊ป.
์ง๋ฌธ + ๋ต๋ณ์ ๊ธฐ๋ฐ์ผ๋ก ๋ ๊ฐ๋จํ ๊ตฌ๋ฌธ์ด ํ์ํ๋ค๊ณ ์ถ๋ก ํ๋์ง ์ง์งํ๊ฒ ๊ถ๊ธํฉ๋๋ค. '์ค๋ฅ ์ฒ๋ฆฌ'๋ผ๊ณ ๋๋ตํ์ ์๋ ์์ง๋ง ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ๋ณด๊ณ ์ถ์ง๋ ์์์ต๋๋ค. ์ค๋ฌธ์กฐ์ฌ์์ ์ด ์ต์ ์ ์ ํํ๋ค๋ฉด ์ค๋ฅ๋ฅผ ๋ํํ๊ณ ์คํ ์ถ์ ์ ์ ๊ณตํ๋ ๋ฑ์ ์์ ์ ๋ ์ ์ํํ ์ ์๋ค๊ณ ์๊ฐํ์ ๊ฒ์ ๋๋ค.
๋ด ์ ์์ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ ์์์ ๋ฌผ๋ฌ๋ ๋ ๊ฒ์ ๋๋ค(ํจ๊ณผ์ ์ผ๋ก
์ ๋ ๋ฐฉ๊ธ try ์ ์์ ์ดํด๋ณด์์ง๋ง, ์ ๊ฐ ๋์น๊ณ ์๋ ๊ฒ์ด ์๋ค๋ฉด "์์ฉ๋ฌธ if ๋ฌธ์ ์ ๊ฑฐํ๊ธฐ ์ํด [...}"๋ฅผ ์ ์ธํ๊ณ ์ ์๋๊ณ ์๋ _์ด์ _๋ฅผ ๋งํ๋ ๊ฒ์ ๋ฌด์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ด๋ฌํ ์์ฉ๊ตฌ๋ฅผ ์ ๊ฑฐํด์ผ ํ๋์ง์ ๋ํ ์ธ๊ธ์ ์์ต๋๋ค.
์์ ๋ด์ฉ์ ํ์คํ ๋์ํฉ๋๋ค. ์๋ก์ด ์ค๋ฅ ๊ฐ ๋ณ๊ฒฝ์ด ์ฌ๋๋ค์ด Go์ ๋ํด ๊ฐ์ง๊ณ ์๋ ์ค๋ฅ ์ฒ๋ฆฌ ๋ถ๋ง์ ๋๋ ๋ฐ ๋์์ด ๋๋์ง ๋ด ์๋ค. ๊ทธ๋ฌ๋ฉด ๋ ๊ฐ๋จํ ๊ตฌ๋ฌธ์ด ํ์ํ์ง ํ์ธํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ ์ฌ๋๋ค์ ๋ฐํ๋ ๋ชจ๋ ์ค๋ฅ์ ์ฃผ์์ ๋ฌ์์ผ ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ try
์ ๋ํด ๋
ผ์ํ๊ณ ์์ต๋๋ค. ํ์ค์ ํ์ฌ ์ฝ๋ ๋ชจ์(ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌํจ)์์ ๋์ ๋น์จ์ ์ค๋ฅ ๊ฒ์ฌ๊ฐ ~bare~ ์ฃผ์ ์ฒ๋ฆฌ๋์ง ์์ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ณ try
์ด์ ์ ์ป์ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ฝ๋ ๊ฐ ์ด๋ ํด์ผ ํ๋์ง์ ๋ํ ๋น์ ์ ๋ฏฟ์์ ์ฝ๋ IS ์ ์๋ฌด ๊ด๋ จ์ด ์์ต๋๋ค. ๋น์ ์ ๋๊ทธ๋ง๋ฅผ ์ด๋ ค์ฃผ์ธ์.
@icholy ์ค๋ฅ ๋ฌด์๋ ๊ฐ๋ฐ์๊ฐ ํด๋น ์ค๋ฅ์ ๊ด์ฌ์ด ์์์ ๋ํ๋ ๋๋ค. ์ค๋ฅ๊ฐ ์ค์ํ์ง ์๊ฑฐ๋ ํธ์ถ์๊ฐ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด "์๋"๋ ๋ฌด์๋ฏธํ๊ณ ํธ์ถ์๋ ๋จ์ํ "์๋"์ ํจ์๋ฅผ ๋ํํ์ง ์์ ๊ฒ์ ๋๋ค.
๋ด ์ ์์ ๋ชจ๋ ์ค๋ฅ ์ฒ๋ฆฌ ์ ์์์ ๋ฌผ๋ฌ๋ ๋ ๊ฒ์ ๋๋ค(ํจ๊ณผ์ ์ผ๋ก
๋๋ ์ด๊ฒ์ ๊ฐ๋ ฅํ๊ฒ ๋์ํฉ๋๋ค. Go ์ค๋ฅ ์ฒ๋ฆฌ์ ๋ํ ๊ฐ์ ์ฌํญ์ด ์ง์๋์ด์ผ ํ๋ ๊ธฐ๋ฅ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๋ถ์ผ์น๊ฐ ๋ง์ด ์์ต๋๋ค. ์ฌ๋๋ค์ด ์ธ๊ธํ๋ ๊ธฐ๋ฅ์ ๋ชจ๋ ๋ค๋ฅธ ๋ถ๋ถ์ ์ด๋ฆ๊ณผ ๊ตฌ๋ฌธ์ ๋ํด ๋ฐ์ดํฌ์๋ฉ์ ์ ๋ฐํ๋ฏ๋ก ๋ ผ์๋ ์๋ฌด๋ฐ๋ ์งํ๋์ง ์์ต๋๋ค.
๋ ๊ด๋ฒ์ํ Go ์ปค๋ฎค๋ํฐ๊ฐ ์ ์๋ ์๋ก์ด ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์์ ์ค์ ๋ก ์ํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๋ ์์ธํ ์๊ณ ์ถ์ต๋๋ค.
๋๋ ์ฌ๋๋ค์ด ์ ์ํ๋ ๊ฒ์ ๋ณธ ๋ง์ ๋ค๋ฅธ ๊ธฐ๋ฅ, ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๋์ดํ๋ ์ค๋ฌธ ์กฐ์ฌ๋ฅผ ์์ฑํ์ต๋๋ค. ๋๋ ์ ์คํ๊ฒ ์ ์๋ ์ด๋ฆ์ด๋ ๊ตฌ๋ฌธ์ _์๋ต_ํ๊ณ , ๋ฌผ๋ก ๋ด ์์ ์ ์๊ฒฌ์ ์ ํธํ๊ธฐ๋ณด๋ค๋ ์ค๋ฌธ์กฐ์ฌ๋ฅผ ์ค๋ฆฝ์ ์ผ๋ก ๋ง๋ค๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค.
์ฌ๋๋ค์ด ์ฐธ์ฌํ๊ณ ์ถ๋ค๋ฉด ๊ณต์ ํ๊ธฐ ์ํด ์ถ์ฝ๋ ๋งํฌ๊ฐ ์์ต๋๋ค.
https://forms.gle/gaCBgxKRE4RMCz7c7
์ฐธ์ฌํ๋ ๋ชจ๋ ์ฌ๋์ด ์์ฝ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ๋๋ค์ด ์ค์ ๋ก ์ํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๋ ์ ์๊ฒ ๋๋ฉด try ์ ์์ด ๊ทธ๋ฌํ ๊ฒ์ ์ ๊ณตํ๋์ง ์ฌ๋ถ์ ๋ํด ์ง๋ฅ์ ์ธ ํ ๋ก ์ ํ ์ ์์ต๋๋ค. (๊ทธ๋ฐ ๋ค์ ๊ตฌ๋ฌธ ๋ ผ์๋ก ๋์ด๊ฐ ์๋ ์์ต๋๋ค.)
@lane-c-wagner ์ฃผ์์ด ์๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ๊ฒ์ ์ ํ ๋ฐํํ์ง ์๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ๋งํ๋ ค๋ ๊ฑด๊ฐ์? ํธ์ง: ์ด์ ๋๊ธ
@icholy ์ ์ ๊ฐ ์๋ชป ์ดํดํ์ต๋๋ค. "bare"๋ผ๊ณ ๋งํ์ ๋ "_"๊ฐ ์ค๋ฅ๋ฅผ ๋ฌด์ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ด ์ ์์ ์ด๋ค ์กฐ์น๋ ์ ํจํ ์กฐ์น๊ฐ ๋์ด์๋ ์ ๋๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ด ๋ณ๊ฒฝ์ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ๋๋ฌธ์ ์ธ์ด์ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ํฅ์ ์ค๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ฅ ํฐ ์ฅ์ ๋ฌผ์ ์๋ณํ๋ ์ค๋ฌธ์กฐ์ฌ๋ ์ฌ์ ํ ์ปค๋ฎค๋ํฐ์ ์ด ์ฅ์ ๋ฌผ์ ๊ณ ์น ๊ฐ์น๊ฐ ์๋์ง ๋ฌผ์ด๋ด์ผ ํฉ๋๋ค. ์ด ์ ์์ ๊ทธ๋ฌํ ์ง๋ฌธ์ ๋ํ ๊ฐ์ฅ ๊ฐ๊น์ด ํ๊ฐ์ ๋๋ค.
"๋ชจ๋๊ฐ ๋ฌด์ํด๋ ์ข๋ค" try
๋ผ๋ ๋ง์ ์ด์ ๊ทธ๋งํ์ธ์. ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ฑํ ์ฝ๋๋ฅผ ์ฝ์ต๋๋ค.
@tv42 ์ฌ๊ธฐ ์์ ์ ๋ฅผ ๋ง์ ํ์๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ ๋ ๊ทธ๋ ๊ฒ ๋งํ๋๋ฐ ์์ ์ด ์์ต๋๋ค. ์ฒญ๊ตฌ๋ ๋๋ก ์ ์ฃ. ๊ทธ๋ฐ ์ผ๋ฐํ์ ์ข ๋ ์ ์ค์ ๊ธฐํ๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌ ํด์.
@griesemer ์ค๋ฌธ์กฐ์ฌ๊ฐ ๋ง์ด ๋ถ์กฑํ์ต๋๋ค. ๋๋ ์ค๋ฅ ์ฒ๋ฆฌ์ ํฌํํ์ง๋ง ๋ด๊ฐ ์๋ฏธํ๋ ๋ฌธ์ ๋ ์ฅํฉํ ๊ฒ์ด ์๋๋ผ ์์ ํ ์ ํ์ ์์ ์ฑ์ด์์ต๋๋ค. ์ค๋ฅ์ ๋ํด์๋ง ๋ค๋ฅธ ๊ฒ์ ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ ์ฌ์ ํ ํฉ๊ณ ์ ํ์ ์ํฉ๋๋ค.
์ด๊ฒ์ ํ์ฌ gofmt๊ฐ err != nil์ธ ๊ฒฝ์ฐ ํ์์ ์ง์ ํ๋ ๋ฐฉ์์ ๋ํ ์ ์์ ๋๋ค.
(์ด๋ try() ์ ์์ ๋ํ ์๊ฒฌ์ด ์๋๋๋ค.)
if ๋ฌธ์ด ๋ค์๊ณผ ๊ฐ์ด nil์ด ์๋ ํ ์ค ์ค๋ฅ ๊ฐ์ ๋ฐํํ๋ ๊ฒฝ์ฐ:
err := myFunc()
if err != nil {
ย ย ย ย return err
}
gofmt๋ ์์ฒด if ๋ฌธ ๊ท์น์ ์ํํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ํ ์ค์ ํ์์ ์ง์ ํ ์ ์์ต๋๋ค.
err := myFunc()
if err != nil { return err }
์ธ ์ค์ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ํ ์ค๋ก ๋ฉ๋๋ค. ๋ ๋ณต์กํฉ๋๋ค. ํ๋ก๊ทธ๋จ ํ๋ฆ์ ๋ฐ๋ผ๊ฐ๊ธฐ ์ฝ์ต๋๋ค.
์ด๊ฒ์ผ๋ก ์ (๋ง์ฅ๋ ์ธ์ )์ ๊ทธ๋ฆด ์์น์ ๋ํ ํ๋จ์ด ํ์ํ ๊ฒ์
๋๋ค.
gofmt ๊ท์น ๋ณ๊ฒฝ. ๋ค์๊ณผ ๊ฐ์ ์ฅ์์ด ํฌํจ๋ ์ ์์ต๋๋ค.
err := myFunc()
if err != nil { return fmt.Errorf("myFunc() blew up! %v", err }
๊ทธ๋ฌ๋ ์ ๊ตํ ๋ค์ค ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ ๊ทธ๋๋ก ์ ์ง๋์ด์ผ ํฉ๋๋ค. ๋ค์ค ํ ๋ฐ ๋ช ํํ๊ณ ๋ช ์์ ์ ๋๋ค.
_try_ ์ ์์ด ์ฒ ํ๋์์ต๋๋ค: https://github.com/golang/go/issues/32437#issuecomment -512035919
์ ๋ค๋ฆญ ๋๊ตฌ?
์ด๊ฒ์ ํ์ฌ gofmt๊ฐ err != nil์ธ ๊ฒฝ์ฐ ํ์์ ์ง์ ํ๋ ๋ฐฉ์์ ๋ํ ์ ์์ ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์๋ํ์ง๋ง ์ฝ๋๋ ์ฌ๋ฌ ์ค ํ์์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์ฝ์ ์ ์์ต๋๋ค. ์๋๋ ๊ทธ ์๋ฃจ์ ๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค.
์ฌ๊ธฐ์ IMO ๋ฌธ์ ๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ํ๋๋ ๋ฐฉ์ ์ด ์๋๋ผ ๋ฌด์ ๋๋์ง ์ฌ๋ถ์
๋๋ค. if err != nil
๊ตฌ๋ฌธ์ ๊ทธ๋๋ก ๋๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง Error
๋ฐํ์ ๋ํ ๋ฌด์ง๋ฅผ ์ ํํ ์ ์์ต๋๊น? ๋ ๊ฑฐ์ ์ฝ๋์ ๋ํ ์ฌ๊ฐ๋ ์ต์
์ด ์๋ ์ปดํ์ผ๋ฌ ๊ฒฝ๊ณ /์ค๋ฅ๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ฌ๊ธฐ์ IMO ๋ฌธ์ ๋ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ์ํ๋๋ ๋ฐฉ์ ์ด ์๋๋ผ ๋ฌด์ ๋๋์ง ์ฌ๋ถ์ ๋๋ค.
if err != nil
๊ตฌ๋ฌธ์ ๊ทธ๋๋ก ๋๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋งError
๋ฐํ์ ๋ํ ๋ฌด์ง๋ฅผ ์ ํํ ์ ์์ต๋๊น? ๋ ๊ฑฐ์ ์ฝ๋์ ๋ํ ์ฌ๊ฐ๋ ์ต์ ์ด ์๋ ์ปดํ์ผ๋ฌ ๊ฒฝ๊ณ /์ค๋ฅ๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
๋ง์ ์ฌ๋๋ค์ด ๋ฌด์๋ ์ค๋ฅ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฆฐํฐ๋ฅผ ์ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ์ด๋ ค์ด ์ค๋ฅ๋ก ๋ง๋๋ ๊ฒ์ ์ ํธํ์ง๋ง ์ด๋ฏธ ์์ฑ๋ ์๋ง์ ๋ ๊ฑฐ์๋ฅผ ๋ณด๋ฉด linter๋ ๊ณต์ ํฉ๋๋ค.
https://github.com/kisielk/errcheck ์ฒ๋ฆฌ๋์ง ์์ ์ค๋ฅ @plyhun @sorenvonsarvort ์ ๋ํด ์๋ ค์ฃผ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
#32437์ ๋ํ ํ ๋ก ์์ ๋ณผ ์ ์๋ฏ์ด ์ด ์ ์์ ํ์ฌ๋ก์๋ ์ฌ์ค์ ์๋ฝ๋์์ต๋๋ค. ํ์. ๋ฌธ์ ๊ฐ ๋ค์ ๋ฐ์ํ๋ฉด ์ ์ ์์ ์ด ์ ์์ต๋๋ค.
๋๋ ๋ง์ ์ ์์ด ์ณ์ง ์๋ค๊ณ ๋๋ผ๋ ์ด์ ์ค ํ๋๊ฐ ์ค์ ๋ก ๋์์ ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ์์ํ์ต๋๋ค. ํํธ์ผ๋ก๋ ๊ฑฐ์ ๋ชจ๋ ํจ์ ํธ์ถ ํ์ err != nil
๋ธ๋ก์ ์ฌ์ฉํ๋ฉด ํ์คํ ์ฅ์ ์ด ์๊ธฐ๋ ํ์ง๋ง ์ฝ๋ ํ๋ฆ์ด ์ด์ํ ๋ฐฉ์์ผ๋ก ์ค๋จ๋ ์ ์๋ค๋ ๊ฒ์ด ์ฌ์ค์
๋๋ค. ๋ฌธ์ . ๋ค๋ฅธ ๋ฌธ์ ๋ ๊ด๋ จ ์ค๋ฅ ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ฌ๋ฌ ๋ฐํ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋นํ ํฌ๋ฐํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
์ฌ๋ฌ ๋ฐํ ํจ์๋ ๊ฒ๋ณด๊ธฐ์ ์์ ์ฐจ์ด์๋ ๋ถ๊ตฌํ๊ณ ๋จ์ผ ๋ฐํ ํจ์์ ๋งค์ฐ ๋ค๋ฅด๊ฒ ๋๊ปด์ง๋๋ค. ํ๋ ์ด์์ ์ธ์๋ฅผ ์ทจํ๋ ํจ์ ํธ์ถ์ ์ถ๊ฐ ์ ํ์ด ์๋ ๊ฒฝ์ฐ์ ๊ฐ์ต๋๋ค. ๊ฐ๋ ๋ํ๋ ๊ฒ์ด ๋งค์ฐ ์ด์ํ๊ฒ ๋๊ปด์ง๋๋ค. ์ฌ๋ฌ ๋ฐํ ๊ฐ์ด ์๋ ํจ์๋ฅผ ํธ์ถํ ๋ ๊ฑฐ์ ํญ์ ์์ฒด ํ์์ ํธ์ถํด์ผ ํ๋ฉฐ :=
์ ๊ฒฐํฉ๋์ด ๋ค๋ฅธ ๊ณณ์์ ๋
ผ์๋ ๋ค์ํ ๋ณ์ ์๋์ ๋ฌธ์ ์ ์ฃผ์ ์์ธ์ด ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. . ๋ฉ์๋ ํธ์ถ์ ์ฐ๊ฒฐํ๊ฑฐ๋ ๊ฐ์ ์ค์ ์๋ ๊ตฌ์กฐ์ฒด ํ๋์ ์ ๋ณ์์ ์ง์ ํ ๋นํ ์ ์์ต๋๋ค.
๋ชจ๋ฅด๊ฒ ์ด์. ์ ๋ง ๊ทธ๋ด ์๋ ์์ด์. ํ์ง๋ง ์ ๋ ๊ฑฐ์ 10๋ ๋์ Go๋ฅผ ์ฌ์ฉํด ์์ผ๋ฉฐ ์ฌ๋ฌ ๋ฐํ์ด ์๋ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์ฌ์ ํ ๊ฐ๋ ์ด์ํ๊ฒ ๋๊ปด์ง๋๋ค.
๊ฐ์ฌํฉ๋๋ค!
์ค์ ๋ก ํ๋ ๊ฐ์ ๋ฌธ์ ์ ์์ต๋๋ค if err != nil
์ ๋ฒ์ err
์ด์์ํด์ผ๋ณด๋ค ๋ ์ด ์ ์์ต๋๋ค. if
์ธ๋ผ์ธํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง๋ง ๋ชจ๋ ์ผ์ด์ค๋ฅผ ์ธ๋ผ์ธํ ์ ์๋ ๊ฒ์ ์๋๋๋ค.
if err := foo(); err != nil {
if _, err := bar(); err != nil {
md5-6a135eb952fe7b24b3389cb16d3244a1
a, err := bar()
if err != nil {
md5-d52f811d3e31bb368bd8045cfb2e93b4
var err error
baz.A, err = bar()
if err != nil {
err
๋ณ์๋ if err != nil {}
๋ธ๋ก์ด ์๋ฃ๋ ํ ํจ์ ๋ฒ์์ ์กด์ฌํ์ง ์์์ผ ํฉ๋๋ค. ๋ค์์ https://github.com/golang/go/issues/33161 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ try()
์ ์์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ ์ ์์
๋๋ค . ๊ฑด์ค์ ์ธ ํผ๋๋ฐฑ์ ์ํฉ๋๋ค.
if err != nil {} ๋ธ๋ก์ด ์๋ฃ๋ ํ์๋ err ๋ณ์๊ฐ ํจ์ ๋ฒ์์ ์์ด์ผ ํฉ๋๋ค.
if ๋ธ๋ก์ด ์๋ฃ๋ ํ์ ์ "์กด์ฌํ์ง ์์์ผ"ํฉ๋๊น? ์ปดํ์ผ๋ฌ๋ ์ด๋ฅผ ์ํด ์ต์ ํํ ์ ์์ผ๋ฉฐ(ํ์ํ๋ค๊ณ ์๊ฐ๋๋ ๊ฒฝ์ฐ) err := stmt()\nif err != nil {} ๋ธ๋ก์ด ์๋ฃ๋ ๋ ๊ฑฐ์ ํญ์ ํจ๊ป ์งํ๋๊ธฐ ๋๋ฌธ์ ์ ์ ์ ๋ถํ๊ฐ ์์ต๋๋ค.
๋๋ ์์ง ๋น์ ์ ์ ์์ ๊น์ด ์๊ฒ ์ดํด๋ณด์ง๋ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ ์๊ฒฌ์์๋ ์ค๋ช ํ๋ฏ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ ์์ ํํค์น๊ธฐ ์ ์ ์ธ์๋ ๋ฌธ์ ์ ๋ํด ๋ ๋ง์ ์ฐ๊ตฌ๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@Freeaqingme ์ค๋ฅ๋ if err != nil
๋ธ๋ก์ด ์๋ฃ๋ ํ ์กด์ฌํ์ง ์์์ผ ํฉ๋๋ค. ๋๋ถ๋ถ์ ์ด๋ฏธ ์กด์ฌํ์ง ์๋ ๊ฒ์ฒ๋ผ ํ๋ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
CopyFile ์์ ์๋ r, err := os.Open(src)
๋ค์์ w, err := os.Create(dst)
์์ต๋๋ค. ๋ ๋ฒ์งธ err
๋ ์ฒซ ๋ฒ์งธ
๋ค๋ฅธ ๊ธฐ์ดํ ๊ฒ๋ค๋ ์์ต๋๋ค. err := foo()
์ดํ์ bar.V, err = baz()
์ ๊ฐ์ ์ฝ๋๊ฐ ์๊ณ ์ฝ๋๊ฐ ๋ฆฌํฉํฐ๋ง๋๊ณ ๋ ์ด์ foo() ๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ baz
์์ var err error
๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. baz
๋ผ์ธ. . ํจ์์ ๋ค๋ฅธ ์์น๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ด ๊ทธ๋ฐ ๋ค๋ฅธ ์์น์ ์ํฅ์ ๋ฏธ์ณ์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ธฐ์ ์ ์ผ๋ก
r, err := os.Open(src)
if err != nil {
return ...
}
w, err := os.Create(dst)
err
์ ๋ ๋ฒ์งธ ์ธ์คํด์ค๋ ์ฒซ ๋ฒ์งธ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌ์ง ์์ต๋๋ค. ๊ทธ๋ค์ ์ค์ ๋ก ๊ฐ์ ๋ณ์์
๋๋ค. https://golang.org/ref/spec#Short_variable_declarations ์์ ๋ณ์ ์ฌ์ ์ธ์ ๋ํ ์ค๋ช
์ ์ฐธ์กฐ
ํจ์ doSomeThing() {
r, err := os.Open(ํ์ผ ์ด๋ฆ)
ํจ๋(fmt.Errorf(err, "ํ์ผ ์ด๊ธฐ ์คํจ: %s", ํ์ผ๋ช
)) //
์ฌ๊ธฐ๊ฐ ํจ๋์
๋๋ค.
}
2019๋ 10์ 10์ผ ๋ชฉ์์ผ ์ค์ 11์ 24๋ถ์ clearcode [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ต๋๋ค.
๋ด์ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฃผ์ฅํ๋ค()
์์:
func doSomeThing() ์ค๋ฅ {
r, err := os.Open(filename) assert(err, "failed to open file: %s", filename) // in this step, just return the error
resp,err := http.Get(someURL)
assert(์ค๋ฅ, "์์ฒญ ์คํจ")}
์ค๋ฅ๋ฅผ ๋ฐํํ์ง ์๋ ๋ ๋ค๋ฅธ ํจ์:
ํจ์ doSomeThing() {
r, err := os.Open(ํ์ผ ์ด๋ฆ)
assert(err, "ํ์ผ ์ด๊ธฐ ์คํจ: %s", filename) // ์ฌ๊ธฐ์ ํจ๋์ ๋๋ค.}
๋ฐ๋ผ์ assert(error, args ...interface{})๊ฐ ๋ค์๋ณด๋ค ๋ซ์ต๋๋ค. if err != nil ; {
๋ฐํ ์ค๋ฅ }โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/32825?email_source=notifications&email_token=AGUV7XQ5HO7GL3YP72R7BV3QN2N55A5CNFSM4H4DL33KYY3PNVWWK3TUL52HS4DFVEXG43VMVBW
๋๋ ๊ตฌ๋ ์ทจ์
https://github.com/notifications/unsubscribe-auth/AGUV7XS4JMK44QHIIR3RSGTQN2N55ANCNFSM4H4DL33A
.
์์ ์ ํ์ฌ ๋ฐํ๋ ์ค์ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ์ถ๋ค๋ ๊ฒ์
๋๋ค.
ํ์ฌ ์ค์ ๊ธฐ๋ฅ.
2019๋ 10์ 11์ผ ๊ธ์์ผ ์ค์ 9์ 55๋ถ Aaaa Einai [email protected] ์์ฑ:
ํจ์ doSomeThing() {
r, err := os.Open(ํ์ผ ์ด๋ฆ)
ํจ๋(fmt.Errorf(err, "ํ์ผ ์ด๊ธฐ ์คํจ: %s", filename)) // ์ฌ๊ธฐ์ ํจ๋์ ๋๋ค.}
2019๋ 10์ 10์ผ ๋ชฉ์์ผ ์ค์ 11:24 clearcode ์๋ฆผ @github.com
์ผ๋ค:๋ด์ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฃผ์ฅํ๋ค()
์์:
func doSomeThing() ์ค๋ฅ {
r, err := os.Open(filename) assert(err, "failed to open file: %s", filename) // in this step, just return the error
resp,err := http.Get(someURL)
assert(์ค๋ฅ, "์์ฒญ ์คํจ")}
์ค๋ฅ๋ฅผ ๋ฐํํ์ง ์๋ ๋ ๋ค๋ฅธ ํจ์:
ํจ์ doSomeThing() {
r, err := os.Open(ํ์ผ ์ด๋ฆ)
assert(err, "ํ์ผ ์ด๊ธฐ ์คํจ: %s", filename) // ์ฌ๊ธฐ์ ํจ๋์ ๋๋ค.}
๋ฐ๋ผ์ assert(error, args ...interface{})๊ฐ ๋ค์๋ณด๋ค ๋ซ์ต๋๋ค. if err != nil ; {
๋ฐํ ์ค๋ฅ }โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/32825?email_source=notifications&email_token=AGUV7XQ5HO7GL3YP72R7BV3QN2N55A5CNFSM4H4DL33KYY3PNVWWK3TUL52HS4DFVEXG43VMVBW
๋๋ ๊ตฌ๋ ์ทจ์
https://github.com/notifications/unsubscribe-auth/AGUV7XS4JMK44QHIIR3RSGTQN2N55ANCNFSM4H4DL33A
.
์์งํ ์ ๋
try
์ ๊ณตํ๋ ์์์ ๋ฐํ์ ์ํ์ง ์์ต๋๋ค. ์ ๋ค๋ฆญ์ด ์๋ค๋ฉด ๋์ ๋ชจ๋๋ ๋ฐฉ์์ ๋์์ ์ฌ์ฉํ๋ ์๋ฃจ์ ์ ํจ์ฌ ๋ ์ ํธํ ๊ฒ์ ๋๋ค.type Result<T> interface { Expect(err error) T OrElse(defaultValue T) T } func From<T>(value T, err error) Result<T> { ... }
๋์๊ฒ ์ด๊ฒ์ ํ์ฌ ์ ์๋ ๋ด์ฅ๋ณด๋ค ํจ์ฌ ๊นจ๋ํ์ง๋ง (๊ฐ, ์ค๋ฅ) ๋ฐ Result
Rust์ Ok and Err๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
if err != nil {}
์กฐ๊ธ ๋ ๋์ ๊ฒ ๊ฐ์์.
@Yanwenjiepy ์๋์ ์
๋๋ค. ์ ๋ Rust์ Result
์ ํ์ ์ข์ํฉ๋๋ค.
๋ฐ๋์ ๋ฐฐ์ด ์ง 10๋ถ๋ ์ฑ ๋์ง ์์์ต๋๋ค. ๋ด๊ฐ ๋ณด๊ณ ์๋ ์ฝ๋์์ ๊ฐ์ฅ ๋จผ์ ์์์ฐจ๋ฆฐ ๊ฒ์ ์ด ์ฌ๋ณธ์ ๊ณ์ํด์ ๋ถ์ฌ๋ฃ์๋ค๋ ๊ฒ์ ๋๋ค.
someValue, err := someFunction();
if err != nil {
panic(err)
}
๋๋ ๋ถ๋ช ํ ์ ๋ฌธ๊ฐ๊ฐ ์๋์ง๋ง ์ด ์ค๋ ๋์์ ๋๋ด๊ธฐ ์ํด ๋๋ฅผ ์ฒ์ ๋ณด์์ ๋๋ง ๊ฐ์น๊ฐ ์์ ์ ์์ต๋๋ค.
ํ์ต์ ์ํด ์ฝ๋ ์กฐ๊ฐ์ ๋ณด๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ค์ ์ฝ๋๋ ํจ๋๊ณผ ์ถฉ๋๋ฟ๋ง ์๋๋ผ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
์ฌ์ค์ด์ง๋ง ์ค๋ฅ๋ ๊ทธ๋ฃนํ๋ ์ ์์ผ๋ฉฐ ์ข ์ข ๊ทธ๋ฃนํ๋์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด try/catch ๋ธ๋ก์ด ๋ค๋ฅธ ์ธ์ด์ ์กด์ฌํ๋ ์ด์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์์ ๋์๊ฒ ๊ณต๋ฃก๊ณผ ๊ฐ์ ๋์๊ฐ ํจ์ฌ ๋ํ ๊ฒ์ ๋๋ค.
try {
foo, throw err := someFunction();
bar, throw err := foo.get();
baz, throw err := bar.make();
qux, throw err := baz.transform();
} catch(err) {
// "Unable to foo bar baz qux."
tryHarder();
}
๋ค์ ํ ๋ฒ, ์์ ํ ํ์ ๋. ๊ทธ๋ฌ๋ ์ฝ๋๋ ๊ธฐํธ์ผ ๋ฟ์ด๋ฉฐ ์ถฉ๋ถํ ๋ฐ๋ณต๋๋ฉด ๊ธฐํธ๋ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ์์ฃผ ๋ฐ๋ณต๋๋ ๊ธฐํธ๋ก ๋ณด์ ๋๋ค.
Rob Pike์ Errors Are Values ๊ฒ์๋ฌผ์ ์ดํด๋ณด๊ณ ๋์ฐ๋ฏธ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ๋ณํฉํ๊ณ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ค์ ๋ก ๋จ์ผ ์ ๋ก ๋ชจ๋ ์์ธ๋ฅผ ์ก๋ ๊ฒ์ ์ค์ ๋ก ๋ฐ์ํ ์ผ์ ๋ํ ์ ๋ณด๋ฅผ ์จ๊ธฐ๊ธฐ ๋๋ฌธ์ ํด๋น ์์ธ๊ฐ ์๋ ๋๋ถ๋ถ์ ์ธ์ด์์ ๋์ ์คํ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. (๊ทธ๋ฆฌ๊ณ ์๋ฅผ ํ์ฅํ์ฌ ๊ฐ๋ณ์ ์ผ๋ก ํฌ์ฐฉ๋ ์์ธ๋ฅผ ๋ถ๋ฆฌํ๊ณ ํด๋น ์ ๋ณด๋ฅผ ๋ฒ๋ฆฌ์ง ์์ผ๋ฉด ์ฝ๋๋ Go์ ํด๋นํ๋ ํ ๋๋ฉ๋๋ค.)
๋งํฌ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. errWriter
๋ ์์ ํ ํต๊ณผ ๊ฐ๋ฅํ ์๋ฃจ์
์
๋๋ค.
์ฌ์ค์ด์ง๋ง ์ค๋ฅ๋ ๊ทธ๋ฃนํ๋ ์ ์์ผ๋ฉฐ ์ข ์ข ๊ทธ๋ฃนํ๋์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด try/catch ๋ธ๋ก์ด ๋ค๋ฅธ ์ธ์ด์ ์กด์ฌํ๋ ์ด์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์์ ๋์๊ฒ ๊ณต๋ฃก๊ณผ ๊ฐ์ ๋์๊ฐ ํจ์ฌ ๋ํ ๊ฒ์ ๋๋ค.
try { foo, throw err := someFunction(); bar, throw err := foo.get(); baz, throw err := bar.make(); qux, throw err := baz.transform(); } catch(err) { // "Unable to foo bar baz qux." tryHarder(); }
๋ค์ ํ ๋ฒ, ์์ ํ ํ์ ๋. ๊ทธ๋ฌ๋ ์ฝ๋๋ ๊ธฐํธ์ผ ๋ฟ์ด๋ฉฐ ์ถฉ๋ถํ ๋ฐ๋ณต๋๋ฉด ๊ธฐํธ๋ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ์์ฃผ ๋ฐ๋ณต๋๋ ๊ธฐํธ๋ก ๋ณด์ ๋๋ค.
๊ฐ ํจ์๊ฐ ์ค๋ณต ์ค๋ฅ ์ ํ์ ๋ฐํํ๊ณ ๋ชจ๋ ํจ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. tryHarder()๋ ์ด๋ป๊ฒ ์์ฑํฉ๋๊น?
try {
foo, throw err := someFunction(); // err could be TypeA and TypeB
bar, throw err := foo.get(); // err could be TypeB and TypeC
baz, throw err := bar.make(); // err could be TypeA and TypeC
qux, throw err := baz.transform(); // err could be TypeB and TypeD
} catch(err) {
tryHarder(); // tell me how to handle each error?
}
๋ค๋ฅธ ์ฌ๋์ด ์๋ ์ฝ๋๋ฅผ ์ดํดํ๋ ๋ฐ 1๋ถ ๋ฐ์ ๊ฑธ๋ฆฌ์ง ์์ต๋๋ค.
foo, err := someFunction(); // err could be TypeA and TypeB
if err != nil {
// handle err
}
bar, err := foo.get(); // err could be TypeB and TypeC
if err != nil {
// handle err
}
baz, err := bar.make(); // err could be TypeA and TypeC
if err != nil {
// handle err
}
qux, err := baz.transform(); // err could be TypeB and TypeD
if err != nil {
// handle err
}
๊ฐ ํจ์๊ฐ ์ค๋ณต ์ค๋ฅ ์ ํ์ ๋ฐํํ๊ณ ๋ชจ๋ ํจ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
๊ทธ ์์์ ๋น์ ์ ์์ ํ ๋ง์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ผ์ ํ๋ ๋ฐฉ๋ฒ์ ํ ๊ฐ์ง๋ฟ์ด์ด์ผ ํฉ๋๋ค.