Go: ์ œ์•ˆ: "if err != nil"์„ ๊ทธ๋Œ€๋กœ ๋‘์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

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

Go2 ์ œ์•ˆ #32437์€ ์–ธ์–ด์— ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜์—ฌ if err != nil { return ... } ์ƒ์šฉ๊ตฌ๋ฅผ ๋œ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋Œ€์•ˆ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค: #32804์™€ #32811์€ ์›๋ž˜์˜ ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ณดํŽธ์ ์œผ๋กœ ์‚ฌ๋ž‘๋ฐ›์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ํ˜ผํ•ฉ์— ๋‹ค๋ฅธ ๋Œ€์•ˆ์„ ๋˜์ง€๋ ค๋ฉด: ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” if err != nil ๊ตฌ์กฐ์˜ ๋ช…์‹œ์  ํŠน์„ฑ์„ ์ข‹์•„ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์ด์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ๊ทธ๋ ‡๊ฒŒ ๋‚˜์œ๊ฐ€์š”?

FrozenDueToAge Proposal Proposal-Hold error-handling

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

์ผ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ•œ ๊ฐ€์ง€๋ฟ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

์–ด๋–ค ํ˜•ํƒœ์˜ ์ปจํ…์ŠคํŠธ๋‚˜ ์ถ”์ ์ด ์—†๋Š” ์˜ค๋ฅ˜(๋ฒ ์–ด ๋ฌธ์ž์—ด "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์˜ ๊ฐ€์žฅ ์ข‹์€ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•ญ์ƒ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ท€์ฐฎ๊ฒŒํ•˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์•„์ง ์ต์ˆ™ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค.

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

  1. ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(try ๋˜๋Š” ์ƒˆ๋กœ์šด if-err ๊ตฌ๋ฌธ)
  2. ์–ด์จŒ๋“ , ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค

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 ๋„ค, ์ €์žฅ์†Œ์— ์ธํ„ฐ๋„ท์˜ ์ ˆ๋ฐ˜์„ ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์ข‹์€ ์ƒ๊ฐ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Finishing Touch

๋ˆ„๊ตฐ๊ฐ€ ๊ฐ€ 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 ํ‚ค์›Œ๋“œ์˜ ์ „์ฒด ์•„์ด๋””์–ด๋ฅผ ์™„์ „ํžˆ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.

image

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

์ค„์ผ ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด

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์— ์˜ˆ์™ธ๊ฐ€ ์—†๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ •ํ™•ํžˆ ๊ทธ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๊นŒ?

  1. ๋‹น์‹ ์€ ์–ด๋–ค ๊ฒƒ์ด ์ข‹์€ ์Šต๊ด€์ด ์•„๋‹Œ์ง€ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์ด๋ก ์ ์ธ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๊ฐ€์น˜ ํŒ๋‹จ์„ ๋‚ด๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  2. 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 ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ƒˆ๋กœ์šด ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

32852

์—ฌ๊ธฐ์— ์ด๋ฏธ ๋‚˜์™€ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฃผ์žฅ์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ณ  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 ํŒ€์˜ ์ถ”๋ก  ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. Go๋Š” ๋งค์šฐ ์ธ๊ธฐ ์žˆ๊ณ  ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ฒœ ๋ช…์˜ ์‚ฌ๋žŒ๋“ค์ด ๋‹น์—ฐํžˆ ์ด์— ๋Œ€ํ•œ ์˜๊ฒฌ, ์ œ์•ˆ ๋ฐ ๋ถˆ๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์˜ค๋žซ๋™์•ˆ ๋Œ๋‹ด์„ ์Œ“์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Go ํŒ€์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ชจ๋“  ์†Œ์Œ์— ๋Œ€ํ•ด _๋ฌด์–ธ๊ฐ€_ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์—„์ฒญ๋‚œ ์••๋ ฅ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ด๊ฑด ๋ญ”๊ฐ€์š”.

์‹œ๋„์—์„œ ๋ณต๊ตฌ()์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ๊ฒฌ๋œ ๊ฒฝ์šฐ 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()
 }

์ด๊ฒƒ์ด ๊ฐ๊ฐ์˜ ์˜ค๋ฅ˜๋ฅผ ๋ณ„๋„์˜ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋ฉ๋‹ˆ๊นŒ?

๋ช‡ ๊ฐ€์ง€ ์„ค๋ช…:

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

  2. ๋‚˜๋Š” ์ด ํ† ๋ก ์ด ๋‹ค๋ฅธ ๊ณณ(golang-nuts)์—์„œ ๊ฐœ์ตœ๋˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๋Š” @ianlancetaylor์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์ œ์•ˆ์ด ์—†์Šต๋‹ˆ๋‹ค.

  3. ์‹ค์ œ๋กœ @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๊ฐ€์ง€ ์ƒํ™ฉ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ์˜ค๋ฅ˜๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜ํ™˜
  2. ์žฅ์‹๋œ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜
  3. ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์กฐ์น˜
  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{ } ๋ณด๋‹ค ์˜ค๋ฅ˜๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ช…์‹œ์  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์•”์‹œ์  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ณด๋‹ค ํ•ญ์ƒ ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ถ”์‹ . ๋‚ด ์–ธ์–ด์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

leave it alone

๊ณ ์žฅ๋‚œ๊ฒŒ ์•„๋‹ˆ๋‹ค....

@Daniel1984 ๋ฐˆ์„

๋ง๋ถ™์—ฌ์„œ, try ์ œ์•ˆ์€ if err != nil ๋‘ก๋‹ˆ๋‹ค. ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ์ถ”๊ฐ€ ์˜ต์…˜์„ ์ œ๊ณตํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” try ๊ฐ€ ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. try :

์ฐฌ์„ฑ

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

๋ฒ”์ฃ„์ž

  • try ๋Š” ๊ธฐ์กด ์ž‘์—…์— ๋Œ€ํ•ด ์ค‘๋ณต ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • try ๊ฐ€ ํ˜„์žฌ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ผ์ด๋ฉฐ, ์ผ๋ช… ๋” ๋งŽ์€ ๋งˆ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ์— ๋ถˆ์ผ์น˜๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • Go ๊ฒฝํ—˜์ด ์—†๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋œ ๋ช…ํ™•ํ•จ(ํ•จ์ˆ˜ ๋ฐ˜ํ™˜๊ณผ ํ‘œํ˜„์‹ ๊ฐ’ ์‚ฌ์ด์˜ ๋ถˆ์ผ์น˜).
  • 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๋Š” ๋‹จ์ˆœํ•˜๋‹ค๋Š” ์ƒ๊ฐ์— ๋Œ€ํ•ด ๋งˆ์ˆ ์ ์ด ๊ฑฐ๋‚˜ ๋…ผ๋ฆฌ์ ์ธ ๊ฒƒ ์‚ฌ์ด์—์„œ ๋ง‰ํ˜€ ๊ณ ๊ตฐ๋ถ„ํˆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ :

  • ์ƒ์šฉ๊ตฌ ์ค„์ด๊ธฐ
  • ๋‹จ์ˆœํ•œ
  • ๋‹ค๋ฅธ ์–ธ์–ด ์ค‘ ๊ธฐ์กด ํŒจํ„ด
  • ์„ ํƒ ๊ณผ๋ชฉ

๋‹จ์ :

  • ํ•™์Šต ๊ณก์„ 
  • ๊ธฐ๋ณธ ๋งˆ๋ฒ•
  • ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ๋ฒ„๊ทธ
  • 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 ) ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”?

string.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 ๋ฌผ๋ก  ๋„ˆ๋ฌด ๊ธธ์ง€ ์•Š๋„๋ก ์˜ˆ์ œ๋ฅผ ๋‹จ์ˆœํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ธฐํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฉฐ, ์ด๊ฒƒ์ด ๋ฌธ์ œ์˜ ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

์ œ๊ธฐํ•œ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋งํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—?

  1. ๋ธ”๋กœ๊ทธ ์ œ๋ชฉ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค. "์“ฐ์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•"์ด๋ผ๊ณ  ๋ถˆ๋Ÿฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณตํ•ด์„œ ๋งํ•˜์ง€๋งŒ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๋‚˜์œ ์Šต๊ด€์ด๋ฉฐ ์†”์งํžˆ ์•„๋ž˜์˜ ์ „์ฒด ์ฝ”๋“œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
  2. ๋‹น์‹ ์€ ์ด๊ฒƒ์„ ๊นจ๋‹ซ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ
    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 ๋Š” ๋ชจ๋“  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

Screenshot 2019-07-07 at 6 30 42 PM

@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
}

๊ฐ ํ•จ์ˆ˜๊ฐ€ ์ค‘๋ณต ์˜ค๋ฅ˜ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋ชจ๋“  ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ ์˜ˆ์—์„œ ๋‹น์‹ ์€ ์™„์ „ํžˆ ๋งž์Šต๋‹ˆ๋‹ค.

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