Go: ์ œ์•ˆ: ๋‚ด์žฅ๋œ Go ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ "try"

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

์ œ์•ˆ: ๋‚ด์žฅ๋œ Go ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ, try

์ด ์ œ์•ˆ์€ ๋งˆ๊ฐ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜๊ฒฌ์„ ์ œ์‹œํ•˜๊ธฐ ์ „์— ์„ธ๋ถ€ ์„ค๊ณ„ ๋ฌธ์„œ ๋ฅผ ์ฝ๊ณ  6์›” 6์ผ ํ˜„์žฌ ํ† ๋ก  ์š”์•ฝ, 6 ์›” 10์ผ ์š”์•ฝ ๋ฐ _๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ง‘์ค‘ ์œ ์ง€์— ๋Œ€ํ•œ ์กฐ์–ธ _์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์ด๋‚˜ ์ œ์•ˆ์€ ์ด๋ฏธ ๋‹ต๋ณ€๋˜์—ˆ๊ฑฐ๋‚˜ ์ž‘์„ฑ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

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

[์•„๋ž˜ ํ…์ŠคํŠธ๋Š” ๋””์ž์ธ ๋ฌธ์„œ๋ฅผ ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ํŽธ์ง‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.]

try ๋‚ด์žฅ ํ•จ์ˆ˜๋Š” ๋‹จ์ผ ํ‘œํ˜„์‹์„ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ‘œํ˜„์‹์€ n+1๊ฐœ์˜ ๊ฐ’(์—ฌ๊ธฐ์„œ n์€ 0์ผ ์ˆ˜ ์žˆ์Œ)์œผ๋กœ ํ‰๊ฐ€๋˜์–ด์•ผ ํ•˜๋ฉฐ ์—ฌ๊ธฐ์„œ ๋งˆ์ง€๋ง‰ ๊ฐ’์€ error ์œ ํ˜•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์ตœ์ข…) ์˜ค๋ฅ˜ ์ธ์ˆ˜๊ฐ€ nil์ด๋ฉด ์ฒ˜์Œ n๊ฐœ ๊ฐ’(์žˆ๋Š” ๊ฒฝ์šฐ)์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ๋‘˜๋Ÿฌ์‹ธ๋Š” ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ

f, err := os.Open(filename)
if err != nil {
    return โ€ฆ, err  // zero values for other results, if any
}

๋กœ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

f := try(os.Open(filename))

try ๋Š” ์ž์ฒด์ ์œผ๋กœ error ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ด๋‹น ๊ฒฐ๊ณผ๋Š” ํฌํ•จํ•˜๋Š” ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

defer func() {
    if err != nil { // no error may have occurred - check for it
        err = โ€ฆ // wrap/augment error
    }
}()

์—ฌ๊ธฐ์„œ err ๋Š” ๋‘˜๋Ÿฌ์‹ธ๋Š” ํ•จ์ˆ˜์˜ ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ, ์ ์ ˆํ•œ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ์˜ ์„ ์–ธ์„ ํ•œ ์ค„์งœ๋ฆฌ๋กœ ์ค„์—ฌ์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด

defer fmt.HandleErrorf(&err, "copy %s %s", src, dst)

( ์—ฌ๊ธฐ์„œ fmt.HandleErrorf ๋Š” *err $ ๋ฅผ ์žฅ์‹ํ•จ) ์ฝ๊ธฐ๊ฐ€ ์ž˜ ๋˜๋ฉฐ ์ƒˆ๋กœ์šด ์–ธ์–ด ๊ธฐ๋Šฅ ์—†์ด๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

ํฌ๋ ˆ๋”ง

์ด ์ œ์•ˆ์€ ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐ›์€ ํ”ผ๋“œ๋ฐฑ์— ํฌ๊ฒŒ ์˜ํ–ฅ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค์Œ์—์„œ ์•„์ด๋””์–ด๋ฅผ ๋นŒ๋ฆฝ๋‹ˆ๋‹ค.

์ƒ์„ธ ์„ค๊ณ„ ๋ฌธ์„œ

https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md

$# try ์˜ ์˜ํ–ฅ์„ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ tryhard ๋„๊ตฌ

https://github.com/griesemer/tryhard

Go2 LanguageChange Proposal error-handling

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

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

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

์••๋„์ ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฐ˜์‘๊ณผ ์—ฌ๊ธฐ์—์„œ์˜ ๊ด‘๋ฒ”์œ„ํ•œ ํ† ๋ก ์„ ๋ฐ”ํƒ•์œผ๋กœ, ์šฐ๋ฆฌ๋Š” ์ด ์ œ์•ˆ์ด ์˜ˆ์ •๋ณด๋‹ค ๋นจ๋ฆฌ ๊ฑฐ์ ˆ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

์ œ์•ˆ ๊ฒ€ํ†  ์œ„์›ํšŒ์˜ ๋กœ๋ฒ„ํŠธ ๊ทธ๋ฆฌ์ฆˆ๋จธ(Robert Griesemer).

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

๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋ฅผ ๋‹จ์ˆœํ•œ ๋””์ž์ธ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ž์ „๊ฑฐ๋ฅผ ํƒ€๊ณ  ์‹ถ์ง€ ์•Š์ง€๋งŒ(์ด ๋Œ€ํ™”๋ฅผ ์—ฐ๊ธฐํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค), Rust๋Š” ๊ฑฐ๊ธฐ์— ๊ฐ€์„œ ๊ฒฐ๊ตญ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋‚ด์žฅ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ? ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋กœ ์ •์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.

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

check io.Copy(w, check newReader(foo))

๋ณด๋‹ค๋Š”:

io.Copy(w, newReader(foo)?)?

ํ•˜์ง€๋งŒ ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

try(io.Copy(w, try(newReader(foo))))

ํ˜ธ์ถœ๋˜๋Š” ์ฃผ์š” ๊ธฐ๋Šฅ์ด ๋” ์ด์ƒ ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ช…ํžˆ ์„ธ ๊ฐ€์ง€๊ฐ€ ๋” ๋‚˜์˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด:

ํ•˜๋‹ค

func f() (n int, err error) {
  n = 7
  try(errors.New("x"))
  // ...
}

๋ฐ˜ํ™˜ (0, "x") ๋˜๋Š” (7, "x")? ๋‚˜๋Š” ํ›„์ž๋ฅผ ๊ฐ€์ •ํ•  ๊ฒƒ์ด๋‹ค.

๋‚ด๋ถ€ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์žฅ์‹์ด๋‚˜ ์ฒ˜๋ฆฌ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ๋Š” 7, errors.New("x") ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณง ์ œ์ถœ๋  ์ „์ฒด ๋ฌธ์„œ(https://golang.org/cl/180557)์—์„œ ๋ช…ํ™•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

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

๋‚˜๋Š” ์ ‘๋ฏธ์‚ฌ ? ๊ฐ€ ๋ณด์ด๋Š” ๋ฐฉ์‹์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ try() ๋ฅผ ๋Šฅ๊ฐ€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๊ธ€์Ž„, ๋‚˜๋Š” ํŒจ๋‹‰์ด ์กด์žฌํ•˜๊ณ  ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์™„์ „ํžˆ ์žŠ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ์ œ์•ˆ์€ ํ˜„์žฌ ์—ฌ๊ธฐ์— ์žˆ์œผ๋ฉฐ (ํ˜•์‹ ๊ฐœ์„  ๋Œ€๊ธฐ ์ค‘์ด๋ฉฐ ๊ณง ์ œ๊ณต๋  ์˜ˆ์ •์ž„) ๋งŽ์€ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@dominikh ์ž์„ธํ•œ ์ œ์•ˆ์€ ์ด์— ๋Œ€ํ•ด ๊ธธ๊ฒŒ ์„ค๋ช…ํ•˜์ง€๋งŒ panic ๋ฐ recover ๋Š” ์ œ์–ด ํ๋ฆ„์—๋„ ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋‘ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์ œ๊ณต ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๊ฐœ์„ ์„ ์œ„ํ•œ ํ•œ ๊ฐ€์ง€ ์„ค๋ช…/์ œ์•ˆ:

if the last argument supplied to try, of type error, is not nil, the enclosing functionโ€™s error result variable (...) is set to that non-nil error value before the enclosing function returns

๋Œ€์‹  is set to that non-nil error value and the enclosing function returns ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (๋“ค/์ „/๊ทธ๋ฆฌ๊ณ )

์ฒ˜์Œ ์ฝ์„ ๋•Œ before the enclosing function returns ๋Š” ๋ฏธ๋ž˜์˜ ์–ด๋–ค ์ง€์ ์—์„œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ธฐ ์ง์ „์— ์˜ค๋ฅ˜ ๊ฐ’์„ _eventually_ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‚˜์ค‘ ์ค„์— ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ํ•ด์„์€ try๋กœ ์ธํ•ด ํ˜„์žฌ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ˜„์žฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋†€๋ผ์šด ๋™์ž‘์ด๋ฏ€๋กœ ๋” ๋ช…ํ™•ํ•œ ํ…์ŠคํŠธ๊ฐ€ ํ™˜์˜๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹จ์ง€ ์„คํƒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์†Œ์ˆ˜์˜ ๋ณด์ปฌ ๋ฐ˜๋Œ€์ž๊ฐ€ if err != nil ... ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด golang์„ ์กฐ๋กฑํ–ˆ๊ณ  ๋ˆ„๊ตฐ๊ฐ€๋Š” ๊ทธ๊ฒƒ์„ ์ง„์ง€ํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์˜€์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ์œ ์ผํ•˜๊ฒŒ ๋ˆ„๋ฝ๋œ ๊ฒƒ์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋‚ด์žฅ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

https://github.com/purpleidea/mgmt/blob/a235b760dc3047a0d66bb0b9d63c25bc746ed274/util/errwrap/errwrap.go#L26

์™œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ž‘์„ฑํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์˜ˆ์ƒ๋˜๋Š” ์ถœ๋ ฅ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

try(foobar())

foobar ๊ฐ€ (error, error) $๋ฅผ ๋ฐ˜ํ™˜ํ•œ ๊ฒฝ์šฐ

์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ์ด์ „ ์šฐ๋ ค๋ฅผ ์ฒ ํšŒํ•˜๊ณ  ๋” ์ด์ƒ ? ์‚ฌ์šฉ์„ ์ œ์•ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ๋‹ต๋ณ€์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค(์ „์ฒด ์ œ์•ˆ์ด ์ œ๊ณต๋œ _์ดํ›„_ ๋ฌธ์ œ๊ฐ€ ์ œ์ถœ๋˜์—ˆ๋‹ค๋ฉด ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค).

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

@webermaster ๋งˆ์ง€๋ง‰ error ๊ฒฐ๊ณผ๋งŒ ์ œ์•ˆ ๋ฌธ์„œ์— ์„ค๋ช…๋œ ๋Œ€๋กœ try ์— ์ „๋‹ฌ๋œ ํ‘œํ˜„์‹์— ๋Œ€ํ•ด ํŠน๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

@dominikh ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‚˜๋„ ๋‹จ์ˆœํ™”๋œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ˆ˜์ง์  ๋ณต์žก์„ฑ์„ ์ˆ˜ํ‰์  ๋ณต์žก์„ฑ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

try(foo()) ์‹ค์ œ๋กœ ํ˜ธ์ถœ ํ•จ์ˆ˜๋ฅผ ๋น ์ ธ๋‚˜๊ฐ€๋Š” ๊ฒƒ์€ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํ•จ์ˆ˜ ํ๋ฆ„์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‹œ๊ฐ์  ์‹ ํ˜ธ๋ฅผ ์šฐ๋ฆฌ์—๊ฒŒ์„œ ๋นผ์•—์•„๊ฐ„๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

๋‚ด๊ฐ€ ๊ฐ€์žฅ ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ์€ defer ๋ฌธ์ด ๋งŒ์กฑํ•˜๋„๋ก ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

  1. ํ•จ์ˆ˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— err ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
    ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ์—ฐ๊ธฐ ๋ฐ ์ด๋ฆ„ ์—†๋Š” ๊ฒฐ๊ณผ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ œ์•ˆ์—์„œ ์ด๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
func sample() (string, error) {
  var err error
  defer fmt.HandleErrorf(&err, "whatever")
  s := try(f())
  return s, nil
}
  1. ๊ณผ๊ฑฐ์— ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ’์„ ํ• ๋‹นํ•˜๋˜ if err != nil ์ƒ์šฉ๊ตฌ๊ฐ€ ์žˆ๋Š” ๋„์šฐ๋ฏธ wrapf ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
func sample() (string, error) {
  s, err := f()
  try(wrapf(err, "whatever"))
  return s, nil
}
func wrapf(err error, format string, ...v interface{}) error {
  if err != nil {
    // err = wrapped error
  }
  return err
}

๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ž‘๋™ํ•˜๋ฉด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func sample() (string, error) {
  var err error
  defer fmt.HandleErrorf(&err, "whatever")
  s := try(f())
  return s, nil
}

์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ์€ ๋ฐ˜ํ™˜ ๊ฐ’๊ณผ ๊ด€๋ จ์ด ์—†๋Š” ๋กœ์ปฌ err ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

func sample() (string, error) {
  s, err := f()
  try(wrapf(err, "whatever"))
  return s, nil
}
func wrapf(err error, format string, ...v interface{}) error {
  if err != nil {
    // err = wrapped error
  }
  return err
}

์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ nil ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ wrapf๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋˜ํ•œ (๊ณ„์†) ์ž‘๋™ํ•˜๋ฉฐ IMO๊ฐ€ ํ›จ์”ฌ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

func sample() (string, error) {
  s, err := f()
  if err != nil {
      return "", wrap(err)
  }
  return s, nil
}

์•„๋ฌด๋„ try ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์™œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ž‘์„ฑํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์˜ˆ์ƒ๋˜๋Š” ์ถœ๋ ฅ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

try(foobar())

foobar ๊ฐ€ (error, error) $๋ฅผ ๋ฐ˜ํ™˜ํ•œ ๊ฒฝ์šฐ

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

์˜ˆ๋ฅผ ๋“ค์–ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@cespare : ๋ˆ„๊ตฐ๊ฐ€ try ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก try ์— ์ ํ•ฉํ•œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” go fix ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹จ์ˆœํ™”๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฐ์„ ์žก๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. try ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•œ ์ถœ๋ ฅ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋” ์งง์€ ์†Œ์Šค ์ฝ”๋“œ๋กœ ๊ณตํ†ต ํŒจํ„ด์„ ๋Œ€์ฒดํ•˜๋Š” ๋‹จ์ˆœํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ํฌ๊ธฐ๋‚˜ ์„ฑ๋Šฅ์— ํฐ ๋ณ€ํ™”๊ฐ€ ์—†์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ try ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ ์–ด๋„ try ๊ฐ€ ๋„์ž…๋œ ๋ฒ„์ „์ธ Go ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@lesrrat : try ๊ฐ€ ์ œ์–ด ํ๋ฆ„์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์›Œ์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” IDE๊ฐ€ ๊ทธ๊ฒƒ์„ ์ถฉ๋ถ„ํžˆ ์‰ฝ๊ฒŒ ๊ฐ•์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@Goodwine : @randall77 ์ด ์ด๋ฏธ ์ง€์ ํ–ˆ๋“ฏ์ด ์ฒซ ๋ฒˆ์งธ ์ œ์•ˆ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•œ ํ•œ ๊ฐ€์ง€ ์˜ต์…˜(๋ฌธ์„œ์—์„œ๋Š” ๋…ผ์˜๋˜์ง€ ์•Š์Œ)์€ error ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ๊ฐ€๋Šฅ์„ฑ์ž…๋‹ˆ๋‹ค(์ฒ˜์Œ์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ). ๊ทธ๋Ÿฌ๋ฉด defer ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฒฐ๊ณผ ์ด๋ฆ„์„ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํ›จ์”ฌ ๋” ๋งˆ์ˆ ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ •๋‹นํ™”๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์™ธ๊ด€์ƒ ๋ฌธ์ œ์ด๋ฉฐ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ go doc ๋ฐ ์นœ๊ตฌ๋“ค์ด ์ œ๊ณตํ•˜๋Š” ์ž๋™ ์ƒ์„ฑ API์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋„๊ตฌ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋””์ž์ธ ๋ฌธ์„œ์˜ FAQ ์ฐธ์กฐ).

@nictuku : ์„ค๋ช…์„ ์œ„ํ•œ ๊ท€ํ•˜์˜ ์ œ์•ˆ์— ๊ด€ํ•˜์—ฌ(s/before/and/): ๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ํ•˜๋Š” ๋‹จ๋ฝ ๋ฐ”๋กœ ์•ž์˜ ์ฝ”๋“œ๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๊ท€ํ•˜์˜ ์š”์ ์€ s/before/and/ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฐ๋ฌธ์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. ๋ณ€๊ฒฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

CL 180637 ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ์‚ฌ์‹ค ์ด ์ œ์•ˆ์„ ์ •๋ง ์ข‹์•„ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•œ ๊ฐ€์ง€ ๋น„ํŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Go์—์„œ ํ•จ์ˆ˜์˜ ์ข…๋ฃŒ์ ์€ ํ•ญ์ƒ return ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŒจ๋‹‰์€ ๋˜ํ•œ ์ถœ๊ตฌ ์ง€์ ์ด์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

return ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜์˜ ์ข…๋ฃŒ์ ์„ ๋งŒ๋“ค๋ฉด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ํ›จ์”ฌ ๋‚ฎ์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐ•์—ฐ์—์„œ ์ด์— ๋Œ€ํ•ด ๋“ค์—ˆ๊ณ  ์ด ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์•„๋ฆ„๋‹ค์›€์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

func CopyFile(src, dst string) error {
    r, err := os.Open(src)
    if err != nil {
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }
    defer r.Close()

    w, err := os.Create(dst)
    if err != nil {
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }

    if _, err := io.Copy(w, r); err != nil {
        w.Close()
        os.Remove(dst)
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }

    if err := w.Close(); err != nil {
        os.Remove(dst)
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }
}

์ด ์ฝ”๋“œ๋Š” ํฐ ํ˜ผ๋ž€์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ดˆ์•ˆ์— ์˜ํ•ด _์˜๋„๋œ_ ๊ฒƒ์ด์ง€๋งŒ try ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ฝ”๋“œ์™€ ๋น„๊ตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

func CopyFile(src, dst string) error {
    defer func() {
        err = fmt.Errorf("copy %s %s: %v", src, dst, err)
    }()
    r, err := try(os.Open(src))
    defer r.Close()

    w, err := try(os.Create(dst))

    defer w.Close()
    defer os.Remove(dst)
    try(io.Copy(w, r))
    try(w.Close())

    return nil
}

์–ธ๋œป ๋ณด๊ธฐ์— ์ด ์ฝ”๋“œ๊ฐ€ ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ์ ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฒซ ๋ฒˆ์งธ ์˜ˆ์ œ์—์„œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๋ชจ๋“  ์ง€์ ์„ ์ฐพ๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฌ์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๋“ค์—ฌ์“ฐ๊ธฐ๋˜์–ด return ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๊ทธ ๋’ค์— ๊ณต๋ฐฑ์ด ์˜ต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ์กฐ๊ฑด๋ถ€ ๋ฐ˜ํ™˜์ด _๋ฐ˜๋“œ์‹œ_ ์กฐ๊ฑด๋ถ€ ๋ธ”๋ก ์•ˆ์— ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— gofmt ํ‘œ์ค€์— ๋”ฐ๋ผ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฉ๋‹ˆ๋‹ค. return ๋Š” ๋˜ํ•œ ์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Œ์„ ์•Œ๋ฆฌ์ง€ ์•Š๊ณ  ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์˜ˆ์—์„œ๋Š” return ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฏ€๋กœ _ever_ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ nil ๋ฟ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋‘ ๊ฐœ์˜ try ํ˜ธ์ถœ์€ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ฒ˜์Œ ๋‘ ๊ฐœ๋Š” ์•ฝ๊ฐ„ ๋” ์–ด๋ ต๊ณ  proc := try(os.FindProcess(try(strconv.Atoi(os.Args[1])))) ์™€ ๊ฐ™์€ ์–ด๋”˜๊ฐ€์— ์ค‘์ฒฉ๋˜์–ด ์žˆ์œผ๋ฉด ํ›จ์”ฌ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์—์„œ ๋ณต๊ท€ํ•˜๋Š” ๊ฒƒ์€ "์‹ ์„ฑํ•œ" ์ผ์ธ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐœ์ธ์ ์œผ๋กœ ํ•จ์ˆ˜์˜ ๋ชจ๋“  ์ข…๋ฃŒ์ ์€ return ๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๋Š” ์ด๋ฏธ 5๋…„ ์ „์— ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด, ๋‹น์‹ ์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค

https://news.ycombinator.com/item?id=20101417

5๋…„ ์ „ Go์—์„œ AST ์ „์ฒ˜๋ฆฌ๊ธฐ๋กœ try()๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๊ฝค ์ข‹์•˜์Šต๋‹ˆ๋‹ค. https://github.com/lunixbochs/og

๋‹ค์Œ์€ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๊ฐ€ ๋งŽ์€ ๊ธฐ๋Šฅ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ž…๋‹ˆ๋‹ค. https://github.com/lunixbochs/poxd/blob/master/tls.go#L13

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

@griesemer
์˜ค๋ฅ˜ ๋ž˜ํ•‘์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ œ์•ˆํ•œ defer ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋‚ด ๋ฌธ์ œ๋Š” ๋‚ด๊ฐ€ ๋ณด์—ฌ์ค€ ์Šค๋‹ˆํŽซ(์•„๋ž˜์—์„œ ๋ฐ˜๋ณต๋จ)์˜ ๋™์ž‘์ด ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ AFAICT๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋งค์šฐ ๋“œ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์ด ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ.

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

var err error
defer fmt.HandleErrorf(err);

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

๋˜๋Š”... ์ด์™€ ๊ฐ™์ด defer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€ ๋ง๊ณ  ๋” ์•ˆ์ „ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

@deanveloper ์ด ์ œ์•ˆ(๊ทธ๋ฆฌ๊ณ  ๋™์ผํ•œ ๊ฒƒ์„ ์‹œ๋„ํ•˜๋Š” ๋ชจ๋“  ์ œ์•ˆ)์ด ์†Œ์Šค ์ฝ”๋“œ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋ณด์ด๋Š” return ๋ฌธ์„ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฒฐ๊ตญ ์ œ์•ˆ์˜ ์š”์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์•„? if ๋ฌธ๊ณผ returns ์˜ ์ƒ์šฉ๊ตฌ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ๋ชจ๋‘ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. return try ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์šฐ๋ฆฌ๋Š” return ๋ฌธ(๋ฐ panic )์„ ์ฆ‰์‹œ ์ธ์‹ํ•˜๋Š” ๋ฐ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. Go(๋ฐ ๊ธฐํƒ€ ๋งŽ์€ ์–ธ์–ด)์—์„œ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ œ์–ด ํ๋ฆ„์ด ํ‘œํ˜„๋˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ $# return 8$#$ ์—์„œ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ผ๋ถ€๊ฐ€ ์ต์ˆ™ํ•ด์ง€๋ฉด try ๋„ ์ œ์–ด ํ๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ข‹์€ IDE ์ง€์›์ด ์ด๊ฒƒ์—๋„ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์–ด ์˜์‹ฌ์น˜ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ์šฐ๋ ค ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์ข€ ๋” ์‚ฌ์†Œํ•˜๊ณ  ๋ฌธ์ฒด์ ์ธ ๋ฌธ์ œ๋Š” ์ด์ œ try(actualThing()) ์— ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๊ฐ€ ๋ž˜ํ•‘๋˜๋Š”์ง€ ์œ ๊ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. try() ๋กœ ๋ž˜ํ•‘๋œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ธ์„ ๋ณด๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํ•˜๊ฒŒ ๋Š๊ปด์ง„๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ์กฐ์ •์œผ๋กœ ํ•ด๊ฒฐ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

a, b, err := myFunc()
check(err, "calling myFunc on %v and %v", a, b)

check() ๋Š” try() ์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๋™์ž‘์„ ์‚ญ์ œํ•˜๊ณ  ๋Œ€์‹  ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฐ˜ํ™˜์„ ์œ ๋ฐœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด try() ์˜ ๋งŽ์€ ์ด์ ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

  • ๊ทธ๊ฒƒ์€ ๋‚ด์žฅ
  • ๊ทธ๊ฒƒ์€ ์—ฐ๊ธฐํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ์ œ์–ด ํ๋ฆ„ WRT๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ž˜ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ์กด ๊ด€ํ–‰๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • errors.Wrap(err, "context message") ์™€ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ž˜ํ•‘์„ ์œ„ํ•œ ํ˜„์žฌ ์ œ์•ˆ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊นจ๋—ํ•œ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. a, b, err := myFunc() ๋ผ์ธ์— ์ƒ์šฉ๊ตฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • defer fmt.HandleError(&err, "msg") ๋กœ ์˜ค๋ฅ˜๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ถŒ์žฅํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • check ์˜ ์„œ๋ช…์€ ๋ž˜ํ•‘ํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ์ž„์˜์˜ ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

@s4n-gt ์ด ๋งํฌ๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ชจ๋ฅด๊ณ  ์žˆ์—ˆ๋‹ค.

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

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

func main() {
  if err := newmain(); err != nil {
    println(err.Error())
    os.Exit(1)
  }
}

๋งˆ์ง€๋ง‰์œผ๋กœ ํ•œ ๊ฐ€์ง€ ๋น„ํŒ. ์‹ค์ œ๋กœ ์ œ์•ˆ ์ž์ฒด์— ๋Œ€ํ•œ ๋น„ํŒ์ด ์•„๋‹ˆ๋ผ "ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ธฐ๋Šฅ" ๋ฐ˜๋ก ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์‘๋‹ต์— ๋Œ€ํ•œ ๋น„ํŒ์ž…๋‹ˆ๋‹ค.

"๊ธฐ๋Šฅ์ด ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค"์— ๋Œ€ํ•œ ์‘๋‹ต์€ " panic ๋„ ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค!"์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ try ์— ์ ์šฉ๋˜์ง€ ์•Š๋Š” panic ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ดœ์ฐฎ์€ ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. panic ๋Š” ์ง๊ด€์ ์ด๊ณ  ์Šคํƒ์„ ๊ณ„์† ํ’€๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๋ณด์ž ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์นœ์ˆ™ํ•ฉ๋‹ˆ๋‹ค. panic ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ฐพ์•„๋ณผ ํ•„์š”์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค. ์ดˆ๋ณด์ž ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” recover ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ดˆ๋ณด์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํŒจ๋‹‰ ๋ณต๊ตฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌ์ถ•ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ํŒจ๋‹‰์„ ํ”ผํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฑฐ์˜ ํ•ญ์ƒ ์œ ๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

  3. ๋งˆ์ง€๋ง‰ ํฌ์ธํŠธ๋ฅผ ํ”ผ๊ธฐ๋ฐฑํ•˜๋ฉด panic ๋Š” ํ˜ธ์ถœ์— ์ค‘์ฒฉ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ณด๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹ํŒจ๋‹‰์€ ๋งค์šฐ ์ฐพ๊ธฐ ์‰ฝ๊ณ  ๊ทธ๊ฒƒ์ด ํ•˜๋Š” ์ผ์— ๋Œ€ํ•ด ์ง๊ด€์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

try ํ•จ์ˆ˜๋Š” ์ด๋Ÿฌํ•œ ์  ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ถฉ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. ๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋ณด์ง€ ์•Š๊ณ ๋Š” try ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ถ”์ธกํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์–ธ์–ด์—์„œ ํ‚ค์›Œ๋“œ๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ Go์—์„œ ์ด ํ‚ค์›Œ๋“œ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

  2. try ๋Š” ํŠนํžˆ ํ•จ์ˆ˜์ผ ๋•Œ ๋ˆˆ์— ๋„์ง€ ์•Š์Šต๋‹ˆ๋‹ค. _ํŠนํžˆ_ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ์ด๋ฅผ ํ•จ์ˆ˜๋กœ ๊ฐ•์กฐํ•  ๋•Œ. _ESPECIALLY_ Java์™€ ๊ฐ™์€ ์–ธ์–ด๋กœ ๊ฐœ๋ฐœํ•œ ํ›„ try ๋Š” ๋ถˆํ•„์š”ํ•œ ์ƒ์šฉ๊ตฌ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค(ํ™•์ธ๋œ ์˜ˆ์™ธ ๋•Œ๋ฌธ์—).

  3. try ๋Š” ์ด์ „ ์ฃผ์„ proc := try(os.FindProcess(try(strconv.Atoi(os.Args[1])))) ์˜ ์˜ˆ์— ๋”ฐ๋ผ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ธ์ˆ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฐœ๊ฒฌํ•˜๊ธฐ๊ฐ€ ๋”์šฑ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

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


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

@buchanae ํฅ๋ฏธ๋กญ๋„ค์š”. ๊ทธ๋Ÿฌ๋‚˜ ์ž‘์„ฑ๋œ ๋Œ€๋กœ fmt ์Šคํƒ€์ผ ํ˜•์‹์„ ํŒจํ‚ค์ง€์—์„œ ์–ธ์–ด ์ž์ฒด๋กœ ์ด๋™ํ•˜์—ฌ ์›œ์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ž‘์„ฑ๋œ ๋Œ€๋กœ fmt ์Šคํƒ€์ผ ํ˜•์‹์„ ํŒจํ‚ค์ง€์—์„œ ์–ธ์–ด ์ž์ฒด๋กœ ์ด๋™ํ•˜์—ฌ ์›œ์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค.

์ข‹์€ ์ง€์ . ๋” ๊ฐ„๋‹จํ•œ ์˜ˆ:

a, b, err := myFunc()
check(err, "calling myFunc")

@buchanae ์šฐ๋ฆฌ๋Š” ๋ช…์‹œ์  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ try ์™€ ๋ณด๋‹ค ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์„ค๊ณ„ ๋ฌธ์„œ , ํŠนํžˆ ์„ค๊ณ„ ๋ฐ˜๋ณต ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. check ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ํŠน์ • ์ œ์•ˆ์€ ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒฝ์šฐ API์™€ ๊ฐ™์€ fmt.Errorf ( check ์˜ ์ผ๋ถ€๋กœ)์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ†ตํ•ด ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ฐ•ํ•˜๋Š” ๊ฒƒ๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์€ ์˜ค๋ฅ˜ ๋ฌธ์ž์—ด์„ ํ†ตํ•ด ์›๋ž˜ ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•˜๋Š” ์ƒˆ ํ•ญ๋ชฉ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

a, b, c, ... err := try(someFunctionCall())
if err != nil {
   return ..., err
}

์ด๋ ‡๊ฒŒ ์ƒ๊ธด ์ฝ”๋“œ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์™€ ๊ฐ™์ด ๋ณด์ด๋Š” ๋ชจ๋“  ์ฝ”๋“œ์— ๋” ๋งŽ์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  defer ๊ฐ€ ์˜ณ์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ if ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ์ค„์„ ๋”ฐ๋ฅด์ง€ ์•Š๋Š”๋‹ค:

defer fmt.HandleErrorf(&err, โ€œfoobarโ€)

์ด๋Š” ํ”Œ๋กœ์–ด์— ์ธ๋ฐ”์šด๋“œ ์˜ค๋ฅ˜๋ฅผ ๋–จ์–ด๋œจ๋ฆฌ๋Š”๋ฐ, ์ด๋Š” ์ด๋ก€์ ์ธ ์ผ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ๋” ์“ฐ๋ผ๋Š” ๊ฑด๊ฐ€์š”?

defer fmt.HandleErrorf(&err, โ€œfoobar: %vโ€, err)

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

@buchanae ๊ฐ€ ์ œ๊ธฐํ•œ ๋‘ ๊ฐ€์ง€ ์šฐ๋ ค ์‚ฌํ•ญ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๋ฐ ์ปจํ…์ŠคํŠธ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ช…๋ช… ๋œ ๋ฐ˜ํ™˜์ด ์•ฝ๊ฐ„ ๋ฒˆ๊ฑฐ๋กญ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ๋ฌธ์„œํ™”๋กœ์„œ๋งŒ ์ •๋ง๋กœ ์œ ์ตํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์—๊ฒŒ ๋” ๋งŽ์ด ๊ธฐ๋Œ€๋Š” ๊ฒƒ์€ ๊ฑฑ์ •์ž…๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋ชจํ˜ธํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋” ์ƒ๊ฐํ•˜๊ณ  ์ข€ ๋” ๊ตฌ์ฒด์ ์ธ ์ƒ๊ฐ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

๊ธฐ์กด ์ฝ”๋“œ:

func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
        err := dbfile.RunMigrations(db, dbMigrations)
        if err != nil {
                return nil, err
        }
        t := &Thing{
                thingy: thingy,
        }
        t.scanner, err = newScanner(thingy, db, client)
        if err != nil {
                return nil, err
        }
        t.initOtherThing()
        return t, nil
}

try ์‚ฌ์šฉ:

func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
        try(dbfile.RunMigrations(db, dbMigrations))
        t := &Thing{
                thingy:  thingy,
                scanner: try(newScanner(thingy, db, client)),
        }
        t.initOtherThing()
        return t, nil
}

newScanner ๊ฐ€ ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋œ ๋ช…ํ™•ํ•˜๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์†์‹ค์€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ try ๊ฐ€ ์žˆ๋Š” ์„ธ์ƒ์—์„œ Go ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๊ทธ ์กด์žฌ์— ๋” ๋ฏผ๊ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@josharian main ๋ฐ˜ํ™˜ error ๊ด€๋ จ : ๊ท€ํ•˜์˜ ์ž‘์€ ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์ด ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ์–ป๋Š” ๋ฐ ํ•„์š”ํ•œ ์ „๋ถ€์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. main ์˜ ์„œ๋ช…์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ •๋‹นํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

"foobar" ์˜ˆ์— ๊ด€ํ•˜์—ฌ: ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋‚˜์œ ์˜ˆ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ ๋ฐ”๊ฟ”์•ผ๊ฒ ๋„ค์š”. ์˜ฌ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

defer fmt.HandleErrorf(&err, โ€œfoobar: %vโ€, err)

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

ํŽธ์ง‘: ์ด ์ดˆ๊ธฐ ํ‰๊ฐ€ ๋ฒ„๊ทธ๋Š” ์˜ˆ์ œ์— ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฌธ์„œ ๋ ๋ถ€๋ถ„:

defer fmt.HandleErrorf(&err, "copy %s %s: %v", src, dst, err)

@adg ์˜ˆ, try ๋Š” ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋‹ค์‹œ: ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์ œ์•ˆ์ด ๋ชจ๋“  ์˜ค๋ฅ˜์— ์Šคํƒ ์ถ”์ ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ธธ์„ ์žƒ์—ˆ๋‹ค.

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

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

๋งž์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ด ํŠน์ • ์ฝ”๋“œ์—์„œ ์„ ํƒํ•œ ๋””์ž์ธ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋งŽ์ด ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.

๋””๋ฒ„๊น…์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์šฐ๋ ค๋ฅผ @deanveloper ๋ฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ด์ง€๋งŒ ์ œ3์ž ์ข…์†์„ฑ์˜ ์Šคํƒ€์ผ์€ ์šฐ๋ฆฌ๊ฐ€ ํ†ต์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋œ ๋ฐ˜๋ณต์ ์ธ if err := ... { return err } ๊ฐ€ ๊ธฐ๋ณธ ํฌ์ธํŠธ๋ผ๋ฉด https://github.com/golang/go/issues/27794 ๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์ฒ˜๋Ÿผ "์กฐ๊ฑด๋ถ€ ๋ฐ˜ํ™˜"์œผ๋กœ ์ถฉ๋ถ„ํ• ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

        return nil, err if f, err := os.Open(...)
        return nil, err if _, err := os.Write(...)

๋‚˜๋Š” ? ๊ฐ€ try ๋ณด๋‹ค ๋” ์ ํ•ฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ํ•ญ์ƒ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด defer ๋ฅผ ์ถ”์ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋„ ๊นŒ๋‹ค๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ try/catch ๋ฅผ ์˜์›ํžˆ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์™ธ์— ๋Œ€ํ•œ ๊ฒŒ์ดํŠธ๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ ์˜์›ํžˆ try/catch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒŒ์ดํŠธ๋ฅผ ๋‹ซ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์œผ๋กœ _๋”_ ์ด์ƒ์ž…๋‹ˆ๋‹ค.

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

@griesemer ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด :

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด ์ œ์•ˆ์€ ๋ชจ๋“  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ try๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
a, b, c, ... err := try(someFunctionCall())
์˜ค๋ฅ˜ != nil {
๋ฐ˜ํ™˜ ..., ์˜ค๋ฅ˜
}
์ด๋ ‡๊ฒŒ ์ƒ๊ธด ์ฝ”๋“œ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์™€ ๊ฐ™์ด ๋ณด์ด๋Š” ๋ชจ๋“  ์ฝ”๋“œ์— ๋” ๋งŽ์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. defer๊ฐ€ ์˜ณ์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ์—ฌ์ „ํžˆ if ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฒŒ๋‹ค๊ฐ€, ์ด ์ œ์•ˆ์€ ์ง€์—ฐ ํ˜ธ์ถœ๊ณผ ํ•จ๊ป˜ ๋ช…๋ช…๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ _๋‹จ์ผ ์žฅ์†Œ_์—์„œ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ์‚ฌ์ดํŠธ๋ฅผ ๋ž˜ํ•‘/์žฅ์‹ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์‹ค์ œ ์ฝ”๋“œ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

func (p *pgStore) DoWork() error {
    tx, err := p.handle.Begin()
    if err != nil {
        return err
    }
    var res int64
    err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
    if err != nil {
        tx.Rollback()
        return fmt.Errorf("insert table: %w", err)
    }

    _, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
    if err != nil {
        tx.Rollback()
        return fmt.Errorf("insert table2: %w", err)
    }
    return tx.Commit()
}

์ œ์•ˆ์— ๋”ฐ๋ฅด๋ฉด:

์˜ค๋ฅ˜ ๋ณด๊ฐ• ๋˜๋Š” ๋ž˜ํ•‘์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ฆ๋œ if ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ๋˜๋Š” defer ๋ฌธ์œผ๋กœ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ "์„ ์–ธ"ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด "์‹ค๋ ฅ์ด ๊ฒ€์ฆ๋œ if ๋ฌธ์„ ๊ณ ์ˆ˜ํ•˜๋‹ค"์˜ ๋ฒ”์ฃผ์— ์†ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ๋„ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Go ํŒ€์ด ์ œ๋„ค๋ฆญ์˜ ์šฐ์„  ์ˆœ์œ„ ๋ฅผ ์ •ํ•  ๊ฒƒ์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. Go ํŒ€์ด ๊ฐ€์žฅ ๋งŽ์€ ๋น„ํŒ์„ ๋“ฃ๋Š” ๊ณณ์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ์˜ ๊ธฐ์ˆ ์€ ๊ทธ๋ ‡๊ฒŒ ๊ณ ํ†ต์Šค๋Ÿฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค( go fmt ๋Š” ํ•œ ์ค„์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).

try() ๊ฐœ๋…์—๋Š” ์ฒดํฌ/ํ•ธ๋“ค์—์„œ check ์˜ ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ทธ๊ฒƒ์€ Go์ฒ˜๋Ÿผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ Go์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ›„์† nil ํ…Œ์ŠคํŠธ ์—†์ด ํ• ๋‹น ๊ตฌ๋ฌธ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธ/์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ 13๊ฐœ์˜ ๊ฐœ๋ณ„ ์‘๋‹ต ์ด ์ด๋ฅผ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ _๋ฐ˜๋ณต ํ…Œ๋งˆ_๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
    https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring -themes

    f, #      := os.Open(...) // return on error
    f, #panic := os.Open(...) // panic on error
    f, #hname := os.Open(...) // invoke named handler on error
    // # is any available symbol or unambiguous pair
    
  2. ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์ค‘์ฒฉ์€ ์ž‘์—… ์ˆœ์„œ๋ฅผ ๋ชจํ˜ธํ•˜๊ฒŒ ํ•˜๊ณ  ๋””๋ฒ„๊น…์„ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ์˜ ์ƒํƒœ์™€ ํ˜ธ์ถœ ์ˆœ์„œ๊ฐ€ ๋ช…ํ™•ํ•ด์•ผ ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    try(step4(try(step1()), try(step3(try(step2())))))
    ์ด์ œ ์–ธ์–ด๊ฐ€ ๋‹ค์Œ์„ ๊ธˆ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค.
    f(t ? a : b) ๋ฐ f(a++)

  3. ์ปจํ…์ŠคํŠธ ์—†์ด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธ/์ฒ˜๋ฆฌ์˜ ์ฃผ์š” ๊ทผ๊ฑฐ๋Š” ์ƒํ™ฉํ™”๋ฅผ ์žฅ๋ คํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  4. error ์œ ํ˜•๊ณผ ๋งˆ์ง€๋ง‰ ๋ฐ˜ํ™˜ ๊ฐ’์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ ์ƒํƒœ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋ฐ˜ํ™˜ ๊ฐ’/์œ ํ˜•์„ ๊ฒ€์‚ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ if errno := f(); errno != 0 { ... } ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

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

    • log.Fatal()
    • ๋ฐœ์ƒํ•˜์ง€ ๋ง์•„์•ผ ํ•  ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ํŒจ๋‹‰()
    • ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋‹ค์‹œ ์‹œ๋„

@gopherbot ์€ Go2, LanguageChange ์ถ”๊ฐ€

? ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ rust ์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ๋ฅผ ์–ธ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

try() ํ˜ธ์ถœ์— ๋Œ€ํ•ด ํšŒ์˜์ ์ธ ์ด์œ ๋Š” ๋‘ ๊ฐ€์ง€ ์•”์‹œ์  ๋ฐ”์ธ๋”ฉ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ๊ณผ try()์— ๋Œ€ํ•œ ์ธ์ˆ˜๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. try()์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜ ๊ฐ’์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ธ์ˆ˜ ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ try()๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ด ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋ ค๋ฉด ๋” ๋งŽ์€ ํ‘œํ˜„์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

func doSomething() (int, %error) {
  f := try(foo())
  ...
}
  • doSomething์˜ ๋ฐ˜ํ™˜ ๊ฐ’์— %error ๊ฐ€ ์—†์œผ๋ฉด try()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • foo()๊ฐ€ ๋ฐ˜ํ™˜ ๊ฐ’์˜ ๋งˆ์ง€๋ง‰์— ์˜ค๋ฅ˜๊ฐ€ ์—†์œผ๋ฉด try()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ๊ตฌ๋ฌธ์— ์ƒˆ๋กœ์šด ์š”๊ตฌ ์‚ฌํ•ญ/๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ foo()์—๋„ %error๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทœ์น™ 1๊ฐœ ์ถ”๊ฐ€

  • %error๋Š” ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’ ๋ชฉ๋ก์—์„œ ํ•˜๋‚˜๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ธ๋ถ€ ์„ค๊ณ„ ๋ฌธ์„œ์—์„œ ์ด์ „ ๋ฐ˜๋ณต์—์„œ try ๋‚ด์žฅ ํ•จ์ˆ˜์— ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ์ œ์•ˆ๋˜์—ˆ์Œ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด:

handler := func(err error) error {
        return fmt.Errorf("foo failed: %v", err)  // wrap error
}

f := try(os.Open(filename), handler)  

๋˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

f := try(os.Open(filename), func(err error) error {
        return fmt.Errorf("foo failed: %v", err)  // wrap error
})  

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

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

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

Hacker ๋‰ด์Šค์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์š”์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. try ๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ(๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์Œ) ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. return ๋˜๋Š” defer ๊ตฌ๋ฌธ์ด ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

func CopyFile(src, dst string) (err error) {
        r := try os.Open(src)
        defer r.Close()

        w := try os.Create(dst)
        defer func() {
                w.Close()
                if err != nil {
                        os.Remove(dst) // only if a โ€œtryโ€ fails
                }
        }()

        try io.Copy(w, r)
        try w.Close()
        return nil
}

@sheerun ์ด์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๋ฐ˜๋ก ์€ panic ๊ฐ€ ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ œ์–ด ํ๋ฆ„๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์— ๋™์˜ํ•˜์ง€ ์•Š์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋งž์Šต๋‹ˆ๋‹ค.

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

์ด ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ tryf ์™€ ๊ฐ™์€ ์„ ํƒ์  ์ฆ๋Œ€ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋ณ€ํ˜•์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func tryf(t1 T1, t1 T2, โ€ฆ tn Tn, te error, fn func(error) error) (T1, T2, โ€ฆ Tn)

์ด๊ฒƒ์„ ๋ฒˆ์—ญ

x1, x2, โ€ฆ xn = tryf(f(), func(err error) { return fmt.Errorf("foobar: %q", err) })

์ด๊ฒƒ์œผ๋กœ

t1, โ€ฆ tn, te := f()
if te != nil {
    if fn != nil {
        te = fn(te)
    }
    err = te
    return
}

์ด๊ฒƒ์€ ๋ช…์‹œ์ ์ธ ์„ ํƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ( try ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ ) ์šฐ๋ฆฌ๋Š” ์ด ๋””์ž์ธ์˜ ์ด์ „ ๋ฒ„์ „์—์„œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ํ•ฉ๋ฆฌ์ ์ธ ๋‹ต๋ณ€์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ๋Šฅ ๋ณด๊ฐ•์ด nil์ด๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ  ์›๋ž˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

try ๊ฐ€ ๊ธฐ์กด์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋Œ€์ฒดํ•˜๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ์˜ค๋ฅ˜ ๊ฒฝ๋กœ์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ค์›Œ์งˆ๊นŒ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค.

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

a, b, err := doWork()
if err != nil {
  updateCounters()
  writeLogs()
  return err
}

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

@politician , ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฐพ๊ณ  ๊ณ„์‹  ๋‹จ์–ด๋Š” _social_์ด ์•„๋‹ˆ๋ผ _opinionated_์ž…๋‹ˆ๋‹ค. Go๋Š” ๋…์ฐฝ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ๋Œ€๋ถ€๋ถ„ ๋‹น์‹ ์ด ๋ฌด์—‡์„ ์–ป๊ณ  ์žˆ๋Š”์ง€์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

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

@politician ๋ช…ํ™•ํžˆ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋“œ๋ผ๋งˆ๋ฅผ ํ”ผํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•œ๋‹ค.

๋ธ”๋กœ๊ทธ์—์„œ: Errors are values โ€‹โ€‹, ๋‚ด ๊ด€์ ์—์„œ ์ด๊ฒƒ์€ ๋ฌด์‹œ๋˜์ง€ ์•Š๋Š” ๊ฐ€์น˜๋ฅผ ๊ฐ–๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ €๋Š” Rop Pike๊ฐ€ "๊ฐ’์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋  ์ˆ˜ ์žˆ๊ณ  ์˜ค๋ฅ˜๋Š” ๊ฐ’์ด๋ฏ€๋กœ ์˜ค๋ฅ˜๋„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•œ ๊ฒƒ์„ ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” error ๋ฅผ exception ๋กœ ๊ฐ„์ฃผํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒ๊ฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฝ”๋”ฉ์—๋„ ๋ณต์žก์„ฑ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜์‹ญ์‹œ์˜ค." -- ๋กญ ํŒŒ์ดํฌ

๋˜ํ•œ ์ด ์Šฌ๋ผ์ด๋“œ ๋ฅผ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

if ๋ฅผ ํ†ตํ•œ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๊ฐ€ ํŠนํžˆ ์–ด์ƒ‰ํ•œ ํ•œ ๊ฐ€์ง€ ์ƒํ™ฉ์€ ํŒŒ์ผ์„ ๋‹ซ์„ ๋•Œ์ž…๋‹ˆ๋‹ค(์˜ˆ: NFS์—์„œ). ํ˜„์žฌ .Close() ์—์„œ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

r, err := os.Open(src)
if err != nil {
    return err
}
defer func() {
    // maybe check whether a previous error occured?
    return r.Close()
}()

defer try(r.Close()) ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ๊ตฌ๋ฌธ์„ ๊ฐ–๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ ์–ด๋„ r.Close() ๋ฐ w.Close() ์˜ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•˜์ง€ ์•Š๋„๋ก ์ œ์•ˆ์—์„œ CopyFile() ์˜ˆ์ œ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@seehuhn ์ง€์—ฐ๋œ ํ•จ์ˆ˜์— ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ œ๊ฐ€ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

func doWork() (err error) {
  r, err := os.Open(src)
  if err != nil {
    return err
  }
  defer func() {
    err = r.Close()  // overwrite the return value
  }()
}

์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๋Š” ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ ์ œ์•ˆ์ด ๋งˆ์Œ์— ๋“ค์ง€๋งŒ @seehuhn ์˜ ์˜ˆ๋„ ๋‹ค๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

defer try(w.Close())

์˜ค๋ฅ˜๊ฐ€ ์•„์ง ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ Close()์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ž์ฃผ์“ฐ๋Š” ํŒจํ„ด์ธ๋ฐ..

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

๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ์ฒซ ๋ฒˆ์งธ ์ผ์€ fmt.HandleErrorf ๋ฅผ tryf ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์˜ค๋ฅ˜์— ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ ‘๋‘์‚ฌ๋กœ ๋ถ™์˜€์Šต๋‹ˆ๋‹ค.

func tryf(t1 T1, t1 T2, โ€ฆ tn Tn, te error, ts string) (T1, T2, โ€ฆ Tn)

์˜ˆ๋ฅผ ๋“ค์–ด (๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์‹ค์ œ ์ฝ”๋“œ์—์„œ):

func (c *Config) Build() error {
    pkgPath, err := c.load()
    if err != nil {
        return nil, errors.WithMessage(err, "load config dir")
    }
    b := bytes.NewBuffer(nil)
    if err = templates.ExecuteTemplate(b, "main", c); err != nil {
        return nil, errors.WithMessage(err, "execute main template")
    }
    buf, err := format.Source(b.Bytes())
    if err != nil {
        return nil, errors.WithMessage(err, "format main template")
    }
    target := fmt.Sprintf("%s.go", filename(pkgPath))
    if err := ioutil.WriteFile(target, buf, 0644); err != nil {
        return nil, errors.WithMessagef(err, "write file %s", target)
    }
    // ...
}

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

func (c *Config) Build() error {
    pkgPath := tryf(c.load(), "load config dir")
    b := bytes.NewBuffer(nil)
    tryf(emplates.ExecuteTemplate(b, "main", c), "execute main template")
    buf := tryf(format.Source(b.Bytes()), "format main template")
    target := fmt.Sprintf("%s.go", filename(pkgPath))
    tryf(ioutil.WriteFile(target, buf, 0644), fmt.Sprintf("write file %s", target))
    // ...
}

๋˜๋Š” @agnivade ์˜ ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func (p *pgStore) DoWork() (err error) {
    tx := tryf(p.handle.Begin(), "begin transaction")
        defer func() {
        if err != nil {
            tx.Rollback()
        }
    }()
    var res int64
    tryf(tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res), "insert table")
    _, = tryf(tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res), "insert table2")
    return tryf(tx.Commit(), "commit transaction")
}

๊ทธ๋Ÿฌ๋‚˜ @josharian ์€ ์ด ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ์ฃผ์ €ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ข‹์€ ์ ์„ ์ œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ž‘์„ฑ๋œ ๋Œ€๋กœ fmt ์Šคํƒ€์ผ ํ˜•์‹์„ ํŒจํ‚ค์ง€์—์„œ ์–ธ์–ด ์ž์ฒด๋กœ ์ด๋™ํ•˜์—ฌ ์›œ์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ค๋‹ˆ๋‹ค.

์ €๋Š” ์ด ์ œ์•ˆ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ์˜ˆ์—์„œ ์ด์ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๊ทธ๊ฒƒ์€ ์ฃผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ("์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ๋œ ์ƒ์šฉ๊ตฌ๋ฌธ")๊ฐ€ ๋‹จ์ˆœํžˆ ๋‚˜์—๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๊ฐ€ ๋‹จ์ˆœํžˆ if err != nil { return err } ์ด๋ฉด ์ด์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ๊ฐ€์น˜๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(Go๋Š” ์„ฑํ–ฅ์— ๋”ฐ๋ผ ์ƒ๋Œ€์ ์œผ๋กœ ์„คํƒ•์ด ์—†๋Š” ์–ธ์–ด์ž„).

์‚ฌ์‹ค, nil์ด ์•„๋‹Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋‚ด๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ์ผ์€ ์ƒํ™ฉ๋งˆ๋‹ค ์ƒ๋‹นํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ t.Fatal(err) ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์žฅ์‹ ๋ฉ”์‹œ์ง€ return fmt.Sprintf("oh no: %v", err) ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๊ณ„์†ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. SafeWriter ๊ฐœ์ฒด์— ์˜ค๋ฅ˜ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ณ„์† ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ผ๋ถ€ ์ž‘์—… ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹๋๋‚  ๋•Œ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ try ๋กœ ์ž๋™ํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ try ์— ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ๋ชจ๋“  if err != nil ๋ธ”๋ก์„ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋ผ๋ฉด ํ•ด๋‹น ์ธ์ˆ˜๋Š” ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ ์ค‘ _์ผ๋ถ€_๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๊นŒ? ํ™•์‹ ํ•˜๋Š”. ๊ทธ๊ฒƒ์ด ๋‚˜์—๊ฒŒ ๋งค๋ ฅ์ ์ธ ์ œ์•ˆ์ž…๋‹ˆ๊นŒ? ์Œ. ๋‚˜๋Š” ์ •๋ง๋กœ ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‚˜์—๊ฒŒ if err != nil ๋Š” ์ค‘๊ด„ํ˜ธ ๋˜๋Š” defer ์™€ ๊ฐ™์ด Go์˜ ์ผ๋ถ€์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. Go๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์ด๊ฒƒ์ด ์žฅํ™ฉํ•˜๊ณ  ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ, Go๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ์–ธ์–ด๋ฅผ ๊ทน์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

@peterbourgon ๋ฐ @deanveloper ๋ฅผ ์—์ฝ”ํ•˜๊ธฐ ์œ„ํ•ด Go์—์„œ ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ์ฝ”๋“œ ํ๋ฆ„์ด ๋ช…ํ™•ํ•˜๊ณ  panic()์ด Python์—์„œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ‘œ์ค€ ํ๋ฆ„ ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์ทจ๊ธ‰ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŒจ๋‹‰์— ๋Œ€ํ•œ ๋…ผ์Ÿ๊ณผ ๊ด€๋ จํ•˜์—ฌ, panic()์€ ๊ฐ€์น˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ํ•ญ์ƒ ํ•œ ์ค„์— ๋‹จ๋…์œผ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. fmt.Println(panic("oops")) ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€์‹œ์„ฑ์„ ์—„์ฒญ๋‚˜๊ฒŒ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค try() ์™€ ๋น„๊ตํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

์ œ์•ˆ์„œ์˜ ์˜ˆ ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

func printSum(a, b string) error {
        fmt.Println(
                "result:",
                try(strconv.Atoi(a)) + try(strconv.Atoi(b)),
        )
        return nil
}

์ œ์–ด ํ๋ฆ„์€ ์‹ค์ œ๋กœ ๋œ ๋ช…ํ™•ํ•ด์ง€๊ณ  ๋งค์šฐ ๋ชจํ˜ธํ•ด์ง‘๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ ๋ชจ๋“  ์˜ค๋ฅ˜๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” Rob Pike์˜ ์ดˆ๊ธฐ ์˜๋„์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ๋ฐ˜์‘์€ "์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”"์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฌธ์ œ๋Š” -- ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ณ  ์ฝ๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ ํšŒ์‚ฌ๊ฐ€ go 2๋ฅผ ์ฑ„ํƒํ•˜์ง€ ์•Š๋„๋ก ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  try ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜ ํ˜ผ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด python 2/3 ๋ถ„ํ• ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ try ์˜ ์ด๋ฆ„์€ ๊ฒฐ๊ตญ catch ๊ฐ€ ๊ตฌ๋ฌธ์— ํ‘œ์‹œ๋˜๊ณ  Java๋กœ ๋Œ์•„๊ฐˆ ๊ฒƒ์ž„์„ ์ž๋™์œผ๋กœ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ ๋•Œ๋ฌธ์— ์ €๋Š” ์ด ์ œ์•ˆ์— _๊ฐ•๋ ฅํ•˜๊ฒŒ_ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

try ์ด๋ฆ„์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹คํŒจ ์œ„ํ—˜์ด ๋†’์€ ์ผ์„ ํ•˜๋ ค๋Š” _์‹œ๋„_๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(์ €๋Š” ์˜์–ด๊ฐ€ ๋ชจ๊ตญ์–ด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— try ์— ๋Œ€ํ•œ ๋ฌธํ™”์  ํŽธ๊ฒฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). (์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ์žฅํ™ฉํ•จ์„ ์ค„์ด๋ ค๋Š” ๋™๊ธฐ) ๋‚™๊ด€์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ์ œ์•ˆ์—์„œ try ๋Š” ์‹ค์ œ๋กœ ์˜ค๋ฅ˜๋ฅผ ์กฐ๊ธฐ์— ๋ฐ˜ํ™˜ํ•˜๋Š” _์บ์น˜_ํ•ฉ๋‹ˆ๋‹ค. @HiImJC์˜ pass ์ œ์•ˆ์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

์ด๋ฆ„ ์™ธ์—๋„ return ์™€ ๊ฐ™์€ ๋ฌธ์ด ์ด์ œ ํ‘œํ˜„์‹ ์ค‘๊ฐ„์— ์ˆจ๊ฒจ์ ธ ์žˆ๋Š” ๊ฒƒ์ด ์–ด์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Go ํ๋ฆ„ ์Šคํƒ€์ผ์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

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

๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์€ ํ•ด๋‹น ์‚ฌ์ดํŠธ์—์„œ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜ ์ข…๋ฅ˜๋ฅผ ์ •์˜/ํ—ˆ์šฉ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด try ์— ๋Œ€ํ•œ ์„ ํƒ์  ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ๊ฐ–๋Š” (ํ๊ธฐ๋œ) ์•„์ด๋””์–ด์˜ ์šฉ๋„๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ’( io.EOF ๋“ฑ) ๋˜๋Š” ์œ ํ˜•( *os.PathError , *exec.ExitError )์œผ๋กœ "์˜ค๋ฅ˜ ์ข…๋ฅ˜"๋ฅผ ์ •์˜ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์•ฝ๊ฐ„ ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค. ๊ฐ’์„ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ธ์ˆ˜๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€๋งŒ ์œ ํ˜•์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด์ง€๋งŒ ์•„์ด๋””์–ด๋ฅผ ๋˜์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@josharian ์ด ์ง€์ ํ•œ ๋ฌธ์ œ๋Š” err ํ‰๊ฐ€๋ฅผ ์ง€์—ฐํ•จ์œผ๋กœ์จ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

defer func() { fmt.HandleErrorf(&err, "oops: %v", err) }()

๋ณด๊ธฐ์—๋Š” ์ข‹์ง€ ์•Š์ง€๋งŒ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋ฅ˜ ํฌ์ธํ„ฐ ๋˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ์ƒˆ ํ˜•์‹ํ™” ๋™์‚ฌ/ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ผ๋ฐ˜ %v ์™€ ๊ฐ™์ด ์—ญ์ฐธ์กฐ๋œ ๊ฐ’์„ ์ธ์‡„ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด %*v ๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค.

defer fmt.HandleErrorf(&err, "oops: %*v", &err)

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

ํŽธ์ง‘ํ•˜๋‹ค:

๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ Stringer ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์กฐ์ฒด์—์„œ ์˜ค๋ฅ˜ ํฌ์ธํ„ฐ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

type wraperr struct{ err *error }
func (w wraperr) String() string { return (*w.err).Error() }

...

defer handleErrorf(&err, "oops: %v", wraperr{&err})

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

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

๋ช…์‹œ๋œ ์ œ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ถˆ๋ถ„๋ช…ํ•œ ๋™์ž‘์ด ์žˆ์œผ๋ฏ€๋กœ ๋” ๋ช…ํ™•ํ•œ _explicit_ ์ถ”๊ฐ€ ~3์ค„๋ณด๋‹ค ์ด๋ฏธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ์ง‘์—์„œ ์—ฐ๊ธฐ ํŒจํ„ด์„ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ–ˆ์„ ๋•Œ ๋น„์Šทํ•˜๊ฒŒ ํ˜ผํ•ฉ๋œ ์ˆ˜์‹ ์„ ๋ณด์ธ ๊ธฐ์‚ฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค - https://bet365techblog.com/better-error-handling-in-go

๊ทธ๋Ÿฌ๋‚˜ check / handle ์ œ์•ˆ์ด ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์„ ์˜ˆ์ƒํ•˜์—ฌ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

Check/handle์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ํ›จ์”ฌ ๋” ํฌ๊ด„์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. handle ๋ธ”๋ก์€ ์ •์˜๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ธฐ๋Šฅ ๋ฒ”์œ„๋ฅผ ์œ ์ง€ํ•œ ๋ฐ˜๋ฉด, ๋ชจ๋“  defer ๋ฌธ์€ ์–‘์— ์ƒ๊ด€์—†์ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋งŽ์€ ์ƒˆ๋กœ์šด ์ปจํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ go์˜ ๊ด€์šฉ๊ตฌ์— ๋” ๋ถ€ํ•ฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. "๋ฐœ์ƒํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜"ํ•˜๋Š” ๋™์ž‘์„ ์›ํ•˜๋ฉด ๋ช…์‹œ์ ์œผ๋กœ handle { return err } ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์ง€์—ฐ ๊ธฐ๋ฐ˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ A Thing์ด ๋  ๊ฒฝ์šฐ ๋‹ค์Œ ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์˜ค๋ฅ˜ ํŒจํ‚ค์ง€์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

        f := try(os.Create(filename))
        defer errors.Deferred(&err, f.Close)

์ง€์—ฐ๋œ Close ๋ฌธ์˜ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋•๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ ๋„๊ตฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ํ•˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜๋Š” ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ‚ค์›Œ๋“œ๋ณด๋‹ค ํŒ๋งค๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
Zig[1]์ฒ˜๋Ÿผ ํ‚ค์›Œ๋“œ์˜€์œผ๋ฉด ๋” ์ข‹๊ฒ ๋‹ค.

  1. https://ziglang.org/documentation/master/#try

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

์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ œ์–ด ํ๋ฆ„์ด Go(๋ฐ ๋‹ค๋ฅธ ๋งŽ์€ ์–ธ์–ด)์—์„œ ํ‘œํ˜„๋˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜ํ™˜ ๋ฌธ(๋ฐ ํŒจ๋‹‰)์„ ์ฆ‰์‹œ ์ธ์‹ํ•˜๋Š” ๋ฐ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ฆฌํ„ด์„ ์œ„ํ•ด ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ผ๋ถ€๊ฐ€ ์ต์ˆ™ํ•ด์ง€๋ฉด try๋ฅผ ์ œ์–ด ํ๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ข‹์€ IDE ์ง€์›์ด ์ด๊ฒƒ์—๋„ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์–ด ์˜์‹ฌ์น˜ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒ๋‹นํžˆ ๋ฌด๋ฆฌ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. gofmt's ์ฝ”๋“œ์—์„œ ๋ฐ˜ํ™˜๊ฐ’์€ ํ•ญ์ƒ /^\t*return / ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋„์›€ ์—†์ด๋Š” ๋ˆˆ์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ์‚ฌ์†Œํ•œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— try ๋Š” ์ฝ”๋“œ์˜ ์–ด๋Š ๊ณณ์—์„œ๋‚˜ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ ์ž„์˜๋กœ ๊นŠ์ˆ™์ด ์ค‘์ฒฉ๋ฉ๋‹ˆ๋‹ค. ๊ต์œก์„ ์•„๋ฌด๋ฆฌ ๋งŽ์ด ํ•ด๋„ ๋„๊ตฌ ์ง€์› ์—†์ด ๊ธฐ๋Šฅ์˜ ๋ชจ๋“  ์ œ์–ด ํ๋ฆ„์„ ์ฆ‰์‹œ ๋ฐœ๊ฒฌํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

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

์–ธ์–ด ๊ธฐ๋Šฅ์€ ํŽธ์ง‘๊ธฐ ์ง€์›์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๊ทธ ์ž์ฒด๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@kungfusheep ๋‚˜๋Š” ๊ทธ ๊ธฐ์‚ฌ๋ฅผ ์ข‹์•„ํ•œ๋‹ค. defer๋งŒ์œผ๋กœ ๋ž˜ํ•‘์„ ์ฒ˜๋ฆฌํ•˜๋ฉด try ์—†์ด ์ด๋ฏธ ๊ฐ€๋…์„ฑ์ด ์ƒ๋‹นํžˆ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” Go์˜ ์˜ค๋ฅ˜๊ฐ€ ์‹ค์ œ๋กœ ๋ฌธ์ œ๋ผ๊ณ  ๋Š๋ผ์ง€ ์•Š๋Š” ์บ ํ”„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  if err != nil { return err } ๋Š” ์ผ๋ถ€ ๊ธฐ๋Šฅ์—์„œ ์ƒ๋‹นํžˆ ๋ฒ„๋ฒ…๊ฑฐ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๋ช…๋ น๋ฌธ ํ›„์— ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ๋žฉ ๋ฐ ๋ฐ˜ํ™˜ ์ด์™ธ์˜ ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์ƒํ™ฉ์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“œ๋Š” ์˜๋ฆฌํ•œ Buffer ๊ตฌ์กฐ์ฒด๊ฐ€ ์—†์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๋‹จ๊ณ„์ผ ๋ฟ์ด๋ฉฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹จ์ˆœํžˆ ๋‹จ๋ฝ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์˜๋ฏธ๋ก ์€ ์•„์ฃผ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. try ๋ฅผ ๋ณผ ๋•Œ๋งˆ๋‹ค ํ–‰๋ณตํ•œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ฅด๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ •๋ง ์ด๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŠน์ˆ˜ ์ผ€์ด์Šค ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

@dominikh try ๋Š” ํ•ญ์ƒ /try\(/ ์™€ ์ผ์น˜ํ•˜๋ฏ€๋กœ ๊ท€ํ•˜์˜ ์š”์ ์ด ์‹ค์ œ๋กœ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•˜๊ณ  ๋‚ด๊ฐ€ ๋“ค์–ด๋ณธ ๋ชจ๋“  ํŽธ์ง‘๊ธฐ์—๋Š” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@qrpnxz ๋‚ด ์ƒ๊ฐ์— ๊ทธ๊ฐ€ ๋งํ•˜๋ ค๋Š” ์š”์ ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ˆˆ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ •๊ทœ ํ‘œํ˜„์‹์€ /^\t* ์— ์ค‘์ ์„ ๋‘” ์œ ์ถ”์ผ ๋ฟ์ด๋ฉฐ, ์ด๋Š” ๋ชจ๋“  ๋ฐ˜ํ™˜๊ฐ’์ด ์ค„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(์„ ํ–‰ ๊ณต๋ฐฑ ๋ฌด์‹œ).

์ข€ ๋” ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ "์ง€์—ฐ"์ด๋ผ๋Š” ํŒจํ‚ค์ง€์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

check ์— ๋Œ€ํ•œ ์ œ์•ˆ์„ ํ˜•์‹์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ๋ฐ˜ํ™˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด nil์„ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

func Format(err error, message string, args ...interface{}) error {
    if err == nil {
        return nil
    }
    return fmt.Errorf(...)
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func foo(s string) (int, error) {
    n, err := strconv.Atoi(s)
    try(deferred.Format(err, "bad string %q", s))
    return n, nil
}

์ œ์•ˆ๋œ fmt.HandleError๋Š” ๋Œ€์‹  ์ง€์—ฐ๋œ ํŒจํ‚ค์ง€์— ๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ  ๋‚ด errors.Defer ๋„์šฐ๋ฏธ ํ•จ์ˆ˜ ๋Š” deferred.Exec ๋กœ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์˜ค๋ฅ˜๊ฐ€ nil์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์‹œ์ €์— ๋Œ€ํ•œ ์กฐ๊ฑด๋ถ€ ์‹คํ–‰์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

func CopyFile(src, dst string) (err error) {
    defer deferred.Annotate(&err, "copy %s %s", src, dst)

    r := try(os.Open(src))
    defer deferred.Exec(&err, r.Close)

    w := try(os.Create(dst))
    defer deferred.Exec(&err, r.Close)

    defer deferred.Cond(&err, func(){ os.Remove(dst) })
    try(io.Copy(w, r))

    return nil
}

๋˜ ๋‹ค๋ฅธ ์˜ˆ:

func (p *pgStore) DoWork() (err error) {
    tx := try(p.handle.Begin())

    defer deferred.Cond(&err, func(){ tx.Rollback() })

    var res int64 
    err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
    try(deferred.Format(err, "insert table")

    _, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
    try(deferred.Format(err, "insert table2"))

    return tx.Commit()
}

์ด ์ œ์•ˆ์€ ์šฐ๋ฆฌ๋ฅผ ๋ชจ๋“  ๊ณณ์—์„œ if err != nil ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์—์„œ ๋ชจ๋“  ๊ณณ์—์„œ try ๋ฅผ ๊ฐ–๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ ๋ฌธ์ œ๋ฅผ ์ด๋™ ์‹œํ‚ค๊ณ  ํ•ด๊ฒฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋˜ํ•œ if err != nil ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ ์–ธ์–ด์˜ ๋ผ์ธ์„ ์–ด์ง€๋Ÿฝํžˆ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์•„๋ž˜์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ try ๋ณด๋‹ค ๊ฐ€๋…์„ฑ์ด ๋” ๋†’๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

file := try(os.OpenFile("thing")) // less readable than, 

file, err := os.OpenFile("thing")
if err != nil {

}

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

func getString() (string, error) { ... }

func caller() {
  defer func() {
    if err != nil { ... } // whether `err` must be defined or not is not shown in this example. 
  }

  // would call try internally, because a user is not 
  // assigning an error value. Also, it can add a compile error
  // for "defined and not used err value" if the user does not 
  // handle the error. 
  str := getString()
}

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

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

์˜ˆ๋ฅผ ๋“ค์–ด VSCode์—๋Š” iferr ๋ผ๋Š” ์Šค๋‹ˆํŽซ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ž…๋ ฅํ•˜๊ณ  Enter ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ „์ฒด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ช…๋ น๋ฌธ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค...๋”ฐ๋ผ์„œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ง€๋ฃจํ•˜์ง€ ์•Š๊ณ  ๋‚˜์ค‘์— ์ฝ๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. .

@josharian

"์ ๋‹นํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณ€๊ฒฝ"์€ ์•„๋‹ˆ์ง€๋งŒ func main() ์˜ค๋ฅ˜๋„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์ด ๊ทธ ์˜๋ฏธ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์žฌ์ž‘์„ฑ์€ ์ „์ฒด ์šด์˜ ์ฒด์ œ์—์„œ ์‹คํ–‰๋˜๋Š” "๊ธฐ์กด" Go ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๋งˆ์ดํฌ๋กœ์ปจํŠธ๋กค๋Ÿฌ ํŽŒ์›จ์–ด ๋˜๋Š” WebAssembly๋งŒ ์ž‘์„ฑํ•˜์ž๋งˆ์ž os.Exit(1) ๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ os.Exit ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธ์ถœ์ด๋ฏ€๋กœ Go ๊ตฌํ˜„์€ ๊ทธ๊ฒƒ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค. main ์˜ ๋ชจ์–‘์€ ์–ธ์–ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.


์ œ์•ˆ์— ๋Œ€ํ•œ ์งˆ๋ฌธ ์ค‘ "์•„๋‹ˆ์˜ค"๋กœ ๊ฐ€์žฅ ์ž˜ ๋Œ€๋‹ตํ•  ์ˆ˜ ์žˆ๋Š” ์งˆ๋ฌธ: try ๋Š” ๊ฐ€๋ณ€ ์ธ์ˆ˜์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๊นŒ? ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜์— ๊ฐ€๋ณ€์„ฑ์ด ์—†๋Š” ๊ฐ€๋ณ€์„ฑ(ish) ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๊นŒ?

var e []error
try(e...)

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

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

๋‚˜๋Š” ์ด๊ฒƒ์— ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋ณธ๋‹ค.

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

์ˆซ์ž 2๋Š” ํ›จ์”ฌ ๋” ๋‚˜์˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์žˆ๋Š” ๋ชจ๋“  ์˜ˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ˜ธ์ถœ์ด์ง€๋งŒ ํ›จ์”ฌ ๋” ๊ตํ™œํ•œ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func doit(abc string) error {
    a := fmt.Sprintf("value of something: %s\n", try(getValue(abc)))
    log.Println(a)
    return nil
}

์ด ์ฝ”๋“œ๋Š” sprintf ์ค‘๊ฐ„์— ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ์‚ฌ์‹ค์„ ๋†“์น˜๊ธฐ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋‚ด ํˆฌํ‘œ๋Š” ์•„๋‹ˆ์˜ค์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ go ์ฝ”๋“œ๋ฅผ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ๊ฒฌ๊ณ ํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ „์—๋„ ๋งํ–ˆ์ง€๋งŒ ์ด ์ œ์•ˆ์ด ๊ทธ๊ฒƒ์„ ์˜ˆ์‹œํ•ฉ๋‹ˆ๋‹ค. Go์— ๋Œ€ํ•œ ๋ถˆ๋งŒ์˜ 90%๋Š” "๋‚˜๋Š” if ๋ฌธ์ด๋‚˜ ๋ฃจํ”„๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค" ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•œ if ๋ฌธ์„ ์ œ๊ฑฐํ•˜์ง€๋งŒ ์ธ์ง€ ๋ถ€ํ•˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•จ์ˆ˜์˜ ์ข…๋ฃŒ์ ์„ ๋†“์น˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

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

func main() {
    f := try(os.Open("foo.txt"))
    defer f.Close()
}

main์—์„œ try ๊ณตํ™ฉ ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ํ—ˆ์šฉ๋˜๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ถˆํ–‰ํžˆ๋„ ํ…Œ์ŠคํŠธ ( func TestFoo(t* testing.T) )์—์„œ๋Š” ํŠนํžˆ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ๋Š” try/catch์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

foo() ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

func foo() (int, error) {}

๊ทธ๋Ÿฌ๋ฉด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

n := try(foo()) {
    case FirstError:
        // do something based on FirstError
    case OtherError:
        // do something based on OtherError
    default:
        // default behavior for any other error
}

๋ฒˆ์—ญ

n, err := foo()
if errors.Is(err, FirstError) {
    // do something based on FirstError
if errors.Is(err, OtherError) {
    // do something based on OtherError
} else {
    // default behavior for any other error
}

๋‚˜์—๊ฒŒ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
์ด๋ฏธ ๋„ˆ๋ฌด ๋งŽ์€ go ์ฝ”๋“œ๊ฐ€ if err != nil { return err } ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์Šคํƒ ๊นŠ์ˆ™ํ•œ ๊ณณ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ fmt.Errorf ๋ž˜ํ•‘์œผ๋กœ ๊ธฐ๋ณธ ์˜ค๋ฅ˜๋ฅผ ๋งˆ์Šคํ‚นํ•˜์—ฌ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ (์•„๋งˆ๋„) ๋” ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค.

if err != nil { return err } ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ์ผ์ข…์˜ ๋งˆ๋ฒ• ๊ฐ™์€ ์ƒˆ ํ‚ค์›Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜ํ•œ ๊ธธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด์ œ ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์‹œ๋„ ํ˜ธ์ถœ๋กœ ๋ž˜ํ•‘๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด ์˜ค๋ฅ˜๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ ๋‹ค์†Œ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค(๊ฐ€๋…์„ฑ์€ ๋–จ์–ด์ง).

func foo() error {
  /// stuff
  try(bar())
  // more stuff
}

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

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

*์ฐธ๊ณ : ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฐ˜๋ณต์„ ์ค„์ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐ˜๋ณต๋˜๋Š” ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด try() ์•ˆ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

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


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

์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ํ…Œ๋งˆ์ธ ๊ฒƒ ๊ฐ™์•„์„œ...

๊ฐ€์„ค: ๋Œ€๋ถ€๋ถ„์˜ Go ํ•จ์ˆ˜๋Š” $ (T1, T2, T3, error) $๊ฐ€ ์•„๋‹Œ (T, error) ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

try ๋ฅผ try(T1, T2, T3, error) (T1, T2, T3) ๋กœ ์ •์˜ํ•˜๋Š” ๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
try(func (args) (T1, T2, T3, error))(T1, T2, T3) ? (์ด๊ฒƒ์€ ๊ทผ์‚ฌ์น˜์ž…๋‹ˆ๋‹ค)

์ฆ‰, try ํ˜ธ์ถœ์˜ ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋Š” ํ•ญ์ƒ ์—ฌ๋Ÿฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ‘œํ˜„์‹์ธ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜์ด๋ฉฐ ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋Š” ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ make ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ try ์ปจํ…์ŠคํŠธ(์˜ˆ: ๊ณ ์ • ๋ฌธ์ž์—ด, %v , ์˜ค๋ฅ˜ ์ธ์ˆ˜๋ฅผ ์ทจํ•˜๊ณ  ๋‹ค๋ฅธ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ๋“ฑ)

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ (T, error) ์ผ€์ด์Šค์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ IMO๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋‹ค์ค‘ ๋ฐ˜ํ’ˆ์„ ๋” ์ด์ƒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@cpuguy83 ์ œ์•ˆ์„œ๋ฅผ ์ฝ์œผ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์ด ์—†์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ try ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ค ์ด์œ ๋กœ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

if err != nil { return err } ๋Š” ํ”„๋กœํ† ํƒ€์ดํ•‘ํ•  ๋•Œ ๋” ์งœ์ฆ๋‚˜๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” try ์™€ "๋‚˜์ค‘์— ์ˆ˜์ •ํ•  ๊ฒƒ"๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

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

๋‹น์‹ ์ด ์ฃผ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์„ ๊ดด๋กญํžˆ๋Š” ์ด๋Ÿฌํ•œ ํŠน์ • "๋ฌธ์ œ" ์ค‘ ์ผ๋ถ€๋ฅผ ์ง€์ ํ•ด ์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€๋…์„ฑ์ด ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์ง€๋งŒ go fmt๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ˆˆ์— ๋„๋„๋ก try()๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

f := try(
    os.Open("file.txt")
)

@MrTravisB

๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ฌธ์ œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ํ•ญ์ƒ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์˜ค๋ฅ˜์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋‹ค๋ฅด๊ฒŒ ํ–‰๋™ํ•˜๊ณ  ์‹ถ์„ ๋•Œ.

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

๋” ๊ตฌ์ฒด์ ์ธ ์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ์˜ ๊ฒฝ์šฐ ๋‹ค์‹œ try ๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ์ด๋ฅผ ์›ํ•˜์ง€ ์•Š์œผ๋ฉด try ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

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

๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์œ„ํ•ด ์†๊ธฐ๋ฅผ ์ •๋‹นํ™”ํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ž์ฃผ ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

๋˜ํ•œ defer ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์˜ค๋ฅ˜๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋Š” ์ ์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. defer ๋ช…์„ธ์„œ๋Š” ์ทจ์†Œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

defer fmt.HandleErrorf(&err, โ€œfoobarโ€)

n := try(foo())

x : try(foo2())

foo() vs foo2() ์—์„œ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์›ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ?

@MrTravisB

foo() ๋Œ€ foo2()์—์„œ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์›ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค๋ฅธ ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด @boomlinde ๊ฐ€ ๋งํ•œ ์š”์ ์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ž์ฃผ ๋ณผ ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ณด๊ณ  ์žˆ์œผ๋ฉฐ try ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ์‹ค์ œ๋กœ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋“œ๋ฌผ์ˆ˜๋ก try ๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ์˜ํ–ฅ์ด ์ ์Šต๋‹ˆ๋‹ค.

@qrpnxz

f := try(os.Open("/foo"))
data := try(ioutil.ReadAll(f))
try(send(data))

(์˜ˆ, ReadFile ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด ํŠน์ • ์˜ˆ๊ฐ€ ์š”์ ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋”˜๊ฐ€์— ๋ณต์‚ฌํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค)

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

Rust์—์„œ ์ ์–ด๋„ ์—ฐ์‚ฐ์ž๋Š” ์‹ค์ œ ๋…ผ๋ฆฌ๋ฅผ ํŒŒํ—ค์น˜๋Š” ๋ฐ ์ถ”๊ฐ€ ๋ถ€๋‹ด์„ ์ฃผ์ง€ ์•Š๋Š” ์ ‘๋ฏธ์‚ฌ( ? ๊ฐ€ ํ˜ธ์ถœ ๋์— ์ถ”๊ฐ€๋จ)์ž…๋‹ˆ๋‹ค.

ํ‘œํ˜„์‹ ๊ธฐ๋ฐ˜ ํ๋ฆ„ ์ œ์–ด

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

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

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


๋˜ ๋‹ค๋ฅธ ์ œ์•ˆ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น๋ฌธ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

if err != nil {
    return nil, 0, err
}

๋ธ”๋ก์— return ๋ช…๋ น๋ฌธ์ด ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ํ•ด๋‹น ๋ช…๋ น๋ฌธ์ด ๊ฐœํ–‰ ๋ฌธ์ž๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ gofmt ์— ์˜ํ•ด ํ•œ ํ–‰์— ํ˜•์‹์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

if err != nil { return nil, 0, err }

์ด๋ก ์  ํ•ด์„

  • ์–ธ์–ด ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์„œ์‹ ๊ทœ์น™์€ ๊ฐ„๋‹จํ•˜๊ณ  ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.
  • gofmt ๋Š” ๊ฐœํ–‰์ด ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ(๊ตฌ์กฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๊ณผ ๊ฐ™์ด) ์œ ์ง€ํ•˜๋Š” ์œ„์น˜์—์„œ ์„ ํƒํ•˜๋„๋ก ๊ทœ์น™์„ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ตํŠธ์ธ์„ ํ†ตํ•ด ์ž‘์„ฑ์ž๋Š” ์ผ๋ถ€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ•์กฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ ํƒํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ gofmt ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ƒˆ ์Šคํƒ€์ผ๋กœ ์ž๋™ ์ด์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • return ๊ตฌ๋ฌธ์—๋งŒ ํ•ด๋‹นํ•˜๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ณจํ”„ ์ฝ”๋“œ์— ๋‚จ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ถ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ์™€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„๊ณผ ์ž˜ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์ค‘์ฒฉ try ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ์ˆ˜์ง ๊ณต๊ฐ„์„ 66% ์ค„์ž…๋‹ˆ๋‹ค.
  • ์‹ ๊ธฐ๋ฐ˜ ์ œ์–ด ํ๋ฆ„ ์—†์Œ
  • ์ฝ”๋“œ๋Š” ์ž‘์„ฑ๋œ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž์ฃผ ์ฝํžˆ๋ฏ€๋กœ ๋…์ž์—๊ฒŒ ์ตœ์ ํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ ์€ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋Š” ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ๋Š” ๋…์ž์—๊ฒŒ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. try ๋Š” ์ž‘์„ฑ์ž์—๊ฒŒ ๋” ๋งŽ์ด ๊ธฐ์šธ์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ๋žŒ๋“ค์€ ์ด๋ฏธ ์—ฌ๋Ÿฌ ์ค„์— try ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด ์ฃผ์„ ๋˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์Šคํƒ€์ผ์„ ์†Œ๊ฐœํ•˜๋Š” ์ด ์ฃผ์„
f, err := os.Open(file)
try(maybeWrap(err))
  • "try on its own line" ์Šคํƒ€์ผ์€ ๋ฐ˜ํ™˜๋˜๋Š” err ๊ฐ’์— ๋Œ€ํ•œ ๋ชจํ˜ธ์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ํ˜•์‹์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€ ๋ช…์‹œํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ  ๋ธ”๋ก์ด ๊ฑฐ์˜ ๋™์ผํ•œ ๊ฒฝ์šฐ ํ•œ ์ค„๋กœ ํ—ˆ์šฉ
  • ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๋˜๋Š” ๋ถˆ๋ช…ํ™•ํ•œ defer ๊ธฐ๋ฐ˜ ๋ž˜ํ•‘์˜ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์˜ค๋ฅ˜ ๋ž˜ํ•‘์— ๋Œ€ํ•œ ์žฅ๋ฒฝ์„ ๋†’์ด๊ณ  ์ „์ž๋Š” godoc ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • try ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๊ธฐ์กด์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์•ž์œผ๋กœ try ๋˜๋Š” ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. try ์ด ์ˆ˜๋ฝ๋˜๋”๋ผ๋„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๊ธ์ •์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • testing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” main ํ•จ์ˆ˜์™€ ๋ถ€์ •์ ์ธ ์ƒํ˜ธ ์ž‘์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ œ์•ˆ์„œ๊ฐ€ ๋ฐ˜ํ™˜ ๋Œ€์‹  ํ•œ ์ค„๋กœ ๋œ ๋ช…๋ น๋ฌธ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ฃผ์žฅ ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ คํ•˜๋‹ค
value, err := something()
if err != nil { t.Fatal(err) }
  • ํŠน์ • ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ์™€ ๋ถ€์ •์ ์ธ ์ƒํ˜ธ ์ž‘์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ณ ๋ คํ•˜๋‹ค
n, err := src.Read(buf)
if err == io.EOF { return nil }
else if err != nil { return err }

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


์ด์‹๋œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ

https://github.com/golang/go/issues/32437#issuecomment -498941435์—์„œ

์‹œ๋„์™€ ํ•จ๊ป˜

func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
        try(dbfile.RunMigrations(db, dbMigrations))
        t := &Thing{
                thingy:  thingy,
                scanner: try(newScanner(thingy, db, client)),
        }
        t.initOtherThing()
        return t, nil
}

์ด๊ฒƒ์œผ๋กœ

func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
        err := dbfile.RunMigrations(db, dbMigrations))
        if err != nil { return nil, fmt.Errorf("running migrations: %v", err) }

        t := &Thing{thingy: thingy}
        t.scanner, err = newScanner(thingy, db, client)
        if err != nil { return nil, fmt.Errorf("creating scanner: %v", err) }

        t.initOtherThing()
        return t, nil
}

์˜ค๋ฅ˜์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์‹œ์— ๊ณต๊ฐ„ ์‚ฌ์šฉ์—์„œ ๊ฒฝ์Ÿ๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/golang/go/issues/32437#issuecomment -499007288์—์„œ

์‹œ๋„์™€ ํ•จ๊ป˜

func (c *Config) Build() error {
    pkgPath := try(c.load())
    b := bytes.NewBuffer(nil)
    try(emplates.ExecuteTemplate(b, "main", c))
    buf := try(format.Source(b.Bytes()))
    target := fmt.Sprintf("%s.go", filename(pkgPath))
    try(ioutil.WriteFile(target, buf, 0644))
    // ...
}

์ด๊ฒƒ์œผ๋กœ

func (c *Config) Build() error {
    pkgPath, err := c.load()
    if err != nil { return nil, errors.WithMessage(err, "load config dir") }

    b := bytes.NewBuffer(nil)
    err = templates.ExecuteTemplate(b, "main", c)
    if err != nil { return nil, errors.WithMessage(err, "execute main template") }

    buf, err := format.Source(b.Bytes())
    if err != nil { return nil, errors.WithMessage(err, "format main template") }

    target := fmt.Sprintf("%s.go", filename(pkgPath))
    err = ioutil.WriteFile(target, buf, 0644)
    if err != nil { return nil, errors.WithMessagef(err, "write file %s", target) }
    // ...
}

์›๋ž˜ ๋Œ“๊ธ€์€ ๊ฐ€์ƒ์˜ tryf ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ์‹์„ ์ฒจ๋ถ€ํ–ˆ์ง€๋งŒ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ณ ์œ ํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ถˆ๋ถ„๋ช…ํ•˜๋ฉฐ ์•„๋งˆ๋„ try ๋Š” ์ ์šฉ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@cpuguy83
๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ try ๋กœ ๋” ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” "ํŒŒ์ผ ์—ด๊ธฐ, ๋ชจ๋“  ๋ฐ”์ดํŠธ ์ฝ๊ธฐ, ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ธฐ"๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด "ํŒŒ์ผ์„ ์—ด๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” ์ด๋ฅผ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ๋ชจ๋“  ๋ฐ”์ดํŠธ๋ฅผ ์ฝ๊ณ  ์ด์ œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค..."๋ผ๊ณ  ์ฝ์Šต๋‹ˆ๋‹ค. err != nil ๋ฅผ ํ†ตํ•ด ์Šค์บ”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. try ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‚ด๊ฐ€ ๋ณผ ๋•Œ ์ฆ‰์‹œ ํ–‰๋™์„ ์•Œ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. err != nil์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ ์ด ์žˆ๋‹ค๋ฉด ๊ทธ ์ง€์ ์ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์—‡์ด๋“  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์—ฌ๊ธฐ์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ƒˆ ๋ฉ”์‹œ์ง€๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ข‹์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

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

@zeebo ๋„ค, ์ €๋Š” ๊ทธ๊ฒƒ์— ๋น ์ ธ์žˆ์Šต๋‹ˆ๋‹ค.
@kungfusheep ์˜ ๊ธฐ์‚ฌ๋Š” ๊ทธ๋Ÿฐ ํ•œ ์ค„ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ธฐ ์œ„ํ•ด ์ข…๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ €์žฅํ•˜์ž๋งˆ์ž gofmt์—์„œ ์ŠฌํŽ๋˜ ์„ธ ์ค„๋กœ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. stdlib์˜ ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์ด์™€ ๊ฐ™์ด ํ•œ ์ค„์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ gofmt๊ฐ€ ์ด๋ฅผ ํ™•์žฅํ•  ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์Šต๋‹ˆ๋‹ค.

@qrpnxz

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

๊ฐ๊ด€์  ์œผ๋กœ if err != nil { return err } ๋ณด๋‹ค๋Š” ๋‚ซ์ง€ ์•Š๊ณ , ํƒ€์ดํ•‘์ด ๋œํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.


๋งˆ์ง€๋ง‰ ํ•œ๊ฐ€์ง€:

๋‹น์‹ ์ด ์ œ์•ˆ์„ ์ฝ์œผ๋ฉด ๋‹น์‹ ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์ด ์•„๋ฌด๊ฒƒ๋„ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@cpuguy83
๋‚ด ๋‚˜์œ CPU ๋…€์„. ๊ทธ๋Ÿฐ ๋œป์ด ์•„๋‹ˆ์—ˆ์–ด์š”.

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

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

๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ง์”€๋“œ๋ฆฌ์ง€๋งŒ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ก ์ด๊ฒƒ์ด ๋…ผ์Ÿ์ด์ง€๋งŒ ๋‹น์‹ ์„ ์ ๋Œ€์‹œํ•  ์˜๋„๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/golang/go/issues/32437#issuecomment -498908380

์•„๋ฌด๋„ ์‹œ๋„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ป”๋ป”ํ•จ์„ ๋ฌด์‹œํ•˜๊ณ , ๋””์ž์ธ ๋น„ํŒ์„ ๋ฌด์‹œํ•˜๋Š” ๊ฝค ์†์— ๋•€์„ ์ฅ๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

์•„๋ฌด๋„ ๋‹น์‹ ์ด ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค{}.

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

์ตœ์†Œํ•œ try ๋Š” lvalue๊ฐ€ ์žˆ๋Š” ํ‚ค์›Œ๋“œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

if err != nil { return err } ๋ณด๋‹ค _๊ฐ๊ด€์ ์œผ๋กœ_ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์ ์Šต๋‹ˆ๋‹ค.

๋‘˜ ์‚ฌ์ด์—๋Š” ํ•œ ๊ฐ€์ง€ ๊ฐ๊ด€์ ์ธ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. try(Foo()) ๋Š” ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๊ทธ ์ฐจ์ด๊ฐ€ ๋‹จ์ ์ž…๋‹ˆ๋‹ค( try(strconv.Atoi(x))+try(strconv.Atoi(y)) ๋น„ํŒ). ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๊ทธ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ๊ฐ™์€ ์ด์œ ๋กœ ์žฅ์ ์ž…๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๊ฐ๊ด€์ ์œผ๋กœ ๋” ์ข‹๊ฑฐ๋‚˜ ๋‚˜์˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ ์ฐจ์ด๊ฐ€ ์–‘ํƒ„์ž ์•„๋ž˜์—์„œ ํœฉ์“ธ๋ ค์•ผ ํ•˜๊ณ  ๊ทธ๊ฒƒ์ด "๊ทธ์ € ํƒ€์ดํ•‘์„ ๋œ ํ•œ๋‹ค"๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์ด ์ œ์•ˆ์„ ์ •๋‹นํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@elagergren-spideroak try ๋Š” ํ•œ ์ˆจ์— ๋ณด๊ธฐ์— ์งœ์ฆ๋‚˜๊ณ  ๋‹ค์Œ ์ˆจ์—๋Š” ๋ช…์‹œ์ ์ด์ง€ ์•Š๋‹ค๊ณ  ๋งํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์ธ์ˆ˜๊ฐ€ ์ž„์‹œ ๋ณ€์ˆ˜์— ๋จผ์ € ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๋” ํ”ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”

this := try(to()).parse().this
that := try(this.easily())

๋‹น์‹ ์˜ ์˜ˆ๋ณด๋‹ค.

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

@josharian https://github.com/golang/go/issues/32437#issuecomment -498941854 ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์—ฌ๊ธฐ์— ์ดˆ๊ธฐ ํ‰๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

defer fmt.HandleErrorf(&err, "foobar: %v", err)

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

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

@ianlancetaylor , @josharian ์ด ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. err defer ๊ฐ€ ์Šคํƒ์— ํ‘ธ์‹œ๋  ๋•Œ์˜ ๊ฐ’์ด์ง€, err ์˜ (์•„๋งˆ๋„ ์˜๋„๋œ) ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค. try ์— ์˜ํ•ด ์„ค์ •๋˜์–ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

try ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์‚ฌ๋žŒ๋“ค์ด ํ•œ ์ค„์— ๋” ๋งŽ์€ ๋…ผ๋ฆฌ์™€ ๋…ผ๋ฆฌ๋ฅผ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋Œ€ํ•œ ๋‚˜์˜ ์ฃผ์š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํ•œ ์ค„์— 5๊ฐœ์˜ ํ‘œํ˜„์‹์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ์‰ฝ์Šต๋‹ˆ๋‹ค.

this := try(to()).parse().this
that := try(this.easily())

^^ ์ด๋งˆ์ €๋„ ๋”์ฐํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ค„์€ ๋จธ๋ฆฌ ์†์—์„œ paren ๋งค์นญ์„ ํ•˜๋ฉด์„œ ์•ž๋’ค๋กœ ์ ํ”„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์•„์ฃผ ๊ฐ„๋‹จํ•œ ๋‘ ๋ฒˆ์งธ ์ค„๋„... ์ฝ๊ธฐ๊ฐ€ ์ •๋ง ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
์ค‘์ฒฉ๋œ ํ•จ์ˆ˜๋Š” ์ฝ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

parser, err := to()
if err != nil {
    return err
}
this := parser.parse().this
that, err := this.easily()
if err != nil {
    return err
}

^^ ์ด๊ฒƒ์€ ํ›จ์”ฌ ๋” ์‰ฝ๊ณ  ๋” ๋‚˜์€ IMO์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ํ›จ์”ฌ ๋” ๋งŽ์€ ์ฝ”๋“œ ๋ผ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

@bcmills @josharian ์•„ ๋ฌผ๋ก  ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค

defer func() { fmt.HandleErrorf(&err, โ€œfoobar: %vโ€, err) }()

๊ทธ๋ ‡๊ฒŒ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ fmt.HandleErrorf ๋Š” ์•”์‹œ์ ์œผ๋กœ ์˜ค๋ฅ˜ ๊ฐ’์„ ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

@ianlancetaylor fmt.HandleErrorf ๊ฐ€ ํ˜•์‹ ํ›„ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ err์„ ๋ณด๋‚ด๋ฉด ๊ตฌํ˜„์ด ๋” ์ข‹์•„์ง€๊ณ  ์‚ฌ์šฉ์ž๋Š” ํ•ญ์ƒ %[1]v ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@natefinch ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋Ÿฌ์ŠคํŠธ ์Šคํƒ€์ผ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋” ๋ง›์žˆ์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
์ƒ๊ฐ๋งŒ ํ•˜๋Š” ์ œ์•ˆ์€ ์•„๋‹ˆ๋‹ˆ ์ฐธ๊ณ ํ•˜์„ธ์š”...

this := to()?.parse().this
that := this.easily()?

๊ฒฐ๊ตญ ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋” ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ( ! ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค...), ์—ฌ์ „ํžˆ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฌธ์ œ๋ฅผ ์ž˜ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.


๋ฌผ๋ก  Rust์—๋„ try() ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ... ๋‹ค๋ฅธ Rust ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค.

if err != nil { return err } ๋ณด๋‹ค _๊ฐ๊ด€์ ์œผ๋กœ_ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์ ์Šต๋‹ˆ๋‹ค.

๋‘˜ ์‚ฌ์ด์—๋Š” ํ•œ ๊ฐ€์ง€ ๊ฐ๊ด€์ ์ธ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. try(Foo()) ๋Š” ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๊ทธ ์ฐจ์ด๊ฐ€ ๋‹จ์ ์ž…๋‹ˆ๋‹ค( try(strconv.Atoi(x))+try(strconv.Atoi(y)) ๋น„ํŒ). ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๊ทธ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ๊ฐ™์€ ์ด์œ ๋กœ ์žฅ์ ์ž…๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๊ฐ๊ด€์ ์œผ๋กœ ๋” ์ข‹๊ฑฐ๋‚˜ ๋‚˜์˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ ์ฐจ์ด๊ฐ€ ์–‘ํƒ„์ž ์•„๋ž˜์—์„œ ํœฉ์“ธ๋ ค์•ผ ํ•˜๊ณ  ๊ทธ๊ฒƒ์ด "๊ทธ์ € ํƒ€์ดํ•‘์„ ๋œ ํ•œ๋‹ค"๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์ด ์ œ์•ˆ์„ ์ •๋‹นํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

@MrTravisB

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

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

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

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

๋˜ํ•œ defer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์˜ค๋ฅ˜๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋Š” ์ ์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. defer ๋ฌธ์€ ์ทจ์†Œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

foo() ๋Œ€ foo2()์—์„œ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์›ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ?

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ try ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด try ์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ์–ป์ง€ ๋ชปํ•˜์ง€๋งŒ ์žƒ์„ ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค.

@cpuguy83

๋Ÿฌ์ŠคํŠธ ์Šคํƒ€์ผ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋” ๋ง›์žˆ์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ์€ ์ด์— ๋Œ€ํ•œ ์ฃผ์žฅ์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ try{}catch{} ๊ฐ€ ๋” ์ฝ๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.upside_down_face:

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

    ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ๊ทธ๊ฒƒ์ด ์ข‹์€ ์†”๋ฃจ์…˜์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ํ˜„์žฌ ์•„์ด๋””์–ด์— ๋””์ž์ธ์— ๊ฒฐํ•จ์ด ์žˆ๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

  3. try(try(try(to()).parse().this)).easily()) ์™€ ๊ฐ™์€ ์˜ˆ์ œ๋Š” ๋น„ํ˜„์‹ค์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ถ„ํ• ์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ๊ณต์ •ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  4. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด 3๊ณณ์ด๊ณ  ๊ฐ ๊ณณ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ํฌ์žฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? try() ๋Š” ์ด๊ฒƒ์„ ๋งค์šฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์‚ฌ์‹ค try() ๋Š” ์ด๋ฏธ ๊ทธ ์–ด๋ ค์›€์„ ๊ฐ์•ˆํ•  ๋•Œ ๋ž˜ํ•‘ ์˜ค๋ฅ˜๋ฅผ ๊ถŒ์žฅํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹ค์Œ์€ ์ œ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

    func before() error {
      x, err := foo()
      if err != nil {
        wrap(err, "error on foo")
      }
      y, err := bar(x)
      if err != nil {
        wrapf(err, "error on bar with x=%v", x)
      }
      fmt.Println(y)
      return nil
    }
    
    func after() (err error) {
      defer fmt.HandleErrorf(&err, "something failed but I don't know where: %v", err)
      x := try(foo())
      y := try(bar(x))
      fmt.Println(y)
      return nil
    }
    
  5. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ try ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด try ์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ์–ป์ง€ ๋ชปํ•˜์ง€๋งŒ ์žƒ์„ ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

func exists(filename string) bool {
  _, err := os.Stat(filename)
  return err == nil
}

if exists(...) { ... } ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ์ฝ”๋“œ๊ฐ€ ์ผ๋ถ€ ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜๋ฅผ ์ž๋™์œผ๋กœ ๋ฌด์‹œํ•˜๋”๋ผ๋„. try ๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ์•„๋งˆ๋„ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ณ  (bool, error) ๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์„œ catch๋ผ๋Š” ๋‘ ๋ฒˆ์งธ ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ๋˜์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค catch ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ›์•„ ๋ฎ์–ด์“ด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ˆ˜์‹ ํ•œ ๋‹ค์Œ ํ›„์† catch ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

func catch(handler func(err error) error) {
  // .. impl ..
}

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

func wrapf(format string, ...values interface{}) func(err error) error {
  // user defined
  return func(err error) error {
    return fmt.Errorf(format + ": %v", ...append(values, err))
  }
}
func sample() {
  catch(wrapf("something failed in foo"))
  try(foo()) // "something failed in foo: <error>"
  x := try(foo2()) // "something failed in foo: <error>"
  // Subsequent calls for catch overwrite the handler
  catch(wrapf("something failed in bar with x=%v", x))
  try(bar(x)) // "something failed in bar with x=-1: <error>"
}

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

func foo(a, b string) (int64, error) {
  return try(strconv.Atoi(a)) + try(strconv.Atoi(b))
}
func withContext(a, b string) (int64, error) {
  catch(func (err error) error {
    return fmt.Errorf("can't parse a: %s, b: %s, err: %v", a, b, err)
  })
  return try(strconv.Atoi(a)) + try(strconv.Atoi(b))
}
func moreExplicitContext(a, b string) (int64, error) {
  catch(func (err error) error {
    return fmt.Errorf("can't parse a: %s, err: %v", a, err)
  })
  x := try(strconv.Atoi(a))
  catch(func (err error) error {
    return fmt.Errorf("can't parse b: %s, err: %v", b, err)
  })
  y := try(strconv.Atoi(b))
  return x + y
}
func withHelperWrapf(a, b string) (int64, error) {
  catch(wrapf("can't parse a: %s", a))
  x := try(strconv.Atoi(a))
  catch(wrapf("can't parse b: %s", b))
  y := try(strconv.Atoi(b))
  return x + y
}
func before(a, b string) (int64, error) {
  x, err := strconv.Atoi(a)
  if err != nil {
    return 0,  fmt.Errorf("can't parse a: %s, err: %v", a, err)
  }
  y, err := strconv.Atoi(b)
  if err != nil {
    return 0,  fmt.Errorf("can't parse b: %s, err: %v", b, err)
  }
  return x + y
}

๊ทธ๋ฆฌ๊ณ  ์—ฌ์ „ํžˆ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ถ„์œ„๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค(๊ณต๊ฐํ•˜๋„๋ก ๋•๊ธฐ ์œ„ํ•ด) catch ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด์ œ... ๋งˆ์ง€๋ง‰ ๋ฌธ์žฅ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ํ† ๋ก ์— ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๋งค์šฐ ๊ณต๊ฒฉ์ ์ธ IMO์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜๋„ ์šฐ๋ฆฌ๊ฐ€ ์ด ๊ธธ์„ ๊ฐ„๋‹ค๋ฉด try{}catch(error err){} ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :stuck_out_tongue:

#27519 - #id/catch ์˜ค๋ฅ˜ ๋ชจ๋ธ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์•„๋ฌด๋„ ์‹œ๋„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ป”๋ป”ํ•จ์„ ๋ฌด์‹œํ•˜๊ณ , ๋””์ž์ธ ๋น„ํŒ์„ ๋ฌด์‹œํ•˜๋Š” ๊ฝค ์†์— ๋•€์„ ์ฅ๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. glib๋Š” ์ œ ์˜๋„๊ฐ€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•˜๋ ค๋Š” ๊ฒƒ์€ try ์ด 100% ์†”๋ฃจ์…˜์ด ๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. try ์—์„œ ์ž˜ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š” ๋‹ค์–‘ํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ˜ธ์ถœ ์‚ฌ์ดํŠธ ์ข…์† ์ปจํ…์ŠคํŠธ๋ฅผ ์˜ค๋ฅ˜์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋” ๋ณต์žกํ•œ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์–ธ์ œ๋“ ์ง€ if err != nil { ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

์ด ์ œ์•ˆ์— ๋”ฐ๋ผ defer ์™€ ํ•จ๊ป˜ ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ง๊ด€์ ์ด์ง€ ์•Š๊ณ  ๋งค์šฐ ํ•ดํ‚คํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

check-handle ์•„์ด๋””์–ด๋กœ ์ธํ•ด return ๋ฌธ์„ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜ ๋ž˜ํ•‘์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

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

@Goodwine ์˜ ์ž„ํ”ผ์‰ฌ ํฌ์ธํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ผ ๋ธŒ๋ฆฌ์ง€ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฒฝ์šฐ HandleErrorf ์™€ ๊ฐ™์€ ๋ณ„๋„์˜ ๊ธฐ๋Šฅ์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

func handler(err *error, handle func(error) error) {
  // nil handle is treated as the identity
  if *err != nil && handle != nil {
    *err = handle(*err)
  }
}

๋‹น์‹ ์ด ์ข‹์•„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

defer handler(&err, func(err error) error {
  if errors.Is(err, io.EOF) {
    return nil
  }
  return fmt.Errorf("oops: %w", err)
})

handler ์ž์ฒด๋ฅผ try ์™€ ๊ฐ™์€ ๋ฐ˜ ๋งˆ๋ฒ• ๋‚ด์žฅ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

defer handler(func(err error) error {
  if errors.Is(err, io.EOF) {
    return nil
  }
  return fmt.Errorf("oops: %w", err)
})

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

defer ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— nil์ด ์•„๋‹Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ๋งˆ๋‹ค handle func๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ try ์—†์ด๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

defer handler(wrapErrWithPackageName)

๋งจ ์œ„์— fmt.Errorf("mypkg: %w", err) ๋ชจ๋“  ๊ฒƒ.

๊ทธ๊ฒƒ์€ ๋‹น์‹ ์—๊ฒŒ ์˜ค๋ž˜๋œ check / handle ์ œ์•ˆ์„ ๋งŽ์ด ์ œ๊ณตํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ช…์‹œ์ ์œผ๋กœ err ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•  ํ•„์š”์„ฑ์„ ์—†์• ๋ฉด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ(๊ทธ๋ฆฌ๊ณ  ๋ช…์‹œ์ ์œผ๋กœ) defer์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. try ์™€ ๊ฐ™์ด ํ”„๋ก ํŠธ ์—”๋“œ์—์„œ ์™„์ „ํžˆ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค.

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

๋‚ด ๋‚˜์œ, ๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค.

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

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

try() ๊ฐ€ ๋””๋ฒ„๊น…์— ์œ ์šฉํ•œ ์ปจํ…์ŠคํŠธ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ž๋™ ์ค„๋ฐ”๊ฟˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด xerrors ๊ฐ€ errors ๊ฐ€ ๋˜๋ฉด ์˜ค๋ฅ˜์—๋Š” try() ๊ฐ€ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํƒ ์ถ”์ ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿค”

๋ชฉํ‘œ๊ฐ€ (https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md ์ฝ๊ธฐ)์ธ ๊ฒฝ์šฐ:

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

๋‚˜๋Š” ์ œ์•ˆ์„ ๋ฐ›์•„๋“ค์ด๊ณ  ๊ฑฐ๊ธฐ์— ์žˆ๋Š” ์ˆ˜์‹ญ์–ต ์ค„์˜ ์ฝ”๋“œ์— ๋Œ€ํ•ด "์ž‘์€ ๋‹จ๊ณ„" ์ฝ”๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ—ˆ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ ๋Œ€์‹ :

func printSum(a, b string) error {
        defer fmt.HandleErrorf(&err, "sum %s %s: %v", a,b, err) 
        x := try(strconv.Atoi(a))
        y := try(strconv.Atoi(b))
        fmt.Println("result:", x + y)
        return nil
}

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

func printSum(a, b string) error {
        var err ErrHandler{HandleFunc : twoStringsErr("printSum",a,b)} 
        x, err.Error := strconv.Atoi(a)
        y,err.Error := strconv.Atoi(b)
        fmt.Println("result:", x + y)
        return nil
}

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

type ioErrHandler ErrHandler
func (i ErrHandler) Handle() ...{

}

๋˜๋Š”

type parseErrHandler ErrHandler
func (p parseErrHandler) Handle() ...{

}

๋˜๋Š”

type str2IntErrHandler ErrHandler
func (s str2IntErrHandler) Handle() ...{

}

๋‚ด ์ฝ”๋“œ ์ „์ฒด์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

func printSum(a, b string) error {
        var pErr str2IntErrHandler 
        x, err.Error := strconv.Atoi(a)
        y,err.Error := strconv.Atoi(b)
        fmt.Println("result:", x + y)
        return nil
}

๋”ฐ๋ผ์„œ ์‹ค์ œ ํ•„์š”๋Š” err.Error๊ฐ€ not nil๋กœ ์„ค์ •๋  ๋•Œ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

func (s str2IntErrHandler) Handle() bool{
   **return false**
}

ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ ๋Œ€์‹  ๊ณ„์†ํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ํ•จ์ˆ˜์—์„œ ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

func printSum(a, b string) error {
        var pErr str2IntErrHandler 
        var oErr overflowError 
        x, err.Error := strconv.Atoi(a)
        y,err.Error := strconv.Atoi(b)
        fmt.Println("result:", x + y)
        totalAsByte,oErr := sumBytes(x,y)
        sunAsByte,oErr := subtractBytes(x,y)
        return nil
}

๋“ฑ.

๋‹ค์‹œ ๋ชฉํ‘œ๋ฅผ ๋„˜์–ด์„œ

  • ์ƒ์šฉ๊ตฌ ์ œ๊ฑฐ - ์™„๋ฃŒ
  • ์ตœ์†Œํ•œ์˜ ์–ธ์–ด ๋ณ€๊ฒฝ - ์™„๋ฃŒ
  • "๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค" ๋‹ค๋ฃจ๊ธฐ - ์ œ์•ˆ๋œ IMO ์ด์ƒ
  • ์–ธ์–ด์— ์•ฝ๊ฐ„์˜ ๋ณต์žก์„ฑ ์ถ”๊ฐ€ - ์†
    ํ”Œ๋Ÿฌ์Šค - ๋ณด๋‹ค ์‰ฌ์šด ์ฝ”๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
x, err := strconv.Atoi(a)

์—๊ฒŒ

x, err.Error := strconv.Atoi(a)

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ - ๋” ๋‚˜์€ ๊ฐ€๋…์„ฑ(IMO, ๋‹ค์‹œ)

@guybrand ๋‹น์‹ ์€ (๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š”) ์ด ๋˜ํ’€์ด๋˜๋Š” ์ฃผ์ œ์— ๋Œ€ํ•œ ์ตœ์‹  ์ง€์ง€์ž์ž…๋‹ˆ๋‹ค.

https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring -themes ์ฐธ์กฐ

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

@natefinch ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ฝ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋Œ€์‹  Go๋ฅผ ์“ฐ๋Š” ๋™์•ˆ ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. IDE ๋งคํฌ๋กœ๋‚˜ ์Šค๋‹ˆํŽซ์ด ์ด๊ฒƒ์ด ์–ธ์–ด์˜ ๊ธฐ๋Šฅ์ด ๋˜์ง€ ์•Š๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@๊ตฟ์™€์ธ

์œ ์šฉํ•œ ์ปจํ…์ŠคํŠธ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. try() ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์œ ์Šต๊ด€์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, try() ๋Š” ์•„๋ฌด๋„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด๋ฉฐ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„ ์กด์žฌํ•˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ๋ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ์„œ์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด(์˜ˆ์‹œ๋กœ ํ‘œ์‹œ๋จ) try ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ œ์•ˆ๋œ ๋ฐฉ์‹, ์˜ค๋ฅ˜์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ์ง๊ตํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ œ์•ˆ์˜ FAQ์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

try ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๋‹ค๋ฅธ ์˜ค๋ฅ˜์— ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ์—ฌ๋Ÿฌ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹จ์ผ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์œ ์šฉํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋˜ํ•œ HandleErrorf ์˜ ์ผ๋ฐ˜์ ์ธ ๋งฅ๋ฝ์—์„œ ์˜ค๋ฅ˜์— ํ•จ์ˆ˜ ์ „์ฒด ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ด‘๋ฒ”์œ„ํ•œ ์‚ฌ์šฉ ์˜์—ญ์„ ํฌ๊ด„ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

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

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

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

0) ๊ธ์ •์ ์ธ ์ธก๋ฉด์—์„œ @rasky , @adg , @eandre , @dpinela ๋ฐ ๊ธฐํƒ€ ์‚ฌ์šฉ์ž๋Š” try ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ฝ”๋“œ ๋‹จ์ˆœํ™”์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ํ–‰๋ณต์„ ํ‘œํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

1) ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋Š” try ๊ฐ€ ์ข‹์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์Šคํƒ€์ผ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  "๋น ๋ฅธ ์ข…๋ฃŒ"๋ฅผ ์ด‰์ง„ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ( @agnivade , @peterbourgon , @politician , @a8m , @eandre , @prologic , @kungfusheep , @cpuguy , ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์ด์— ๋Œ€ํ•ด ์šฐ๋ ค๋ฅผ ํ‘œ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.)

2) ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด return ๋ฅผ ์ˆจ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด์žฅ ๋˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜ ๊ตฌ๋ฌธ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ( @sheerun , @Redundancy , @dolmen , @komuw , @RobertGrantEllis , @elagergren-spideroak ). try ๋Š” ํŠนํžˆ ์ž„์˜๋กœ ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ๋Š” ํ‘œํ˜„์‹์— ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ๊ฐ„๊ณผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(@peterbourgon). @natefinch ๋Š” try ๊ฐ€ "ํ•œ ์ค„์— ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์„ ๋คํ”„ํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์‰ฝ๊ธฐ" ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ Go์—์„œ ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ์šฐ๋ คํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ try ๋ฅผ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•œ IDE ์ง€์›์€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(@dominikh). try ๋Š” "๋…๋ฆฝ"ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3) ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋ช…์‹œ์ ์ธ if ๋ฌธ์˜ ํ˜„์ƒ์ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทธ๊ฒƒ์— ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค( @bitfield , @marwan-at-work, @natefinch). ์ผ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ•œ ๊ฐ€์ง€๋งŒ ์žˆ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(@gbbr). ๊ทธ๋ฆฌ๊ณ  ๋ช…์‹œ์  if ๋ฌธ์€ ์•”์‹œ์  return ( @DavexPro , @hmage , @prologic , @natefinch)๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.
๊ฐ™์€ ์ค„์„ ๋”ฐ๋ผ @mattn ์€ try ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ์˜ "์•”์‹œ์  ๋ฐ”์ธ๋”ฉ"์— ๋Œ€ํ•ด ์šฐ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์€ ์ฝ”๋“œ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

4) try ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋””๋ฒ„๊น… ๋ช…๋ น๋ฌธ์ด ์‚ฝ์ž…๋  ์ˆ˜ ์žˆ๋„๋ก try ํ‘œํ˜„์‹์„ if ๋ช…๋ น๋ฌธ์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค( @deanveloper , @typeless , @networkimprov , ๊ธฐํƒ€).

5) ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜( @buchanae , @adg) ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์šฐ๋ ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์ด ์ œ์•ˆ์„ ๊ฐœ์„ ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ œ์•ˆ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

6) ์ผ๋ถ€๋Š” ์ข‹์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์žฅ๋ คํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒ์  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ(@beoran) ๋˜๋Š” try ( @unexge , @a8m , @eandre , @gotwarlost)์— ์ œ๊ณต๋œ ํ˜•์‹ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

7) @pierrec ์€ gofmt ๊ฐ€ try ํ‘œํ˜„์‹์˜ ํ˜•์‹์„ ์ ์ ˆํ•˜๊ฒŒ ์ง€์ •ํ•˜์—ฌ ๋” ์ž˜ ๋ณด์ด๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.
๋˜๋Š” gofmt ์ด ํ•œ ์ค„(@zeebo)์˜ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” if ๋ฌธ์„ ํ˜•์‹ํ™”ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜์—ฌ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8) @marwan-at-work๋Š” try ๊ฐ€ ๋‹จ์ˆœํžˆ if ๋ฌธ์—์„œ try ์‹์œผ๋กœ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ „ํ™˜ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์‹ค์ œ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด Go๊ฐ€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์‹ค์ œ๋กœ ์•”์‹œ์ ์œผ๋กœ ๋งŒ๋“ค์–ด "์†Œ์œ "ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” (์ ์ ˆํ•œ) ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋” ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(@cpuguy).

9) ๋งˆ์ง€๋ง‰์œผ๋กœ ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ try ( @beoran , @HiImJC , @dolmen) ๋ผ๋Š” ์ด๋ฆ„์„ ์ข‹์•„ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ? ( @twisted1919 , @leaxoy , ๊ธฐํƒ€)์™€ ๊ฐ™์€ ๊ธฐํ˜ธ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. .

์ด ํ”ผ๋“œ๋ฐฑ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜๊ฒฌ(์ˆœ์„œ๋Œ€๋กœ ๋ฒˆํ˜ธ ์ง€์ •):

0) ๊ธ์ •์ ์ธ ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! :-)

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

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

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

4) ๋””๋ฒ„๊น… ์ง€์ ์€ ์œ ํšจํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๊ฐ์ง€์™€ return ์‚ฌ์ด์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ try ํ‘œํ˜„์‹์„ if ๋ฌธ์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์งœ์ฆ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5) ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๊ฐ’: ์ž์„ธํ•œ ๋ฌธ์„œ์—์„œ ์ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด ์ œ์•ˆ์— ๋Œ€ํ•œ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” ์ข‹์€ ์œ„์น˜์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

6) try ์— ๋Œ€ํ•œ ์„ ํƒ์  ํ•ธ๋“ค๋Ÿฌ ์ธ์ˆ˜ : ์ž์„ธํ•œ ๋ฌธ์„œ์—์„œ๋„ ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋””์ž์ธ ๋ฐ˜๋ณต ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

7) gofmt ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ $ try ํ‘œํ˜„์‹์˜ ํ˜•์‹์„ ์ง€์ •ํ•˜์—ฌ ์ถ”๊ฐ€๋กœ ํ‘œ์‹œ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ‘œํ˜„์‹์— ์‚ฌ์šฉ๋  ๋•Œ try ์˜ ์ผ๋ถ€ ์ด์ ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

8) ์˜ค๋ฅ˜ ํ…Œ์ŠคํŒ…( try ) ๊ด€์ ์ด ์•„๋‹Œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ( handle ) ๊ด€์ ์—์„œ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์šฐ๋ฆฌ๋Š” ๊ฐ„๋‹จํžˆ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ์˜ ๊ฐœ๋…์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ๋งŒ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค(์ž‘๋…„ Gophercon์—์„œ ๋ฐœํ‘œ๋œ ์›๋ž˜ ๋””์ž์ธ ์ดˆ์•ˆ๊ณผ ์œ ์‚ฌ). ๋งˆ์ง€๋ง‰ ๊ฐ’์ด error ์œ ํ˜•์ธ ๋‹ค์ค‘ ๊ฐ’ ํ• ๋‹น์—์„œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์„ ์–ธ๋œ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น ๊ฐ’์„ ํ• ๋‹น์—์„œ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ๊ฒƒ์ด nil์ด ์•„๋‹Œ์ง€ ์•”์‹œ์ ์œผ๋กœ ํ™•์ธํ•˜๊ณ  ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ํ•ธ๋“ค๋Ÿฌ๋กœ ๋ถ„๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ช…์‹œ์  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์™„์ „ํžˆ ์‚ฌ๋ผ์ง€๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋Œ€์‹  ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์™„์ „ํžˆ ์•”์‹œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทน๋‹จ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๊ฒ€์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋ณด์ด์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

9) ์ด ์‹œ์ ์—์„œ ์ด๋ฆ„์„ ์ž์ „๊ฑฐ๋กœ ์˜ฎ๊ธฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด ์ด๋ฆ„์„ ๋ฏธ์„ธ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

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

์ด๊ฒƒ์€ ์ œ์•ˆ์— ๋Œ€ํ•œ ์˜๊ฒฌ์ด ์•„๋‹ˆ๋ผ ์˜คํƒ€ ๋ณด๊ณ ์„œ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ์ œ์•ˆ์ด ๊ฒŒ์‹œ๋œ ์ดํ›„๋กœ ์ˆ˜์ •๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์–ธ๊ธ‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

func try(t1 T1, t1 T2, โ€ฆ tn Tn, te error) (T1, T2, โ€ฆ Tn)

ํ•ด์•ผํ•œ๋‹ค:

func try(t1 T1, t2 T2, โ€ฆ tn Tn, te error) (T1, T2, โ€ฆ Tn)

์˜ค๋ฅ˜ ๊ฒ€์‚ฌ ๋ฌธ์— ๋Œ€ํ•ด ๊ณต๊ฐœ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Go ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋Œ€๋ถ€๋ถ„์˜ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๊ฐ€ ์‹ค์ œ๋กœ ๋ฐ˜๋ณต๋˜๋Š”์ง€ ๋˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋™์ผํ•œ ๊ธฐ๋Šฅ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ๊ฒ€์‚ฌ๊ฐ€ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š”์ง€ ์•Œ์•„๋‚ผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ์ œ์•ˆ์€ ์ „์ž์˜ ๊ฒฝ์šฐ์—๋Š” ๋งŽ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์ง€๋งŒ ํ›„์ž์—๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ ์‚ฌ๋žŒ๋“ค์€ if err != nil ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ ์ถ”๊ฐ€๋ฅผ ํฌ๊ธฐํ•˜๊ณ  try() ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  IMO๊ฐ€ ํ•ด๋กœ์šธ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋ณ„๋กœ ๊ณตํ†ต ์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๊ฐ€์˜ค๋Š” ์˜ค๋ฅ˜ ๊ฐ’ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์‚ฌ๋žŒ๋“ค์ด ๋” ๋งŽ์€ ์ •๋ณด๋กœ ์˜ค๋ฅ˜๋ฅผ ๋” ์ž์ฃผ ๊ฐ์Œ€ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‚ด๊ฐ€ ์ œ์•ˆ์„ ์ž˜๋ชป ์ดํ•ดํ–ˆ์ง€๋งŒ AFAIU๋Š” ๋‹จ์ผ ํ•จ์ˆ˜์˜ ๋ชจ๋“  ์˜ค๋ฅ˜๊ฐ€ ์ •ํ™•ํžˆ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๋ž˜ํ•‘๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ, ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋ž˜ํ•‘ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋Š” 5๊ฐœ์˜ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ผ์ƒ์—์„œ ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ํ”ํ•œ์ง€(๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฝค ์ผ๋ฐ˜์ ์ž„) ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ try() ๊ฐ€ ๋‹ค๋ฅธ ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ๋•Œ์—๋„ ์‚ฌ๋žŒ๋“ค์ด ํ•จ์ˆ˜๋‹น ๊ณตํ†ต ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์šฐ๋ คํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅด๊ฒŒ.

์ž‘์€ ์ƒ˜ํ”Œ ์„ธํŠธ์˜ ๋ฐ์ดํ„ฐ๋กœ ๋’ท๋ฐ›์นจ๋˜๋Š” ๊ฐ„๋‹จํ•œ ์„ค๋ช…:

์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Go์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ๋œ ์ƒ์šฉ๊ตฌ if ๋ฌธ์„ ์ œ๊ฑฐํ•˜๋„๋ก ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ try๋ผ๋Š” ์ƒˆ๋กœ์šด ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ด ์ œ์•ˆ์œผ๋กœ ํ•ด๊ฒฐ๋˜๋Š” ํ•ต์‹ฌ ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ ์ด "๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ"๋Š” ์ด ~60k SLOC์— ๋‹ฌํ•˜๋Š” ์ˆ˜์‹ญ ๊ฐœ์˜ ๊ณต๊ฐœ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์—์„œ ๋‚ด ์ฝ”๋“œ์˜ ~1.4%๋งŒ ์ฐจ์ง€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋น„์Šทํ•œ ํ†ต๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜์‹ญ๋‹ˆ๊นŒ?

Go ์ž์ฒด์™€ ๊ฐ™์€ ํ›จ์”ฌ ๋” ํฐ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ด ~160๋งŒ SLOC๋Š” if err != nil ์™€ ๊ฐ™์€ ํ–‰์ด ์žˆ๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์•ฝ ~0.5%์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด Go 2๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๊ฐ€์žฅ ์˜ํ–ฅ๋ ฅ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?

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

  1. @pierrec ๋Š” gofmt๊ฐ€ try ํ‘œํ˜„์‹์„ ์ ์ ˆํ•˜๊ฒŒ ํ˜•์‹ํ™”ํ•˜์—ฌ ๋” ์ž˜ ๋ณด์ด๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๋˜๋Š” gofmt์—์„œ ํ•œ ์ค„(@zeebo)์˜ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” if ๋ฌธ์„ ํ˜•์‹ํ™”ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜์—ฌ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. gofmt ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ $ try ํ‘œํ˜„์‹์˜ ํ˜•์‹์„ ์ง€์ •ํ•˜์—ฌ ์ถ”๊ฐ€๋กœ ๋ˆˆ์— ๋„๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ‘œํ˜„์‹์— ์‚ฌ์šฉ๋  ๋•Œ try ์˜ ์ผ๋ถ€ ์ด์ ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

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

@griesemer ๋ชจ๋“  ์˜๊ฒฌ์„ ๊ฒ€ํ† ํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์˜ ์ „๋ถ€๋Š” ์•„๋‹์ง€๋ผ๋„ ๊ฐ€์žฅ ๋งŽ์ด ๋‹ต๋ณ€ํ•ด ์ฃผ์‹  ๋†€๋ผ์šด ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐ŸŽ‰

๊ท€ํ•˜์˜ ํ”ผ๋“œ๋ฐฑ์—์„œ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ํ•œ ๊ฐ€์ง€๋Š” Go ๊ตฌ๋ฌธ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋Œ€์‹  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด Go ์–ธ์–ด์˜ ๋„๊ตฌ/๊ฒ€ํ†  ๋ถ€๋ถ„์„ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด๋””์–ด์˜€์Šต๋‹ˆ๋‹ค.

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

@griesemer ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ž˜ ์ƒ๊ฐ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ, https://www.reddit.com/r/golang/comments/bwvyhe ์—์„œ ๋‚ด๊ฐ€ ํŽธ์•ˆํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์— ๋” ๊ฐ€๊น๊ฒŒ ๊ท€ํ•˜์˜ ์ œ์•ˆ์„ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

@zeebo gofmt ํ˜•์‹ if err != nil { return ...., err } ์„ ํ•œ ์ค„์— ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ชจ๋“  "์งง์€" if ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์ด ํŠน์ • ์ข…๋ฅ˜์˜ if ํŒจํ„ด์—๋งŒ ํ•ด๋‹น๋  ๊ฒƒ์ž…๋‹ˆ๊นŒ?

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

ํ˜„์žฌ ์Šคํƒ€์ผ:

a, b, c, ... err := BusinessLogic(...)
if err != nil {
   return ..., err
}

ํ•œ ์ค„ if :

a, b, c, ... err := BusinessLogic(...)
if err != nil { return ..., err }

๋ณ„๋„์˜ ์ค„์— try (!):

a, b, c, ... err := BusinessLogic(...)
try(err)

์ œ์•ˆ๋œ try :

a, b, c := try(BusinessLogic(...))

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

@marwan-at-work ๋„๊ตฌ๊ฐ€ ๋‹น์‹ ์„ ์œ„ํ•ด ๋ฌด์—‡์„ ์ œ์•ˆํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋“  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ˆจ๊ธธ ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ?

@dpinela

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

IMO ๋‚ด ์ œ์•ˆ์€ ๊ตฌ๋ฌธ ๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์˜๋ฏธ:

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

๊ทธ๋ž˜์„œ ์ฃผ๋œ ์ฐจ์ด์ ์€ ์šฐ๋ฆฌ๊ฐ€ ํ•ญ์ƒ ๋งˆ์ง€๋ง‰ var to jnz ํ˜ธ์ถœ์„ ๋ถ„์„ํ•˜๊ฑฐ๋‚˜ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” try(func())๋กœ ์›๋ž˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋ž˜ํ•‘ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ์ œ์•ˆ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ง„์ง€ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@griesemer

๋„๊ตฌ๊ฐ€ ๋‹น์‹ ์„ ์œ„ํ•ด ๋ฌด์—‡์„ ์ œ์•ˆํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋“  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ˆจ๊ธธ ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ?

์ •๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. gopls ๊ฐ€ ์„ ํƒ์ ์œผ๋กœ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ƒ์šฉ๊ตฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด:

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

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

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

// user begins to write this function: 
func openFile(path string) ([]byte, error) {
  file, err := os.Open(path)
  defer file.Close()
  bts, err := ioutil.ReadAll(file)
  return bts, nil
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ์ž๋Š” ํŒŒ์ผ์„ ์ €์žฅํ•˜์—ฌ ๋„๊ตฌ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ณ (gofmt/goimports๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌ) gopls ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ๋ณด๊ณ  ๋ฐ˜ํ™˜ ์„œ๋ช…์„ ๋ถ„์„ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

// user has triggered the tool (by saving the file, or code action)
func openFile(path string) ([]byte, error) {
  file, err := os.Open(path)
  if err != nil {
    return nil, fmt.Errorf("openFile: %w", err)
  }
  defer file.Close()
  bts, err := ioutil.ReadAll(file)
  if err != nil {
    return nil, fmt.Errorf("openFile: %w", err)
  }
  return bts, nil
}

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

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

์ด์ „์— ์ด ๋ฌธ์ œ๊ฐ€ ์ œ๊ธฐ๋œ ๊ฒฝ์šฐ ์‚ฌ๊ณผํ•˜์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ์–ธ๊ธ‰์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

try(DoSomething()) ๋Š” ์ž˜ ์ฝํžˆ๊ณ  ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. try(err) , OTOH๋Š” ์˜๋ฏธ์ƒ์œผ๋กœ ์•ฝ๊ฐ„ ๋ฒ—์–ด๋‚œ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๊นŒ? ์ œ ์ƒ๊ฐ์—๋Š” ์˜ค๋ฅ˜๋ฅผ _ํ…Œ์ŠคํŠธ_ํ•˜๊ฑฐ๋‚˜ _ํ™•์ธ_ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ _์‹œ๋„_ํ•˜๋Š” ๊ฒƒ์€ ์˜ณ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

try(err) ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๊ด€์„ฑ์˜ ์ด์œ ๋กœ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค try(DoSomething()) ๊ฐ€ ์ž‘๋™ํ•˜๋ฉด ์ด์ƒํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ err := DoSomething(); try(err) ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ํŽ˜์ด์ง€์—์„œ try(err) ๊ฐ€ ์•ฝ๊ฐ„ ์–ด์ƒ‰ํ•ด ๋ณด์ด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ์ด์ƒํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋‚ด์žฅ ํ•จ์ˆ˜๋Š” ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ตฌ์ฒด์ ์ธ ์ œ์•ˆ์ด ์—†์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‚˜๋Š” ์ด ๊ด€์ฐฐ์„ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

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

if err != nil { t.Fatal(err) }

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

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

์•„์ง ๋ง์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ์— ๋” ์ด์ƒ ๋ง๋ถ™์ผ ๋ง์ด ์—†์Šต๋‹ˆ๋‹ค.


๋””์ž์ธ ๋ฌธ์„œ์—์„œ ์ด ์งˆ๋ฌธ์— ๋Œ€๋‹ตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ:

func foo() (err error) {
    src := try(getReader())
    if src != nil {
        n, err := src.Read(nil)
        if err == io.EOF {
            return nil
        }
        try(err)
        println(n)
    }
    return nil
}

๋‚ด ์ดํ•ด๋Š” ๊ทธ๊ฒƒ์ด ๋กœ ์„คํƒ•์„ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

func foo() (err error) {
    tsrc, te := getReader()
    if err != nil {
        err = te
        return
    }
    src := tsrc

    if src != nil {
        n, err := src.Read(nil)
        if err == io.EOF {
            return nil
        }

        terr := err
        if terr != nil {
            err = terr
            return
        }

        println(n)
    }
    return nil
}

err ๊ฐ€ ๋„ค์ดํ‚ค๋“œ ๋ฆฌํ„ด ๋™์•ˆ ์„€๋„์ž‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑฐ ์ปดํŒŒ์ผ ์•ˆ๋˜๋‚˜์š”? ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋ฏธ๋ฌ˜ํ•œ ์‹คํŒจ์ด๋ฉฐ ์ผ์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ๊ทธ๋ฆฌ ๋†’์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์„คํƒ•๋ณด๋‹ค ๋” ๋งŽ์€ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@marwan-at-work

๋งˆ์ง€๋ง‰ ๋Œ“๊ธ€์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด:

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

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

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋ฐ˜๋Œ€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ƒ์šฉ๊ตฌ์˜ ๊ฐ€์žฅ ํฐ ์„ฑ๊ฐ€์‹ฌ์€ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ™”๋ฉด ์ „์ฒด์— ์ˆ˜์ง์œผ๋กœ ํ•จ์ˆ˜์˜ ํ–‰๋ณตํ•œ ๊ฒฝ๋กœ๋ฅผ ๋ถ„์‚ฐ์‹œ์ผœ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ณ๋ˆˆ์งˆ. ๊ทธ ํšจ๊ณผ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‘ ์ž‘์—… ์‚ฌ์ด์— ์ƒ์šฉ๊ตฌ ๋ธ”๋ก์ด ์žˆ๋Š” I/O๊ฐ€ ๋งŽ์€ ์ฝ”๋“œ์—์„œ ํŠนํžˆ ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค. CopyFile ์˜ ๋‹จ์ˆœํ•œ ๋ฒ„์ „์กฐ์ฐจ๋„ ์‹ค์ œ๋กœ 5๋‹จ๊ณ„(์˜คํ”ˆ ์†Œ์Šค, ๋‹ซ๊ธฐ ์†Œ์Šค ์—ฐ๊ธฐ, ๋Œ€์ƒ ์—ด๊ธฐ, ์†Œ์Šค ๋ณต์‚ฌ -> ๋Œ€์ƒ, ๋Œ€์ƒ ๋‹ซ๊ธฐ)๋งŒ ์ˆ˜ํ–‰ํ•˜๋”๋ผ๋„ 20์ค„ ์ •๋„ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๋ณ„๋„์˜ ์ค„์— try ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  handler func๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

func try(error, optional func(error)error)
func (p *pgStore) DoWork() error {
    tx, err := p.handle.Begin()
    try(err)

    handle := func(err error) error {
        tx.Rollback()
        return err
    }

    var res int64
    _, err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
    try(err, handle)

    _, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
    try(err, handle)

    return tx.Commit()
}

@zeebo : ์ œ๊ฐ€ ๋“œ๋ฆฐ ์˜ˆ์‹œ ๋Š” 1:1 ๋ฒˆ์—ญ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ(์ „ํ†ต์ ์ธ if )๋Š” ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹ค๋ฅธ ๊ฒƒ๋„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ด๊ฒƒ์ด ํ•จ์ˆ˜์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๊ฒ€์‚ฌ๋˜๋Š” ์œ ์ผํ•œ ์žฅ์†Œ์ธ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ์˜ˆ์ œ( if ์‚ฌ์šฉ)๊ฐ€ ์ฝ”๋“œ ์ž‘์„ฑ์— ์ ์ ˆํ•œ ์„ ํƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ๋™์ผํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ(๋ž˜ํ•‘)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘ ํ˜„์žฌ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— defer ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ๊ณณ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ if ๋ฅผ try ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋˜๋Š” ๊ทธ๋Œ€๋กœ ๋‘์‹ญ์‹œ์˜ค). ํ™•์ธํ•ด์•ผ ํ•  ์˜ค๋ฅ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๊ณ  ๋ชจ๋‘ ๋‹ค๋ฅด๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ(์ด๋Š” ํ•จ์ˆ˜์˜ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ๋„ˆ๋ฌด ๊ด‘๋ฒ”์œ„ํ•˜๊ณ  ๋ถ„ํ• ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‹ ํ˜ธ์ผ ์ˆ˜ ์žˆ์Œ) if ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ž˜ ํ–ˆ์–ด. ์˜ˆ, ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ ์˜ฌ๋ฐ”๋ฅธ ์„ ํƒ์€ ์ฝ”๋“œ์™€ ๊ฐœ์ธ ์ทจํ–ฅ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. Go์—์„œ "ํ•œ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•"์„ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ, ํŠนํžˆ ์ผ๋ฐ˜์ ์ธ ๊ตฌ์„ฑ์˜ ๊ฒฝ์šฐ์—๋Š” ์ด๋ฏธ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด if - else - if ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹๋„ˆ๋ฌด ๊ธธ์–ด์ง€๋ฉด switch ๊ฐ€ ๋” ์ ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” var x int ๋ณ€์ˆ˜ ์„ ์–ธ์ด x := 0 ๋ณด๋‹ค ์˜๋„๋ฅผ ๋” ์ž˜ ํ‘œํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด์— ๋Œ€ํ•ด ๋งŒ์กฑํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค).

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

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

๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•จ์ˆ˜์˜ ์ตœ์ข… ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ์˜ค๋ฅ˜ ์œ ํ˜•์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋‹นํ™ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋นŒํŠธ์ธ์„ ๋” ๋‹ค์žฌ๋‹ค๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค(์˜ˆ: #32219์—์„œ ๋‚ด ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋งŒ์กฑ์‹œํ‚ด)

@pjebs ์ด๊ฒƒ์€ ๊ณ ๋ ค๋˜์–ด ๊ฒฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„ธ๋ถ€ ์„ค๊ณ„ ๋ฌธ์„œ(์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ๋ฌธ์ œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์–ธ๊ธ‰ํ•จ)๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค.

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

func doSomething() (error, error, error, error, error) {
   ...
}
try(try(try(try(try(doSomething)))))

๋””์ž์ธ์— ๋”ฐ๋ฅด๋ฉด ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  panic ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๋ฅผ ๊ฐ•์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•จ์ˆ˜๊ฐ€ error ์œ ํ˜•์˜ ์ตœ์ข… ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋Š” ์ œํ•œ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  ํ˜„์žฌ ์ œ์•ˆ์„œ์— ๋ช…์‹œ๋œ ๋Œ€๋กœ ์ •ํ™•ํžˆ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

error => ํŒจ๋‹‰์˜ ์ตœ์ข… ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ์—†๋Š” ๊ฒฝ์šฐ
ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ๋ณ€์ˆ˜ ์„ ์–ธ์— try๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ => ํŒจ๋‹‰( MustXXX( ) ๊ทœ์น™์ด ํ•„์š” ์—†์Œ)

๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ์•ฝ๊ฐ„์˜ ์–ธ์–ด ๋ณ€๊ฒฝ.

@mattn , ๋‚˜๋Š” ์ƒ๋‹นํ•œ ์ˆ˜์˜ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋Ÿฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋งค์šฐ ์˜์‹ฌํ•ฉ๋‹ˆ๋‹ค.

@pjebs , ์˜๋ฏธ๋ก (ํ˜„์žฌ ๊ธฐ๋Šฅ์— ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ํŒจ๋‹‰)์€ https://github.com/golang/proposal/blob/master/design/32437-try-builtin์—์„œ ๋””์ž์ธ ๋ฌธ์„œ๊ฐ€ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์Šต๋‹ˆ๋‹ค. md#ํ† ๋ก .

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

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

@pjebs ๊ทธ๊ฒƒ์ด _์ •ํ™•ํžˆ_ ์šฐ๋ฆฌ๊ฐ€ ์ด์ „ ์ œ์•ˆ์—์„œ ๊ณ ๋ คํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ž์„ธํ•œ ๋ฌธ์„œ, ๋””์ž์ธ ๋ฐ˜๋ณต ์„น์…˜, 4๋ฒˆ์งธ ๋‹จ๋ฝ ์ฐธ์กฐ):

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

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

@griesemer ์žฌ์ž‘์„ฑ์— ๋Œ€ํ•œ ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ์ด ๋˜์–ด์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

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

์˜ค๋ฅ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์— ๋Œ€ํ•ด์„œ๋Š” ํ•จ์ˆ˜์˜ ๊ด€์‹ฌ์ด ๋„ˆ๋ฌด ๊ด‘๋ฒ”์œ„ํ•˜๋‹ค๋Š” ์‹ ํ˜ธ๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฃผ์„์—์„œ ์ฃผ์žฅ๋œ ์‹ค์ œ ์ฝ”๋“œ์˜ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋ฒˆ์—ญํ•˜๊ณ  ๋‚ด ์›๋ž˜ ์ฃผ์„ ์˜ ๋งจ ์•„๋ž˜์— ์žˆ๋Š” ๋“œ๋กญ๋‹ค์šด์— ๋ฐฐ์น˜ํ•˜๊ณ  https://github.com/golang/go/issues/32437#issuecomment ์˜ ์˜ˆ - 499007288 ์ œ ์ƒ๊ฐ์—๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ฅผ ์ž˜ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

func (c *Config) Build() error {
    pkgPath, err := c.load()
    if err != nil { return nil, errors.WithMessage(err, "load config dir") }

    b := bytes.NewBuffer(nil)
    err = templates.ExecuteTemplate(b, "main", c)
    if err != nil { return nil, errors.WithMessage(err, "execute main template") }

    buf, err := format.Source(b.Bytes())
    if err != nil { return nil, errors.WithMessage(err, "format main template") }

    target := fmt.Sprintf("%s.go", filename(pkgPath))
    err = ioutil.WriteFile(target, buf, 0644)
    if err != nil { return nil, errors.WithMessagef(err, "write file %s", target) }
    // ...
}

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

defer wrap(&err, "message: %v", err) ๋ฒ„๊ทธ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฏธ๋ฌ˜ํ•˜๊ณ  ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ Go ํ”„๋กœ๊ทธ๋ž˜๋จธ๋„ ๋„˜์–ด์ง€๊ฒŒ ๋˜์—ˆ๋Š”์ง€ ์•ฝ๊ฐ„์˜ ์‹ ํ˜ธ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.


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

@griesemer ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ณตํ™ฉ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์œ„ํ—˜์— ๋Œ€ํ•œ ํ† ๋ก ์„ ๋ณด์ง€ ๋ชปํ•œ ๋‹ค๋ฅธ ์„น์…˜์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

@zeebo ์ด ์˜ˆ์ œ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ if ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์„ ํƒ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์š”์ ์„ ๋งํ•˜์ž๋ฉด, if๋ฅผ ํ•œ ์ค„๋กœ ํ˜•์‹ํ™”ํ•˜๋ฉด ์ด๊ฒƒ์„ ์กฐ๊ธˆ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

try ์— ๋Œ€ํ•œ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ํ•ธ๋“ค๋Ÿฌ ์ธ์ˆ˜๋Š” _required_์ด์ง€๋งŒ nil-able์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์˜ˆ์™ธ ๋Œ€์‹  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ „๋‹ฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํ•ธ๋“ค๋Ÿฌ์— nil ๊ฐ’์„ ์ œ๊ณตํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด try ๊ฐ€ ์›๋ž˜ ์ œ์•ˆ์—์„œ์™€ ๊ฐ™์ด ๋™์ž‘ํ•˜์ง€๋งŒ nil ์ธ์ˆ˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ๊ฒ€ํ†  ์ค‘์— ์žก๊ธฐ๊ฐ€ ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

file := try(os.Open("my_file.txt"), nil)

ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ œ๊ณต๋˜์—ˆ์ง€๋งŒ nil์ด๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ํŒจ๋‹‰์„ ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ ๋ถ€์žฌ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด try ์€ ์›๋ž˜ ์ œ์•ˆ์— ๋”ฐ๋ผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€์žฌ ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ ๊ฐ™์€ ๊ฒƒ์€ ์—†๊ณ  ์˜ค์ง ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค.

ํ•ธ๋“ค๋Ÿฌ๊ฐ€ nil์ด ์•„๋‹Œ ์˜ค๋ฅ˜๋กœ ํ˜ธ์ถœ๋œ ๋‹ค์Œ nil ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ด๊ฒƒ์€ ์˜ค๋ฅ˜๊ฐ€ "์ทจ์†Œ๋จ"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‘˜๋Ÿฌ์‹ธ๋Š” ํ•จ์ˆ˜๊ฐ€ nil ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋‘˜๋Ÿฌ์‹ธ๋Š” ํ•จ์ˆ˜๊ฐ€ nil ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ๋ฐ˜ํ™˜๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. try ๊ฐ€ nil์ด ์•„๋‹Œ ์˜ค๋ฅ˜ ๊ฐ’์„ ๋ฐ›์€ ํ›„์—๋„ ์‹คํ–‰์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ž ์žฌ์ ์œผ๋กœ ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ "์ฒ˜๋ฆฌ"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋™์ž‘์€ ์˜ˆ๋ฅผ ๋“ค์–ด "๊ฐ€์ ธ์˜ค๊ธฐ ๋˜๋Š” ๋งŒ๋“ค๊ธฐ" ์Šคํƒ€์ผ ํ•จ์ˆ˜์—์„œ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func getOrCreateObject(obj *object) error {
    defaultObjectHandler := func(err error) error {
        if err == ObjectDoesNotExistErr {
            *obj = object{}
            return nil
        }
        return fmt.Errorf("getting or creating object: %v", err)
    }

    *obj = try(db.getObject(), defaultObjectHandler)
}

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

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

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

@velovix ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€๋งŒ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ธฐ๋ณธ์ ์œผ๋กœ nil ๊ฐ€ ๋  ์ˆ˜ ์—†๋‚˜์š”? ์™œ "์‹œ๊ฐ์  ๋‹จ์„œ"๊ฐ€ ํ•„์š”ํ•œ๊ฐ€์š”?

@griesemer @velovix ์•„์ด๋””์–ด๊ฐ€ ์ฑ„ํƒ๋˜์—ˆ์ง€๋งŒ builtin ์— err ์„ ํŒจ๋‹‰์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์‚ฌ์ „ ์ •์˜๋œ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ์ง€๋‚˜์น˜๊ฒŒ ์ค‘์š”ํ•œ ํ•จ์ˆ˜์— ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ œ๊ฑฐํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•จ์ˆ˜๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ ์—†์ด try ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

@pjebs

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ธฐ๋ณธ์ ์œผ๋กœ nil์ด ๋  ์ˆ˜ ์—†๋‚˜์š”? ์™œ "์‹œ๊ฐ์  ๋‹จ์„œ"๊ฐ€ ํ•„์š”ํ•œ๊ฐ€์š”?

ํ•˜๋Š” ์šฐ๋ ค๋ฅผ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

  1. ํ˜„์žฌ try ์ œ์•ˆ์€ ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋“ค์ด ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  1. ์›๋ž˜ ์ œ์•ˆ ๋ฌธ์„œ์˜ ์šฐ๋ ค ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ์ฒซ ๋Œ“๊ธ€์—์„œ ๊ทธ๊ฒƒ์„ ์ธ์šฉํ–ˆ๋‹ค.

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

๋ช…์‹œ์ ์ธ nil ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์žŠ๋Š” ๊ฒƒ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ์ƒ๋žตํ•˜์—ฌ ์•”์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€์‹  ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋„๋ก ๋ช…์‹œ์ ์œผ๋กœ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/golang/go/issues/32437#issuecomment -498947603์—์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ์–ธ๊ธ‰๋œ ์กฐ๊ฑด๋ถ€ ๋ฐ˜ํ™˜์— ๋Œ€ํ•ด ๋” ์ƒ๊ฐํ•ด๋ณด์„ธ์š”.
๊ฒƒ ๊ฐ™๋‹ค
return if f, err := os.Open("/my/file/path"); err != nil
Go์˜ ๊ธฐ์กด if ๋ชจ์–‘๊ณผ ๋” ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

return if ๋ฌธ์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•˜๋ฉด
err != nil ์™€ ๊ฐ™์€ ๋งˆ์ง€๋ง‰ ์กฐ๊ฑด ํ‘œํ˜„์‹์ด ์—†์„ ๋•Œ,return if ๋ฌธ์˜ ๋งˆ์ง€๋ง‰ ๋ณ€์ˆ˜๋Š” error ์œ ํ˜•์ž…๋‹ˆ๋‹ค.๊ทธ๋Ÿฌ๋ฉด ๋งˆ์ง€๋ง‰ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์•”์‹œ์  ์กฐ๊ฑด์œผ๋กœ nil ์™€ ์ž๋™์œผ๋กœ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด return if ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ•์•ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
return if f, err := os.Open("my/file/path")

try ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์‹ ํ˜ธ-์žก์Œ ๋น„์œจ์— ๋งค์šฐ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.
return if ๋ฅผ try ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.
try f, err := os.Open("my/file/path")
์ด๊ฒƒ์€ ์ ์–ด๋„ ๊ตฌ๋ฌธ์ ์œผ๋กœ๋Š” ์ด ์Šค๋ ˆ๋“œ์—์„œ ์ œ์•ˆ๋œ ๋‹ค๋ฅธ try ๋ณ€ํ˜•๊ณผ ๋‹ค์‹œ ์œ ์‚ฌํ•ด์ง‘๋‹ˆ๋‹ค.
๊ฐœ์ธ์ ์œผ๋กœ ์ด ๊ฒฝ์šฐ try return if ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์ด ํ•จ์ˆ˜์˜ ์ข…๋ฃŒ์ ์„ ๋งค์šฐ ๋ช…์‹œ์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋””๋ฒ„๊น…ํ•  ๋•Œ ๋‚˜๋Š” ์ข…์ข… ํŽธ์ง‘๊ธฐ ๋‚ด์—์„œ ํ‚ค์›Œ๋“œ return ๋ฅผ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜์—ฌ ํฐ ํ•จ์ˆ˜์˜ ๋ชจ๋“  ์ข…๋ฃŒ์ ์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๋””๋ฒ„๊ทธ ๋กœ๊น…์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ถˆํŽธํ•จ์—๋„ ์ถฉ๋ถ„ํžˆ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
return if body ๋ธ”๋ก๋„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด
์›๋ž˜์˜:

        return if f, err := os.Open("my/path") 

๋””๋ฒ„๊น…ํ•  ๋•Œ:

-       return if f, err := os.Open("my/path") 
+       return if f, err := os.Open("my/path") {
+               fmt.Printf("DEBUG: os.Open: %s\n", err)
+       }

return if ์˜ ๋ณธ๋ฌธ ๋ธ”๋ก์˜ ์˜๋ฏธ๋Š” ๋ถ„๋ช…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. defer ์ „์— ์‹คํ–‰๋˜๊ณ  ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, Go์˜ ๊ธฐ์กด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์— ๋ถˆ๋งŒ์ด ์—†์Šต๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€๊ฐ€ ํ˜„์žฌ Go์˜ ์žฅ์ ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€ ๋” ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค.

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

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

@griesemer - IIUC, ํ˜ธ์ถœ ์‚ฌ์ดํŠธ ์ข…์† ์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ์˜ ๊ฒฝ์šฐ ํ˜„์žฌ if ๋ฌธ์ด ๊ดœ์ฐฎ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์ด ์ƒˆ๋กœ์šด try ํ•จ์ˆ˜๋Š” ํ•œ ๊ณณ์—์„œ ์—ฌ๋Ÿฌ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ if err != nil { return err} ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ์˜ค๋ฅ˜๋ฅผ ์žฅ์‹ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ œ์•ˆ์€ ์ „์ž๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ํ›„์ž์—๋Š” ๋ณ„๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์ด ์‰ฌ์šด ๋ฐ˜ํ™˜ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

์ข‹์€ ์Œ์ด ๋  catch ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

func a() int {
  x := randInt()
  // let's assume that this is what recruiters should "fix" for us
  // or this happens in 3rd-party package.
  if x % 1337 != 0 {
    panic("not l33t enough")
  }
  return x
}

func b() error {
  // if a() panics, then x = 0, err = error{"not l33t enough"}
  x, err := catch(a())
  if err != nil {
    return err
  }
  sendSomewhereElse(x)
  return nil
}

// which could be simplified even further

func c() error {
  x := try(catch(a()))
  sendSomewhereElse(x)
  return nil
}

์ด ์˜ˆ์—์„œ catch() ๋Š” recover() ํŒจ๋‹‰ ๋ฐ return ..., panicValue ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ก , ์šฐ๋ฆฌ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” func๊ฐ€ ์žˆ๋Š” ๋ช…๋ฐฑํ•œ ์ฝ”๋„ˆ ์ผ€์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ๊ฐ’์„ ๊ทธ๋ƒฅ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ catch()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ๋กœ ํŒจ๋‹‰์„ ๋ณต๊ตฌํ•˜๊ณ  ์˜ค๋ฅ˜๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Go๋Š” ์‹ค์ œ๋กœ ์˜ˆ์™ธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๊ฝค ์žฌ๋ฏธ์žˆ์–ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ ์šฐ๋ฆฌ๋Š” ๊ฝค ๊น”๋”ํ•œ try()-catch() ํŒจํ„ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Java( catch(Throwable) in Main + throws LiterallyAnything ). ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜์ฒ˜๋Ÿผ ๋ˆ„๊ตฐ๊ฐ€์˜ ํŒจ๋‹‰์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‚ด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ Go์— ์•ฝ 6๋ฐฑ๋งŒ ๊ฐœ ์ด์ƒ์˜ LoC๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์ด ์ ์–ด๋„ ์ €์—๊ฒŒ๋Š” ์ผ์„ ๋‹จ์ˆœํ™”ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@griesemer ํ† ๋ก ์„ ์š”์•ฝํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

๋˜ํ•œ @velovix ์˜ ์ œ์•ˆ๋„ ๋งˆ์Œ์— ๋“ค๊ณ  ์‚ฌ์–‘์— ์„ค๋ช…๋œ ๋Œ€๋กœ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์ œ๊ธฐ๋œ๋‹ค๋Š” ์ ์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ @velovix ๊ฐ€ ์ด๋ฏธ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์‰ฝ๊ฒŒ ๋‹ต๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

  • ํ•จ์ˆ˜ ๊ฐ’(nil ๋ฆฌํ„ฐ๋Ÿด์ด ์•„๋‹˜)์„ ์ œ๊ณตํ•˜๊ณ  ํ•ด๋‹น ํ•จ์ˆ˜ ๊ฐ’(๋ณ€์ˆ˜์— ์ €์žฅ๋จ)์ด nil์ด๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? => ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌํ•˜์ง€ ๋งˆ์„ธ์š”, ๋งˆ์นจํ‘œ. ์ด๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ปจํ…์ŠคํŠธ์— ์˜์กดํ•˜๊ณ  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ•ธ๋“ค๋Ÿฌ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. :)

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

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

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

@griesemer

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

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

๋˜ ๋‹ค๋ฅธ ์ฃผ์žฅ์€ ํ•จ์ˆ˜๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ์˜ ์ตœ์ƒ์œ„ ์„ ์–ธ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ defer .

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

๋Œ€๊ด„ํ˜ธ ์—†์ด ์ž‘๋™ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
a := try func(some)

@Cyberax - ์œ„์—์„œ ์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊ฒŒ์‹œํ•˜๊ธฐ ์ „์— ๋””์ž์ธ ๋ฌธ์„œ๋ฅผ ์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ตฌ๋…ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ๋Š” ์—ฐ์‚ฐ์ž์™€ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

8์›” ๋ฒ„์ „๋ณด๋‹ค ์ด๊ฒŒ ๋” ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

return ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๋Š” ๋ฐ˜ํ’ˆ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฒƒ์€ ์•„๋‹Œ ๋ถ€์ •์ ์ธ ํ”ผ๋“œ๋ฐฑ์˜ ๋Œ€๋ถ€๋ถ„์€ ๋‘ ๊ฐ€์ง€๋กœ ์š”์•ฝ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. ์‚ฌ๋žŒ๋“ค์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ•„์ˆ˜๊ฐ€ ๋˜๋Š” ๋ช…๋ช…๋œ ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ์˜ค๋ฅ˜์— ์ž์„ธํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด ๋‘ ๊ฐ€์ง€ ๋ฐ˜๋ก ์— ๋Œ€ํ•œ ๋ฐ˜๋ฐ•์€ ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. "์šฐ๋ฆฌ๋Š” [๋ช…๋ช…๋œ ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜]๊ฐ€ ์ •์ƒ์ด๋ผ๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค"
  2. "์•„๋ฌด๋„ try ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. " / 100% ๊ฒฝ์šฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” 1์— ๋Œ€ํ•ด ์ •๋ง๋กœ ํ•  ๋ง์ด ์—†์Šต๋‹ˆ๋‹ค(๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ•ํ•˜๊ฒŒ ๋Š๋ผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ 2์— ๊ด€ํ•ด์„œ๋Š” 8์›” ์ œ์•ˆ์—๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ˜๋Œ€ ์ œ์•ˆ์—๋„ ์ด ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ tryf ๋ฐ˜๋Œ€ ์ œ์•ˆ(์ด ์Šค๋ ˆ๋“œ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ๋‘ ๋ฒˆ ๊ฒŒ์‹œ๋จ)์ด๋‚˜ try(X, handlefn) ๋ฐ˜๋Œ€ ์ œ์•ˆ(์„ค๊ณ„ ๋ฐ˜๋ณต์˜ ์ผ๋ถ€์ž„) ๋ชจ๋‘ ์ด ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

try ๊ฐ€ ๊ด€๋ จ ์ปจํ…์ŠคํŠธ๋กœ ์˜ค๋ฅ˜๋ฅผ ๊พธ๋ฏธ๋Š” ๊ฒƒ์—์„œ ๋ฒ—์–ด๋‚˜ ํ•˜๋‚˜์˜ ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ๋ณ„ ์˜ค๋ฅ˜ ์žฅ์‹์œผ๋กœ ์‚ฌ๋žŒ๋“ค์„ ๋ฐ€์–ด๋‚ผ ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ์ œ์•ˆํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ˜„์žฌ defer ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. defer ๊ฐ€ ํ•จ์ˆ˜ ์ด๋ฆ„์ด๋‚˜ ํ•จ์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด๋„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰,
defer func(...) {...}
defer packageName.functionName
  1. ํŒจ๋‹‰ ๋˜๋Š” ์ง€์—ฐ์ด ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ง€์—ฐ์„ ๋งŒ๋‚˜๋ฉด ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด 0 ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

  2. try ์— ๋‘˜ ์ด์ƒ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉ

  3. try ๊ฐ€ ์ƒˆ๋กœ์šด ์œ ํ˜•์˜ defer๋ฅผ ๋งŒ๋‚˜๋ฉด ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  try ์˜ ๊ณ ์œ  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋’ค๋”ฐ๋ฅด๋Š” ์˜ค๋ฅ˜ ๊ฐ’์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func errorfn() error {
    return errors.New("an error")
}


func f(fail bool) {
    defer func(err *error, a, b, c int) {
        fmt.Printf("a=%d b=%d c=%d\n", a, b, c)
    }
    if fail {
        try(errorfn, 1, 2, 3)
    }
}

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค:

f(false)        // prints "a=0 b=0 c=0"
f(true)         // prints "a=1 b=2 c=3"

@zeebo์˜ https://github.com/golang/go/issues/32437#issuecomment -499309304 ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func (c *Config) Build() error {
    defer func(err *error, msg string, args ...interface{}) {
        if *err == nil || msg == "" {
            return
        }
        *err = errors.WithMessagef(err, msg, args...)
    }
    pkgPath := try(c.load(), "load config dir")

    b := bytes.NewBuffer(nil)
    try(templates.ExecuteTemplate(b, "main", c), "execute main template")

    buf := try(format.Source(b.Bytes()), "format main template")

    target := fmt.Sprintf("%s.go", filename(pkgPath))
    try(ioutil.WriteFile(target, buf, 0644), "write file %s", target)
    // ...
}

๊ทธ๋ฆฌ๊ณ  ErrorHandlef๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

func HandleErrorf(err *error, format string, args ...interface{}) {
        if *err != nil && format != "" {
                *err = fmt.Errorf(format + ": %v", append(args, *err)...)
        }
}

fmt -์Šคํƒ€์ผ ํ˜•์‹ ๋ฌธ์ž์—ด์„ ํ•ต์‹ฌ ์–ธ์–ด๋กœ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋งŽ์ด ์ฐพ๋Š” tryf ๋ฅผ ๋ฌด๋ฃŒ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

defer ๋Š” ์ธ์ˆ˜๋กœ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์€ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ‚ค์›Œ๋“œ๋ฅผ ์†Œ๊ฐœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md ์— ์„ค๋ช…๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์™ธ์— ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ์—ฐ๊ธฐ์— ๋Œ€ํ•ด ํŒŒ์„œ์—๊ฒŒ ๊ฐ€๋ฅด์นœ๋‹ค
  2. ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœ ๋Œ€์‹  ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์ง€์—ฐ๋„ ๋™์ผํ•œ ์„œ๋ช…์„ ๊ฐ–๋Š”์ง€ ํ™•์ธํ•˜๋„๋ก ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  3. try ์— ์ „๋‹ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ defer ์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜์˜ ์„œ๋ช…๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋„๋ก ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  4. ์ ์ ˆํ•œ deferproc ํ˜ธ์ถœ์„ ์ƒ์„ฑํ•˜๋„๋ก ๋ฐฑ์—”๋“œ(?)๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  5. try ์˜ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ์ง€์—ฐ์— ์˜ํ•ด ์ง€์—ฐ๋œ ํ˜ธ์ถœ์„ ๋งŒ๋‚  ๋•Œ ์ง€์—ฐ๋œ ํ˜ธ์ถœ์˜ ์ธ์ˆ˜๋กœ ์ธ์ˆ˜๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

check/handle ๋“œ๋ž˜ํ”„ํŠธ ๋””์ž์ธ์˜ ๋ณต์žก์„ฑ ์ดํ›„์— ์ด ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์‹ค์šฉ์ ์ธ ์ œ์•ˆ์ด ์‹คํ˜„๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ๊ธฐ๋ถ„ ์ข‹๊ฒŒ ๋†€๋ž์Šต๋‹ˆ๋‹ค.

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

๋ช‡ ๊ฐ€์ง€ ํŠน์ • ์‚ฌํ•ญ์— ๋Œ€ํ•ด:

  1. ์ œ์•ˆ์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ์‹ซ์–ดํ•˜๋Š” ์œ ์ผํ•œ ์ ์€ defer ๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ ๋ช…๋ช…๋œ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์–ธ์–ด๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹. ๋”ฐ๋ผ์„œ ์ œ์•ˆ์ด ์ฑ„ํƒ๋˜๋ฉด ์ด๋ฅผ ์ˆ˜์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  2. try ๊ฐ€ ์˜ค๋ฅ˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ํŒจํ‚ค์ง€์™€ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์†”๋ฃจ์…˜์€ nil์ด ์•„๋‹Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ฐ˜ํ™˜๋˜๊ธฐ๋ณด๋‹ค๋Š” ํ•ญ์ƒ ํŒจ๋‹‰ ์ƒํƒœ๊ฐ€ ๋˜๋Š” ๋‘ ๋ฒˆ์งธ ๋‚ด์žฅ ํ•จ์ˆ˜(์•„๋งˆ๋„ ptry ๋˜๋Š” must )๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๊ธฐ๋Šฅ( main ํฌํ•จ)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ์•„์ด๋””์–ด๋Š” ์ œ์•ˆ์„œ์˜ ํ˜„์žฌ ๋ฐ˜๋ณต์—์„œ ๊ฑฐ๋ถ€๋˜์—ˆ์ง€๋งŒ '๋ฐ€์ ‘ํ•œ ์š”์ฒญ'์ด๋ผ๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์œผ๋ฉฐ ๋”ฐ๋ผ์„œ ์žฌ๊ฒ€ํ†  ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด go try(f) ๋˜๋Š” defer try(f) ํ•˜๋Š” ์ผ์— ๋Œ€ํ•ด ๋จธ๋ฆฌ๋ฅผ ์ˆ™์ด๋Š” ๊ฒƒ์ด ์–ด๋ ค์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๋”ฐ๋ผ์„œ ๊ทธ๋“ค์„ ์™„์ „ํžˆ ๊ธˆ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

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

์žฅ์‹ ์˜ค๋ฅ˜์˜ ๊ฒฝ์šฐ

func myfunc()( err error){
try(thing())
defer func(){
err = errors.Wrap(err,"more context")
}()
}

์ด๊ฒƒ์€ ๊ธฐ์กด ํŒจ๋Ÿฌ๋‹ค์ž„๋ณด๋‹ค ํ›จ์”ฌ ๋” ์žฅํ™ฉํ•˜๊ณ  ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ๋Š๊ปด์ง€๋ฉฐ ๊ฒ€์‚ฌ/ํ•ธ๋“ค๋งŒํผ ๊ฐ„๊ฒฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ž˜ํ•‘๋˜์ง€ ์•Š์€ try() ๋ณ€ํ˜•์ด ๋” ๊ฐ„๊ฒฐํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด try์™€ ์ผ๋ฐ˜ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์„ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. try์™€ ๊ฐ„๋‹จํ•œ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์„ ํ˜ผํ•ฉํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์˜ค๋ฅ˜๋ฅผ ๊พธ๋ฏธ๋Š” ๋ฐ ์™„์ „ํžˆ ๋งค๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(Is/As๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค). ์ด๊ฒƒ์ด ๊ตฌ๋ฌธ์ ์œผ๋กœ ๊น”๋”ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€์ง€ ํ™•์‹ ์ด ์„œ์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. check/handle์€ ๋‚ด๊ฐ€ ๋” ์ฒ ์ €ํ•˜๊ฒŒ ์ˆ˜์šฉํ•  ๋ฌด์–ธ๊ฐ€๋ฅผ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์˜ ๋‹จ์ˆœ์„ฑ๊ณผ "ํ•œ ๊ฐ€์ง€๋งŒ ์ž˜ ํ•˜๋ผ"๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด GoAWK ์ธํ„ฐํ”„๋ฆฌํ„ฐ์—์„œ๋Š” ๋งค์šฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์•ฝ 100๊ฐœ์˜ if err != nil { return nil } ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ƒ๋‹นํžˆ ์ž‘์€ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹Œ ๋‚ด์žฅ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ œ์•ˆ์˜ ์ •๋‹น์„ฑ์„ ์ฝ์—ˆ๊ณ , ๊ทธ๊ฒƒ์€ ํŒŒ์„œ๋ฅผ ์กฐ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒฐ๋ก ์œผ๋กœ โ€‹โ€‹๊ท€๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋„๊ตฌ ์ž‘์„ฑ์ž์—๊ฒŒ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์ ์€ ์–‘์˜ ๊ณ ํ†ต์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋ฐ˜๋ฉด์— ์ถ”๊ฐ€ ๊ด„ํ˜ธ์™€ this-look-like-a-function- but-is-in-in-readability ๋ฌธ์ œ๋Š” ๋ชจ๋“  Go ์ฝ”๋”์™€ ์ฝ”๋“œ์˜ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋…์ž๋Š” ๊ฒฌ๋ŽŒ์•ผ ํ•œ๋‹ค. ๋‚ด ์˜๊ฒฌ์œผ๋กœ๋Š” (๋ณ€๋ช…? :-) "ํ•˜์ง€๋งŒ panic() ๋Š” ํ๋ฆ„์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค"๋Š” ๊ทธ๊ฒƒ์„ ์ž๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํŒจ๋‹‰๊ณผ ํšŒ๋ณต์€ ๋ณธ์งˆ์ ์œผ๋กœ ์˜ˆ์™ธ์  ์ธ ๋ฐ˜๋ฉด try() ๋Š” ์ •์ƒ์ ์ธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ ์ œ์–ด ํ๋ฆ„์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ €๋Š” ์ด ์ œ์•ˆ์— ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์ œ์•ˆ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ํฐ ์˜ˆ์•ฝ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค: defer ์— ๋Œ€ํ•œ handle ์˜ ๋น„์ง๊ต์„ฑ.

์œ„์—์„œ ๊ฐ•์กฐ๋˜์ง€ ์•Š์€ ๋‘ ๊ฐ€์ง€ ์ธก๋ฉด์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, ์ด ์ œ์•ˆ์ด ์˜ค๋ฅ˜์— ์ƒํ™ฉ๋ณ„ ์˜ค๋ฅ˜ ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์ง€๋Š” ์•Š์ง€๋งŒ ์Šคํƒ ํ”„๋ ˆ์ž„ ์˜ค๋ฅ˜ ์ถ”์  ์ •๋ณด๋ฅผ ์˜ค๋ฅ˜์— ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. https://play.golang.org/p /YL1MoqR08E6

๋‘˜์งธ, try ๋Š” ํ‹€๋ฆผ์—†์ด https://github.com/golang/go/issues/19642์˜ ๊ธฐ๋ณธ ๋ฌธ์ œ ๋Œ€๋ถ€๋ถ„์— ๋Œ€ํ•œ ๊ณต์ •ํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฌธ์ œ์˜ ์˜ˆ๋ฅผ ๋“ค๋ฉด try ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๋ฒˆ ๋ชจ๋“  ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๊ธด ์ด๋ฆ„์„ ๊ฐ€์ง„ ๊ฐ’์— ์˜ํ•œ ๊ตฌ์กฐ์ฒด ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์ž ์žฌ์ ์œผ๋กœ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

func (f *Font) viewGlyphData(b *Buffer, x GlyphIndex) (buf []byte, offset, length uint32, err error) {
    xx := int(x)
    if f.NumGlyphs() <= xx {
        try(ErrNotFound)
    }
    i := f.cached.locations[xx+0]
    j := f.cached.locations[xx+1]
    if j < i {
        try(errInvalidGlyphDataLength)
    }
    if j-i > maxGlyphDataLength {
        try(errUnsupportedGlyphDataLength)
    }
    buf, err = b.view(&f.src, int(i), int(j-i))
    return buf, i, j - i, err
}

์ด ์ œ์•ˆ๋„ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ถ€ํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

make try ๊ฐ€ ๋‹ค์–‘ํ•œ ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

  • ์‹œ๋„(f):
    ์œ„์™€ ๊ฐ™์ด.
    ๋ฐ˜ํ™˜ ์˜ค๋ฅ˜ ๊ฐ’์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค(๋งˆ์ง€๋ง‰ ๋ฐ˜ํ™˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ).
    ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ๋ชจ๋ธ
  • ์‹œ๋„(f, doPanic ๋ถ€์šธ):
    ์œ„์™€ ๊ฐ™์ง€๋งŒ doPanic์ด๋ฉด ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ํŒจ๋‹‰(err)ํ•ฉ๋‹ˆ๋‹ค.
    ์ด ๋ชจ๋“œ์—์„œ๋Š” ๋ฐ˜ํ™˜ ์˜ค๋ฅ˜ ๊ฐ’์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‹œ๋„(f, fn):
    ์œ„์™€ ๊ฐ™์ง€๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— fn(err)์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
    ์ด ๋ชจ๋“œ์—์„œ๋Š” ๋ฐ˜ํ™˜ ์˜ค๋ฅ˜ ๊ฐ’์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ๋ช…์‹œ์ ์ด๋ฉด์„œ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋‚ด์žฅ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์žฅ์ :

  • ํ•ญ์ƒ ๋ช…์‹œ์  - ํŒจ๋‹‰ ๋˜๋Š” ์„ค์ • ์˜ค๋ฅ˜ ์—ฌ๋ถ€๋ฅผ ์œ ์ถ”ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ปจํ…์ŠคํŠธ๋ณ„ ํ•ธ๋“ค๋Ÿฌ ์ง€์›(ํ•˜์ง€๋งŒ ํ•ธ๋“ค๋Ÿฌ ์ฒด์ธ ์—†์Œ)
  • ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ง€์›
  • ํ•„์ˆ˜(...) ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ณต์ ์ธ if err !=nil { return ... err } ๋Š” ํ™•์‹คํžˆ ๋ชป์ƒ๊ธด ๋ง๋”๋“ฌ์ด์ง€๋งŒ ๋‚˜๋Š” ๊ทธ ๋ง์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
try() ์ œ์•ˆ์ด ๊ฐ€๋…์„ฑ์ด ๋งค์šฐ ๋‚ฎ๊ณ  ๋‹ค์†Œ ๋ถˆ๋ถ„๋ช…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ.
๋ช…๋ช…๋œ ๋ฐ˜ํ™˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ตฌ๋ฌธ ์„คํƒ•์œผ๋กœ try(err) ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
if err !=nil { return err } :

file, err := os.Open("file.go")
try(err)

~์„์œ„ํ•œ

file, err := os.Open("file.go")
if err != nil {
   return err
}

๋ฐ˜ํ™˜ ๊ฐ’์ด ๋‘ ๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ try(err) ๋Š” return t1, ... tn, err ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ t1, ... tn์€ ๋‹ค๋ฅธ ๋ฐ˜ํ™˜ ๊ฐ’์˜ 0 ๊ฐ’์ž…๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์€ ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๊ฐ’์˜ ํ•„์š”์„ฑ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,
์ œ ์ƒ๊ฐ์—๋Š” ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

file, try(err) := os.Open("file.go")

๋˜๋Š”

file, err? := os.Open("file.go")

์ด ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์€ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ ์‹๋ณ„์ž์—๋Š” ?๊ฐ€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ).

(์ด ์ œ์•ˆ์€ https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring-themes ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜๋ณต๋˜๋Š” ํ…Œ๋งˆ ์˜ˆ์ œ๋Š” ๋– ๋‚˜์ง€ ์•Š๊ณ  ๋ช…์‹œ์  ํ•ธ๋“ค์ด ์—ฌ์ „ํžˆ ๋…ผ์˜๋˜๋Š” ๋‹จ๊ณ„์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅด๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ์—ฐ๊ธฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

์ด ์‹ ์ค‘ํ•˜๊ณ  ํฅ๋ฏธ๋กœ์šด ์ œ์•ˆ์„ ํ•ด์ฃผ์‹  go ํŒ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@rogpeppe comment if try ๋‚ด๊ฐ€ ์•„๋‹Œ ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@aarzilli - ๊ท€ํ•˜์˜ ์ œ์•ˆ์— ๋”ฐ๋ฅด๋ฉด tryf ์— ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•  ๋•Œ๋งˆ๋‹ค defer ์ ˆ์ด ํ•„์ˆ˜์ž…๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ

try(ioutil.WriteFile(target, buf, 0644), "write file %s", target)

์ง€์—ฐ ๊ธฐ๋Šฅ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@agnivade

๋‚ด๊ฐ€ ํ•˜๊ณ (...) defer ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

์œ ํ˜• ๊ฒ€์‚ฌ ์˜ค๋ฅ˜.

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

func (f *Font) viewGlyphData(b *Buffer, x GlyphIndex) (buf []byte, offset, length uint32, err error) {
    xx := int(x)
    if f.NumGlyphs() <= xx {
        try(ErrNotFound)
    }
    //...

return nil, 0, 0, ErrNotFound ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ์š•๊ตฌ๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€๋งŒ ์ฐจ๋ผ๋ฆฌ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

๊ธฐ๋ณธ๊ฐ’๊ณผ ์˜ค๋ฅ˜ ๊ฐ’์„ ์‰ฝ๊ฒŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์›ํ•˜๋ฉด ๋ณ„๋„๋กœ ํ•ด๊ฒฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋‹ค๋ฅธ ๋‚ด์žฅ ๊ฐ™์€

return default(ErrNotFound)

์ ์–ด๋„ ๊ทธ๊ฒƒ์€ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋…ผ๋ฆฌ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ try ๋ฅผ ๋‚จ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ง™์‹œ๋‹ค.

@natefinch try ๋‚ด์žฅ์˜ ์ด๋ฆ„์ด ์›๋ž˜ ์ œ์•ˆ์—์„œ์™€ ๊ฐ™์ด check ์ด๋ฉด check(err) ๊ฐ€ ๋˜์–ด ํ›จ์”ฌ ๋” ์ž˜ ์ฝํž™๋‹ˆ๋‹ค.

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

a, b := try(1, f(), err)

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

@natefinch ํ•œ ๋‹จ๊ณ„ ์˜ฌ๋ผ๊ฐ€์„œ ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋Š” ํŒจ๋‹‰์ฒ˜๋Ÿผ ๊ฐœ๋…ํ™”ํ•˜๋ฉด ๊ฝค ์ง€์ €๋ถ„ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‹ค๋ฅด๊ฒŒ ๊ฐœ๋…ํ™”ํ•œ๋‹ค. Go์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค., Rust์˜ ์šฉ์–ด๋ฅผ ๋Š์Šจํ•˜๊ฒŒ ์ฐจ์šฉํ•ฉ๋‹ˆ๋‹ค. try ๋Š” ๊ฒฐ๊ณผ์˜ ์••์ถ•์„ ํ’€๊ณ  error != nil ์ด๋ฉด "์˜ค๋ฅ˜ ๊ฒฐ๊ณผ"๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ error == nil ์ด๋ฉด ๊ฒฐ๊ณผ์˜ T ๋ถ€๋ถ„ ์••์ถ•์„ ํ‘ธ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ์ž…๋‹ˆ๋‹ค.

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

@ugorji ๋‹น์‹ ์ด ์ œ์•ˆํ•œ try(f, bool) ๋ณ€์ข…์€ #32219์˜ must ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

@ugorji ๋‹น์‹ ์ด ์ œ์•ˆํ•œ try(f, bool) ๋ณ€์ข…์€ #32219์˜ must ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

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

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

func foo() error {
  defer fmt.HandleErrorf(try(), "important foo context info")
  try(bar())
  try(baz())
  try(etc())
}

@ugorji
try(f, bool) ์— ๋ถ€์šธ์„ ์ง€์ •ํ•˜๋ฉด ์ฝ๊ธฐ ์–ด๋ ต๊ณ  ๋†“์น˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ œ์•ˆ์„ ์ข‹์•„ํ•˜์ง€๋งŒ ํŒจ๋‹‰์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ์„ธ ๋ฒˆ์งธ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ(์˜ˆ: try(f(), func(err error) { panic('at the disco'); }) )์—์„œ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์— ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ˆจ๊ฒจ์ง„ try(f(), true) ๋ณด๋‹ค ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.

@ugorji
try(f, bool) ์— ๋ถ€์šธ์„ ์ง€์ •ํ•˜๋ฉด ์ฝ๊ธฐ ์–ด๋ ต๊ณ  ๋†“์น˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ œ์•ˆ์„ ์ข‹์•„ํ•˜์ง€๋งŒ ํŒจ๋‹‰์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ์„ธ ๋ฒˆ์งธ ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ(์˜ˆ: try(f(), func(err error) { panic('at the disco'); }) )์—์„œ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์— ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ˆจ๊ฒจ์ง„ try(f(), true) ๋ณด๋‹ค ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.

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

@patrick-nyt๋Š” https://github.com/golang/go/issues/32437#issuecomment -499533464์—์„œ nil ํ…Œ์ŠคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” _assignment syntax_์˜ ๋˜ ๋‹ค๋ฅธ ์ง€์ง€์ž์ž…๋‹ˆ๋‹ค.

์ด ๊ฐœ๋…์€ ํ™•์ธ/์ฒ˜๋ฆฌ ์ œ์•ˆ์— ๋Œ€ํ•œ 13๊ฐœ์˜ ๊ฐœ๋ณ„ ์‘๋‹ต์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring -themes

f, ?return := os.Open(...)
f, ?panic  := os.Open(...)

์™œ์š”? Go 1์ฒ˜๋Ÿผ ์ฝ์ง€๋งŒ try() ๋ฐ check ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

try ์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ์ด์˜๋Š” ๊ทธ๊ฒƒ์ด ํ‘œํ˜„์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹ ์— nil์ด ์•„๋‹ˆ๋ฉด ๋ฐ˜ํ™˜์„ ์˜๋ฏธํ•˜๋Š” ๋‹จํ•ญ ์ ‘๋ฏธ์‚ฌ ๋ฌธ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค ? ๋‹ค์Œ์€ ํ‘œ์ค€ ์ฝ”๋“œ ์ƒ˜ํ”Œ์ž…๋‹ˆ๋‹ค( ์ œ์•ˆ๋œ ์ง€์—ฐ ํŒจํ‚ค์ง€ ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •).

func CopyFile(src, dst string) error {
    var err error // Don't need a named return because err is explicitly named
    defer deferred.Annotate(&err, "copy %s %s", src, dst)

    r, err := os.Open(src)
    err?
    defer deferred.AnnotatedExec(&err, r.Close)

    w, err := os.Create(dst)
    err?
    defer deferred.AnnotatedExec(&err, r.Close)

    defer deferred.Cond(&err, func(){ os.Remove(dst) })
    _, err = io.Copy(w, r)

    return err
}

pgStore ์˜ˆ:

func (p *pgStore) DoWork() error {
    tx, err := p.handle.Begin()
    err?

    defer deferred.Cond(&err, func(){ tx.Rollback() })

    var res int64 
    err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
    // tricky bit: this would not change the value of err 
    // but the deferred.Cond would still be triggered by err being set before
    deferred.Format(err, "insert table")?

    _, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
    deferred.Format(err, "insert table2")?

    return tx.Commit()
}

๋‚˜๋Š” @jargv์—์„œ ์ด๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค :

try()๋Š” ์ด๋ฏธ ๋งˆ์ˆ ์ ์ด๊ณ  ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ nullary(์ธ์ˆ˜ 0) ํ˜•์‹์œผ๋กœ ํ˜ธ์ถœ๋  ๋•Œ ํ•ด๋‹น ๊ฐ’์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ™•์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ธ์ˆ˜์˜ ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ try ๋ผ๋Š” ์ด๋ฆ„์„ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋Š” ๋Œ€์‹  $ reterr ๊ฐ™์€ ๋˜ ๋‹ค๋ฅธ ๋งˆ๋ฒ• ๋‚ด์žฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ๋ธŒ๋ฆฌํ•‘์„ ํ•˜๋ฉฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋กœ "๊ณ ํ†ต์„ ๋ฐ›๋Š”" go ์ฝ”๋“œ๋ฅผ ์ฐพ์•˜์ง€๋งŒ ์ œ์•ˆ๋œ try()๊ฐ€ ์ˆ˜ํ–‰ํ•  "๋งˆ๋ฒ•"์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋‚ด๋ ค ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ, ๋‚ด๊ฐ€ ์ œ์•ˆ์„ ์ž˜๋ชป ์ดํ•ดํ•˜์ง€ ์•Š๋Š” ํ•œ, ๊ทธ ์ค‘ ๋งŽ์€ ๊ฒƒ(์˜ˆ: ๊ธฐ๋ณธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์•„๋‹˜)์€ ๋งŽ์€ ๊ฒƒ์„ ์–ป์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ "์˜ค๋ž˜๋œ" ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
net/http/request.go์˜ ์˜ˆ:

func (r *Request) write(w io.Writer, usingProxy bool, extraHeaders Header, waitForContinue func() bool) (err error) {
`

trace := httptrace.ContextClientTrace(r.Context())
if trace != nil && trace.WroteRequest != nil {
    defer func() {
        trace.WroteRequest(httptrace.WroteRequestInfo{
            Err: err,
        })
    }()
}

// Find the target host. Prefer the Host: header, but if that
// is not given, use the host from the request URL.
//
// Clean the host, in case it arrives with unexpected stuff in it.
host := cleanHost(r.Host)
if host == "" {
    if r.URL == nil {
        return errMissingHost
    }
    host = cleanHost(r.URL.Host)
}

// According to RFC 6874, an HTTP client, proxy, or other
// intermediary must remove any IPv6 zone identifier attached
// to an outgoing URI.
host = removeZone(host)

ruri := r.URL.RequestURI()
if usingProxy && r.URL.Scheme != "" && r.URL.Opaque == "" {
    ruri = r.URL.Scheme + "://" + host + ruri
} else if r.Method == "CONNECT" && r.URL.Path == "" {
    // CONNECT requests normally give just the host and port, not a full URL.
    ruri = host
    if r.URL.Opaque != "" {
        ruri = r.URL.Opaque
    }
}
if stringContainsCTLByte(ruri) {
    return errors.New("net/http: can't write control character in Request.URL")
}
// TODO: validate r.Method too? At least it's less likely to
// come from an attacker (more likely to be a constant in
// code).

// Wrap the writer in a bufio Writer if it's not already buffered.
// Don't always call NewWriter, as that forces a bytes.Buffer
// and other small bufio Writers to have a minimum 4k buffer
// size.
var bw *bufio.Writer
if _, ok := w.(io.ByteWriter); !ok {
    bw = bufio.NewWriter(w)
    w = bw
}

_, err = fmt.Fprintf(w, "%s %s HTTP/1.1\r\n", valueOrDefault(r.Method, "GET"), ruri)
if err != nil {
    return err
}

// Header lines
_, err = fmt.Fprintf(w, "Host: %s\r\n", host)
if err != nil {
    return err
}
if trace != nil && trace.WroteHeaderField != nil {
    trace.WroteHeaderField("Host", []string{host})
}

// Use the defaultUserAgent unless the Header contains one, which
// may be blank to not send the header.
userAgent := defaultUserAgent
if r.Header.has("User-Agent") {
    userAgent = r.Header.Get("User-Agent")
}
if userAgent != "" {
    _, err = fmt.Fprintf(w, "User-Agent: %s\r\n", userAgent)
    if err != nil {
        return err
    }
    if trace != nil && trace.WroteHeaderField != nil {
        trace.WroteHeaderField("User-Agent", []string{userAgent})
    }
}

// Process Body,ContentLength,Close,Trailer
tw, err := newTransferWriter(r)
if err != nil {
    return err
}
err = tw.writeHeader(w, trace)
if err != nil {
    return err
}

err = r.Header.writeSubset(w, reqWriteExcludeHeader, trace)
if err != nil {
    return err
}

if extraHeaders != nil {
    err = extraHeaders.write(w, trace)
    if err != nil {
        return err
    }
}

_, err = io.WriteString(w, "\r\n")
if err != nil {
    return err
}

if trace != nil && trace.WroteHeaders != nil {
    trace.WroteHeaders()
}

// Flush and wait for 100-continue if expected.
if waitForContinue != nil {
    if bw, ok := w.(*bufio.Writer); ok {
        err = bw.Flush()
        if err != nil {
            return err
        }
    }
    if trace != nil && trace.Wait100Continue != nil {
        trace.Wait100Continue()
    }
    if !waitForContinue() {
        r.closeBody()
        return nil
    }
}

if bw, ok := w.(*bufio.Writer); ok && tw.FlushHeaders {
    if err := bw.Flush(); err != nil {
        return err
    }
}

// Write body and trailer
err = tw.writeBody(w)
if err != nil {
    if tw.bodyReadError == err {
        err = requestBodyReadError{err}
    }
    return err
}

if bw != nil {
    return bw.Flush()
}
return nil

}
`

๋˜๋Š” pprof/profile/profile_test.go์™€ ๊ฐ™์€ ์ฒ ์ €ํ•œ ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ๋œ ๊ฒƒ์ฒ˜๋Ÿผ:
`
func checkAggregation(prof *ํ”„๋กœํ•„, *aggTest) ์˜ค๋ฅ˜ {
// ํ–‰์— ๋Œ€ํ•œ ์ด ์ƒ˜ํ”Œ ์ˆ˜๊ฐ€ ๋ณด์กด๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
์ด๊ณ„ := int64(0)

samples := make(map[string]bool)
for _, sample := range prof.Sample {
    tb := locationHash(sample)
    samples[tb] = true
    total += sample.Value[0]
}

if total != totalSamples {
    return fmt.Errorf("sample total %d, want %d", total, totalSamples)
}

// Check the number of unique sample locations
if a.rows != len(samples) {
    return fmt.Errorf("number of samples %d, want %d", len(samples), a.rows)
}

// Check that all mappings have the right detail flags.
for _, m := range prof.Mapping {
    if m.HasFunctions != a.function {
        return fmt.Errorf("unexpected mapping.HasFunctions %v, want %v", m.HasFunctions, a.function)
    }
    if m.HasFilenames != a.fileline {
        return fmt.Errorf("unexpected mapping.HasFilenames %v, want %v", m.HasFilenames, a.fileline)
    }
    if m.HasLineNumbers != a.fileline {
        return fmt.Errorf("unexpected mapping.HasLineNumbers %v, want %v", m.HasLineNumbers, a.fileline)
    }
    if m.HasInlineFrames != a.inlineFrame {
        return fmt.Errorf("unexpected mapping.HasInlineFrames %v, want %v", m.HasInlineFrames, a.inlineFrame)
    }
}

// Check that aggregation has removed finer resolution data.
for _, l := range prof.Location {
    if !a.inlineFrame && len(l.Line) > 1 {
        return fmt.Errorf("found %d lines on location %d, want 1", len(l.Line), l.ID)
    }

    for _, ln := range l.Line {
        if !a.fileline && (ln.Function.Filename != "" || ln.Line != 0) {
            return fmt.Errorf("found line %s:%d on location %d, want :0",
                ln.Function.Filename, ln.Line, l.ID)
        }
        if !a.function && (ln.Function.Name != "") {
            return fmt.Errorf(`found file %s location %d, want ""`,
                ln.Function.Name, l.ID)
        }
    }
}

return nil

}
`
๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์˜ˆ์ž…๋‹ˆ๋‹ค. "๋” ๋‚˜์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์˜ต์…˜์„ ์›ํ•ฉ๋‹ˆ๋‹ค"

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

์ €๋Š” ์ด ์ œ์•ˆ์— ๋Œ€๋ถ€๋ถ„ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

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

  • ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฌธ์„œํ™”
  • defer ๋‚ด์—์„œ ๊ฒฐ๊ณผ ๊ฐ’ ์กฐ์ž‘(์ผ๋ฐ˜์ ์œผ๋กœ error )

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

์•”์‹œ์  ์˜ค๋ฅ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ defer๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฒฝ์šฐ

func f(err error, t1 T1, t2 T2, ..., tn Tn) error

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋งˆ์ง€๋ง‰ ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ error ์œ ํ˜•์ธ $#$2 g #$ ํ•จ์ˆ˜(์ฆ‰, try ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜)์—์„œ $ f ์— ๋Œ€ํ•œ ํ˜ธ์ถœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฐ๊ธฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func g() (R0, R0, ..., error) {
    defer f(t0, t1, ..., tn) // err is implicit
}

error-defer์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. f ์— ๋Œ€ํ•œ ์ง€์—ฐ๋œ ํ˜ธ์ถœ์€ f ์˜ ์ฒซ ๋ฒˆ์งธ ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ g ์˜ ๋งˆ์ง€๋ง‰ ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  2. f ๋Š” ํ•ด๋‹น ์˜ค๋ฅ˜๊ฐ€ nil์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  3. f ์˜ ๊ฒฐ๊ณผ๋Š” g ์˜ ๋งˆ์ง€๋ง‰ ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ error-defer ๋ฐ try๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ „ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์„ค๊ณ„ ๋ฌธ์„œ์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func printSum(a, b string) error {
    defer func(err error) error {
        return fmt.Errorf("printSum(%q + %q): %v", a, b, err)
    }()
    x := try(strconv.Atoi(a))
    y := try(strconv.Atoi(b))
    fmt.Println("result:", x+y)
    return nil
}

HandleErrorf๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func printSum(a, b string) error {
    defer handleErrorf("printSum(%q + %q)", a, b)
    x := try(strconv.Atoi(a))
    y := try(strconv.Atoi(b))
    fmt.Println("result:", x+y)
    return nil
}

func handleErrorf(err error, format string, args ...interface{}) error {
    return fmt.Errorf(format+": %v", append(args, err)...)
}

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

func(error, ...error) error

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


์ง€๋‚œ ๋ฉฐ์น  ๋™์•ˆ ์ด ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณด๋ฉด ์•ฝ๊ฐ„ ๋งˆ๋ฒ• ๊ฐ™์€ ์ผ์ด์ง€๋งŒ ๋ช…๋ช…๋œ ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ํฐ ์ด์ ์ž…๋‹ˆ๋‹ค. try ๋Š” ์˜ค๋ฅ˜ ์กฐ์ž‘์„ ์œ„ํ•ด defer ๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋ฏ€๋กœ defer ๋ฅผ ํ™•์žฅํ•˜์—ฌ ํ•ด๋‹น ๋ชฉ์ ์— ๋” ์ ํ•ฉํ•˜๋„๋ก ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ try ์™€ error-defer ์‚ฌ์ด์—๋Š” ์ผ์ •ํ•œ ๋Œ€์นญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ error-defers๋Š” ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์„ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ช…๋ช…๋œ ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์‚ฌ์šฉ์„ ๋Œ€์ฒดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋Š˜๋‚ ์—๋„ try ์—†์ด๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์€ ์‹ค์ œ ์ฝ”๋“œ์˜ ํŽธ์ง‘๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

// GetMulti retrieves multiple files through the cache at once and returns its
// results as a slice parallel to the input.
func (c *FileCache) GetMulti(keys []string) (_ []*File, err error) {
    files := make([]*file, len(keys))

    defer func() {
        if err != nil {
            // Return any successfully retrieved files.
            for _, f := range files {
                if f != nil {
                    c.put(f)
                }
            }
        }
    }()

    // ...
}

error-defer๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

// GetMulti retrieves multiple files through the cache at once and returns its
// results as a slice parallel to the input.
func (c *FileCache) GetMulti(keys []string) ([]*File, error) {
    files := make([]*file, len(keys))

    defer func(err error) error {
        // Return any successfully retrieved files.
        for _, f := range files {
            if f != nil {
                c.put(f)
            }
        }
        return err
    }()

    // ...
}

@beoran ์ œ๋„ค๋ฆญ์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค๋Š” ๊ท€ํ•˜์˜ ์˜๊ฒฌ ์— ๋Œ€ํ•ด. ์ œ๋„ค๋ฆญ์€ ์—ฌ๊ธฐ์—์„œ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. FAQ ๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค.

@velovix ์˜ 2-argument try ์˜ ๊ธฐ๋ณธ ๋™์ž‘์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ œ์•ˆ๊ณผ ๊ด€๋ จํ•˜์—ฌ: ์ „์— ๋งํ–ˆ๋“ฏ์ด ๋ถ„๋ช…ํžˆ ํ•ฉ๋ฆฌ์ ์ธ ์„ ํƒ์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์•„์ด๋””์–ด๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์•…๋ชฝ์ž…๋‹ˆ๋‹ค.

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

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

@aarzilli ์ œ์•ˆ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜์„œ, ๋‚˜๋Š” ์ œ์•ˆ๋œ try ์‚ฌ๋žŒ๋“ค์ด ์žฅ์‹ ์˜ค๋ฅ˜๋ฅผ _discourages_ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์œ„์˜ ์ด์œ ๋กœ if ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ด๋ฏธ ๋‚™๋‹ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค). try ๋Š” _์žฅ๋ คํ•˜์ง€_ ์•Š์Šต๋‹ˆ๋‹ค.

(์ด๋ฅผ ์žฅ๋ คํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ try ์— ๋ฌถ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ์žฅ์‹ํ•˜๊ฑฐ๋‚˜ ๋ช…์‹œ์ ์œผ๋กœ ์˜ตํŠธ์•„์›ƒํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ try ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

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

๊ทธ๋Ÿฌ๋‚˜ ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ชจ๋“  ์‚ฌ๋žŒ์ด try ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก defer ์„ ์“ฐ๋„๋ก ๊ฐ•์š”ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์‹œ ์›์ ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์˜ค๋ฅ˜๋ฅผ ๊พธ๋ฏธ์ง€ ์•Š๋Š” ์ชฝ์œผ๋กœ ๊ธฐ์šธ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

@alanfo ๊ธ์ •์ ์ธ ํ”ผ๋“œ๋ฐฑ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์ œ๊ธฐํ•œ ์š”์ ์— ๊ด€ํ•˜์—ฌ:

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

@benhoyt ๊ธ์ •์ ์ธ ํ”ผ๋“œ๋ฐฑ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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

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

(์™„์ „ํžˆ, ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ? ์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์ž ์˜ต์…˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Go์™€ ๊ฐ™์€ ์–ธ์–ด์— ๋Œ€ํ•œ ์ตœ์„ ์˜ ์„ ํƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์‹œ, ๊ทธ๊ฒƒ์ด try ๋ฅผ ๋ง›์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ์ „๋ถ€๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

@ugorji ๊ธ์ •์ ์ธ ํ”ผ๋“œ๋ฐฑ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

try ๋Š” ์ถ”๊ฐ€ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ™•์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ์€ func (error) error ์„œ๋ช…์ด ์žˆ๋Š” ํ•จ์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹นํ™ฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ•œ ์ค„ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์Šต๋‹ˆ๋‹ค.

func doPanic(err error) error { panic(err) }

try ์˜ ๋””์ž์ธ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@patrick-nyt ๋‹น์‹ ์ด ์ œ์•ˆ ํ•˜๋Š” ๊ฒƒ :

file, err := os.Open("file.go")
try(err)

ํ˜„์žฌ ์ œ์•ˆ์œผ๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@dpinela , @ugorji must vs try ์ฃผ์ œ์— ๋Œ€ํ•œ ๋””์ž์ธ ๋ฌธ์„œ๋„ ์ฝ์œผ์‹ญ์‹œ์˜ค. try ๋Š” ์ตœ๋Œ€ํ•œ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. must ๋Š” ์ดˆ๊ธฐํ™” ํ‘œํ˜„์‹์˜ ์ผ๋ฐ˜์ ์ธ "ํŒจํ„ด"์ด์ง€๋งŒ ์ด๋ฅผ "์ˆ˜์ •"ํ•  ๊ธด๊ธ‰ํ•œ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

@jargv ์ œ์•ˆ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šด ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค(์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๋‚ด ์˜๊ฒฌ๋„ ์ฐธ์กฐ ํ•˜์‹ญ์‹œ์˜ค ). ์š”์•ฝ:

  • try(x) ๋Š” ์ œ์•ˆ๋œ ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • try() ๋Š” ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” *error $๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@cespare @jargv ์˜ ์ œ์•ˆ ์€ ๋‹น์‹ ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๋‹จํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๋™์ผํ•œ ์•ก์„ธ์Šค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

https://github.com/golang/go/issues/32437#issuecomment -499320588์— ๋”ฐ๋ผ:

func doPanic(err ์˜ค๋ฅ˜) ์˜ค๋ฅ˜ { ํŒจ๋‹‰(err) }

๋‚˜๋Š” ์ด ๊ธฐ๋Šฅ์ด ๊ฝค ์ผ๋ฐ˜์ ์ผ ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•œ๋‹ค. ์ด๊ฒƒ์€ "builtin"(๋˜๋Š” errors ๊ณผ ๊ฐ™์€ ํ‘œ์ค€ ํŒจํ‚ค์ง€์˜ ๋‹ค๋ฅธ ๊ณณ)์—์„œ ๋ฏธ๋ฆฌ ์ •์˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

์˜ˆ, ์ด ์ œ์•ˆ์€ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ง€๊ธˆ์˜ ๋‚˜ ์ž์‹ .

๋ฌผ๋ก , ์ด ๋ฌธ์ œ๋Š” ์„ธ๋ถ€์ ์ธ ๋Œ€์•ˆ์— ๋„ˆ๋ฌด ๋งŽ์€ ์ดˆ์ ์„ ๋งž์ถ˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์ฐธ๊ฐ€์ž๋“ค์ด ์™„์ „ํžˆ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ. ์ด ์ œ์•ˆ์— ๋Œ€ํ•œ ํญ๋„“์€ ๊ณต๊ฐ๋Œ€๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

Op vr 7 jun. 2019 01:04 ์Šˆ๋ฆฌํ”„ ํ”ผ์ œ์ด ์•Œ๋ฆผ @github.com :

์•„์Šคํผ #32437 (๋Œ“๊ธ€)
https://github.com/golang/go/issues/32437#issuecomment-499320588 :

func doPanic(err ์˜ค๋ฅ˜) ์˜ค๋ฅ˜ { ํŒจ๋‹‰(err) }

๋‚˜๋Š” ์ด ๊ธฐ๋Šฅ์ด ๊ฝค ์ผ๋ฐ˜์ ์ผ ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋ฏธ๋ฆฌ ์ •์˜ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
"๋นŒํŠธ์ธ"์—์„œ?

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

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

@beoran ์•„๋งˆ๋„ ์ œ๋„ค๋ฆญ๊ณผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‘˜์€ ๋‹ค๋ฅธ ๊ฒƒ ๊ฐ™์•„์š”. ์ œ๋„ค๋ฆญ์€ ์–ธ์–ด์˜ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์บ์น˜ ์˜ฌ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์œ ํ˜•์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

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

ํ•จ์ˆ˜ ๋‚ด์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šด ์—ฌ๋Ÿฌ ํ˜ธ์ถœ์„ ์ฒ˜๋ฆฌํ•˜๋ฉด defer ์˜ค๋ฅ˜ ํ•ธ๋“ค์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ๋Œ€ํ•œ ๋‚˜์˜ ์ดˆ๊ธฐ ๋ฐ˜์‘์€ ๐Ÿ‘Ž์˜€์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ œ์•ˆ์„œ๋ฅผ ์ฝ์€ ํ›„ ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์€ ๋ณต์žก์„ฑ์œผ๋กœ ์—ฌ์ „ํžˆ ๋‹ฌ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ๊ธฐ ๋•Œ๋ฌธ์— โค๏ธ ๋ฐ ๐Ÿ‘์— ๋Œ€ํ•œ ๋ฐ˜์‘์„ ๋’ค์ง‘์—ˆ์Šต๋‹ˆ๋‹ค.

@carlmjohnson ๋„ค ๊ฐ„๋‹จํ•˜์ง€๋งŒ...

๋‚˜๋Š” ๋™๋“ฑํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜์‹ญ ๋ฒˆ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ํ•จ์ˆ˜์˜ ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ํ•œ ์ค„๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  2. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€์—์„œ err => ํŒจ๋‹‰ ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ์„ ์–ธํ•˜๊ฑฐ๋‚˜ ๊ณตํ†ต ์œ„์น˜๋ฅผ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Go ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๊ณตํ†ต์ ์ด๋ฏ€๋กœ "ํ‘œ์ค€ ํŒจํ‚ค์ง€" ๋Š” _ ๊ณตํ†ต ์œ„์น˜์ž…๋‹ˆ๋‹ค.

@griesemer ์›๋ž˜ try ์ œ์•ˆ์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•จ์ˆ˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

@pjebs ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•จ์ˆ˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์›๋ž˜ ๋””์ž์ธ์—์„œ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ œ๊ณต๋œ _if_์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ try ์˜ ๋˜ ๋‹ค๋ฅธ ํ•ฉ๋ณ‘์ฆ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด _ํ›จ์”ฌ_ ์ข‹์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ํ•ญ์ƒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•˜๋Š” ๋ณ„๋„์˜ must ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ช…ํ™•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด try ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋ฉด ์ฝ”๋“œ์—์„œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•ด์ง€๋ฉฐ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ณผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ must ์˜ ์ฃผ์š” ๋งค๋ ฅ์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ testing ํŒจํ‚ค์ง€๊ฐ€ must ๋กœ ์ธํ•œ ํŒจ๋‹‰์„ ๋ณต๊ตฌํ•˜๊ณ  ์ข‹์€ ๋ฐฉ์‹์œผ๋กœ ํ…Œ์ŠคํŠธ ์‹คํŒจ๋กœ ๋ณด๊ณ ํ•˜๋„๋ก ์ ์ ˆํ•˜๊ฒŒ ์กฐ์ •๋œ ๊ฒฝ์šฐ. ๊ทธ๋Ÿฌ๋‚˜ TestXxx(t *testing.T) error ํ˜•์‹์˜ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ๋„ ํ—ˆ์šฉํ•˜๋„๋ก ํ…Œ์ŠคํŠธ ํŒจํ‚ค์ง€๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์™œ ๋˜ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ์–ธ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๊นŒ? ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋งค์šฐ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์ด๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด(์•„๋งˆ๋„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์–ด์•ผ ํ•จ) try ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ํ…Œ์ŠคํŠธ๋Š” ์•ฝ๊ฐ„์˜ ์ž‘์—…์ด ๋” ํ•„์š”ํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

must ์˜ ๋‹ค๋ฅธ ๋น„๊ต์  ์ผ๋ฐ˜์ ์ธ ์šฉ๋„๋Š” ์ „์—ญ ์ดˆ๊ธฐํ™” ํ‘œํ˜„์‹( must(regexp.Compile... ๋“ฑ)์ž…๋‹ˆ๋‹ค. "์žˆ์œผ๋ฉด ์ข‹์€" ๊ฒƒ์ด์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ์ƒˆ๋กœ์šด ์–ธ์–ด ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ์ˆ˜์ค€๊นŒ์ง€ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@griesemer must ๊ฐ€ try ์™€ ๋ชจํ˜ธํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ๊ณ  ์ถ”์ง„๋ ฅ์ด try ๊ตฌํ˜„์„ ํ–ฅํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ must ์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

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

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด must ๊ฐ€ try ์•„์ฃผ ํ›Œ๋ฅญํ•˜๊ฒŒ ์นญ์ฐฌํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

@pjebs ํ™•์‹คํžˆ ์ง€๊ธˆ ๋‹น์žฅ์€ " try ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋ชจ๋ฉ˜ํ…€"์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค... - ๊ทธ๋ฆฌ๊ณ  ์ €ํฌ๋„ ์ด ๊ธ€์„ ์ดํ‹€ ์ „์— ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ •๋œ ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ์ข€ ์ฃผ์ž.

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

๋ชจ๋“  ์˜๊ฒฌ๊ณผ ์ƒ์„ธํ•œ ์„ค๊ณ„ ๋ฌธ์„œ๋ฅผ ์ฝ๋Š” ๋ฐ ๋ช‡ ์‹œ๊ฐ„์„ ๋ณด๋‚ธ ํ›„ ์ด ์ œ์•ˆ์— ๋‚ด ๊ฒฌํ•ด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” @ianlancetaylor ์˜ ์ด์ „ ์š”์ ์„ ๋‹ค์‹œ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ํ† ๋ก ์— ์ƒˆ๋กœ์šด ์˜๊ฒฌ์„ ์ถ”๊ฐ€ํ•ด ๋‹ฌ๋ผ๋Š” ์š”์ฒญ ์„ ์กด์ค‘ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด์ „ ์˜๊ฒฌ์„ ์–ด๋Š ์ •๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์˜๊ฒฌ์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ ค์‚ฌํ•ญ

defer์˜ ๋ถˆํ–‰ํ•œ ์˜ค๋ฒ„๋กœ๋”ฉ

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

์˜ค๋ฅ˜๋„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด defer ๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋Š” ์Šคํ‘ธ๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์™œ ํ‚ค์›Œ๋“œ defer ์ž…๋‹ˆ๊นŒ? defer ๋Š” _"๋‚˜์ค‘์— ํ•  ์ˆ˜ ์žˆ์Œ"์ด ์•„๋‹ˆ๋ผ _"๋‚˜์ค‘์— ํ•  ๊ฒƒ"_์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ Go ํŒ€์ด defer ์„ฑ๋Šฅ ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•œ ์šฐ๋ ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ defer ๊ฐ€ _"hot path"_ ์ฝ”๋“œ ํ๋ฆ„์— ๋Œ€ํ•ด ๊ณ ๋ ค๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋‘ ๋ฐฐ๋กœ ๋ถˆํ–‰ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ™•์ธํ•˜๋Š” ํ†ต๊ณ„ ์—†์Œ

@prologic ์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด try() ์ œ์•ˆ์€ ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์‚ฌ์šฉํ•  ์ฝ”๋“œ์˜ ๋งŽ์€ ๋ถ€๋ถ„์— ๊ทผ๊ฑฐํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด Go ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋‹ฌ๋ž˜๊ธฐ ์œ„ํ•œ ์‹œ๋„์— ๊ธฐ๋ฐ˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๋ชจ๋“  ํŒŒ์ผ์„ ์ฒ ์ €ํžˆ ๊ฒ€ํ† ํ•˜๊ณ  ๋ฉ”๋ชจํ•˜์ง€ ์•Š๊ณ  ๋‚ด ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ ํ†ต๊ณ„๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. @prologic ์ด ๊ธฐ๋ปํ•˜๋ฉด์„œ๋„ ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ผํ™”์— ๋”ฐ๋ฅด๋ฉด try() ๊ฐ€ ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ 5%๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  1% ๋ฏธ๋งŒ์„ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์˜์‹ฌํ•˜๋ฉด ๋†€๋ž„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๋งค์šฐ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹คํžˆ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๊ฐ€์ ธ ์™€์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉํ• ์ง€ ํ™•์ธํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๊นŒ?

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

๊ฐœ๋ฐœ์ž๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ์‰ฝ๊ฒŒ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

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

f, _ := os.Open(filename)

๋‚˜๋Š” ๋‚ด ์ž์‹ ์˜ ์ฝ”๋“œ๋ฅผ ๋” ์ž˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์—„์ฒญ๋‚˜๊ฒŒ ์œ ์šฉํ•œ ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๋‹ค๋ฅธ Go ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ์••๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ _"Other People's Code(tm)"_ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ์ข…์ข… ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

์ •๋ง ์ง„์ง€ํ•˜๊ฒŒ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋” ์‰ฝ๊ฒŒ ๋ฌด์‹œํ•˜๊ณ  GitHub๋ฅผ ๊ฒฌ๊ณ ํ•˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋กœ ๋”๋Ÿฝํž ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?

(๋Œ€๋ถ€๋ถ„) ์ด๋ฏธ userland์—์„œ try() ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ œ์•ˆ์„ ์˜คํ•ดํ•˜์ง€ ์•Š๋Š” ํ•œ - ์•„๋งˆ๋„ ๊ทธ๋Ÿด ๊ฒƒ์ž…๋‹ˆ๋‹ค - ์—ฌ๊ธฐ์— try() ๊ฐ€ userland ์—์„œ ๊ตฌํ˜„๋œ Go Playground ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ๋น„๋ก ํ•˜๋‚˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’๊ณผ ์˜ˆ์ƒ ์œ ํ˜• ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ:

package main

import (
    "errors"
    "fmt"
    "strings"
)
func main() {
    defer func() {
        r := recover()
        if r != nil && strings.HasPrefix(r.(string),"TRY:") {
            fmt.Printf("Ouch! %s",strings.TrimPrefix(r.(string),"TRY: "))
        }
    }()
    n := try(badjuju()).(int)
    fmt.Printf("Just chillin %dx!",n)   
}
func badjuju() (int,error) {
    return 10, errors.New("this is a really bad error")
}
func try(args ...interface{}) interface{} {
    err,ok := args[1].(error)
    if ok && err != nil {
        panic(fmt.Sprintf("TRY: %s",err.Error()))
    }
    return args[0]
}

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๋Š” ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์˜ ์ˆ˜์— ๋”ฐ๋ผ try2() , try3() ๋“ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

func try(args ...interface{}) ...interface{} {
    err,ok := args[1].(error)
    if ok && err != nil {
        panic(fmt.Sprintf("TRY: %s",err.Error()))
    }
    return args[0:len(args)-2]
}

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

๋ช…ํ™•์„ฑ ๋ถ€์กฑ

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

try() ๊ฐ€ ํ‘œํ˜„์‹์„ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

์˜ค๋ฅ˜๊ฐ€ ๊ทธ๋ƒฅ ๋ฌด์‹œ๋ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ฒซ ๋ฒˆ์งธ ๋˜๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์˜ defer ๋กœ ์ ํ”„ํ• ๊นŒ์š”? ๊ทธ๋ ‡๋‹ค๋ฉด ์ž๋™์œผ๋กœ err ๋ผ๋Š” ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ํด๋กœ์ € ๋‚ด๋ถ€์— ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค _(I ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๊นŒ?)_. ์ž๋™ ์˜ค๋ฅ˜ ์ด๋ฆ„์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์ด๋ฆ„์„ ์–ด๋–ป๊ฒŒ ์ง€์ •ํ•ฉ๋‹ˆ๊นŒ? ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด ํ•จ์ˆ˜์—์„œ ๋‚ด err ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  defer ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๊นŒ? ์—ญ์ˆœ์œผ๋กœ ๋˜๋Š” ์ผ๋ฐ˜ ์ˆœ์„œ๋กœ?

์•„๋‹ˆ๋ฉด ํด๋กœ์ €์™€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ func ๋ชจ๋‘์—์„œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๊นŒ? _(์—ฌ๊ธฐ์—์„œ ๊ทธ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ๋‹จ์–ด๋ฅผ ์ฝ์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ฒฐ์ฝ” ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)_

์ œ์•ˆ์„œ์™€ ์ง€๊ธˆ๊นŒ์ง€์˜ ๋ชจ๋“  ์˜๊ฒฌ์„ ์ฝ์€ ํ›„์—๋„ ์†”์งํžˆ ์œ„์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ _"Captain Obvious"_๋ฅผ ์˜นํ˜ธํ•˜๋Š” ์–ธ์–ด์— ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๊นŒ?

ํ†ต์ œ๋ ฅ ๋ถ€์กฑ

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

์ข…์ข… func ๋‚ด์—์„œ ๋˜๋Š” package ๋‚ด์—์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ธก๋ฉด์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋˜์ง€๋งŒ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ๋” ๊ตฌ์ฒด์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค๋ฅธ func ๋‚ด์—์„œ error() func ํ˜ธ์ถœ 5๊ฐœ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. A() , B() , C() , D() ๋ฐ E() ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž์ฒด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด C() , ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋ ค๋ฉด A() , B() , D() , E() ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ B() ๋ฐ E() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด ์ œ์•ˆ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์‰ฝ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

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

_ "์™œ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ์–ธ์–ด์— ์•ฝ๊ฐ„์˜ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๊ณ  ์ƒˆ๋กœ์šด ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๋ฐ›์•„๋“ค์ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๊นŒ?" _

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

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

break ์— ๋Œ€ํ•œ ๋ช…์‹œ์  ์ง€์› ๋ถ€์กฑ

์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์กฐ๊ธฐ ๋ฐ˜ํ™˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์™ผ์ชฝ ํ•„๋“œ์—์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ $# ์ด์ „์— ํ•จ์ˆ˜์˜ ๋Œ€๋ถ€๋ถ„ ๋˜๋Š” ์ „์ฒด๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด break ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค return .

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

์กฐ๊ธฐ ๋ฐ˜ํ™˜ ๋Œ€์‹  break ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด for range "1" {...} ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ _(์‹ค์ œ๋กœ๋Š” ์ƒ์ˆ˜๋งŒ ํฌํ•จํ•˜๋Š” only ๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Once #$6$#$ ๊ฐ’์œผ๋กœ "1" ):_

func (me *Config) WriteFile() (err error) {
    for range only.Once {
        var j []byte
        j, err = json.MarshalIndent(me, "", "    ")
        if err != nil {
            err = fmt.Errorf("unable to marshal config; %s", 
                err.Error(),
            )
            break
        }
        err = me.MaybeMakeDir(me.GetDir(), os.ModePerm)
        if err != nil {
            err = fmt.Errorf("unable to make directory'%s'; %s", 
                me.GetDir(), 
                err.Error(),
            )
            break
        }
        err = ioutil.WriteFile(string(me.GetFilepath()), j, os.ModePerm)
        if err != nil {
            err = fmt.Errorf("unable to write to config file '%s'; %s", 
                me.GetFilepath(), 
                err.Error(),
            )
            break
        }
    }
    return err
}

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

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋น—๋‚˜๊ฐ„๋‹ค. ์—ฌ๊ธฐ์—์„œ ๊ฐ€์ ธ์˜จ ์ด์œ ๋Š” Go์—์„œ ์ดˆ๊ธฐ return ๋ฅผ ๊ฐ€์ •ํ•˜๊ณ  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด break ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฌด์‹œํ•˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ์˜๊ฒฌ err == nil ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์•„๊ฐ€ Go์˜ ๊ด€์šฉ์  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ๋Š๊ผˆ๋˜ ์šฐ๋ ค๋ฅผ ์ œ๊ธฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ Go์˜ ์ฒ ํ•™์„ ํฌ๊ฒŒ ์‹ ๋ด‰ํ•˜์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด nil ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํ‹ด โ€” API ์‘๋‹ต์— ์‚ฌ์šฉ โ€” ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ nil์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค .

๊ทธ๋ž˜์„œ Go 2์˜ ๊ฒฝ์šฐ Go๊ฐ€ status ์˜ ์ƒˆ๋กœ์šด ๋‚ด์žฅ ์œ ํ˜•๊ณผ ์„ธ ๊ฐœ์˜ ๋‚ด์žฅ ํ•จ์ˆ˜ iserror() , iswarning() , issuccess() ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. status ๋Š” error ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โ€” ๋งŽ์€ ์—ญํ˜ธํ™˜์„ฑ์„ ํ—ˆ์šฉํ•˜๊ณ  issuccess() ์— ์ „๋‹ฌ๋œ nil ๊ฐ’์€ true $๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ status ์—๋Š” ์˜ค๋ฅ˜ ์ˆ˜์ค€์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜ ์ˆ˜์ค€์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ํ•ญ์ƒ ๋‚ด์žฅ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋กœ ์ˆ˜ํ–‰๋˜๋ฉฐ ์ด์ƒ์ ์œผ๋กœ๋Š” nil ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

func (me *Config) WriteFile() (sts status) {
    for range only.Once {
        var j []byte
        j, sts = json.MarshalIndent(me, "", "    ")
        if iserror(sts) {
            sts.AddMessage("unable to marshal config")
            break
        }
        sts = me.MaybeMakeDir(me.GetDir(), os.ModePerm)
        if iserror(sts) {
            sts.AddMessage("unable to make directory'%s'", me.GetDir())
            break
        }
        sts = ioutil.WriteFile(string(me.GetFilepath()), j, os.ModePerm)
        if iserror(sts) {
            sts.AddMessage("unable to write to config file '%s'", 
                me.GetFilepath(), 
            )
            break
        }
        sts = fmt.Status("config file written")
    }
    return sts
}

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

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

_"๋ชจ๋“  ์‚ฌ๋žŒ์„ ์œ„ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค"_ ์ •๋‹นํ™”

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

๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ๋ฐฐ์›Œ์•ผ ํ•˜๋Š” ์ด ๋ณต์žกํ•˜๊ณ  ๋ณต์žกํ•œ ์–ธ์–ด ๋ณ€๊ฒฝ์ด ์ •๋ง ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ?

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

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

์†”์งํžˆ ๊ทธ ๋ฐ˜์‘์„ ๋ณด์•˜์„ ๋•Œ ๋‚˜๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐ์ • ์ค‘ ํ•˜๋‚˜๋ฅผ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‚ด๊ฐ€ ๋™์˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋ผ๋ฉด ๋ถ„๊ฐœํ•˜๊ฑฐ๋‚˜
  2. ๋‚ด๊ฐ€ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด๋ผ๋ฉด ์˜๊ธฐ์–‘์–‘ํ•ฉ๋‹ˆ๋‹ค.

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

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

_(๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ํŒ€์ด ๋ฉ”์‹ ์ €๋ฅผ ์˜์ง€ ์•Š๊ณ  ๋ฐ”๋‘‘์ด ๊ณ„์†ํ•ด์„œ ์ตœ๊ณ ๊ฐ€ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๋ˆ„๊ตฐ๊ฐ€์˜ ๊ฑด์„ค์ ์ธ ๋น„ํŒ์œผ๋กœ ๋ฐ›์•„๋“ค์ด๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•ต์‹ฌ ํŒ€.)_

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

try() ์ค‘์ฒฉ

์ด๊ฒƒ ์—ญ์‹œ ๋ช‡๋ช‡์— ์˜ํ•ด ๋‹ค๋ฃจ์–ด์กŒ์ง€๋งŒ, ๋‚˜๋Š” try() ์™€ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ๊ณ„์†๋˜๋Š” ์š”์ฒญ์„ ๋น„๊ตํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•ฝ 18๊ฐœ์›” ์ „ ๋‹ค๋ฅธ ๋ฐ”๋‘‘ ํŒ€์›์˜ ๋ง ์ธ์šฉ:

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

์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” _primary_ ์–ธ๊ธ‰๋œ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ์ค‘์ฒฉ๋  ๋•Œ ์ฝ๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ์ž˜๋ชป ์ฝ๊ธฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ try(try(try(to()).parse().this)).easily()) ์™€ ๊ฐ™์€ ์ค‘์ฒฉ๋œ try() ๋ฌธ์˜ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์‚ผํ•ญ ์—ฐ์‚ฐ์ž ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ ๋Š” ์ค‘์ฒฉ๋œ ํ‘œํ˜„์‹์ด ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฃผ์žฅ์ด ์žˆ๋Š” _"ํ‘œํ˜„์‹"_์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ try() ๋„ ์ค‘์ฒฉ ๊ฐ€๋Šฅํ•œ ํ‘œํ˜„์‹์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ด์ œ ์—ฌ๊ธฐ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ _"๋‚ด ์ƒ๊ฐ์— [์ค‘์ฒฉ๋œ try() s]์™€ ๊ฐ™์€ ์˜ˆ๋Š” ๋น„ํ˜„์‹ค์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค."_ ๊ทธ ์ง„์ˆ ์€ ์ด์˜๋ฅผ ์ œ๊ธฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ๋žŒ๋“ค์ด ๊ฐœ๋ฐœ์ž๊ฐ€ try() ๋ฅผ ์ค‘์ฒฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฐ€์ •์„ ๋ฐ›์•„๋“ค์ธ๋‹ค๋ฉด ์‚ฌ๋žŒ๋“ค์ด _"๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋Š” ๋น„ํ˜„์‹ค์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค."_๋ผ๊ณ  ๋งํ•  ๋•Œ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ๋™์ผํ•œ ์กด์ค‘์ด ์ฃผ์–ด์ง€์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ์ ์— ๋Œ€ํ•œ ๊ฒฐ๋ก ์€ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ์— ๋Œ€ํ•œ ์ฃผ์žฅ์ด ์‹ค์ œ๋กœ ์œ ํšจํ•˜๋‹ค๋ฉด ์ด try() ์ œ์•ˆ์— ๋Œ€ํ•œ ์œ ํšจํ•œ ์ฃผ์žฅ์œผ๋กœ๋„ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด

์ด ๊ธ€์„ ์“ฐ๋Š” ์‹œ์ ์—์„œ 58% ๋ฐ˜๋Œ€ ํˆฌํ‘œ๋Š” 42% ์ฐฌ์„ฑ ํˆฌํ‘œ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋‹ค์‹œ ๋…ผ์˜ํ•ด์•ผ ํ•  ์‹œ์ ์ด๋ผ๋Š” ์ œ์•ˆ์ด ์ถฉ๋ถ„ํžˆ ๋ถ„์—ด์ ์ž„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ์— ์ถฉ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

fwiw

์ถ”์‹ : ์ข€ ๋” ๋†๋‹ด์œผ๋กœ ํ‘œํ˜„ํ•˜์ž๋ฉด Yoda์˜ ์ง€ํ˜œ๋ฅผ ์˜์—ญํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

_" try() ์ด(๊ฐ€) ์—†์Šต๋‹ˆ๋‹ค. do() ์žˆ์Šต๋‹ˆ๋‹ค."_

@ianlancetaylor

@beoran ์•„๋งˆ๋„ ์ œ๋„ค๋ฆญ๊ณผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@beoran ์— ๋Œ€ํ•ด ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ช‡ ๋ถ„ ์ „ ์ œ ์˜๊ฒฌ์—์„œ ์ œ๋„ค๋ฆญ _(๊ฐ€๋ณ€ ๋ฐ˜ํ™˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํฌํ•จ)_์ด ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ ๊ณ ์œ ์˜ try() ๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ โ€” ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด ์œ„์—์„œ ๋งํ•œ ๊ฒƒ์„ ๋” ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๊ธฐ์—์„œ ๋ฐ˜๋ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

_" ์ œ๋„ค๋ฆญ์˜ ์œ ์Šค ์ผ€์ด์Šค๋Š” Java ๋“ฑ์˜ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์˜๋ฏธ ์ฒด๊ณ„์™€ ์ œ๋„ค๋ฆญ ๊ตฌ๋ฌธ ์ƒ๋Ÿฌ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ œ๋„ค๋ฆญ์˜ ์œ ์Šค ์ผ€์ด์Šค๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด์žฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ถ•์†Œ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)"_

@ianlancetaylor

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

func try(v interface{}, err error) interface{} {
   if err != nil { 
     panic(err)
   }
   return v
}

์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”: https://play.golang.org/p/Kq9Q0hZHlXL

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋‹จ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ง€์—ฐ๋œ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์ด ์ œ์•ˆ์—์„œ์™€ ๊ฐ™์ด try ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ง€์—ฐ๋œ ์ฒ˜๋ฆฌ๊ธฐ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ด๊ฒƒ์ด ์‹ฌ๊ฐํ•œ ๋‹จ์ ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Go์— ์ผ์ข…์˜ super(arg1, ..., argn) ๋‚ด์žฅ์ด ์žˆ์œผ๋ฉด ํ˜ธ์ถœ ์Šคํƒ์˜ ํ•œ ๋‹จ๊ณ„ ์œ„์ธ ํ˜ธ์ถœ์ž์˜ ํ˜ธ์ถœ์ž๊ฐ€ ์ฃผ์–ด์ง„ ์ธ์ˆ˜ arg1,...argn, ์ผ์ข…์˜ ์Šˆํผ ๋ฆฌํ„ด์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ํ•  ๊ฒฝ์šฐ.
  2. ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ์ด try ๋Š” ๋‹จ์ผ ๊ฒฐ๊ณผ์™€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์—์„œ๋งŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ฐ˜ํ™˜๋œ emtpy ์ธํ„ฐํŽ˜์ด์Šค ๊ฒฐ๊ณผ๋ฅผ assert๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถฉ๋ถ„ํžˆ ๊ฐ•๋ ฅํ•œ ์ œ๋„ค๋ฆญ์€ ๋ฌธ์ œ 2์™€ 3์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ super() ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” 1๊ฐœ๋งŒ ๋‚จ๊น๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func (T ... interface{})try(T, err error) super {
   if err != nil { 
      super(err)
   }
  super(T...)
}

๊ทธ๋Ÿฌ๋ฉด ์—ฐ๊ธฐ๋œ ๊ตฌ์กฐ๋Š” ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ด์ ์€ Go์— ์ œ๋„ค๋ฆญ์ด ์ถ”๊ฐ€๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค, super() ๋‚ด์žฅ์— ๋Œ€ํ•œ ์ด ์•„์ด๋””์–ด๋Š” ๋„ˆ๋ฌด ๊ฐ•๋ ฅํ•˜๊ณ  ํฅ๋ฏธ๋กœ์›Œ์„œ ๋”ฐ๋กœ ์ œ์•ˆ์„ ๊ฒŒ์‹œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๊ทธ ์ œ์•ˆ์ด ๋งˆ์Œ์— ๋“ค์ง€๋งŒ defer try(...) ๋ฐ go try(...) ๊ฐ€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋ญ”๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.... ์ง๊ต์„ฑ์€ ์ข‹์€ ๋””์ž์ธ ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค. ๋” ์ฝ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋ณผ ๋•Œ
x = try(foo(...)) y = try(bar(...))
try ๊ฐ€ ์ปจํ…์ŠคํŠธ ์—ฌ์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค! ๊ณ ๋ คํ•˜๋‹ค:
try ( x = foo(...) y = bar(...) )
์—ฌ๊ธฐ์„œ foo() ๋ฐ bar() ๋Š” ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๊ฐ’์€ error ์ž…๋‹ˆ๋‹ค. ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์€ ๋ฐ˜ํ™˜๋œ ์˜ค๋ฅ˜ ๊ฐ’์ด ์ƒ๋žต ๋˜๋Š”(์ˆ˜์‹ ์ž ์—†์Œ) try ๋ธ”๋ก ๋‚ด ํ˜ธ์ถœ์— ๋Œ€ํ•ด์„œ๋งŒ ์ค‘์š”ํ•˜์ง€๋งŒ ๋ฐ˜๋Œ€๋กœ ๋ฌด์‹œ ๋ฉ๋‹ˆ๋‹ค(์ˆ˜์‹ ์ž๋Š” _ ์ž„). foo ์™€ bar ํ˜ธ์ถœ ์‚ฌ์ด์—์„œ ์ผ๋ถ€ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์•ฝ:
a) go ๋ฐ defer $์— ๋Œ€ํ•ด $ try ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋Š” ๊ตฌ๋ฌธ ๋•๋ถ„์— ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
b) ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
c) ๊ทธ๊ฒƒ์˜ ๋งˆ๋ฒ• ๊ฐ™์€ ์„ฑ์งˆ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ณด๋‹ค ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์œผ๋กœ ๋” ์ž˜ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

try๊ฐ€ ์ปจํ…์ŠคํŠธ๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” ํŠน๋ณ„ํžˆ ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋Š” try/catch ๋ธ”๋ก์„ ๋งŒ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์บ์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ œ์•ˆ์„œ๊ฐ€ ์žˆ์„ ๋•Œ์™€ ๋˜‘๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
x = try(foo(...)) y = try(bar(...))
์ด๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.
````

์•„์ง ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ํ•˜์ง€ ๋ง์•˜์–ด์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฐ€์ •์„ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

foo ๋˜๋Š” bar๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด try ์ปจํ…์ŠคํŠธ์—๋„ ๋ฐฐ์น˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์˜ค๋ฅ˜ ๊ธฐ๋Šฅ๊ณผ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ๊ธฐ๋Šฅ ์‚ฌ์ด๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋‹ค์†Œ ์ถ”ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ด์ „ ์–ธ์–ด์˜ try ๋ธ”๋ก ๋ฌธ์ œ๋กœ ๋˜๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ keyword ( ... ) ๊ตฌ๋ฌธ์—์„œ ๊ฐ ์ค„์— ํ‚ค์›Œ๋“œ ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์ธ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ import, var, const ๋“ฑ์˜ ๊ฒฝ์šฐ: ๊ฐ ํ–‰์€ ํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ทœ์น™์— ๋Œ€ํ•œ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ข‹์€ ๊ฒฐ์ •์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค

ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํŠน์ˆ˜ ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ด€์šฉ์ ์ž…๋‹ˆ๊นŒ?

๊ฐ’์„ ๋ฌด์‹œํ•˜๋Š” ๋นˆ ์‹๋ณ„์ž _ ๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” # ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ error ์œ ํ˜•์˜ ๋งˆ์ง€๋ง‰ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์žˆ๋Š” ํ•จ์ˆ˜์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func foo() (error) {
    f, # := os.Open()
    defer f.Close()
    _, # = f.WriteString("foo")
    return nil
}

# ์— ์˜ค๋ฅ˜๊ฐ€ ํ• ๋‹น๋˜๋ฉด ํ•จ์ˆ˜๋Š” ์ˆ˜์‹ ๋œ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ด๋ฆ„์ด 0 ๊ฐ’์ด ์•„๋‹Œ ๊ฒฝ์šฐ
  • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ช…๋ช…๋œ ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๊ฐ’

@deanveloper , try ๋ธ”๋ก ์˜๋ฏธ๋Š” ์˜ค๋ฅ˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์˜ค๋ฅ˜ ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜์—๋งŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์ œ์•ˆ์˜ ๋งˆ์ง€๋ง‰ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
try(x = foo(...)) try(y = bar(...))
๋™์ผํ•œ ๋ธ”๋ก ๋‚ด์— ๋‘ ๋ช…๋ น๋ฌธ์„ ๋ชจ๋‘ ๋„ฃ๋Š” ๊ฒƒ์€ ๋ฐ˜๋ณต๋˜๋Š” import , const ๋ฐ var ๋ช…๋ น๋ฌธ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด
try( x = foo(...)) go zee(...) defer fum() y = bar(...) )
์ด๊ฒƒ์€ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
try(x = foo(...)) go zee(...) defer fum() try(y = bar(...))
์ด ๋ชจ๋“  ๊ฒƒ์„ ํ•˜๋‚˜์˜ try ๋ธ”๋ก์—์„œ ์ œ์™ธํ•˜๋ฉด ๋œ ๋ฐ”์ฉ๋‹ˆ๋‹ค.

๊ณ ๋ คํ•˜๋‹ค
try(x = foo())
foo()๊ฐ€ ์˜ค๋ฅ˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
x = foo()

๊ณ ๋ คํ•˜๋‹ค
try(f, _ := os.open(filename))
๋ฐ˜ํ™˜๋œ ์˜ค๋ฅ˜ ๊ฐ’์€ ๋ฌด์‹œ๋˜๋ฏ€๋กœ ์ด๋Š” ๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
f, _ := os.open(filename)

๊ณ ๋ คํ•˜๋‹ค
try(f, err := os.open(filename))
๋ฐ˜ํ™˜๋œ ์˜ค๋ฅ˜ ๊ฐ’์€ ๋ฌด์‹œ ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
f, err := os.open(filename) if err != nil { return ..., err }
ํ˜„์žฌ ์ œ์•ˆ์„œ์— ๋ช…์‹œ๋œ ๋Œ€๋กœ.

๋˜ํ•œ ์ค‘์ฒฉ๋œ ์‹œ๋„๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค!

๋‹ค์Œ์€ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€์ฒด ์ œ์•ˆ์— ๋Œ€ํ•œ ๋งํฌ์ž…๋‹ˆ๋‹ค.

try() ์™€ ๋™์ผํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด 2๊ฐœ์˜ ์ž‘์ง€๋งŒ ๋ฒ”์šฉ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ• ๋‹น๋ฌธ์—์„œ func /closure๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ธฐ๋Šฅ.
  2. break , continue ๋˜๋Š” return ์ด์ƒ์˜ ๋ ˆ๋ฒจ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด _"๋งˆ์ˆ "์ด ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์šฐ๋ฆฌ ๋ชจ๋‘์—๊ฒŒ ์นœ์ˆ™ํ•œ ๊ด€์šฉ์  Go ์ฝ”๋“œ์™€ ๋” ์ผ์น˜ํ•˜๋Š” Go ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ œ์•ˆ์„ ์ฝ์—ˆ๊ณ  ์‹œ๋„๊ฐ€ ์–ด๋””๋กœ ๊ฐ€๊ณ  ์žˆ๋Š”์ง€ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

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

์ง€๋„๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค:

v := m[key]

๊ทธ๋Œ€๋กœ:

v, ok := m[key]

try๊ฐ€ ์ œ์•ˆํ•œ ๋Œ€๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ ๋‚ด์žฅ์„ ์ œ๊ฑฐํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘ํ•˜๋ฉด:

v, err := fn()

์“ฐ๋Š” ๋Œ€์‹ :

v := try(fn())

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

v := fn()

err ๊ฐ’์ด ์บก์ฒ˜๋˜์ง€ ์•Š์œผ๋ฉด try์™€ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ต์ˆ™ํ•ด์ง€๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ฆฌ์ง€๋งŒ v, ok := m[key] ๋ฐ v, ok := x.(string) $ ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ณ  err ๊ฐ’์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

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

โ€ข ์–ธ์–ด ๊ตฌ๋ฌธ์ด ์œ ์ง€๋˜๊ณ  ์ƒˆ๋กœ์šด ํ‚ค์›Œ๋“œ๊ฐ€ ๋„์ž…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
โ€ข try์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ ์„คํƒ•์ด ๊ณ„์† ์‚ฌ์šฉ๋˜๋ฉฐ ์„ค๋ช…ํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
โ€ข ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
โ€ข ์ด์ „ ๋ฒ„์ „๊ณผ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ ์ œ์•ˆ์„œ์˜ CopyFile ์˜ˆ์ œ๋ฅผ defer fmt.HandleErrorf(&err, "copy %s %s", src, dst) ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.

func CopyFile(src, dst string) (err error) {
        defer fmt.HandleErrorf(&err, "copy %s %s", src, dst)

        r := os.Open(src)
        defer r.Close()

        w := os.Create(dst)
        defer func() {
                err := w.Close()
                if err != nil {
                        os.Remove(dst) // only if a โ€œtryโ€ fails
                }
        }()

        io.Copy(w, r)
        w.Close()
        return nil
}

@savaki ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ข‹์•„ํ•˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ญ์ƒ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ Go๊ฐ€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋’ค์ง‘๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์–ธ์ œ ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š์„์ง€ ์ง€์ •ํ•˜๋„๋ก(๋ณ€์ˆ˜์— ์˜ค๋ฅ˜๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ) ์ง€์ •ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์‹๋ณ„์ž๋Š” ๋ชจ๋“  ๋ฐ˜ํ™˜ ์ง€์ ์„ ๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ฅด๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ทœ์น™์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๊ณต๊ฐœ ์‹๋ณ„์ž ๋Œ€๋ฌธ์ž ์‚ฌ์šฉ). ํ•จ์ˆ˜๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค๋ฉด ํ•ญ์ƒ ? ๋กœ ๋๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Go๋Š” ํ•ญ์ƒ ์˜ค๋ฅ˜๋ฅผ ์•”์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  try์ฒ˜๋Ÿผ ํ˜ธ์ถœ ํ•จ์ˆ˜์— ์ž๋™์œผ๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ try ๋Œ€์‹  ? ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ œ์•ˆํ•˜๋Š” ์ผ๋ถ€ ์ œ์•ˆ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ ? ๊ฐ€ ์ถ”๊ฐ€ ์‹๋ณ„์ž๊ฐ€ ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜ ์ด๋ฆ„์˜ ์ผ๋ถ€๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ error ๋ฅผ ๋งˆ์ง€๋ง‰ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ ํ•จ์ˆ˜๋Š” ? ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์—†์œผ๋ฉด ์ปดํŒŒ์ผ์กฐ์ฐจ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ? ๋Š” ์ž„์˜์ ์ด๋ฉฐ ์˜๋„๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. operation?() ๋Š” try(someFunc()) ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜์ง€๋งŒ ? ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์˜ ์ผ๋ถ€์ด๋ฉฐ ์œ ์ผํ•œ ๋ชฉ์ ์€ ํ•จ์ˆ˜๊ฐ€ ๋Œ€๋ฌธ์ž๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณ€์ˆ˜์˜ ์ฒซ ๊ธ€์ž.

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

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

์ด์ „ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ C++ ์˜ˆ์™ธ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

func some_old_test() (int, error){
    return 0, errors.New("err1")
}
func some_new_test() (int){
        if true {
             return 1
        }
    throw errors.New("err2")
}
func throw_res(int, e error) int {
    if e != nil {
        throw e
    }
    return int
}
func main() {
    fmt.Println("Hello, playground")
    try{
        i := throw_res(some_old_test())
        fmt.Println("i=", i + some_new_test())
    } catch(err io.Error) {
        return err
    } catch(err error) {
        fmt.Println("unknown err", err)
    }
}

@owais ์˜๋ฏธ๋ก ์ด try์™€ ์ •ํ™•ํžˆ ๋™์ผํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์†Œํ•œ err ์œ ํ˜•์„ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘ํ•˜๋ฉด:

func foo() error {
  _, err := fn() 
  if err != nil {
    return err
  }

  return nil
} 

์‹œ๋„ ์ œ์•ˆ์„ ์ดํ•ดํ•˜๋ฉด ๊ฐ„๋‹จํžˆ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

func foo() error {
  _  := fn() 
  return nil
} 

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

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

func foo() (err error) {
  _  := fn() 
  return nil
} 

๋ณ€์ˆ˜์— ํ• ๋‹น๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜์˜ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

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

f := os.Open("foo.txt")

๋ช…์‹œ์  ๋ฐ˜ํ™˜์„ ์„ ํ˜ธํ•˜๊ณ  ์ž‘์„ฑ๋œ ๋งŒํŠธ๋ผ๋ณด๋‹ค ์ฝ”๋“œ๋ฅผ ๋” ๋งŽ์ด ์ฝ์Šต๋‹ˆ๋‹ค.

f := os.Open("foo.txt") else return

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ์šฐ๋ฆฌ๋Š” ๋‘ ํ˜•์‹์„ ๋ชจ๋‘ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๊ณ  gofmt๊ฐ€ ์ž๋™์œผ๋กœ else ๋ฐ˜ํ™˜์„ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ ์ถ”๊ฐ€, ๋ณ€์ˆ˜์˜ ๋กœ์ปฌ ์ด๋ฆ„ ์ง€์ •. ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— return์ด ๋ช…์‹œ์ ์œผ๋กœ ๋ฉ๋‹ˆ๋‹ค.

f := os.Open("foo.txt") else err {
  return errors.Wrap(err, "some context")
}

์—ฌ๋Ÿฌ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์žˆ๋Š” ์ปจํ…์ŠคํŠธ ์ถ”๊ฐ€

f := os.Open("foo.txt") else err {
  return i, j, errors.Wrap(err, "some context")
}

์ค‘์ฒฉ ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๋™์ผํ•œ ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ตœ์ข… ์˜ค๋ฅ˜๋ฅผ ๋บ€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

bits := ioutil.ReadAll(os.Open("foo")) else err {
  // either error ends up here.
  return i, j, errors.Wrap(err, "some context")
}

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜์˜ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ๊ฐ’ ๋ˆ„๋ฝ์œผ๋กœ ์ธํ•ด ์ปดํŒŒ์ผ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

func foo(s string) int {
   i := strconv.Atoi(s) // cannot implicitly return error due to missing error return value for foo.
   return i * 2
}

์˜ค๋ฅ˜๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋ฌด์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ–‰๋ณตํ•˜๊ฒŒ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

func foo(s string) int {
   i, _ := strconv.Atoi(s)
   return i * 2
} 

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

func foo() error {
  return errors.New("whoops")
}

func bar() {
  foo()
}

๋ฃจํ”„ ๋‚ด์—์„œ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

for _, s := range []string{"1","2","3","4","5","6"} {
  i := strconv.Atoi(s) else continue
}

ํŽธ์ง‘: ; ๋ฅผ else ๋กœ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒƒ์˜ ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ํ˜„์žฌ if err != nil {return err} ๋˜๋Š” ์ด ์ œ์•ˆ์—์„œ ์†Œ๊ฐœ๋œ try ํ•จ์ˆ˜์™€ ๋‹ฌ๋ฆฌ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ง€์ ์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ์‹œ๊ฐ์ ์œผ๋กœ ์ฝ”๋“œ๋Š” ๋งค์šฐ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ ์–ด๋–ค ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ• ์ง€ ์•Œ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์˜ˆ์™ธ IMO๋ณด๋‹ค ๋” ๋‚˜์œ ๊ฒฝํ—˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์ฃผ์š” ๋‹จ์ ์€ ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ API๊ฐ€ ๋œ ์˜ˆ๋ป์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ FAQ ์ฐธ์กฐ). ์šฐ๋ฆฌ๋Š” ์ด ์Šคํƒ€์ผ์ด ํ™•๋ฆฝ๋˜๋ฉด ์ต์ˆ™ํ•ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ์ด์ „์— ์ œ์•ˆ๋˜์—ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—ฌ๊ธฐ ๋˜๋Š” ์ œ์•ˆ์„œ์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ•จ์ˆ˜์˜ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹ค๋ฅธ ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ๊ณ ๋ คํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์˜ˆ:

func example() error {
        var err *error = funcerror() // always return a non-nil pointer
        fmt.Print(*err) // always nil if the return parameters are not named and not in a defer

        defer func() {
                err := funcerror()
                fmt.Print(*err) // "x"
        }

        return errors.New("x")
}
func exampleNamed() (err error) {
        funcErr := funcerror()
        fmt.Print(*funcErr) // "nil"

        err = errors.New("x")
        fmt.Print(*funcErr) // "x", named return parameter is reflected even before return is called

        *funcErr = errors.New("y")
        fmt.Print(err) // "y", unfortunate side effect?

        defer func() {
                funcErr := funcerror()
                fmt.Print(*funcErr) // "z"
                fmt.Print(err) // "z"
        }

        return errors.New("z")
}

์‹œ๋„ ์‚ฌ์šฉ:

func CopyFile(src, dst string) (error) {
        defer func() {
                err := funcerror()
                if *err != nil {
                        *err = fmt.Errorf("copy %s %s: %v", src, dst, err)
                }
        }()
        // one liner alternative
        // defer fmt.HandleErrorf(funcerror(), "copy %s %s", src, dst)

        r := try(os.Open(src))
        defer r.Close()

        w := try(os.Create(dst))
        defer func() {
                w.Close()
                err := funcerror()
                if *err != nil {
                        os.Remove(dst) // only if a โ€œtryโ€ fails
                }
        }()

        try(io.Copy(w, r))
        try(w.Close())
        return nil
}

๋˜๋Š” funcerror(์ด๋ฆ„์€ ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—…์ž…๋‹ˆ๋‹ค. D )๋Š” defer ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉด nil์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋Œ€์•ˆ์€ funcerror๊ฐ€ "Errorer" ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

type interface Errorer() {
        Error() error
}

@savaki ์ €๋Š” try() ๋ฅผ ์ƒ๋žตํ•˜๊ณ  ์ง€๋„ ๋˜๋Š” ์œ ํ˜• ์ฃผ์žฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ท€ํ•˜์˜ ์ œ์•ˆ์„ ์‹ค์ œ๋กœ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋” _"๊ฐ€๋Š” ๊ฒƒ ๊ฐ™์•„์š”."_

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๋ˆˆ์— ๋„๋Š” ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์˜ค๋ฅ˜๊ฐ€ return ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ณ  ๊ธฐ๋Šฅ์„ ์ข…๋ฃŒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ท€ํ•˜์˜ ์ œ์•ˆ์ž…๋‹ˆ๋‹ค. ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ํ˜„์žฌ for ์ค‘ break $#$ ๋˜๋Š” ํ˜„์žฌ for ์— ๋Œ€ํ•ด continue ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ดˆ๊ธฐ return s๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฉ”์Šค๊ฐ€ ๋” ๋‚˜์€ ์„ ํƒ์ผ ๋•Œ ํฐ ๋ง์น˜์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” break ๋ฐ continue ๊ฐ€ ์œ ํšจํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ „๋žต์œผ๋กœ ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋ฉฐ ํ˜„์žฌ ๊ท€ํ•˜์˜ ์ œ์•ˆ์€ return ๋งŒ ๊ฐ€์ •ํ•˜๋Š” ๋ฐ˜๋ฉด try() ๋Š” ์ด๋ฅผ ๊ฐ€์ •ํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค ํ•ธ๋“ค๋Ÿฌ ์ž์ฒด๋Š” return ๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ  break ๋˜๋Š” continue $ ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

@mikeschinkel ๋‚ด ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๊ทธ์™€ ์ €๋Š” ๋น„์Šทํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์„ ํƒ์  ๋ธ”๋ก ๋ฌธ์œผ๋กœ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

@์ œ์ž„์Šค ๋กœ๋ Œ์Šค

@mikeskkinkel ๋‚ด ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๊ทธ์™€ ๋‚˜๋Š” ๋น„์Šทํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์„ ํƒ์  ๋ธ”๋ก ๋ฌธ์œผ๋กœ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ๋ฅผ ๋“ค๋ฉด:

f := os.Open("foo.txt"); err {
  return errors.Wrap(err, "some context")
}

์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋Š” ์ผ๊ณผ ๋น„๊ตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

f,err := os.Open("foo.txt"); 
if err != nil {
  return errors.Wrap(err, "some context")
}

ํ™•์‹คํžˆ ๋‚˜์—๊ฒŒ ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ :

  1. err ์€(๋Š”) _"๋งˆ๋ฒ•์ฒ˜๋Ÿผ"_ ์„ ์–ธ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋งˆ๋ฒ•์€ ์ตœ์†Œํ™”ํ•ด์•ผ๊ฒ ์ฃ ? ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
f, err := os.Open("foo.txt"); err {
  return errors.Wrap(err, "some context")
}
  1. ๊ทธ๋Ÿฌ๋‚˜ Go๋Š” nil ๊ฐ’์„ false ๋กœ ํ•ด์„ํ•˜์ง€ ์•Š๊ณ  ํฌ์ธํ„ฐ ๊ฐ’์„ true ๋กœ ํ•ด์„ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
f, err := os.Open("foo.txt"); err != nil {
  return errors.Wrap(err, "some context")
}

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

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

f := os.Open("foo.txt"); iserror() {
  return errors.Wrap(error(), "some context")
}

๋˜๋Š” ๋” ๋‚˜์€ _(๊ฐ™์€ ๊ฒƒ):_

f := os.Open("foo.txt"); iserror() {
  return error().Extend("some context")
}

๋‹น์‹ ๊ณผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

์ œ์ณ๋‘๊ณ , ๋‚ด ์‚ฌ์šฉ์ž ์ด๋ฆ„ ์ฒ ์ž๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋‚ด๊ฐ€ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด์ง€ ์•Š์•˜๋‹ค๋ฉด ๋‹น์‹ ์˜ ์–ธ๊ธ‰์„ ์•Œ๋ฆฌ์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

@mikeschinkel ๋‚ด ์ „ํ™”์— ์žˆ๋˜ ์ด๋ฆ„์— ๋Œ€ํ•ด ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  github๊ฐ€ ์ž๋™ ์ œ์•ˆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

err์€ "๋งˆ๋ฒ•์ฒ˜๋Ÿผ" ์„ ์–ธ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋งˆ๋ฒ•์€ ์ตœ์†Œํ™”ํ•ด์•ผ๊ฒ ์ฃ ? ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

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

_"๋ฐ˜ํ™˜์„ ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•˜๋Š” ์•„์ด๋””์–ด๋Š” ๋งˆ๋ฒ•๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค."_

๋‹น์‹ ์€ ๊ฑฐ๊ธฐ์—์„œ ๋‚˜์—๊ฒŒ์„œ ์–ด๋–ค ๋…ผ์Ÿ๋„ ์–ป์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

_"์ด๊ฒƒ์€ ์ด ์ „์ฒด ์ œ์•ˆ์—์„œ ์ง„ํ–‰๋˜๋Š” ๊ฐ€์žฅ ๋งˆ๋ฒ• ๊ฐ™์€ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค."_

๋‚˜๋Š” _"๋ชจ๋“  ๋งˆ๋ฒ•์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค"๋ผ๊ณ  ์ฃผ์žฅํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

_"๊ฒŒ๋‹ค๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ์„ ์–ธ๋˜์—ˆ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ ๋ธ”๋ก์˜ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์—์„œ ๋งˆ์ง€๋ง‰์—..."_

๊ทธ๋ž˜์„œ err2 ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๊ฒƒ๋„ ์ž‘๋™ํ• ๊นŒ์š”?

f := os.Open("foo.txt"); err2 {
  return errors.Wrap(err, "some context")
}

๋”ฐ๋ผ์„œ ์„ธ๋ฏธ์ฝœ๋ก  ๋’ค์— err / err2 ์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ๋ฅผ ์ œ์•ˆํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, nil ๋˜๋Š” nil ์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ง€๋„๋ฅผ ํ™•์ธํ•  ๋•Œ์™€ ๊ฐ™์ด bool nil ?

if _,ok := m[a]; !ok {
   print("there is no 'a' in 'm'")
}

๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฅ˜ ํŒจํ‚ค์ง€์— ๊ณง ์ถ”๊ฐ€๋  go์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๋งค์šฐ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

์ €๋„ break ๋ฐ continue _( return ๋Š” ์•„๋‹˜)_ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

์žˆ๋Š” ๊ทธ๋Œ€๋กœ, ๋‚˜๋Š” ์ด try() ์ œ์•ˆ์ด ๋„์›€์ด ๋˜๊ธฐ๋ณด๋‹ค๋Š” ํ•ด๋กญ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ, ์ œ์•ˆ๋œ ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๋ณด๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. #jmtcw.

@beoran @mikeschinkel ์ด์ „์— ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฒ„์ „์˜ try ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ œ์•ˆํ–ˆ๋Š”๋ฐ, ์ด๋Š” ์ œ์–ด ํ๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝ๊ณ  ์žˆ๋‹ค๋ฉด, ๋‹น์‹ ์€ ๋‘˜ ๋‹ค panic ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•˜์—ฌ try ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ try ์˜ ์ด ๋ฒ„์ „์€ ๋งค์šฐ ๋ช…์‹œ์ ์œผ๋กœ panic ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฒ„์ „์˜ try ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ œ๋„ค๋ฆญ(https://go.googlesource.com/proposal/+/master/design/go2draft-contracts.md์˜ ๋””์ž์ธ ์ดˆ์•ˆ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•œ ์ œ๋„ค๋ฆญ ๋ฒ„์ „)์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ํŒจ๋‹‰์€ ์˜ค๋Š˜๋‚  Go ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์œ ํ˜•์ด ์•„๋‹ˆ๋ฉฐ ๋‚˜์—๊ฒŒ ์ข‹์€ ์ƒ๊ฐ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@mikeschinkel ํŠน์ˆ˜ ์ฒ˜๋ฆฌ๋Š” ๋ธ”๋ก์ด ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
```
f := os.Open('foo'); err { return err } // ์—ฌ๊ธฐ์„œ err์€ ํ•ญ์ƒ nil์ด ์•„๋‹™๋‹ˆ๋‹ค.

@ianlancetaylor

_"์˜ˆ, ์šฐ๋ฆฌ๋Š” ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... ๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋ฅ˜์— ํŒจ๋‹‰ํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋Š˜๋‚  Go ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์œ ํ˜•์ด ์•„๋‹ˆ๋ฉฐ ๋‚˜์—๊ฒŒ ์ข‹์€ ์ƒ๊ฐ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค."_

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

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

๋‚ด๊ฐ€ ํ•˜๊ณ  ์žˆ์ง€ ์•Š์€ ๊ฒƒ(์•„๋งˆ๋„ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ์Œ)์€ ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ $# try() panic() ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜นํ˜ธํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ๊ทธ๋“ค์ด ์ •๋ง๋กœ ์›ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ํ•  ์ˆ˜ ์žˆ๊ณ  ์ œ๋„ค๋ฆญ.

๊ทธ๊ฒŒ ๋ช…ํ™•ํ•ด ์กŒ๋‚˜์š”?

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

@ianlancetaylor ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ, ๋‚˜๋Š” try() ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ๋ณด๋‹ค ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ด์œ ๋ฅผ ์ฐพ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์—ฌ๊ธฐ์— ์ œ์•ˆ๋œ ๋Œ€๋กœ try() ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์—†๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ˆœ์ „ํžˆ ์‹œ๊ฐ์ ์ธ ์ธก๋ฉด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ดˆ๊ธฐ check ์ œ์•ˆ์„ ์ด๊ฒƒ๋ณด๋‹ค ๋” ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค. check ๋Š” try() ์™€ ๊ฐ™์€ ํž˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ $#$ bar(try(foo())) bar(check foo()) ๊ฐ€ ๋” ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

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

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, ์ด ์ œ์•ˆ์€ ๋ชจ๋“  ๋ฉด์—์„œ ์ด์ „์˜ handle / check ์ œ์•ˆ์— ์กŒ์Šต๋‹ˆ๋‹ค.

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

try ๋Š” ๊ธฐ๋Šฅ์—์„œ ์ œ์–ด/์˜๋„๋œ ์ข…๋ฃŒ์ž…๋‹ˆ๋‹ค. ์ œ์–ด๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ ์ข…๋ฃŒ๋ฅผ ํฌํ•จํ•˜์—ฌ ํ•ญ์ƒ ์‹คํ–‰์„ ์—ฐ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋ถˆ์ผ์น˜๋Š” ํ˜ผ๋ž€์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ฐ€์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค.

func someHTTPHandlerGuts() (err error) {
  defer func() {
    recordMetric("db call failed")
    return fmt.HandleErrorf("db unavailable: %v", err)
  }()
  data := try(makeDBCall)
  // some code that panics due to a bug
  return nil
}

net/http๊ฐ€ ํŒจ๋‹‰์—์„œ ๋ณต๊ตฌ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๊ณ  ํŒจ๋‹‰๊ณผ ๊ด€๋ จ๋œ ํ”„๋กœ๋•์…˜ ๋ฌธ์ œ ๋””๋ฒ„๊น…์„ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๊ณ„์ธก์„ ๋ณด๋ฉด recordMetric ํ˜ธ์ถœ์—์„œ db ํ˜ธ์ถœ ์‹คํŒจ๊ฐ€ ๊ธ‰์ฆํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ›„์† ๋ผ์ธ์˜ ํŒจ๋‹‰์ธ ์ง„์ •ํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹ค์Œ์€ ์ œ๊ธฐ๋œ ์šฐ๋ ค ์‚ฌํ•ญ ์ค‘ ์ผ๋ถ€์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ • ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. $#$ return $#$ ๋Œ€์‹  try ๋ฅผ goto ์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•˜์‹ญ์‹œ์˜ค. ๋‚ด ๋ง์„ ๋“ค์–ด. :)

try ๋Š” ๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ ์„คํƒ•์ด ๋ฉ๋‹ˆ๋‹ค.

t1, โ€ฆ tn, te := f()  // t1, โ€ฆ tn, te are local (invisible) temporaries
if te != nil {
        err = te   // assign te to the error result parameter
        goto error // goto "error" label
}
x1, โ€ฆ xn = t1, โ€ฆ tn  // assignment only if there was no error

ํ˜œํƒ:

  • defer ๋Š” ์˜ค๋ฅ˜๋ฅผ ์žฅ์‹ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๊ทธ๋Ÿฌ๋‚˜ ๋ช…๋ช…๋œ ๋ฐ˜ํ’ˆ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.)
  • error: ๋ ˆ์ด๋ธ”์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜ ์–ด๋”˜๊ฐ€์— try ๊ฐ€ ์žˆ๋‹ค๋Š” ์‹œ๊ฐ์  ๋‹จ์„œ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ์„œ์˜ ํ•ธ๋“ค๋Ÿฌ ๋ฌธ์ œ๋ฅผ ํšŒํ”ผํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด๋ธ”์„ ํ•ธ๋“ค๋Ÿฌ๋กœ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. try(fn(), wrap) ๋Š” goto wrap goto error ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” wrap: ๊ฐ€ ํ•จ์ˆ˜์— ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์žˆ์œผ๋ฉด ๋””๋ฒ„๊น…์—๋„ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€/๋ณ€๊ฒฝํ•˜์—ฌ ๋””๋ฒ„๊น… ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ์ฝ”๋“œ:

func CopyFile(src, dst string) (err error) {
    r := try(os.Open(src))
    defer r.Close()

    w := try(os.Create(dst))
    defer func() {
        w.Close()
        if err != nil {
            os.Remove(dst) // only if a โ€œtryโ€ fails
        }
    }()

    try(io.Copy(w, r), copyfail)
    try(w.Close())
    return nil

error:
    return fmt.Errorf("copy %s %s: %v", src, dst, err)

copyfail:
    recordMetric("copy failure") // count incidents of this failure
    return fmt.Errorf("copy %s %s: %v", src, dst, err)
}

๊ธฐํƒ€ ์˜๊ฒฌ:

  • try ์˜ ๋Œ€์ƒ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ๋ ˆ์ด๋ธ” ์•ž์— ์ข…๋ฃŒ ๋ช…๋ น๋ฌธ์ด ์™€์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๊ฒƒ์€ ํ•จ์ˆ˜๋ฅผ ๊ฐ•์ œ ์ข…๋ฃŒํ•˜๊ณ  ์ผ๋ถ€ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ํ•ฉ๋ฆฌ์ ์ด๊ณ  ์œ ์šฉํ•œ ์‚ฌ์šฉ์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • try ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฃจํ”„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒŒ '์•„ํ”„๋ฉด ํ•˜์ง€๋งˆ'๋ผ๋Š” ๊ธฐ์น˜์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” https://github.com/golang/go/issues/26058์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํฌ๋ ˆ๋”ง: ์ด ์•„์ด๋””์–ด์˜ ๋ณ€ํ˜•์€ ์ž‘๋…„ GopherCon์—์„œ @griesemer ๊ฐ€ ์ง์ ‘ ์ œ์•ˆํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@josharian ์—ฌ๊ธฐ์„œ panic ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๊บผ๋‚ด์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์˜ ์˜ˆ๋Š” ๋‚˜์—๊ฒŒ ์ด์ƒํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ์—์„œ defer๊ฐ€ ํ•ญ์ƒ "db call failed" ๋ฉ”ํŠธ๋ฆญ์„ ๊ธฐ๋กํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. someHTTPHandlerGuts ๊ฐ€ ์„ฑ๊ณตํ•˜๊ณ  nil ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ž˜๋ชป๋œ ๋ฉ”ํŠธ๋ฆญ์ด ๋ฉ๋‹ˆ๋‹ค. defer ๋Š” ์˜ค๋ฅ˜๋‚˜ ํŒจ๋‹‰์˜ ๊ฒฝ์šฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์ข…๋ฃŒ ๊ฒฝ์šฐ์— ์‹คํ–‰๋˜๋ฏ€๋กœ ํŒจ๋‹‰์ด ์—†์–ด๋„ ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

func someHTTPHandlerGuts() (err error) {
  defer func() {
    recordMetric("db call failed")
    return fmt.HandleErrorf("db unavailable: %v", err)
  }()
  data := try(makeDBCall)
  // some code that panics due to a bug
  return nil
}

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

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

๋‚ด POV์—์„œ ์ด ์‹œ๋„ ๊ตฌ๋ฌธ์ด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

V, ํ™•์ธ:= m[ํ‚ค]

์ง€๋„์—์„œ ์ฝ์€ ์–‘์‹

handle / check ์ œ์•ˆ ์„ ๋‹จ์ˆœํ™”๋œ ํ˜•ํƒœ๋กœ ๋˜์‚ด๋ฆฌ๋ฉด goto ๋ ˆ์ด๋ธ”์ด ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ•จ์ˆ˜์˜ ๋์œผ๋กœ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. handle err { ... } ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์—ฐ๊ฒฐ๋˜๋„๋ก ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ๋งˆ์ง€๋ง‰ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ œ์•ˆ์„ ๋งŽ์ด ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์‚ฌ์šฉ ์ง€์ ์— ๋” ๊ฐ€๊น๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ  goto ์•„์ด๋””์–ด์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

func CopyFile(src, dst string) (err error) {
    handle err {
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }
    r := check os.Open(src)
    defer r.Close()

    w := check os.Create(dst)
    defer func() {
        w.Close()
        if err != nil {
            os.Remove(dst) // only if a โ€œcheckโ€ fails
        }
    }()

    {
        // handlers are scoped, after this scope the original handle is used again.
        // as an alternative, we could have repeated the first handle after the io.Copy,
        // or come up with a syntax to name the handlers, though that's often not useful.
        handle err {
            recordMetric("copy failure") // count incidents of this failure
            return fmt.Errorf("copy %s %s: %v", src, dst, err)
        }
        check io.Copy(w, r)
    }
    check w.Close()
    return nil
}

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

@josharian @griesemer ๋ช…๋ช…๋œ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ๋„์ž…ํ•˜๋ฉด(ํ™•์ธ/์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋งŽ์€ ์‘๋‹ต์ด ์š”์ฒญ๋จ, ๋ฐ˜๋ณต๋˜๋Š” ํ…Œ๋งˆ ์ฐธ์กฐ) try(f(), err) ๋ณด๋‹ค ์„ ํ˜ธ๋˜๋Š” ๊ตฌ๋ฌธ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

try.err f()
try?err f()
try#err f()

?err    f() // because 'try' is redundant
?return f() // no handler
?panic  f() // no handler

(?err f()).method()

f?err() // lead with function name, instead of error handling
f?err().method()

file, ?err := os.Open(...) // many check/handle responses also requested this style

Go์—์„œ ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ๊ตฌ๋ฌธ์ด ๋น„๊ต์  ๊ตฌ๋‘์ ์ด ์—†๊ณ  ํฐ ๋ฌธ์ œ ์—†์ด ํฐ ์†Œ๋ฆฌ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Go๊ฐ€ $#@!perl ๋กœ ๋๋‚˜๋Š” ๊ฒƒ์„ ์ •๋ง ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ "์‹œ๋„"ํ•˜๊ณ  ์ฒด์ธ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • go์˜ ๋‚˜๋จธ์ง€ ์ œ์–ด ํ๋ฆ„๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์˜ˆ: for/if/return/etc ํ‚ค์›Œ๋“œ).
  • ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

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

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

FWIW, panic ๋Š” ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ๊ด„ํ˜ธ๊ฐ€ ์žˆ์ง€๋งŒ go ๋ฐ defer ๋„ ํ๋ฆ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” try ๊ฐ€ ํŠน์ดํ•œ ํ๋ฆ„ ์—ฐ์‚ฐ์ด๋ผ๋Š” ์ ์—์„œ defer ์™€ ๋” ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค try (try os.Open(file)).Read(buf) ์–ด์จŒ๋“ , ํ•˜์ง€๋งŒ ์–ด์จŒ๋“ . ์–ด๋Š ์ชฝ์ด๋“  ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ตœ์ข… ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ๋ณ€์ˆ˜์˜ ์•”์‹œ์  ์ด๋ฆ„์„ ์‹ซ์–ดํ•  ๊ฒƒ์ด๋ผ๋Š” ์ œ์•ˆ: $err . try() IMO๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค. :-)

@griesemer

_"๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” ๋ฐฉํ•ด๊ฐ€ ๋˜๋Š” ์—๋Ÿฌ ํ•ธ๋“ค๋ง ์ฝ”๋“œ๋ฅผ ์ข‹์•„ํ•œ๋‹ค(๋งˆ์ง€๋ง‰์—)"_

๊ฑฐ๊ธฐ์— +1!

๋‚˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ _before_ ๊ตฌํ˜„๋œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ _after_ ๊ตฌํ˜„๋œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ณด๋‹ค ์ถ”๋ก ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ •์‹ ์ ์œผ๋กœ ์ ํ”„ํ•˜๊ณ  ๋…ผ๋ฆฌ ํ๋ฆ„์„ ๋”ฐ๋ผ๊ฐ€์•ผ ํ•˜๋Š” ๊ฒƒ์€ 1980๋…„์— Basic with GOTO๋ฅผ ์ž‘์„ฑํ•˜๋˜ ๋•Œ๋กœ ๋Œ์•„๊ฐ„ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

CopyFile() ๋ฅผ ์˜ˆ์ œ๋กœ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ž ์žฌ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

func CopyFile(src, dst string) (err error) {

    r := os.Open(src)
    defer r.Close()

    w := os.Create(dst)
    defer w.Close()

    io.Copy(w, r)
    w.Close()

    for err := error {
        switch err.Source() {
        case w.Close:
            os.Remove(dst) // only if a โ€œtryโ€ fails
            fallthrough
        case os.Open, os.Create, io.Copy:
            err = fmt.Errorf("copy %s %s: %v", src, dst, err)
        default:
            err = fmt.Errorf("an unexpected error occurred")
        }
    }

    return err
}

ํ•„์š”ํ•œ ์–ธ์–ด ๋ณ€๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. for range{} ์™€ ์œ ์‚ฌํ•œ for error{} ๊ตฌ์กฐ๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ์—๋งŒ ์ž…๋ ฅ๋˜๊ณ  ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  2. <object>.Error() string ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ˜ํ™˜ ๊ฐ’ ์บก์ฒ˜๋ฅผ ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ for error{} ๊ตฌ๋ฌธ์ด ๋™์ผํ•œ func ๋‚ด์— ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  3. func ๊ฐ€ ๋งˆ์ง€๋ง‰ ๋ฐ˜ํ™˜ ๊ฐ’์—์„œ _"์˜ค๋ฅ˜"_๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ํ”„๋กœ๊ทธ๋žจ ์ œ์–ด ํ๋ฆ„์ด for error{} ๊ตฌ์กฐ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„๋กœ ์ ํ”„ ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  4. _"์˜ค๋ฅ˜"_๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ Go๋Š” <error>.Source() ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

_"์˜ค๋ฅ˜"_๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ˜„์žฌ _"์˜ค๋ฅ˜"_๋Š” Error() string ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ๊ฐœ์ฒด๋กœ ์ •์˜๋˜๋ฉฐ ๋ฌผ๋ก  nil ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ RESTful API์˜ ์„ฑ๊ณต ๊ฒฐ๊ณผ์— ํ•„์š”ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก _์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ์—๋„_ ์˜ค๋ฅ˜๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Go ํŒ€์— err!=nil ๊ฐ€ _"์˜ค๋ฅ˜"๋ฅผ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ž๋™์œผ๋กœ ๊ฐ€์ •ํ•˜์ง€ ๋ง๊ณ  ๋Œ€์‹  ์˜ค๋ฅ˜ ๊ฐœ์ฒด๊ฐ€ IsError() IsError() ๊ฐ€ true ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. $ nil ๊ฐ€ ์•„๋‹Œ ๊ฐ’์ด _"์˜ค๋ฅ˜"๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ธฐ ์ „์— true

_( ํ•„์—ฐ์  ์œผ๋กœ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋งํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ฃผ๋กœ _"์˜ค๋ฅ˜"์—์„œ ๋ถ„๊ธฐํ•˜๋„๋ก ์ œ์–ด ํ๋ฆ„์„ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. err!=nil ๋งŒ ๋ณด๋ฉด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ œํ•œ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’ ์ธก๋ฉด์—์„œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)_

BTW, ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ _"์˜ค๋ฅ˜"_ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด ์ƒˆ๋กœ์šด ๋‚ด์žฅ iserror() ํ•จ์ˆ˜ ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type ErrorIser interface {
    IsError() bool
}
func iserror(err error) bool {
    if err == nil { 
        return false
    }
    if _,ok := err.(ErrorIser); !ok {
        return true
    }
    return err.IsError()
}

_"์˜ค๋ฅ˜"_์˜ ํฌ์ฐฉ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์˜ ๋ถ€์ˆ˜์  ์ด์ 

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

๋‚˜์—๊ฒŒ _"๊ฐ„๋‹จํ•จ์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋‚˜์š” ์•„๋‹ˆ๋ฉด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ํฌ๊ธฐํ•ด์•ผ ํ•˜๋‚˜์š”?"_๋ผ๋Š” ๊ฒฐ์ •์€ Go ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์œ„์˜ _"์˜ค๋ฅ˜"_๋ฅผ ์บก์ฒ˜ํ•˜์ง€ ์•Š๋„๋ก ํ—ˆ์šฉํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๊ฑฐ์˜ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

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

https://github.com/rhysd/trygo

ํ™•์žฅ๋œ ์–ธ์–ด์ธ TryGo๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  TryGo to Go ๋ฒˆ์—ญ๊ธฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฒˆ์—ญ๊ธฐ์™€ ํ•จ๊ป˜ ์ฝ”๋“œ

func CreateFileInSubdir(subdir, filename string, content []byte) error {
    cwd := try(os.Getwd())

    try(os.Mkdir(filepath.Join(cwd, subdir)))

    p := filepath.Join(cwd, subdir, filename)
    f := try(os.Create(p))
    defer f.Close()

    try(f.Write(content))

    fmt.Println("Created:", p)
    return nil
}

๋กœ ๋ฒˆ์—ญ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

func CreateFileInSubdir(subdir, filename string, content []byte) error {
    cwd, _err0 := os.Getwd()
    if _err0 != nil {
        return _err0
    }

    if _err1 := os.Mkdir(filepath.Join(cwd, subdir)); _err1 != nil {
        return _err1
    }

    p := filepath.Join(cwd, subdir, filename)
    f, _err2 := os.Create(p)
    if _err2 != nil {
        return _err2
    }
    defer f.Close()

    if _, _err3 := f.Write(content); _err3 != nil {
        return _err3
    }

    fmt.Println("Created:", p)
    return nil
}

์–ธ์–ด์˜ ์ œ์•ฝ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ try() ํ˜ธ์ถœ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

  • ์ •์˜๋ฌธ์˜ RHS
  • ํ• ๋‹น ๋ช…์„ธ์„œ์˜ RHS
  • ํ†ตํ™” ๋ช…์„ธ์„œ

ํ•˜์ง€๋งŒ ๋‚ด ์ž‘์€ ํ”„๋กœ์ ํŠธ๋กœ ์ด๊ฒƒ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์€

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž˜ ์ž‘๋™ํ•˜๊ณ  ์—ฌ๋Ÿฌ ์ค„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๊ฐ’์€ ์‹ค์ œ๋กœ err ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ ๋Œ€์ž…๊ณผ try() ํŠน์ˆ˜ ํ•จ์ˆ˜ ๋ชจ๋‘์— ์˜ํ•ด ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด
  • ์ด try() ํ•จ์ˆ˜์—๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ '๋ž˜ํ•‘ ์˜ค๋ฅ˜' ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

_"์ด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ๋‚˜์—๊ฒŒ ์ข‹์€ ๊ฒฐ๊ณผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค."_

์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์— ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๋ฐ ๋™์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

_"์ด ์‹œ๋„ ๊ตฌ๋ฌธ(๊ผญ ํ•„์š”ํ•˜์ง€ ์•Š์Œ)์€ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค."_

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

์—ฌ๊ธฐ์—์„œ ์ •๋‹นํ™”๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋ฉด ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์ ˆ๋˜์—ˆ๋˜ ๊ณผ๊ฑฐ ์ œ์•ˆ์„ ๋‹ค์‹œ ๊ฒ€ํ† ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด์ œ ์šฐ๋ฆฌ๋Š” ์„ ํƒ๋œ ์—ฃ์ง€ ์ผ€์ด์Šค์—๋งŒ ์œ ์šฉํ•œ Go์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ œ ์ƒ๊ฐ์—๋Š” ์ด ์„ ๋ก€๋ฅผ ์„ธ์šฐ๋Š” ๊ฒƒ์ด ์žฅ๊ธฐ์ ์œผ๋กœ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค...

_"@mikeshenkel"_

์ถ”์‹ : ๋งž์ถค๋ฒ• ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์ฒ˜์Œ์— ๊ท€ํ•˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. _(์ด๊ฒƒ์€ ๋‚˜๋ฅผ ํ™”๋‚˜๊ฒŒ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ๋‚ด ์‚ฌ์šฉ์ž ์ด๋ฆ„์˜ ์ฒ ์ž๊ฐ€ ํ‹€๋ ธ์„ ๋•Œ ์•Œ๋ฆผ์„ ๋ฐ›์ง€ ๋ชปํ•  ๋ฟ์ž…๋‹ˆ๋‹ค...)_

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

์ด ์ €์žฅ์†Œ์— ์žˆ๋Š” 11,108,770๊ฐœ์˜ ์ค‘์š”ํ•œ Go ๋ผ์ธ์—์„œ try ๊ฐ€ ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉ๋œ ์ธ์Šคํ„ด์Šค๋Š” 63๊ฐœ ์— ๋ถˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค(ํฌ๊ณ  ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋ฉฐ ๊ทธ ์ž์ฒด๋กœ ์ค‘์š”ํ•จ)๊ฐ€ Go ์ฝ”๋“œ์˜ ์ผ๋ถ€์— ๋ถˆ๊ณผํ•˜๋‹ค๋Š” ๊ฒƒ๊ณผ ๊ฐœ์ธ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ง์ ‘ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กœ์šด ๊ฒฐ๊ณผ.

๋˜ํ•œ try ๋Š” ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์†Œ๋ฌธ์ž์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒจํ‚ค์ง€์˜ ๊ณต๊ฐœ API์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ ์ถ”๊ฐ€๋Š” ํŒจํ‚ค์ง€ ๋‚ด๋ถ€์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

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

๋‹ค์Œ ๊ตฌ์„ฑ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

1) ํ•ธ๋“ค๋Ÿฌ ์—†์Œ

// The existing proposal, but as a keyword rather than builtin.  When an error is 
// "caught", the function returns all zero values plus the error.  Nothing 
// particularly new here.
func doSomething() (int, error) {
    try SomeFunc()
    a, b := try AnotherFunc()

    // ...

    return 123, nil
}

2) ํ•ธ๋“ค๋Ÿฌ

์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ธ๋ผ์ธ๋˜๊ธฐ ์œ„ํ•œ ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ๋ธ”๋ก์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์—์„œ ํ™•์ธํ•˜์„ธ์š”.

func doSomething() (int, error) {
    // Inline error handler
    a, b := try SomeFunc() else err {
        return 0, errors.Wrap(err, "error in doSomething:")
    }

    // Named error handlers
    handler logAndContinue err {
        log.Errorf("non-critical error: %v", err)
    }
    handler annotateAndReturn err {
        return 0, errors.Wrap(err, "error in doSomething:")
    }

    c, d := try SomeFunc() else logAndContinue
    e, f := try OtherFunc() else annotateAndReturn

    // ...

    return 123, nil
}

์ œ์•ˆ๋œ ์ œํ•œ ์‚ฌํ•ญ:

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

ํ˜œํƒ:

  • try / else ๊ตฌ๋ฌธ์€ ๊ธฐ์กด "compound if"๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋””์Šˆ๊ฐ€๋ง๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    go a, b := try SomeFunc() else err { return 0, errors.Wrap(err, "error in doSomething:") }
    ๋œ๋‹ค
    go if a, b, err := SomeFunc(); err != nil { return 0, errors.Wrap(err, "error in doSomething:") }
    ๋‚ด ๋ˆˆ์— ๋ณตํ•ฉ if๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ํ•ญ์ƒ ๋„์›€์ด ๋˜๊ธฐ๋ณด๋‹ค ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ์กฐ๊ฑด๋ฌธ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘์—… _ํ›„์—_ ๋ฐœ์ƒํ•˜๊ณ  ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์ด ์กฐ๊ฑด๋ฌธ ๋‚ด๋ถ€์— ๋ผ์–ด ์žˆ์œผ๋ฉด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด ๋œ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๋ˆˆ์ด ์‚ฐ๋งŒํ•˜๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ์ •์˜๋œ ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„๋Š” ๋ผ์ธ์—์„œ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ์„ ๋•Œ๋งŒํผ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋Š” ์˜๋„์  ์œผ๋กœ ํ•จ์ˆ˜๋กœ ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค (๋˜๋Š” ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•œ ์˜๋ฏธ์™€ ์œ ์‚ฌํ•˜์ง€ ์•Š์Œ). ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค:

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

    • ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์—๋Š” ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. check / handle ์— ๋Œ€ํ•œ "์ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ตฌ์ œ๊ธˆ์œต์—๋งŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค"๋ผ๋Š” ๋น„ํŒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ "ํ•ธ๋“ค๋Ÿฌ ์ฒด์ธ" ๋น„ํŒ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค. ์ž„์˜์˜ ์ฝ”๋“œ๋Š” ์ด๋Ÿฌํ•œ ์ฒ˜๋ฆฌ๊ธฐ ์ค‘ ํ•˜๋‚˜์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์ œ์–ด ํ๋ฆ„์€ ์•”์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • super return ๋ฅผ ์˜๋ฏธํ•˜๊ธฐ ์œ„ํ•ด ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์—์„œ return ๋ฅผ ํ•˜์ด์žฌํ‚นํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ ๋„์šฉ์€ ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. return ๋Š” return ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ $# super return ๋Š” ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • defer ๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ๋‹ฌ๋น›์„ ๋ฐ›์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋ฆฌ์†Œ์Šค ๋“ฑ์„ ์ •๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ„์† ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์˜ค๋ฅ˜์— ์ปจํ…์ŠคํŠธ ์ถ”๊ฐ€์™€ ๊ด€๋ จํ•˜์—ฌ:

    • ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋ฉฐ ๊ธฐ์กด if err != nil ๋ธ”๋ก๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

@griesemer ์‹ค์ œ๋กœ โ€” ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฝค ๋ฏธ์ง€๊ทผํ•œ ๋Š๋‚Œ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๋” Go-ish ์—†์ด.

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

a, b := try SomeFunc() else err {
    someLocalFunc(err)
    return 0, err
}

(์ €๋Š” ์—ฌ์ „ํžˆ if๋ฅผ ํ•ฉ์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ์•ž์„œ ์Šค๋ ˆ๋“œ์—์„œ ๋…ผ์˜ํ•œ ๊ฐ„๋‹จํ•œ gofmt ์กฐ์ •์„ ๊ตฌํ˜„ํ•˜์—ฌ ์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ•œ ์ค„์งœ๋ฆฌ ๋ฐ˜ํ™˜์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

a, b := try SomeFunc() else err { return 0, errors.Wrap(err, "bad stuff!") }

์œ„ ์ œ์•ˆ์—์„œ ์ƒˆ๋กœ์šด ํ‚ค์›Œ๋“œ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€? ์™œ ์•ˆ ๋ผ:

SomeFunc() else return
a, b := SomeOtherFunc() else err { return 0, errors.Wrap(err, "bad stuff!") }

@griesemer ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ๋‹ค์‹œ ํ…Œ์ด๋ธ”์— ์žˆ์œผ๋ฉด try/handle ๋˜๋Š” try/_label_์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์€ ํŠนํžˆ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ƒ๋žตํ–ˆ์œผ๋ฉฐ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ •์˜ํ•˜๊ณ  ํ˜ธ์ถœํ•˜๋Š” ์ˆ˜๋งŽ์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ œ์•ˆํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋จผ์ € ํ”ผ๋“œ๋ฐฑ ํ™•์ธ/์ฒ˜๋ฆฌ ์œ„ํ‚ค๋ฅผ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ฟˆ๊พธ๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ์ด๋ฏธ ๊ฑฐ๊ธฐ์— ์„ค๋ช…๋˜์–ด์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค :-)
https://github.com/golang/go/wiki/Go2ErrorHandlingํ”ผ๋“œ๋ฐฑ

@smonkewitz ์•„๋‹ˆ์š”, ์ง€๊ธˆ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์–ธ๊ธ‰๋œ ํ• ๋‹น ๋ฌธ์— ๋ฐ”์ธ๋”ฉ๋œ ์ƒˆ ํ‚ค์›Œ๋“œ๋Š” ํ•ด๋‹น ๋ฒ„์ „์—์„œ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/golang/go/issues/32437#issuecomment -499808741
https://github.com/golang/go/issues/32437#issuecomment -499852124
https://github.com/golang/go/issues/32437#issuecomment -500095505

@ianlancetaylor ๋Š” ์•„์ง go ํŒ€์—์„œ ์ด ํŠน๋ณ„ํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ๊ณ ๋ คํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ์•ˆ๋œ try ๋‚ด์žฅ ํ•จ์ˆ˜๋งŒํผ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ์ง€๋Š” ์•Š์ง€๋งŒ ๋” ๊ด€์šฉ์ ์ž…๋‹ˆ๋‹ค. ~๋ถˆํ•„์š”ํ•œ ํ‘œํ˜„, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.~

@deanveloper ์™€ ๋ช‡๋ช‡ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋งํ•œ ๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์ œ ์ž์‹ ์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. https://github.com/golang/go/issues/32437#issuecomment -498939499 @deanveloper ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๋˜ํ•œ ์ด ์ œ์•ˆ์—์„œ try ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ ๋” ํฐ ํ‘œํ˜„์‹์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  1. ๊ณตํ™ฉ ์ƒํƒœ๋Š” ์กฐ๊ฑด์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•ญ์ƒ ํ˜ธ์ถœ ํ•จ์ˆ˜๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.
  2. Panic์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋ช…๋ น๋ฌธ์œผ๋กœ๋งŒ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€์‹œ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์‹œ๋„:

  1. ์กฐ๊ฑด๋ถ€์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋˜๊ฑฐ๋‚˜ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋‚ด ํŽธ์ง‘๊ธฐ ์ฐฝ์˜ ์˜ค๋ฅธ์ชฝ ์—ฌ๋ฐฑ์„ ์ง€๋‚˜ ์ž ์žฌ์ ์œผ๋กœ ํ•œ ์ค„์— ๋ณตํ•ฉ ํ‘œํ˜„์‹์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ try ๋Š” "์กฐ๊ธˆ ๋ฒ—์–ด๋‚œ" ๊ฒƒ ์ด์ƒ์œผ๋กœ ๋Š๊ปด์ง€๋ฉฐ ๊ทผ๋ณธ์ ์œผ๋กœ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์— ํ•ด๋ฅผ ๋ผ์นœ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

````
๋งŒ์•ฝ != "๊นจ์กŒ๋‹ค" {
์ˆ˜์ •ํ•˜์ง€ ๋งˆ์„ธ์š”(๊ทธ๊ฒƒ)
}

@ChrisHines ๊ท€ํ•˜์˜ ์š”์ ์— ๋Œ€ํ•ด(์ด ์Šค๋ ˆ๋“œ์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ฐ˜ํ–ฅ๋จ) ๋˜ ๋‹ค๋ฅธ ์ œํ•œ์„ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  try ๋ฌธ(ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ํฌํ•จ)์€ ์ž์ฒด ๋ผ์ธ์—์„œ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๋„Œ์„ผ์Šค๋Š” ์—†์Šต๋‹ˆ๋‹ค.

try EmitEvent(try (try DecodeMsg(m)).SaveToDB())

๊ทธ๋Ÿฌ๋‚˜ ์˜คํžˆ๋ ค ์ด๊ฒƒ์€:

dm := try DecodeMsg(m)
um := try dm.SaveToDB()
try EmitEvent(um)

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ด๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

dm, err := DecodeMsg(m)
if err != nil {
    return nil, err
}

um, err := dm.SaveToDB()
if err != nil {
    return nil, err
}

err = EmitEvent(um)
if err != nil {
    return nil, err
}

์ด ๋””์ž์ธ์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ํ•œ ๊ฐ€์ง€๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์˜ค๋ฅ˜๋ฅผ ์กฐ์šฉํžˆ ๋ฌด์‹œํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์ง€๊ธˆ์€ x, _ := SomeFunc() (๋ฌด์‹œ๋œ ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์˜ค๋ฅ˜? ๋‹ค๋ฅธ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?)๊ฐ€ ํ‘œ์‹œ๋˜์ง€๋งŒ ์ด์ œ ๋ช…ํ™•ํ•˜๊ฒŒ ์ฃผ์„์„ ๋‹ฌ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

x := try SomeFunc() else err {}

์ œ์•ˆ์„ ์ง€์›ํ•˜๋Š” ์ด์ „ ๊ฒŒ์‹œ๋ฌผ ์ดํ›„๋กœ @jagv (๋งค๊ฐœ๋ณ€์ˆ˜ ์—†๋Š” try ๋Š” *error $๋ฅผ ๋ฐ˜ํ™˜)์™€ @josharian (์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋จ)์ด ๊ฒŒ์‹œํ•œ ๋‘ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ์ˆ˜์ •๋œ ํ˜•์‹์€ ์ œ์•ˆ์„ ์ƒ๋‹นํžˆ ํ–ฅ์ƒ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์•„์ด๋””์–ด๋ฅผ ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ถ”๊ฐ€ ์•„์ด๋””์–ด์™€ ํ•ฉ์น˜๋ฉด try ์˜ ๋„ค ๊ฐ€์ง€ ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋…ธ๋ ฅํ•˜๋‹ค()
  2. ์‹œ๋„(๋งค๊ฐœ๋ณ€์ˆ˜)
  3. try(๋งค๊ฐœ๋ณ€์ˆ˜, ๋ ˆ์ด๋ธ”)
  4. try(params, ํŒจ๋‹‰)

1์€ ๋‹จ์ˆœํžˆ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ๋งค๊ฐœ๋ณ€์ˆ˜(ERP)์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์—†๋Š” ๊ฒฝ์šฐ(#4๋งŒ) nil์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ถ”๊ฐ€ ๋‚ด์žฅ์„ ์ถ”๊ฐ€ํ•  ํ•„์š” ์—†์ด ๋ช…๋ช…๋œ ERP์— ๋Œ€ํ•œ ๋Œ€์•ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

2๋Š” ํ˜„์žฌ ์˜ˆ์ƒํ•œ ๋Œ€๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. nil์ด ์•„๋‹Œ ์˜ค๋ฅ˜๋Š” ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋˜์ง€๋งŒ defer ๋ฌธ์œผ๋กœ ์žฅ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3์€ @josharian ์ด ์ œ์•ˆํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, nil์ด ์•„๋‹Œ ์˜ค๋ฅ˜์—์„œ ์ฝ”๋“œ๊ฐ€ ๋ ˆ์ด๋ธ”๋กœ ๋ถ„๊ธฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๊ฒฝ์šฐ๊ฐ€ ์ด์ œ #2๋กœ ๋ณ€์งˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ ๋ ˆ์ด๋ธ”์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— defer ๋ณด๋‹ค ์˜ค๋ฅ˜๋ฅผ ์žฅ์‹ํ•˜๋Š”(๋˜๋Š” ๋กœ์ปฌ๋กœ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ nil์„ ๋ฐ˜ํ™˜ํ•˜๋Š”) ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹# 2๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ ๋ ˆ์ด๋ธ” ๋ฐ goto ๋™์ž‘์€ ์ œ๋ชฉ( @josharian ์ด ๋งํ•œ ๋Œ€๋กœ)์„ #26058์ด ๋จผ์ € ์ˆ˜์ •๋˜๋„๋ก ์ ์šฉํ•˜์ง€๋งŒ ์–ด์จŒ๋“  ์ˆ˜์ •๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ ˆ์ด๋ธ” ์ด๋ฆ„์€ #4์™€ ์ถฉ๋Œํ•˜๋ฏ€๋กœ panic ๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

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

์ด๊ฒƒ์€ try ์˜ ๋ณ„๋„ ๋ฒ„์ „์ด์–ด์•ผ ํ•˜๋ฉฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋กœ ๋ถ„๊ธฐํ•œ ๋‹ค์Œ ๊ทธ๋กœ๋ถ€ํ„ฐ ํŒจ๋‹‰์„ ์ผ์œผํ‚ค๋ ค๋ฉด ์—ฌ์ „ํžˆ ERP๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ์ œ์•ˆ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ์œ ํ˜•์˜ ๋ฐ˜์‘ ์ค‘ ํ•˜๋‚˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„์˜ ์‰ฌ์šด ๊ฐ€์‹œ์„ฑ์„ ์ƒ์‹คํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์šฐ๋ ค์˜€์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, @deanveloper ๋Š” https://github.com/golang/go/issues/32437#issuecomment -498932961์—์„œ ๊ทธ ์šฐ๋ ค๋ฅผ ์•„์ฃผ ์ž˜ ํ‘œํ˜„ํ–ˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ๋†’์€ ์ง€์ง€๋ฅผ ๋ฐ›์€ ๋Œ“๊ธ€์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@dominikh ๋Š” https://github.com/golang/go/issues/32437#issuecomment -499067357์— ์ผ์Šต๋‹ˆ๋‹ค.

gofmt's ์ฝ”๋“œ์—์„œ ๋ฐ˜ํ™˜์€ ํ•ญ์ƒ /^\t*return /๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋„์›€ ์—†์ด๋Š” ๋ˆˆ์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ์‚ฌ์†Œํ•œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— try๋Š” ์ฝ”๋“œ์˜ ์–ด๋Š ๊ณณ์—์„œ๋‚˜ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ ์ž„์˜๋กœ ๊นŠ์ˆ™์ด ์ค‘์ฒฉ๋ฉ๋‹ˆ๋‹ค. ๊ต์œก์„ ์•„๋ฌด๋ฆฌ ๋งŽ์ด ํ•ด๋„ ๋„๊ตฌ ์ง€์› ์—†์ด ๊ธฐ๋Šฅ์˜ ๋ชจ๋“  ์ œ์–ด ํ๋ฆ„์„ ์ฆ‰์‹œ ๋ฐœ๊ฒฌํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด @brynbellomy ๋Š” ์–ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  try ๋ฌธ(ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋„)์€ ์ž์ฒด ์ค„์—์„œ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์•„๊ฐ€ ํ• ๋‹น์˜ ๊ฒฝ์šฐ์—๋„ try ๊ฐ€ ์ค„์˜ ์‹œ์ž‘์ด ๋˜์–ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

try dm := DecodeMsg(m)
try um := dm.SaveToDB()
try EmitEvent(um)

๋‹ค์Œ ๋Œ€์‹  ( @brynbellomy ์˜ ์˜ˆ์—์„œ):

dm, err := DecodeMsg(m)
if err != nil {
    return nil, err
}

um, err := dm.SaveToDB()
if err != nil {
    return nil, err
}

err = EmitEvent(um)
if err != nil {
    return nil, err
}

ํŽธ์ง‘์ž๋‚˜ IDE์˜ ๋„์›€ ์—†์ด๋„ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋ฉด์„œ ์ƒ๋‹นํ•œ ์–‘์˜ ๊ฐ€์‹œ์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์ œ์•ˆ์„œ์—๋Š” ๋‹ค์Œ ์˜ˆ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

info := try(try(os.Open(file)).Stat())    // proposed try built-in

๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

try f := os.Open(file)
try info := f.Stat()

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

@elagergren-spideroak์€ ๋‹ค์Œ ์˜ˆ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

try(try(try(to()).parse().this)).easily())

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

@thepudds , ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ด์ „ ๋Œ“๊ธ€์—์„œ ์–ป์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ 

try f := os.Open(file)
try info := f.Stat()

๋ถ„๋ช…ํžˆ ํ•ด์•ผ ํ•  ์ผ์€ try ๋ฅผ ๊ด„ํ˜ธ ์•ˆ์— ๋‘˜ ์ด์ƒ์˜ ๋ฌธ์žฅ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” try ๋ธ”๋ก ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์œ„๋Š” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

try (
    f := os.Open(file)
    into := f.Stat()
)

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ค‘์ฒฉ์—๋„ ๋™์ผํ•œ ์ž‘์—…์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์œ„์˜ ๋‚ด์šฉ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

try info := os.Open(file).Stat()

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•จ์ˆ˜ ์„œ๋ช…์—์„œ Open์ด ์˜ค๋ฅ˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ณ  try ๋ธ”๋ก์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ๊ธฐ๋ณธ ๋ฐ˜ํ™˜ ๊ฐ’์— ๋Œ€ํ•ด Stat()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

try (
    f := os.Open(file)
    debug("f: %v\n", f) // debug returns nothing
    into := f.Stat()
)

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

try(try(try(to()).parse()).this)).easily())

๋‚ด๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ๊ดœ์ฐฎ์€ ๋™์•ˆ

try to().parse().this().easily()

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

๋˜ ๋‹ค๋ฅธ ์ด์ ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ธฐ๋ณธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์‹๋ณ„ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์œ„์˜ ๋„ค ๊ฐ€์ง€ ๊ธฐ๋Šฅ ์ค‘ ์–ด๋–ค ๊ธฐ๋Šฅ์ด ์‹คํŒจํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

try ๊ฐ€ ๋‹ค๋ฅธ ํ‘œํ˜„์‹ ์•ˆ์— ๋‚˜ํƒ€๋‚˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ€๋…์„ฑ์— ๋Œ€ํ•ด ๋‹ค์†Œ ์šฐ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ grep "return .*err$" ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฌด์ž‘์œ„๋กœ ๋ธ”๋ก์„ ์ฝ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. 7214๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋‹จ์ง€ ๋ช‡ ๋ฐฑ๊ฐœ๋งŒ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

์ฃผ๋ชฉํ•ด์•ผ ํ•  ์ฒซ ๋ฒˆ์งธ ์‚ฌํ•ญ์€ try ๊ฐ€ ์ ์šฉ๋˜๋Š” ๊ณณ์—์„œ ๊ฑฐ์˜ ๋ชจ๋“  ๋ธ”๋ก์„ ์ข€ ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ๋Š” ์ด๋“ค ์ค‘ 10๋ถ„์˜ 1 ๋ฏธ๋งŒ์ธ ๊ทน์†Œ์ˆ˜๋งŒ์ด ๋‹ค๋ฅธ ํ‘œํ˜„์‹ ์•ˆ์— try ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” x := try(...) ๋˜๋Š” ^try(...)$ ํ˜•์‹์˜ ๋ช…๋ น๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ try ๊ฐ€ ๋‹ค๋ฅธ ํ‘œํ˜„์‹ ์•ˆ์— ๋‚˜ํƒ€๋‚˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

ํ…์ŠคํŠธ/ํ…œํ”Œ๋ฆฟ

func gt(arg1, arg2 reflect.Value) (bool, error) {
        // > is the inverse of <=.
        lessOrEqual, err := le(arg1, arg2)
        if err != nil {
                return false, err
        }
        return !lessOrEqual, nil
}

๋‹ค์Œ์ด ๋ฉ๋‹ˆ๋‹ค:

func gt(arg1, arg2 reflect.Value) (bool, error) {
        // > is the inverse of <=.
        return !try(le(arg1, arg2)), nil
}

ํ…์ŠคํŠธ/ํ…œํ”Œ๋ฆฟ

func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
        switch v.Kind() {
        case reflect.Map:
                index, err := prepareArg(index, v.Type().Key())
                if err != nil {
                        return reflect.Value{}, err
                }
                if x := v.MapIndex(index); x.IsValid() {
                        v = x
                } else {
                        v = reflect.Zero(v.Type().Elem())
                }
        ...
        }
}

๋œ๋‹ค

func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
        ...
        switch v.Kind() {
        case reflect.Map:
                if x := v.MapIndex(try(prepareArg(index, v.Type().Key()))); x.IsValid() {
                        v = x
                } else {
                        v = reflect.Zero(v.Type().Elem())
                }
        ...
        }
}

(์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋ณธ ๊ฐ€์žฅ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์˜ˆ์ž…๋‹ˆ๋‹ค)

์ •๊ทœ ํ‘œํ˜„์‹/๊ตฌ๋ฌธ:

regexp/syntax/parse.go

func Parse(s string, flags Flags) (*Regexp, error) {
        ...
        if c, t, err = nextRune(t); err != nil {
                return nil, err
        }
        p.literal(c)
        ...
}

๋œ๋‹ค

func Parse(s string, flags Flags) (*Regexp, error) {
        ...
        c, t = try(nextRune(t))
        p.literal(c)
        ...
}

์ด๊ฒƒ์€ ๋‹ค๋ฅธ ํ‘œํ˜„์‹ ๋‚ด๋ถ€์—์„œ ์‹œ๋„ํ•˜๋Š” ์˜ˆ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. c ๋ฐ t ์˜ ๊ฐ’์ด if ๋ฌธ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜ ์žˆ์Œ์„ ์—ฌ๊ธฐ์—์„œ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฌผ/http

net/http/request.go:readRequest

        mimeHeader, err := tp.ReadMIMEHeader()
        if err != nil {
                return nil, err
        }
        req.Header = Header(mimeHeader)

๋‹ค์Œ์ด ๋ฉ๋‹ˆ๋‹ค:

        req.Header = Header(try(tp.ReadMIMEHeader())

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/SQL

        if driverCtx, ok := driveri.(driver.DriverContext); ok {
                connector, err := driverCtx.OpenConnector(dataSourceName)
                if err != nil {
                        return nil, err
                }
                return OpenDB(connector), nil
        }

๋œ๋‹ค

        if driverCtx, ok := driveri.(driver.DriverContext); ok {
                return OpenDB(try(driverCtx.OpenConnector(dataSourceName))), nil
        }

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/SQL

        si, err := ctxDriverPrepare(ctx, dc.ci, query)
        if err != nil {
                return nil, err
        }
        ds := &driverStmt{Locker: dc, si: si}

๋œ๋‹ค

        ds := &driverStmt{
                Locker: dc,
                si: try(ctxDriverPrepare(ctx, dc.ci, query)),
        }

๊ทธ๋ฌผ/http

        if http2isconnectioncloserequest(req) && dialonmiss {
                // it gets its own connection.
                http2tracegetconn(req, addr)
                const singleuse = true
                cc, err := p.t.dialclientconn(addr, singleuse)
                if err != nil {
                        return nil, err
                }
                return cc, nil
        }

๋œ๋‹ค

        if http2isconnectioncloserequest(req) && dialonmiss {
                // it gets its own connection.
                http2tracegetconn(req, addr)
                const singleuse = true
                return try(p.t.dialclientconn(addr, singleuse))
        }

๊ทธ๋ฌผ/http

func (f *http2Framer) endWrite() error {
        ...
        n, err := f.w.Write(f.wbuf)
        if err == nil && n != len(f.wbuf) {
                err = io.ErrShortWrite
        }
        return err
}

๋œ๋‹ค

func (f *http2Framer) endWrite() error {
        ...
        if try(f.w.Write(f.wbuf) != len(f.wbuf) {
                return io.ErrShortWrite
        }
        return nil
}

(์ด๊ฑฐ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.)

๊ทธ๋ฌผ/http

        if f, err := fr.ReadFrame(); err != nil {
                return nil, err
        } else {
                hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
        }

๋œ๋‹ค

        hc = try(fr.ReadFrame()).(*http2ContinuationFrame)// guaranteed by checkFrameOrder

}

(์—ญ์‹œ ์ข‹๋‹ค.)

๊ทธ๋ฌผ :

        if ctrlFn != nil {
                c, err := newRawConn(fd)
                if err != nil {
                        return err
                }
                if err := ctrlFn(fd.ctrlNetwork(), laddr.String(), c); err != nil {
                        return err
                }
        }

๋œ๋‹ค

        if ctrlFn != nil {
                try(ctrlFn(fd.ctrlNetwork(), laddr.String(), try(newRawConn(fd))))
        }

์–ด์ฉŒ๋ฉด ์ด๊ฒƒ์€ ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉฐ ๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

        if ctrlFn != nil {
                c := try(newRawConn(fd))
                try(ctrlFn(fd.ctrlNetwork(), laddr.String(), c))
        }

์ „๋ฐ˜์ ์œผ๋กœ, ๋‚˜๋Š” ๋‚ด๊ฐ€ ์ฝ์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์— ๋Œ€ํ•œ try ์˜ ํšจ๊ณผ๋ฅผ ์•„์ฃผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

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

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

์ด๊ฒƒ์€ try ๋ฅผ ๋ช…๋ น๋ฌธ์œผ๋กœ ๋งŒ๋“œ๋Š” @thepudds ์˜ ํฅ๋ฏธ๋กœ์šด ์ œ์•ˆ๊ณผ ๋งค์šฐ ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์˜ˆ์ œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ํ‘œํ˜„์‹- try ๋˜๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์ถ”๊ฐ€ ๋ผ์ธ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๊ณ  ํ˜„์ƒ ์œ ์ง€:

func gt(arg1, arg2 reflect.Value) (bool, error) {
        // > is the inverse of <=.
        try lessOrEqual := le(arg1, arg2)
        return !lessOrEqual, nil
}
func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
        ...
        switch v.Kind() {
        case reflect.Map:
                try index := prepareArg(index, v.Type().Key())
                if x := v.MapIndex(index); x.IsValid() {
                        v = x
                } else {
                        v = reflect.Zero(v.Type().Elem())
                }
        ...
        }
}
func Parse(s string, flags Flags) (*Regexp, error) {
        ...
        try c, t = nextRune(t)
        p.literal(c)
        ...
}
        try mimeHeader := tp.ReadMIMEHeader()
        req.Header = Header(mimeHeader)
        if driverCtx, ok := driveri.(driver.DriverContext); ok {
                try connector := driverCtx.OpenConnector(dataSourceName)
                return OpenDB(connector), nil
        }

์ด๊ฒƒ์€ try -ed์—ฌ์•ผ ํ•˜๋Š” ์—ฌ๋Ÿฌ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ try ํ‘œํ˜„์‹๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ‹€๋ฆผ์—†์ง€๋งŒ ์ €๋Š” ์—ฌ์ „ํžˆ ์ด ์ ˆ์ถฉ์•ˆ์˜ ๊ท ํ˜•์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

        try si := ctxDriverPrepare(ctx, dc.ci, query)
        ds := &driverStmt{Locker: dc, si: si}

์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ตœ์•…์˜ ๊ฒฝ์šฐ์ด๋ฉฐ ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

        if http2isconnectioncloserequest(req) && dialonmiss {
                // it gets its own connection.
                http2tracegetconn(req, addr)
                const singleuse = true
                try cc := p.t.dialclientconn(addr, singleuse)
                return cc, nil
        }

๋‚˜๋Š” if try ๊ฐ€ ํ•ฉ๋ฒ•์ธ์ง€ ๋˜๋Š” ํ•ฉ๋ฒ•์ด์–ด์•ผ ํ•˜๋Š”์ง€ ๋‚˜ ์ž์‹ ๊ณผ ํ† ๋ก ํ–ˆ์ง€๋งŒ ์™œ ๊ทธ๊ฒƒ์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ ์—ฌ๊ธฐ์—์„œ ์•„์ฃผ ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ•ฉ๋ฆฌ์ ์ธ ์„ค๋ช…์„ ์ œ์‹œํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

func (f *http2Framer) endWrite() error {
        ...
        if try n := f.w.Write(f.wbuf); n != len(f.wbuf) {
                return io.ErrShortWrite
        }
        return nil
}
        try f := fr.ReadFrame()
        hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
        if ctrlFn != nil {
                try c := newRawConn(fd)
                try ctrlFn(fd.ctrlNetwork(), laddr.String(), c)
        }

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

func (f *http2Framer) endWrite() error {
        ...
        if try(f.w.Write(f.wbuf) != len(f.wbuf) {
                return io.ErrShortWrite
        }
        return nil
}

๋˜ํ•œ try ๋Š” "์‹œ๋„"ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "๋ณดํ˜ธ ๊ณ„์ „๊ธฐ"์ž…๋‹ˆ๋‹ค. ์ œ์•ˆ์˜ ๊ธฐ๋ณธ ์˜๋ฏธ๊ฐ€ ๊บผ์ ธ ์žˆ์œผ๋ฉด ๊ฒฐ๊ณผ ์ฝ”๋“œ์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

func (f *http2Framer) endWrite() error {
        ...
        relay n := f.w.Write(f.wbuf)
        return checkShortWrite(n, len(f.wbuf))
}

try ๋ฌธ์„ ๋งŒ๋“ค๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜ ๊ฐ’๊ณผ ์ž‘์—…์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

try c, @      := newRawConn(fd) // return
try c, <strong i="6">@panic</strong> := newRawConn(fd) // panic
try c, <strong i="7">@hname</strong> := newRawConn(fd) // invoke named handler
try c, <strong i="8">@_</strong>     := newRawConn(fd) // ignore, or invoke "ignored" handler if defined

์ตœ์†Œํ•œ ํŒจ๋‹‰ ๋ฐ ๋ฌด์‹œ ์ž‘์—…์— ๋Œ€ํ•ด์„œ๋Š” ํ•˜์œ„ ํ‘œํ˜„์‹ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(Russ๋Š” ์ด๊ฒƒ์ด ์š”๊ตฌ ์‚ฌํ•ญ์ด๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค).

๋จผ์ € @crawshaw ๊ฐ€ ์‹œ๊ฐ„์„ ๋‚ด์–ด ๋Œ€๋žต 200๊ฐœ์˜ ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์œ„์˜ ์‚ฌ๋ ค ๊นŠ์€ ๊ธ€์„ ์ž‘์„ฑํ•ด ์ฃผ์‹  ๋ฐ ๋Œ€ํ•ด ๋ฐ•์ˆ˜๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

๋‘˜์งธ, @jimmyfrasche , http2Framer ์˜ˆ์‹œ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์‘๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


๋‚˜๋Š” if try ๊ฐ€ ํ•ฉ๋ฒ•์ธ์ง€ ๋˜๋Š” ํ•ฉ๋ฒ•์ด์–ด์•ผ ํ•˜๋Š”์ง€ ๋‚˜ ์ž์‹ ๊ณผ ํ† ๋ก ํ–ˆ์ง€๋งŒ, ์™œ ๊ทธ๊ฒƒ์ด ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ ์—ฌ๊ธฐ์—์„œ ์•„์ฃผ ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ•ฉ๋ฆฌ์ ์ธ ์„ค๋ช…์„ ์ œ์‹œํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

```
func (f *http2Framer) endWrite() ์˜ค๋ฅ˜ {
...
์‹œ๋„ n := fwWrite(f.wbuf); n != len(f.wbuf) {
io.ErrShortWrite ๋ฐ˜ํ™˜
}
๋ฐ˜ํ™˜ ์—†์Œ
}

At least under what I was suggesting above in https://github.com/golang/go/issues/32437#issuecomment-500213884, under that proposal variation I would suggest `if try` is not allowed.

That `http2Framer` example could instead be:

func (f *http2Framer) endWrite() ์˜ค๋ฅ˜ {
...
์‹œ๋„ n := fwWrite(f.wbuf)
๋งŒ์•ฝ n != len(f.wbuf) {
io.ErrShortWrite ๋ฐ˜ํ™˜
}
๋ฐ˜ํ™˜ ์—†์Œ
}
`` That is one line longer, but hopefully still "light on the page". Personally, I think that (arguably) reads more cleanly, but more importantly it is easier to see the ์‹œ๋„`.

@deanveloper ๋Š” https://github.com/golang/go/issues/32437#issuecomment -498932961์—์„œ ์œ„์—์„œ ์ผ์Šต๋‹ˆ๋‹ค.

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

ํŠน์ • http2Framer ์˜ˆ์ œ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์งง์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ try ๊ฐ€ ํ–‰์˜ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์ด์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜์—์„œ ๋” "์‹ ์„ฑํ•œ" ๋ฐ˜ํ™˜์„ ๋ณด๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.

@crawshaw ์–ธ๊ธ‰:

๋‘ ๋ฒˆ์งธ๋Š” 10๋ถ„์˜ 1๋„ ๋˜์ง€ ์•Š๋Š” ์•„์ฃผ ์ ์€ ์ˆ˜์˜ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค๋ฅธ ํ‘œํ˜„์‹ ์•ˆ์— try๋ฅผ ๋„ฃ์„ ๊ฒƒ์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” x := try(...) ๋˜๋Š” ^try(...)$ ํ˜•์‹์˜ ๋ช…๋ น๋ฌธ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ try ์˜ ๋ณด๋‹ค ์ œํ•œ๋œ ํ˜•์‹์œผ๋กœ 10๊ฐœ ์ค‘ 1๊ฐœ์˜ ์˜ˆ์ œ๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ๋งŒ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค try ๋ผ์ธ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@jimmyfrasche

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

์ด๊ฒƒ์€ try ๋ฅผ ๋ช…๋ น๋ฌธ์œผ๋กœ ๋งŒ๋“œ๋Š” @thepudds ์˜ ํฅ๋ฏธ๋กœ์šด ์ œ์•ˆ๊ณผ ๋งค์šฐ ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์˜ˆ์ œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ํ‘œํ˜„์‹- try ๋˜๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์ถ”๊ฐ€ ๋ผ์ธ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๊ณ  ํ˜„์ƒ ์œ ์ง€:

func gt(arg1, arg2 reflect.Value) (bool, error) {
        // > is the inverse of <=.
        try lessOrEqual := le(arg1, arg2)
        return !lessOrEqual, nil
}

์ฒซ ๋ฒˆ์งธ ์˜ˆ๋Š” ๋‚ด๊ฐ€ try ํ‘œํ˜„์‹์„ ์„ ํ˜ธํ•˜๋Š” ์ด์œ ๋ฅผ ์ž˜ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ฒ„์ „์—์„œ๋Š” le ์— ๋Œ€ํ•œ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€์ˆ˜์— ๋„ฃ์–ด์•ผ ํ•˜์ง€๋งŒ ๊ทธ ๋ณ€์ˆ˜์—๋Š” le ๋ผ๋Š” ์šฉ์–ด๊ฐ€ ์ด๋ฏธ ์•”์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ๋ก ์  ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜๋ฏธ๊ฐ€ ์—†๊ฑฐ๋‚˜(์˜ˆ x ) ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”(์˜ˆ lessOrEqual ) ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. expression- try ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๊ฐ„ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

try (ํ‚ค์›Œ๋“œ)๊ฐ€ ์ค„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์œผ๋กœ ์ด๋™๋œ ๋งˆ์ง€๋ง‰ ๋ช‡ ๊ฐœ์˜ ๊ฒŒ์‹œ๋ฌผ ๋’ค์— ์ œ ์ง€์›์„ ์ œ๊ณตํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. return ์™€ ๊ฐ™์€ ์‹œ๊ฐ์  ๊ณต๊ฐ„์„ ๊ณต์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Re: @jimmyfrasche ๊ฐ€ try ๋ฅผ ๋ณตํ•ฉ if ๋ช…๋ น๋ฌธ ๋‚ด์—์„œ ํ—ˆ์šฉํ•˜๋„๋ก ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ด๊ฒƒ์ด ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋กœ ์—ฌ๊ธฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์‚ฌ๋žŒ๋“ค์ด try ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๊ฐ๋„์—์„œ ์ด ์ƒํ™ฉ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. try / else ๊ตฌ๋ฌธ์— ํ›„์† ์กฐ๊ฑด( err ๋ฐ n ์„ ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋งŽ์€ I/O ํ•จ์ˆ˜์˜ ๊ณตํ†ต ํŒจํ„ด)์„ ํฌํ•จํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

func (f *http2Framer) endWrite() error {
        // ...
        try n := f.w.Write(f.wbuf) else err {
                return errors.Wrap(err, "error writing:")
        } else if n != len(f.wbuf) {
                return io.ErrShortWrite
        }
        return nil
}

.Write ์—์„œ ๋ฐ˜ํ™˜๋œ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ .Write ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ช…ํ™•ํ•œ ์ฃผ์„์ด ์žˆ์Šต๋‹ˆ๋‹ค(@thepudds์—์„œ ์ง€์ ํ•œ ๋Œ€๋กœ).

func (f *http2Framer) endWrite() error {
        // ...
        try n := f.w.Write(f.wbuf)
        if n != len(f.wbuf) {
                return io.ErrShortWrite
        }
        return nil
}

๋‚˜๋Š” ๋‘ ๋ฒˆ์งธ @daved ์˜ ์‘๋‹ต์ž…๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— @crawshaw ๊ฐ€ ๊ฐ•์กฐ ํ‘œ์‹œํ•œ ๊ฐ ์˜ˆ์ œ๋Š” try ์˜ ๊ฒฐ๊ณผ๋กœ ๋œ ๋ช…ํ™•ํ•ด์ง€๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

try (ํ‚ค์›Œ๋“œ)๊ฐ€ ์ค„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์œผ๋กœ ์ด๋™๋œ ๋งˆ์ง€๋ง‰ ๋ช‡ ๊ฐœ์˜ ๊ฒŒ์‹œ๋ฌผ ๋’ค์— ์ œ ์ง€์›์„ ์ œ๊ณตํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. return ์™€ ๊ฐ™์€ ์‹œ๊ฐ์  ๊ณต๊ฐ„์„ ๊ณต์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

ใ….)

try f := os.Open(filepath) else err {
    return errors.Wrap(err, "can't open")
}

๋น„.)

f := try os.Open(filepath) else err {
    return errors.Wrap(err, "can't open")
}

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

@davecheney @daved @crawshaw
๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด Daves์˜ ์˜๊ฒฌ์— ๋™์˜ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. @crawshaw ์˜ ์˜ˆ์—๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์ผ์ด ์ง„ํ–‰๋˜๋Š” ๋ผ์ธ์— ๊นŠ์ด ํฌํ•จ๋œ ๋งŽ์€ try ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ถœ๊ตฌ ์ง€์ ์„ ์ฐพ๊ธฐ๊ฐ€ ์ •๋ง ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, try ๊ด„ํ˜ธ๋Š” ์ผ๋ถ€ ์˜ˆ์—์„œ ์ƒํ™ฉ์„ ์ƒ๋‹นํžˆ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

  • try ๋ฅผ ํ‚ค์›Œ๋“œ๋กœ
  • ํ•œ ์ค„ try ํ•˜๋‚˜๋งŒ
  • try ๋Š” ์ค„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

ํ…์ŠคํŠธ/ํ…œํ”Œ๋ฆฟ

func gt(arg1, arg2 reflect.Value) (bool, error) {
        // > is the inverse of <=.
        lessOrEqual, err := le(arg1, arg2)
        if err != nil {
                return false, err
        }
        return !lessOrEqual, nil
}

๋‹ค์Œ์ด ๋ฉ๋‹ˆ๋‹ค:

func gt(arg1, arg2 reflect.Value) (bool, error) {
        // > is the inverse of <=.
        try lessOrEqual := le(arg1, arg2)
        return !lessOrEqual, nil
}

ํ…์ŠคํŠธ/ํ…œํ”Œ๋ฆฟ

func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
        switch v.Kind() {
        case reflect.Map:
                index, err := prepareArg(index, v.Type().Key())
                if err != nil {
                        return reflect.Value{}, err
                }
                if x := v.MapIndex(index); x.IsValid() {
                        v = x
                } else {
                        v = reflect.Zero(v.Type().Elem())
                }
        ...
        }
}

๋œ๋‹ค

func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
        ...
        switch v.Kind() {
        case reflect.Map:
                try index := prepareArg(index, v.Type().Key())
                if x := v.MapIndex(index); x.IsValid() {
                        v = x
                } else {
                        v = reflect.Zero(v.Type().Elem())
                }
        ...
        }
}

์ •๊ทœ ํ‘œํ˜„์‹/๊ตฌ๋ฌธ:

regexp/syntax/parse.go

func Parse(s string, flags Flags) (*Regexp, error) {
        ...
        if c, t, err = nextRune(t); err != nil {
                return nil, err
        }
        p.literal(c)
        ...
}

๋œ๋‹ค

func Parse(s string, flags Flags) (*Regexp, error) {
        ...
        try c, t = nextRune(t)
        p.literal(c)
        ...
}

๊ทธ๋ฌผ/http

net/http/request.go:readRequest

        mimeHeader, err := tp.ReadMIMEHeader()
        if err != nil {
                return nil, err
        }
        req.Header = Header(mimeHeader)

๋‹ค์Œ์ด ๋ฉ๋‹ˆ๋‹ค:

        try mimeHeader := tp.ReadMIMEHeader()
        req.Header = Header(mimeHeader)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/SQL

        if driverCtx, ok := driveri.(driver.DriverContext); ok {
                connector, err := driverCtx.OpenConnector(dataSourceName)
                if err != nil {
                        return nil, err
                }
                return OpenDB(connector), nil
        }

๋œ๋‹ค

        if driverCtx, ok := driveri.(driver.DriverContext); ok {
                try connector := driverCtx.OpenConnector(dataSourceName)
                return OpenDB(connector), nil
        }

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/SQL

        si, err := ctxDriverPrepare(ctx, dc.ci, query)
        if err != nil {
                return nil, err
        }
        ds := &driverStmt{Locker: dc, si: si}

๋œ๋‹ค

        try si := ctxDriverPrepare(ctx, dc.ci, query)
        ds := &driverStmt{Locker: dc, si: si}

๊ทธ๋ฌผ/http

        if http2isconnectioncloserequest(req) && dialonmiss {
                // it gets its own connection.
                http2tracegetconn(req, addr)
                const singleuse = true
                cc, err := p.t.dialclientconn(addr, singleuse)
                if err != nil {
                        return nil, err
                }
                return cc, nil
        }

๋œ๋‹ค

        if http2isconnectioncloserequest(req) && dialonmiss {
                // it gets its own connection.
                http2tracegetconn(req, addr)
                const singleuse = true
                try cc := p.t.dialclientconn(addr, singleuse)
                return cc, nil
        }

๊ทธ๋ฌผ/http
์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์šฐ๋ฆฌ์—๊ฒŒ ์ค„์„ ์ €์žฅํ•˜์ง€ ์•Š์ง€๋งŒ if err == nil ๋Š” ๋น„๊ต์  ๋“œ๋ฌธ ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

func (f *http2Framer) endWrite() error {
        ...
        n, err := f.w.Write(f.wbuf)
        if err == nil && n != len(f.wbuf) {
                err = io.ErrShortWrite
        }
        return err
}

๋œ๋‹ค

func (f *http2Framer) endWrite() error {
        ...
        try n := f.w.Write(f.wbuf)
        if n != len(f.wbuf) {
                return io.ErrShortWrite
        }
        return nil
}

๊ทธ๋ฌผ/http

        if f, err := fr.ReadFrame(); err != nil {
                return nil, err
        } else {
                hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
        }

๋œ๋‹ค

        try f := fr.ReadFrame()
        hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
}

๊ทธ๋ฌผ:

        if ctrlFn != nil {
                c, err := newRawConn(fd)
                if err != nil {
                        return err
                }
                if err := ctrlFn(fd.ctrlNetwork(), laddr.String(), c); err != nil {
                        return err
                }
        }

๋œ๋‹ค

        if ctrlFn != nil {
                try c := newRawConn(fd)
                try ctrlFn(fd.ctrlNetwork(), laddr.String(), c)
        }

@james-lawrence https://github.com/golang/go/issues/32437#issuecomment -500116099์— ๋Œ€ํ•œ ๋‹ต์žฅ : ์„ ํƒ์  , err ์™€ ๊ฐ™์€ ์•„์ด๋””์–ด๊ฐ€ ์‹ฌ๊ฐํ•˜๊ฒŒ ๊ณ ๋ ค๋˜๊ณ  ์žˆ๋Š”์ง€ ๊ธฐ์–ต๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ์š”. ๊ฐœ์ธ์ ์œผ๋กœ ์ด๊ฒƒ์€ ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ํ›„ํ–‰ error ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ๋ณ€๊ฒฝ๋˜๋ฉด ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ๊ณ„์† ์ปดํŒŒ์ผ๋˜์ง€๋งŒ ๋งค์šฐ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด defer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์˜๋ฏธ๊ฐ€ ์žˆ์ง€๋งŒ ์˜ค๋ฅ˜์˜ ์ด๋ฆ„๊ณผ ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ if err != nil ์ƒ์šฉ๊ตฌ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™ธ๋ถ€ ์ฒ˜๋ฆฌ๊ธฐ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

func handler(err *error) {
  if *err != nil {
    *err = handle(*err)
  }
} 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

defer handler(&err)

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

๋‚ด๋ถ€ ์ฒ˜๋ฆฌ๊ธฐ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

defer func() {
  if err != nil {
    err = handle(err)
  }
}()

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์˜ค๋ฅ˜์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ์˜ ์•ž๋ถ€๋ถ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ๋‹จ์ผ ํ•จ์ˆ˜๋กœ ์ถ”์ƒํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func catch(err *error, handle func(error) error) {
  if *err != nil && handle != nil {
    *err = handle(*err)
  }
}

์ด๋Š” nil ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์˜ ๋ชจํ˜ธ์„ฑ์— ๋Œ€ํ•œ @griesemer ์˜ ์šฐ๋ ค์™€ ์ƒ์ถฉ๋˜๋ฉฐ err ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์ž์ฒด defer ๋ฐ func(err error) error ์ƒ์šฉ๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. err ๋Š” ์™ธ๋ถ€ ํ•จ์ˆ˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

try ๊ฐ€ ํ‚ค์›Œ๋“œ๋กœ ๋๋‚˜๋Š” ๊ฒฝ์šฐ ์•„๋ž˜์— ์„ค๋ช…๋œ catch ํ‚ค์›Œ๋“œ๋„ ์žˆ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ์ƒ handle ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

catch err {
  return handleThe(err)
}

์˜๋ฏธ์ ์œผ๋กœ ์œ„์˜ ๋‚ด๋ถ€ ์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์„คํƒ•์ด ๋ฉ๋‹ˆ๋‹ค.

defer func() {
  if err != nil {
    err = handleThe(err)
  }
}()

๋‹ค์†Œ ๋งˆ์ˆ ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์˜ค๋ฅ˜๋ฅผ ์žก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ($# catch err ๋’ค์˜ err๋Š” catch ๋ธ”๋ก์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.)

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

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

๋ณต์žกํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” try ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ catch ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

catch err {
  log.Print(err)
  return err
}

๋˜๋Š” ๋ฐ˜ํ™˜๋œ ๋ชจ๋“  ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.

catch err {
  return fmt.Errorf("foo: %w", err)
}

@ianlancetaylor

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

์—…์ŠคํŠธ๋ฆผ ์ฝ”๋“œ์™€ ๋‹ค์šด์ŠคํŠธ๋ฆผ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜ ์„œ๋ช…์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์„œ๋ช…์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ์˜ˆ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ €์—๊ฒŒ ๊ทธ๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ _"์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ค„ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค"_ ๋˜๋Š” _"๊ฒŒ์œผ๋ฆ„์„ ๋Š๋ผ๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๋ ฅํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค."์˜ ๋ฒ”์ฃผ์— ์†ํ•ฉ๋‹ˆ๋‹ค. _

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

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

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


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

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


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

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

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

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

try ํ‚ค์›Œ๋“œ๋Š” ํ™•์‹คํžˆ ๊ฐ€๋…์„ฑ(ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋Œ€๋น„)์— ๋„์›€์ด ๋˜๋ฉฐ ๋œ ๋ณต์žกํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. @brynbellomy @crawshaw ์‹œ๊ฐ„์„ ๋‚ด์–ด ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

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

์กฐ๊ฑด๋ถ€ ๋ฐ˜ํ™˜์— ๋Œ€ํ•œ ๋ฏธ๋‹ˆ ์ œ์•ˆ

๋ฐœ์ทŒ:

err, thing := newThing(name)
refuse nil, err

์œ„ํ‚ค์—๋„ "๋Œ€์•ˆ ์•„์ด๋””์–ด"์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋„ ๋งค์šฐ ํ•ฉ๋ฆฌ์ ์ธ ์„ ํƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

@alexhornbake ๋” ์œ ์šฉํ•  ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

assert(nil, err)
assert(len(a), len(b))
assert(true, condition)
assert(expected, given)

์ด ๋ฐฉ๋ฒ•์€ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ์—๋งŒ ์ ์šฉ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋งŽ์€ ์œ ํ˜•์˜ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ๊ฒƒ์€ ์˜ค๋ฅ˜๋กœ ๋ž˜ํ•‘๋˜๊ณ  ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

@alexhornbake

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

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

        req.Header = Header(try(tp.ReadMIMEHeader())

๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ž์ฃผ ๊ทธ๋ฆฌ์›Œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋น ๋ฅธ ์ฝ๊ธฐ๋Š” "ํ™•์ธ, ํ—ค๋”๋ฅผ ReadMimeHeader์˜ ํ—ค๋”๋กœ ์„ค์ •"ํ•ฉ๋‹ˆ๋‹ค.

        if driverCtx, ok := driveri.(driver.DriverContext); ok {
                return OpenDB(try(driverCtx.OpenConnector(dataSourceName))), nil
        }

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

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

        ds := &driverStmt{
                Locker: dc,
                si: try(ctxDriverPrepare(ctx, dc.ci, query)),
        }   

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

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

@daved ํŒ”๋กœ์šฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๊ฑฐ๋‚˜ ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

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

@jimmyfrasche ์˜ ์บ์น˜ ์ œ์•ˆ ์ด ๋งˆ์Œ์— ๋“ค์ง€๋งŒ ๋Œ€์•ˆ์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
go handler fmt.HandleErrorf("copy %s %s", src, dst)
๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
go defer func(){ if(err != nil){ fmt.HandleErrorf(&err,"copy %s %s", src, dst) } }()
์—ฌ๊ธฐ์„œ err์€ ์œ ํ˜• ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋„ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
go handler func(err *error){ *err = fmt.Errorf("foo: %w", *err) }() `
๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๊ฐ’(catch๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Œ)์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ์ฃผ์š” ๋ฌธ์ œ๋Š” err์ด ๋ถˆํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. fmt.HandleErrorf ์™€ ๊ฐ™์€ ์ฒ˜๋ฆฌ๊ธฐ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ์—ฐ๊ธฐํ•  ๋•Œ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ํ•ฉ๋ฆฌ์ ์ธ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์ˆ˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

@yiyus catch , ์ •์˜ํ•œ ๋Œ€๋กœ catch ๋ฅผ ํฌํ•จํ•˜๋Š” ํ•จ์ˆ˜์— err ์ด๋ฆ„์„ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

catch err { ์—์„œ err ๋Š” catch ๋ธ”๋ก ๋‚ด ์—์„œ ์ด๋ฆ„์ด ์ง€์ •๋œ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์œผ๋กœ fmt.HandleErrorf fmt.Errorf ๊ฐ™์€ ๊ฒƒ์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

func f() error {
  catch err {
    return fmt.Errorf("foo: %w", err)
  }
  return errors.New("bar")
}

foo: bar ๋กœ ์ธ์‡„ํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • try() ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์ƒ์œ„ ํ•จ์ˆ˜์—์„œ ์ฝ”๋“œ ์‹คํ–‰์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • return ํ‚ค์›Œ๋“œ๋Š” ์—†์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

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

  1. if x, err := thingie(); err != nil { handle(err) } ์™€ ์ƒ๋‹นํžˆ ๋‹ค๋ฅด๊ณ  ๋” ์ข‹์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. try x := thingie else err { handle(err) } ๋ผ์ธ์— ๋”ฐ๋ฅธ ์ œ์•ˆ์€ ๊ทธ ๊ธฐ์ค€์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ if ๋ผ๊ณ  ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?

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

try /handle์— ๋Œ€ํ•œ ๋Œ€์ฒด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋…ผ์˜ํ•  ๋•Œ ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค.

@carlmjohnson ์š”์  2์— ๋Œ€ํ•œ @jimmyfrasche ์˜ catch ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. defer ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์ผ ๋ฟ์ด๋ฏ€๋กœ 2์ค„์„ ์ ˆ์•ฝํ•˜๊ณ  ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ๊ฐ’์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์•„์ง ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ชจ๋“  ํ•ญ๋ชฉ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. defer ์ด๊ธฐ ๋•Œ๋ฌธ์— defer ์™€ ์ง๊ต์„ฑ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@ubombi ๊ฐ€ ๋งํ•œ ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

try() ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์ƒ์œ„ ํ•จ์ˆ˜์—์„œ ์ฝ”๋“œ ์‹คํ–‰์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.; return ํ‚ค์›Œ๋“œ๋Š” ์—†์ง€๋งŒ ์ฝ”๋“œ๋Š” ์‹ค์ œ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Ruby์—์„œ procs์™€ lambdas๋Š” try ๊ฐ€ ํ•˜๋Š” ์ผ์˜ ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค... proc์€ return ๋ฌธ์ด ๋ธ”๋ก ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ํ˜ธ์ถœ์ž๋กœ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฐ”๋กœ try ๊ฐ€ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค... ๊ทธ๋ƒฅ ๋ฏธ๋ฆฌ ์ •์˜๋œ Ruby proc์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ทธ ๊ธธ์„ ๊ฐ„๋‹ค๋ฉด ์‹ค์ œ๋กœ proc functions ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ try ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ if err != nil ๋ฅผ ์„ ํ˜ธํ•˜๋Š”๋ฐ ๊ฐ€๋…์„ฑ์ด ๋” ๋†’์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ proc์„ ์ •์˜ํ•œ๋‹ค๋ฉด try ๊ฐ€ ๋” ์œ ๋ฆฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

proc try(err *error, msg string) {
  if *err != nil {
    *err = fmt.Errorf("%v: %w", msg, *err)
    return
  }
}

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func someFunc() (string, error) {
  err := doSomething()
  try(&err, "someFunc failed")
}

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

๋˜ํ•œ ๊ฐ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ๋งŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์›๋ž˜ Go2 ์ œ์•ˆ์˜ handle {} ์ ˆ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋…์„ฑ์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ๊ณ ๋ ค ์‚ฌํ•ญ์€ func() ๋ฐ proc()์ด func() ๋ฐ proc!() ์™€ ๊ฐ™์ด ๋‹ค๋ฅด๊ฒŒ ํ˜ธ์ถœ๋˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ proc ํ˜ธ์ถœ์ด ์‹ค์ œ๋กœ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœ ๊ธฐ๋Šฅ.

@marwan-at-work, ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ try(err, "someFunc failed") ๊ฐ€ try(&err, "someFunc failed") ๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@dpinela ์ˆ˜์ •ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค :)

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

try := handler(err error) {     //which corelates with - try := func(err error) 
   if err !=nil{
       //do what ever you want to do when there's an error... log/print etc
       return2   //2 levels
   }
} 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ
f := try(os.Open(ํŒŒ์ผ ์ด๋ฆ„))
์ œ์•ˆ์ด ์กฐ์–ธํ•˜๋Š” ๋Œ€๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•จ์ˆ˜(๋˜๋Š” ์‹ค์ œ๋กœ "ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜")๋กœ์„œ ๊ฐœ๋ฐœ์ž๋Š” ํ•จ์ˆ˜๊ฐ€ ํ•˜๋Š” ์ผ, ๋‹ค๋ฅธ ๊ฒฝ์šฐ์— ์˜ค๋ฅ˜ ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ›จ์”ฌ ๋” ๋งŽ์€ ์ œ์–ด ๊ถŒํ•œ์„ ๊ฐ–๊ฒŒ ๋˜๋ฉฐ, ์œ ์‚ฌํ•œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ „์ฒด์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งค๋ฒˆ fmt.Errorf("error opening file %s ....")๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  os.Open์„ ์ฒ˜๋ฆฌํ•  ์ฝ”๋“œ(๋งํ•˜์ž๋ฉด).
์ด๊ฒƒ์€ ๋˜ํ•œ "try"๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ•์ œ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

@guybrand ์ด๋Ÿฌํ•œ 2๋‹จ๊ณ„ ๋ฐ˜ํ™˜ return2 (๋˜๋Š” Smalltalk์—์„œ ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋…์ด "๋น„๋กœ์ปฌ ๋ฐ˜ํ™˜"์ด๋ผ๊ณ  ํ•จ)์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์ข‹์€ ๋ฒ”์šฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋˜ํ•œ #32473์—์„œ @mikeschinkel ์ด ์ œ์•ˆํ•จ) . ํ•˜์ง€๋งŒ try ์ด(๊ฐ€) ๊ท€ํ•˜์˜ ์ œ์•ˆ์— ์—ฌ์ „ํžˆ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ return2 ์— ๋Œ€ํ•œ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. try ๋Š” return ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. try ๋ฅผ ์“ธ ์ˆ˜๋„ ์žˆ์œผ๋ฉด ๋” ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ด์ง€๋งŒ ์ž„์˜์˜ ์„œ๋ช…์—๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@griesemer

_" return2 ์— ๋Œ€ํ•œ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. try ๋Š” return ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."_

ํ•œ ๊ฐ€์ง€ ์ด์œ ๋Š” โ€” #32473 _(์ฐธ๊ณ ์— ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค)_ โ€” return ์™ธ์—๋„ break ๋ฐ continue ์˜ ์—ฌ๋Ÿฌ ์ˆ˜์ค€์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

1) ์ผ๋ฐ˜์ ์œผ๋กœ try ๊ธฐ๋Šฅ์— ๋‚ด์žฅ๋œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ์„ ํƒ์œผ๋กœ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ _์ ์–ด๋„_ ํ‚ค์›Œ๋“œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค( @carloslenz ๋Š” " ๊ด„ํ˜ธ"); try ํ‘œํ˜„์‹์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์œผ๋ฉฐ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๋ฉฐ( @ChrisHines , @jimmyfrasche) " return ์—†์ด ๋ฐ˜ํ™˜"๋ฉ๋‹ˆ๋‹ค. @brynbellomy ๋Š” ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉ๋œ try ์˜ ์‹ค์ œ ๋ถ„์„ ์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ๋ถ„์œจ ๊ธฐ์ค€์œผ๋กœ ๋งค์šฐ ์ ์€ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚˜ ๋„ˆ๋ฌด ๋งŽ์€ ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ํ‚ค์›Œ๋“œ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2) @crawshaw ๋Š” std ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ˆ˜๋ฐฑ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€ ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๊ณ  ์ œ์•ˆ๋œ try ๊ฐ€ ๊ฑฐ์˜ ํ•ญ์ƒ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. @jimmyfrasche ๋Š” ๋ฐ˜๋Œ€ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

3) ๋˜ ๋‹ค๋ฅธ ์ฃผ์ œ๋Š” ์˜ค๋ฅ˜ ์žฅ์‹์— defer ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. @josharian ์€ defer ๊ฐ€ ํ•ญ์ƒ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์‹œ ์‹คํ–‰๋˜์ง€๋งŒ ์˜ค๋ฅ˜ ์žฅ์‹์„ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์žˆ๋Š” ๊ฒฝ์šฐ ํ˜ผ๋™์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ณธ์ฒด์— ์‹ ๊ฒฝ์„ ์“ด๋‹ค๊ณ  ์ง€์ ํ•ฉ๋‹ˆ๋‹ค.

4) ์ œ์•ˆ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ œ์•ˆ์„ ๋งŽ์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. @zeebo , @patrick-nyt๋Š” gofmt ๋ฅผ ํ•œ ์ค„์— ๊ฐ„๋‹จํ•œ if $ ํ˜•์‹์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ ์ƒํƒœ์— ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค). @jargv ๋Š” try() (์ธ์ˆ˜ ์—†์ด)๊ฐ€ ํ˜„์žฌ "๋ณด๋ฅ˜ ์ค‘์ธ" ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด defer ์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. @masterada ๋Š” ๋Œ€์‹  errorfunc() ์‚ฌ์šฉ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. @velovix ๋Š” 2-argument try ์˜ ์•„์ด๋””์–ด๋ฅผ ๋˜์‚ด๋ ค ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@klaidliadon , @networkimprov ๋Š” try f, # := os.Open() ์™€ ๊ฐ™์€ ํŠน์ˆ˜ "ํ• ๋‹น ์—ฐ์‚ฐ์ž"๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. @networkimprov ๋Š” ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์กฐ์‚ฌํ•˜๋Š” ๋ณด๋‹ค ํฌ๊ด„์ ์ธ ๋Œ€์•ˆ ์ œ์•ˆ์„ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค(๋ฌธ์ œ #32500 ์ฐธ์กฐ). @mikeschinkel ์€ ๋˜ํ•œ ์˜ค๋ฅ˜ ๊ด€๋ จ try ๊ฐ€ ์•„๋‹Œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๋ฒ”์šฉ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•˜๋Š” ๋Œ€์•ˆ ์ œ์•ˆ์„œ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค(๋ฌธ์ œ #32473 ์ฐธ์กฐ). @josharian ์€ ์ž‘๋…„ GopherCon์—์„œ try ๊ฐ€ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๊ณ  ๋Œ€์‹  error ๋ผ๋Š” ๋ ˆ์ด๋ธ”๋กœ ์ ํ”„( goto ์‚ฌ์šฉ)ํ•˜๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ๋˜์‚ด๋ ธ์Šต๋‹ˆ๋‹ค. , try ๋Š” ๋Œ€์ƒ ๋ ˆ์ด๋ธ”์˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5) try ๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ํ•˜์—ฌ ๋‘ ์ค„์˜ ์ƒ๊ฐ์ด ๋– ์˜ฌ๋ž๋‹ค. @brynbellomy ๋Š” ๋Œ€์•ˆ์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„์ „์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

a, b := try f()
a, b := try f() else err { /* handle error */ }

@thepudds ๋Š” ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€ ์ค„ ์‹œ์ž‘ ๋ถ€๋ถ„์— try ๋ฅผ ์ œ์•ˆํ•˜์—ฌ try ์™€ return ์™€ ๋™์ผํ•œ ๊ฐ€์‹œ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

try a, b := f()

์ด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ defer ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@griesemer

@mikeschinkel #32473์— ๋Œ€ํ•œ ์ฐธ์กฐ ๋•๋ถ„์— ๊ณตํ†ต์ ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

~์— ๊ด€ํ•˜์—ฌ

๊ทธ๋Ÿฌ๋‚˜ ๊ท€ํ•˜์˜ ์ œ์•ˆ์— ์—ฌ์ „ํžˆ ์‹œ๋„๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋‚ด ์ œ์•ˆ์€ ์˜ˆ์•ฝ๋œ "build in/keyword/expression"์ด ์•„๋‹Œ "any" ํ•ธ๋“ค๋Ÿฌ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ "try()"๊ฐ€ ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ๋ฐ˜๋Œ€ ํˆฌํ‘œ๋ฅผ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค). "ํ™•๋Œ€"ํ•˜๊ธฐ ์œ„ํ•ด - ๋” ๋งŽ์€ ์žฅ์ ์„ ๋ณด์—ฌ์ค„ ๊ฒƒ์ด๋ฏ€๋กœ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด "์ผ๋‹จ go 2.0์ด ๋„์ž…๋  ๊ฒƒ"์ด๋ผ๊ณ  ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ์š”์•ฝ์—์„œ ๋ณด๊ณ ํ•œ "ํ˜ผํ•ฉ๋œ ๋ถ„์œ„๊ธฐ"์˜ ์›์ธ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. "try()๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐœ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค." - ๋ฌผ๋ก  "Go 3.0์ด ๋‹ค๋ฅธ ์ฃผ์š” ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. "๊ณ ํ†ต ์ฒ˜๋ฆฌ" ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์‚ฌ๋žŒ๋“ค์ด ๋„ˆ๋ฌด ๊ธธ์–ด ๋ณด์ž…๋‹ˆ๋‹ค. :)

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

์กฐ๋งŒ๊ฐ„ ํฅ๋ฏธ๋กœ์šด ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ - ๋†€๋ผ์šด ์ž‘์—…๊ณผ ์ธ๋‚ด์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

ํ˜„์žฌ ์ œ์•ˆ๋œ ๊ตฌ๋ฌธ์˜ ๊ธธ์ด์™€ ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ๋ฌธ์„ ๋น„๊ตํ•˜๋ฉด ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์žฅ์‹ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€์žฅ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๊ตฌ๋ฌธ์˜ ์˜ˆ:

try a, b := f() else err { return fmt.Errorf("Decorated: %s", err); }
if a,b, err :=f;  err != nil { return fmt.Errorf("Decorated: %s", err); }
try a, b := f()
if a,b, err :=f;  err != nil { return err; }

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

try else ์™€ ๊ด€๋ จํ•˜์—ฌ $# fmt.HandleErrorf (ํŽธ์ง‘: ์ž…๋ ฅ์ด nil์ผ ๋•Œ nil์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•จ)์™€ ๊ฐ™์€ ์กฐ๊ฑด๋ถ€ ์˜ค๋ฅ˜ ๊ธฐ๋Šฅ์€ ์ดˆ๊ธฐ ์ฃผ์„์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋ฏ€๋กœ else ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

a, b, err := doSomething()
try fmt.HandleErrorf(&err, "Decorated "...)

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

๋‚˜๋Š” ๋˜ํ•œ ์ด๋ฆ„์ด ์ ์ ˆํ•˜์ง€ ์•Š๋‹ค๋Š” @daved ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ๋‹ฌ์„ฑํ•˜๋ ค๋Š” ๊ฒƒ์€ ๋ณดํ˜ธ๋œ ํ• ๋‹น์ด๋ฏ€๋กœ Swift์—์„œ์™€ ๊ฐ™์ด guard ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  else ์ ˆ์„ ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฐ™์€ ๊ฒƒ

GuardStmt = "guard" ( Assignment | ShortVarDecl | Expression ) [  "else" Identifier Block ] .

์—ฌ๊ธฐ์„œ Identifier ๋Š” ๋‹ค์Œ Block ์— ๋ฐ”์ธ๋”ฉ๋œ ์˜ค๋ฅ˜ ๋ณ€์ˆ˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. else ์ ˆ์ด ์—†์œผ๋ฉด ํ˜„์žฌ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ง€์—ฐ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์žฅ์‹ํ•ฉ๋‹ˆ๋‹ค).

์ฒ˜์Œ์—๋Š” else ์ ˆ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” $# guard if err != nil ๋’ค์— ์˜ค๋Š” ์ผ๋ฐ˜์ ์ธ ํ• ๋‹น์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ์ƒ์˜ ์„คํƒ•์ผ ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. guard ๋Š” ์˜๋„๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ผ๋ถ€๋Š” catch ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋„๋ก ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. else ์˜๋ฏธ๋ก ์ ์œผ๋กœ ๋˜‘๊ฐ™์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ณ  ์ด๋ฏธ ์–ธ์–ด์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” try-else ๋ฌธ์„ ์ข‹์•„ํ•˜์ง€๋งŒ ์ด ๊ตฌ๋ฌธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

a, b, (err) := func() else { return err }

try - else ํ‘œํ˜„์‹์€ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.

a, b := try f() else err { ... }
fmt.Println(try g() else err { ... })`

๋ช…๋ น๋ฌธ try - else ๋Š” if ๋ช…๋ น๋ฌธ์ž…๋‹ˆ๋‹ค.

try a, b := f() else err { ... }
// (modulo scope of err) same as
a, b, err := f()
if err != nil { ... }

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

a, b := try(f(), decorate)
// same as
a, b := try(g())
// where g is
func g() (whatever, error) {
  x, err := f()
  if err != nil {
    try(decorate(err))
  }
  return x, nil
}

์„ธ ๊ฐ€์ง€ ๋ชจ๋‘ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๊ณ  ์˜ค๋ฅ˜ ๋ฒ”์œ„๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋‚ด์žฅ try ์— ๋Œ€ํ•ด ๊ฐ€์žฅ ๋งŽ์€ ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์„ค๊ณ„ ๋ฌธ์„œ์— ์–ธ๊ธ‰๋œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

try - else ์˜ ๊ฒฝ์šฐ try if ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์žฅ์ ์ด ๋„ˆ๋ฌด ๋ฏธ๋ฏธํ•ด์„œ ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๊ธด ํ•˜์ง€๋งŒ ๊ทธ ์ž์ฒด๋กœ ์ •๋‹นํ™”๋˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์„ธ ๊ฐ€์ง€ ๋ชจ๋‘ ๊ฐœ๋ณ„ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ํŠน๋ณ„ํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์˜ค๋ฅ˜๋ฅผ ๋™๋“ฑํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ defer ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ else ๋ธ”๋ก์—์„œ ๋™์ผํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์•ฝ๊ฐ„ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค.

func printSum(a, b string) error {
  try x := strconv.Atoi(a) else err {
    return fmt.Errorf("printSum: %w", err)
  }
  try y := strconv.Atoi(b) else err {
    return fmt.Errorf("printSum: %w", err)
  }
  fmt.Println("result:", x + y)
  return nil
}

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

else /handler๊ฐ€ ์—†๋Š” try ๋Œ€ else๊ฐ€ ์žˆ๋Š” else try ์˜ ์‹ค์ œ ๋ถ„ํฌ๊ฐ€ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๋Š” ์‹ค์ œ ๋ถ„ํฌ๋ฅผ ๋ณด๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ˆ˜์ง‘ํ•˜๊ธฐ ์‰ฌ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

@jimmyfrasche ์˜ ์ตœ๊ทผ ๋Œ“๊ธ€์„ ํ™•์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์˜ ๋ชฉํ‘œ๋Š” ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    a, b, err := f()
    if err != nil {
        return nil, err
    }

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

    try a, b := f() else err { return nil, err }

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ์ ˆ์•ฝํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋Š๋ผ์ง€ ์•Š์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์„ธ ์ค„์„ ์ ˆ์•ฝํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ด๋Š” ์ข‹์€ ์ผ์ด์ง€๋งŒ ์ œ ๊ณ„์‚ฐ์œผ๋กœ๋Š” 56์ž์—์„œ 46์ž๋กœ ์ค„์˜€์Šต๋‹ˆ๋‹ค. ๋ณ„๋กœ์ž…๋‹ˆ๋‹ค. ๋น„๊ต

    a, b := try(f())

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

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

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์˜ˆ์ œ์— ๋Œ€ํ•ด @crawshaw ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์˜ˆ๋ฅผ ์ฝ์„ ๋•Œ try ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๊ณ  ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ํ†ต์ œ์˜ ํ๋ฆ„์ด ๊ทธ ์–ธ์–ด๋ฅผ ์•„๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ณง ์ œ2์˜ ์ฒœ์„ฑ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์•„๋งˆ๋„ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ •์ƒ์ ์ธ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ๋žŒ๋“ค์ด ์˜ค๋ฅ˜์˜ ๊ฒฝ์šฐ์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. if err != nil { return err } ์œ„์— ์ด๋ฏธ ์œ ์•ฝ์„ ๋ฐ”๋ฅด๋“ฏ์ด try ์œ„์— ์œ ์•ฝ์„ ๋ฐ”๋ฅด๋ฉด์„œ ์ด๋Ÿฌํ•œ ์˜ˆ๋ฅผ ์ฝ์–ด๋ณด์‹ญ์‹œ์˜ค.

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

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

  2. ๊ทธ ์ด๋ฆ„์€ ๊ทธ ๊ธฐ๋Šฅ์„ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ๋กœ, ๊ทธ๊ฒƒ์ด ํ•˜๋Š” ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: "๋งŒ์•ฝ ํ•จ์ˆ˜๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด, ํ˜ธ์ถœ์ž๋กœ๋ถ€ํ„ฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค." ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋„ˆ๋ฌด ๊น๋‹ˆ๋‹ค :-) ์ตœ์†Œํ•œ ๋‹ค๋ฅธ ์ด๋ฆ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  3. try์˜ ์•”์‹œ์  ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์„ ์‚ฌ์šฉํ•˜๋ฉด Go๊ฐ€ ๋งˆ์ง€ ๋ชปํ•ด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ์ฆ‰, A๊ฐ€ try ๊ฐ€๋“œ์—์„œ ํ˜ธ์ถœ๋˜๊ณ  B๊ฐ€ try ๊ฐ€๋“œ์—์„œ C๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  C๊ฐ€ try ๊ฐ€๋“œ์—์„œ D๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ D๊ฐ€ ์‹ค์ œ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋กœ์ปฌ์ด ์•„๋‹Œ goto๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋„ˆ๋ฌด "๋งˆ๋ฒ•์ "์œผ๋กœ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

  4. ๊ทธ๋Ÿฌ๋‚˜ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ์‹œ๋„๋ฅผ ์„ ํƒํ•˜๋ฉด ํ•ด๋‹น ์˜ต์…˜์ด ๋‹ซํž™๋‹ˆ๋‹ค.

@ianlancetaylor
"๋‹ค๋ฅธ ์‹œ๋„" ์ œ์•ˆ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด else ๋ธ”๋ก์€ ์„ ํƒ ์‚ฌํ•ญ์ด๋ฉฐ ์‚ฌ์šฉ์ž ์ œ๊ณต ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์˜ˆ์•ฝ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ try a, b := f() else err { return nil, err } else ์ ˆ์€ ์‹ค์ œ๋กœ ์ค‘๋ณต๋˜๋ฉฐ ์ „์ฒด ํ‘œํ˜„์‹์€ try a, b := f() ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ianlancetaylor๋‹˜ ๋ง์”€ ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ€๋…์„ฑ๊ณผ ์ƒ์šฉ๊ตฌ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ์ด๋ฉฐ ์•„๋งˆ๋„
go 2.0 ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ(๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ)

๋˜ํ•œ ํ˜„์žฌ์˜

a, b, err := f()
if err != nil {
    return nil, err
}

๊ฐ€๋…์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๋ฏฟ๊ธฐ ๋•Œ๋ฌธ์—

if a, b, err := f(); err != nil {
    return nil, err
}

๊ฑฐ์˜ ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฒ”์œ„๊ฐ€ "๋ฌธ์ œ"์˜€์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ifErr a, b, err := f() {
    return nil, err
}

๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ; err != ๋ถ€๋ถ„์ด ์—†๊ณ  ๋ฒ”์œ„๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ฑฐ๋‚˜

๋น„์Šทํ•˜๊ฒŒ

์‹œ๋„ a, b, ์˜ค๋ฅ˜ := f() {
๋ฐ˜ํ™˜ ์—†์Œ, ์˜ค๋ฅ˜
}

์—ฌ๋ถ„์˜ ๋‘ ์ค„์„ ์œ ์ง€ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2019๋…„ 6์›” 11์ผ ํ™”์š”์ผ, 20:19 Dmitriy Matrenichev, [email protected]
์ผ๋‹ค:

@ianlancetaylor https://github.com/ianlancetaylor
"๋‹ค๋ฅธ ์‹œ๋„" ์ œ์•ˆ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด else๊ฐ€ ์ฐจ๋‹จ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์„ ํƒ ์‚ฌํ•ญ์ด๋ฉฐ ์‚ฌ์šฉ์ž ์ œ๊ณต ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์˜ˆ์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ
try a, b := f() else err { return nil, err } else ์ ˆ์€ ์‹ค์ œ๋กœ
์ค‘๋ณต๋˜๋ฉฐ ์ „์ฒด ํ‘œํ˜„์‹์€ ๋‹จ์ˆœํžˆ try, b :=๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ํ”„()

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

@ianlancetaylor

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

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. else ๋Š” ๊ตฌ๋ฌธ์ƒ์˜ ์„คํƒ•(์ด์ƒํ•œ ๊ตฌ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค!)์ผ ๋ฟ์ด๋ฉฐ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฏ€๋กœ ๊ทธ๋‹ค์ง€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ try ๋ฅผ ์ง„์ˆ ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@ianlancetaylor Echoing @DmitriyMV , else ๋ธ”๋ก์€ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ๋ฅผ ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค(์‹ค์ œ ์ฝ”๋“œ์—์„œ ์ฒ˜๋ฆฌ๋œ ๋ธ”๋ก๊ณผ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ try ๋ธ”๋ก์˜ ์ƒ๋Œ€์  ๋น„์œจ ์ธก๋ฉด์—์„œ ๋ณผ ๋•Œ ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค).

func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
    headRef, err := r.Head()
    if err != nil {
        return err
    }

    parentObjOne, err := headRef.Peel(git.ObjectCommit)
    if err != nil {
        return err
    }

    parentObjTwo, err := remoteBranch.Reference.Peel(git.ObjectCommit)
    if err != nil {
        return err
    }

    parentCommitOne, err := parentObjOne.AsCommit()
    if err != nil {
        return err
    }

    parentCommitTwo, err := parentObjTwo.AsCommit()
    if err != nil {
        return err
    }

    treeOid, err := index.WriteTree()
    if err != nil {
        return err
    }

    tree, err := r.LookupTree(treeOid)
    if err != nil {
        return err
    }

    remoteBranchName, err := remoteBranch.Name()
    if err != nil {
        return err
    }

    userName, userEmail, err := r.UserIdentityFromConfig()
    if err != nil {
        userName = ""
        userEmail = ""
    }

    var (
        now       = time.Now()
        author    = &git.Signature{Name: userName, Email: userEmail, When: now}
        committer = &git.Signature{Name: userName, Email: userEmail, When: now}
        message   = fmt.Sprintf(`Merge branch '%v' of %v`, remoteBranchName, remote.Url())
        parents   = []*git.Commit{
            parentCommitOne,
            parentCommitTwo,
        }
    )

    _, err = r.CreateCommit(headRef.Name(), author, committer, message, tree, parents...)
    if err != nil {
        return err
    }
    return nil
}
func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
    try headRef := r.Head()
    try parentObjOne := headRef.Peel(git.ObjectCommit)
    try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
    try parentCommitOne := parentObjOne.AsCommit()
    try parentCommitTwo := parentObjTwo.AsCommit()
    try treeOid := index.WriteTree()
    try tree := r.LookupTree(treeOid)
    try remoteBranchName := remoteBranch.Name()
    try userName, userEmail := r.UserIdentityFromConfig() else err {
        userName = ""
        userEmail = ""
    }

    var (
        now       = time.Now()
        author    = &git.Signature{Name: userName, Email: userEmail, When: now}
        committer = &git.Signature{Name: userName, Email: userEmail, When: now}
        message   = fmt.Sprintf(`Merge branch '%v' of %v`, remoteBranchName, remote.Url())
        parents   = []*git.Commit{
            parentCommitOne,
            parentCommitTwo,
        }
    )

    try r.CreateCommit(headRef.Name(), author, committer, message, tree, parents...)
    return nil
}

try / else ํŒจํ„ด์€ ๋ณตํ•ฉ if ๋ฅผ ํ†ตํ•ด ๋งŽ์€ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ try ๊ฐ€ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ianlancetaylor

if err != nil { return err } ์ด๋ฏธ ์œ ์•ฝ์„ ๋ฐ”๋ฅด๋“ฏ์ด ์œ ์•ฝ์„ ๋ฐ”๋ฅด๋Š” ๋™์•ˆ ์ด ์˜ˆ์ œ๋ฅผ ์ฝ์–ด๋ณด์‹ญ์‹œ์˜ค.

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

@ianlancetaylor

๋‚˜๋Š” ์ •์ง€ ์‹ ํ˜ธ๋ฅผ ๋ณผ ๋•Œ ์ธ์‡„๋œ ๋‹จ์–ด๋ฅผ ์ฝ๊ณ  ๊ทธ ๊นŠ์€ ์˜๋ฏธ๋ฅผ ์ˆ™๊ณ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ชจ์–‘๊ณผ ์ƒ‰์ƒ์œผ๋กœ ๋” ๋งŽ์ด ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋ˆˆ์€ if err != nil { return err } ์ด์ƒ์œผ๋กœ ๋น›๋‚  ์ˆ˜ ์žˆ์ง€๋งŒ ๋™์‹œ์— ์—ฌ์ „ํžˆ ๋ช…ํ™•ํ•˜๊ณ  ์ฆ‰๊ฐ์ ์œผ๋กœ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

try -statement ๋ณ€ํ˜•์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์—ฌ์ฃผ์ง€๋งŒ ์œ ์•ฝ์„ ๋ฐ”๋ฅด๊ธฐ๋Š” ์‰ฝ์ง€๋งŒ ๋†“์น˜๊ธฐ ์–ด๋ ค์šด ๋ฐฉ์‹์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@brynbellomy

  1. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
    func createMergeCommit(r *repo.Repo, ์ธ๋ฑ์Šค *git.Index, ์›๊ฒฉ *git.Remote, remoteBranch *git.Branch) (ํ•ด์‹œ, ์˜ค๋ฅ˜) {
  2. ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์ค„์„ ์–ด๋–ป๊ฒŒ ์ถ”์ ํ•ฉ๋‹ˆ๊นŒ?
  3. ๋ฒ”์œ„ ๋ฌธ์ œ๋ฅผ ๋ฒ„๋ฆฌ๊ณ (๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ) ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {

    if headRef, err := r.Head(); err != nil {
        return err
    } else if parentObjOne, err := headRef.Peel(git.ObjectCommit); err != nil {
        return err
    } else parentObjTwo, err := remoteBranch.Reference.Peel(git.ObjectCommit); err != nil {
        return err
    } ...

๊ฐ€๋…์„ฑ ์ธก๋ฉด์—์„œ๋Š” ๊ทธ๋‹ค์ง€ ๋‹ค๋ฅด์ง€ ์•Š์ง€๋งŒ(๋˜๋Š” fmt.Errorf("error with head : %s", err.Error()) ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•˜๊ณ  ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ์ž”์†Œ๋ฆฌ๋Š”

  1. ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ; ์˜ค๋ฅ˜ != ์—†์Œ
  2. ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ - ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์ข‹์€ ์Šต๊ด€์ด ์•„๋‹ˆ๋ฉฐ, "์ž˜๋ชป๋œ" ์˜ค๋ฅ˜๋ฅผ ์•”์‹œํ•˜๋Š” "์ข‹์€" ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ", file.Open , close , Remove , Db ํ•จ์ˆ˜ ๋“ฑ์˜ ๊ฒฝ์šฐ ๋งŽ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋™์ผํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐœ์ƒ) - ๊ทธ๋Ÿฐ ๋‹ค์Œ - ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์—์„œ ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    " createMergeCommit " ํ•˜์ง€๋งŒ ๋ฐœ์ƒํ•œ ์ •ํ™•ํ•œ ์ค„๊นŒ์ง€ ์ถ”์ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๋ฏธ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฒŒ์‹œํ–ˆ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค(๋งŽ์€ ์ข‹์€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค :P ) ์ด ๋Œ€์ฒด ๊ตฌ๋ฌธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

fail := func(err error) error {
  log.Print("unexpected error", err)
  return err
}

a, b, err := f1()          // normal
c, d := f2() -> throw      // calls throw(err)
e, f := f3() -> panic      // calls panic(err)
g, h := f4() -> t.Error    // calls t.Error(err)
i, j := f5() -> fail       // calls fail(err)

์ฆ‰, ๋ฐ˜ํ™˜๋œ err != nil์ธ ๊ฒฝ์šฐ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ์˜ค๋ฅธ์ชฝ์— -> handler ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋‹จ์ผ ์ธ์ˆ˜๋กœ ๋ฐ›์•„๋“ค์ด๊ณ  ์„ ํƒ์ ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค(์˜ˆ: func(error) ๋˜๋Š” func(error) error ). ํ•ธ๋“ค๋Ÿฌ๊ฐ€ nil ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ๊ณ„์† ์ง„ํ–‰๋˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ a := b() -> handler ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

a, err := b()
if err != nil {
  if herr := handler(err); herr != nil {
    return herr
  }
}

์ด์ œ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋กœ a := b() -> throw ์˜ ์•ฝ์–ด์ธ try ๋‚ด์žฅ(๋˜๋Š” ํ‚ค์›Œ๋“œ ๋˜๋Š” ?= ์—ฐ์‚ฐ์ž ๋“ฑ)์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func() error {
  a, b := try(f1())
  c, d := try(f2())
  e, f := try(f3())
  ...
  return nil
}() -> panic // or throw/fail/whatever

๊ฐœ์ธ์ ์œผ๋กœ ?= ์—ฐ์‚ฐ์ž๋Š” try ํ‚ค์›Œ๋“œ/๋‚ด์žฅ๋ณด๋‹ค ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

func() error {
  a, b ?= f1()
  c, d ?= f2()
  e, f ?= f3()
  ...
  return nil
}() -> panic

์ฐธ๊ณ  : ์—ฌ๊ธฐ์—์„œ๋Š” ํ˜ธ์ถœ์ž์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‚ด์žฅ์— ๋Œ€ํ•œ ์ž๋ฆฌ ํ‘œ์‹œ์ž๋กœ throw๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

Try๋Š” ๋‹ค์–‘ํ•œ ์ธ์ˆ˜๋ฅผ ์ทจํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

func try(t1 T1, t2 T2, โ€ฆ tn Tn, te error) (T1, T2, โ€ฆ Tn)

try(f()) ์—์„œ์™€ ๊ฐ™์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ try ์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ Go์—์„œ ์—ฌ๋Ÿฌ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด ์•”์‹œ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ์„œ๋ฅผ ์ฝ์–ด๋ณธ ๊ฒฐ๊ณผ ๋‹ค์Œ ์Šค๋‹ˆํŽซ์€ ๋ชจ๋‘ ์œ ํšจํ•˜๊ณ  ์˜๋ฏธ์ ์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

a, b = try(f())
//
u, v, err := f()
a, b = try(u, v, err)

์ œ์•ˆ์€ ๋˜ํ•œ ์ถ”๊ฐ€ ์ธ์ˆ˜๋กœ try ๋ฅผ ํ™•์žฅํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ ํ•จ์ˆ˜์˜ ํ˜•์‹์ด๋‚˜ ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ํŒ๋‹จ๋˜๋ฉด ํ•ด๋‹น ์ถ”๊ฐ€ ์ธ์ˆ˜๋ฅผ try ํ˜ธ์ถœ์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํ•ธ๋“ค๋Ÿฌ ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜ ๋ชฉ๋ก์˜ ์‹œ์ž‘ ๋˜๋Š” ๋์— ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var h handler
a, b = try(h, f())
// or
a, b = try(f(), h)

(์œ„์˜ ์˜๋ฏธ๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ) try ๋Š” ๋ช…์‹œ์  ํ•ธ๋“ค๋Ÿฌ ์ธ์ˆ˜์™€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋‘๋Š” ๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

func f() (handler, error) { ... }
func g() (error) { ... }
try(f())
try(h, g())

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

์ด๋Ÿฌํ•œ ๋ฌธ์ œ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋ˆˆ์— ๋„๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ try ๊ฐ€ ๋‚˜๋จธ์ง€ ์–ธ์–ด์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋Š๋‚Œ์„ ์ฃผ๋ฏ€๋กœ try ์ด ์ œ์•ˆ ์ƒํƒœ.

@๋งˆ๋ฒ• ๊ฐ™์€

ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๋ฏธ h๋ฅผ ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

var h handler
a, b, h = f()

๋˜๋Š”

a, b, h.err = f()

ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ:

h:= handler(err error){
 log(...)
 return ....
} 

๊ทธ๋Ÿฌ์ž ์ œ์•ˆ์ด ์žˆ์—ˆ๋‹ค.

a, b, h(err) = f()

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

๋”ฐ๋ผ์„œ varargs ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

@brynbellomy์˜ else ์ œ์•ˆ์— ๋Œ€ํ•œ ๋Œ€์•ˆ:

a, b := try f() else err { /* handle error */ }

else ์งํ›„์— ์žฅ์‹ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

decorate := func(err error) error { return fmt.Errorf("foo failed: %v", err) }

try a, b := f() else decorate
try c, d := g() else decorate

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

decorate := fmt.DecorateErrorf("foo failed")

๋ฐ์ฝ”๋ ˆ์ด์…˜ ํ•จ์ˆ˜๋Š” func(error) error ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹œ๋„ ์ค‘์ธ ๊ด€๋ จ ํ•จ์ˆ˜์—์„œ try๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ธฐ ์ง์ „์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ try์— ์˜ํ•ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” ์ œ์•ˆ ๋ฌธ์„œ์˜ ์ด์ „ "์„ค๊ณ„ ๋ฐ˜๋ณต" ์ค‘ ํ•˜๋‚˜์™€ ์ •์‹ ์ด ๋น„์Šทํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

f := try(os.Open(filename), handler)              // handler will be called in error case

๋ˆ„๊ตฐ๊ฐ€ ๋” ๋ณต์žกํ•œ ๊ฒƒ์„ ์›ํ•˜๊ฑฐ๋‚˜ ๋ช…๋ น๋ฌธ ๋ธ”๋ก์„ ์›ํ•˜๋ฉด ๋Œ€์‹  if ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ค๋Š˜๋‚ ์ฒ˜๋Ÿผ).

์ฆ‰, https://github.com/golang/go/issues/32437#issuecomment -500949780์˜ @brynbellomy์˜ ์˜ˆ์— ํ‘œ์‹œ๋œ try ์˜ ์‹œ๊ฐ์  ์ •๋ ฌ์— ๋Œ€ํ•ด ์ข‹์€ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

์–ด์จŒ๋“  ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ์ข‹์€ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋‹ค๋ฅธ ์˜ต์…˜์„ ๋ช…์‹œ์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ @thepudds ๊ฐ€ https://github.com/golang/go/issues ์—์„œ ์ง€์ ํ•œ ๋ฉ‹์ง„ ์ •๋ ฌ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด var try ํ•จ์ˆ˜๋กœ ๋‹ค์‹œ ์ž‘์„ฑ๋œ @brynbellomy ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. /32437#issuecomment -500998690.

package main

import (
    "fmt"
    "time"
)

func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
    var (
        headRef          = try(r.Head())
        parentObjOne     = try(headRef.Peel(git.ObjectCommit))
        parentObjTwo     = try(remoteBranch.Reference.Peel(git.ObjectCommit))
        parentCommitOne  = try(parentObjOne.AsCommit())
        parentCommitTwo  = try(parentObjTwo.AsCommit())
        treeOid          = try(index.WriteTree())
        tree             = try(r.LookupTree(treeOid))
        remoteBranchName = try(remoteBranch.Name())
    )

    userName, userEmail, err := r.UserIdentityFromConfig()
    if err != nil {
        userName = ""
        userEmail = ""
    }

    var (
        now       = time.Now()
        author    = &git.Signature{Name: userName, Email: userEmail, When: now}
        committer = &git.Signature{Name: userName, Email: userEmail, When: now}
        message   = fmt.Sprintf(`Merge branch '%v' of %v`, remoteBranchName, remote.Url())
        parents   = []*git.Commit{
            parentCommitOne,
            parentCommitTwo,
        }
    )

    _, err = r.CreateCommit(headRef.Name(), author, committer, message, tree, parents...)
    return err
}

try -statement ๋ฒ„์ „๋งŒํผ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ๋„ ์ข‹์Šต๋‹ˆ๋‹ค. try ๋Š” ํ‘œํ˜„์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋…์„ฑ์„ ํฌ์ƒ์‹œํ‚ค๋ฉด์„œ ์ด๋Ÿฌํ•œ ์ค‘๊ฐ„ ๋ณ€์ˆ˜ ์ค‘ ์ผ๋ถ€๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‹ค๋ฅธ ๋ฌด์—‡๋ณด๋‹ค ์Šคํƒ€์ผ์˜ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ try ๊ฐ€ var ๋ธ”๋ก์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” var ์˜ ๊ฐ ํ–‰์ด ์–ธ์ œ ํ• ๋‹น๋˜๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ์ „์ฒด ๋ธ”๋ก์ด ๋‹จ์ผ ๋ช…๋ น๋ฌธ์ด ์•„๋‹ˆ๋ผ ๋ณ„๋„์˜ ๋ช…๋ น๋ฌธ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

@thepudds

try, b := f() else ์žฅ์‹

์•„๋งˆ๋„ ๋‚ด ๋‡Œ ์„ธํฌ์˜ ํ™”์ƒ์ด ๋„ˆ๋ฌด ์‹ฌํ•ด์„œ

try a, b := f() ;catch(decorate)

๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋„๋Ÿฌ์šด ๊ฒฝ์‚ฌ๋กœ

a, b := f()
catch(decorate)

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

    try headRef := r.Head()
    try parentObjOne := headRef.Peel(git.ObjectCommit)
    try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
    try parentCommitOne := parentObjOne.AsCommit()
    try parentCommitTwo := parentObjTwo.AsCommit()
    try treeOid := index.WriteTree()
    try tree := r.LookupTree(treeOid)
    try remoteBranchName := remoteBranch.Name()

~์™€ ํ•จ๊ป˜

    try ( 
    headRef := r.Head()
    parentObjOne := headRef.Peel(git.ObjectCommit)
    parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
    parentCommitOne := parentObjOne.AsCommit()
    parentCommitTwo := parentObjTwo.AsCommit()
    treeOid := index.WriteTree()
    tree := r.LookupTree(treeOid)
    remoteBranchName := remoteBranch.Name()
    )

(๋˜๋Š” ์‹ฌ์ง€์–ด ๋งˆ์ง€๋ง‰์— ์บ์น˜)
๋‘ ๋ฒˆ์งธ๋Š” ๋” ์ฝ๊ธฐ ์‰ฝ์ง€๋งŒ ์•„๋ž˜ ํ•จ์ˆ˜๊ฐ€ 2๊ฐœ์˜ var๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ฐ•์กฐํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” ํ•˜๋‚˜๋ฅผ ๋งˆ์ˆ ์ฒ˜๋Ÿผ ๋ฒ„๋ฆฌ๊ณ  "magic Returns err"๋กœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    try(err) ( 
    headRef := r.Head()
    parentObjOne := headRef.Peel(git.ObjectCommit)
    parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
    parentCommitOne := parentObjOne.AsCommit()
    parentCommitTwo := parentObjTwo.AsCommit()
    treeOid := index.WriteTree()
    tree := r.LookupTree(treeOid)
    remoteBranchName := remoteBranch.Name()
    ); err!=nil {
      //handle the err
    }

์ตœ์†Œํ•œ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•  ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋‚ด๊ฐ€ ์›ํ•  ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋ช…์‹œ์ ์œผ๋กœ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ์ฃผ์„์„ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ gofmt ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹ค์Œ ํ•œ ์ค„ ์„œ์‹ ๋˜๋Š” ๋ชจ๋“  ๋ณ€ํ˜•์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

if f() { return nil, err }

์ œ๋ฐœ, ์•„๋‹ˆ. if ํ•œ ์ค„์„ ์›ํ•˜๋ฉด ํ•œ ์ค„ if , ์˜ˆ:

if f() then return nil, err

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

ํ† ๋ก ์˜ ์—ด๊ธฐ ์†์—์„œ ์žŠํ˜€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

2) ํ˜„์žฌ ์ œ์•ˆ์— ๋Œ€ํ•œ ๋ถˆ๋งŒ ์ค‘ ํ•˜๋‚˜๋Š” ์•ก์„ธ์Šค๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์•ˆ์ด ์ถ”๊ฐ€ ๊ตฌ๋ฌธ, ์ฆ‰ ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์ƒ์šฉ๊ตฌ(์˜ˆ: ... else err { ... } ๋“ฑ)๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ชจ๋“  ๋Œ€์•ˆ ์ œ์•ˆ์€ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํฅ๋ฏธ๋กœ์šด ์ ์€: ์˜ค๋ฅ˜๋ฅผ ๊พธ๋ฏธ๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์—†๊ณ  ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ์ผ์ข…์˜ ๋ช…์‹œ์  ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๋ช…์‹œ์  return ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ํ•ด๋‹น return ๋ฌธ์€ ์ด ๊ฒฝ์šฐ ๋„ค์ดํ‚ค๋“œ ๋ฆฌํ„ด์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ชจ๋“ (์ผ๋ฐ˜์ ์œผ๋กœ 0) ๊ฒฐ๊ณผ ๊ฐ’์„ ์—ด๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ํ•จ์ˆ˜๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๊พธ๋ฏธ์ง€ ์•Š๊ณ  ๋งŽ์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๋ช…์‹œ์  ๋ฐ˜ํ™˜( return nil, err ๋“ฑ)์ด ์ƒ์šฉ๊ตฌ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ œ์•ˆ๊ณผ ๋ช…์‹œ์ ์ธ return ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋Œ€์•ˆ์€ ์ด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์˜ค๋ฅ˜๋ฅผ ๊พธ๋ฏธ๊ณ  ์‹ถ๋‹ค๋ฉด ํ˜„์žฌ ์ œ์•ˆ์€ ์˜ค๋ฅ˜ ๊ฐ’์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ์— ์ด๋ฆ„์„ ์ง€์ •ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒฐ๊ณผ์— ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋„๋ก _์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค_. ์ด๊ฒƒ์€ ๋ช…์‹œ์  ํ•ธ๋“ค๋Ÿฌ์—์„œ ๋„ค์ดํ‚ค๋“œ ๋ฆฌํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜๋ณตํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์ข‹์€ ๋ถ€์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. (๋„ค์ดํ‚ค๋“œ ๋ฆฌํ„ด์— ๋Œ€ํ•ด ๊ฐ•ํ•œ ๋Š๋‚Œ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์‹ค์€ ์šฐ๋ฆฌ๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ์ผ ๋•Œ ๋‹ค๋ฅธ ๋ชจ๋“ (์ผ๋ฐ˜์ ์œผ๋กœ 0) ๊ฒฐ๊ณผ ๊ฐ’์„ ์—ด๊ฑฐํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์ดํ•ด). ์ฆ‰, ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ๋ฅผ ์žฅ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ƒ์šฉ๊ตฌ๋ฅผ ๋”์šฑ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

try ์˜ ์ด์ „ ๋ฒ„์ „์€ ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค: try(expr, handler) ๋Š” ํ•˜๋‚˜(๋˜๋Š” ์•„๋งˆ๋„ ๋‘ ๊ฐœ) ํ‘œํ˜„์‹์„ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฒซ ๋ฒˆ์งธ ํ‘œํ˜„์‹์€ ๋‹ค์ค‘ ๊ฐ’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ‘œํ˜„์‹์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋งŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ). ํ•ด๋‹น(๋‹ค์ค‘๊ฐ’) ํ‘œํ˜„์‹์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์€ error ์œ ํ˜•์ด์–ด์•ผ ํ•˜๋ฉฐ ํ•ด๋‹น ๊ฐ’์€ nil์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค. (๋“ฑ - ๋‹น์‹ ์ด ์ƒ์ƒํ•  ์ˆ˜์žˆ๋Š” ๋‚˜๋จธ์ง€).

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

a, b := try(u, v, err)

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

a, b := u, v  // we don't care if the assignment happens in case of an error
try(err)

(๋˜๋Š” ํ•„์š”์— ๋”ฐ๋ผ if ๋ฌธ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค). ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ์—๋Š” ๋„ค์ดํ‚ค๋“œ ๋ฆฌํ„ด์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ return ๋ฌธ์€ ๋ชจ๋“ (์ผ๋ฐ˜์ ์œผ๋กœ 0) ๊ฒฐ๊ณผ ๊ฐ’์„ ์—ด๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•Œ๋ชธ ๋ฐ˜ํ™˜์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ์‹œ๋„๋Š” ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ try(ํ•จ์ˆ˜ ๋˜๋Š” ๋ช…๋ น๋ฌธ์œผ๋กœ)์— ๋Œ€ํ•ด ์ข‹์•„ํ•˜๋Š” ํ•œ ๊ฐ€์ง€๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋” ์ด์ƒ ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ๋ƒฅ try๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@griesemer ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ €๋„ ๋‚ด๋ฆฐ ๊ฒฐ๋ก ์ž…๋‹ˆ๋‹ค.

try ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…: https://github.com/golang/go/issues/32437#issuecomment -501035322์˜ ์˜ˆ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด try ๋Š” ๋ฆฌ๋“œ๋ฅผ ๋ฌป์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์ผ๋ จ์˜ try ๋ฌธ์ด ๋˜์–ด ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ๊ฐ€๋ฆฝ๋‹ˆ๋‹ค.

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

์˜ค๋ฅ˜ ์„ ์–ธ/ํ• ๋‹น์„ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ํ•œ ์ค„ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ stmt๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

err := f() // followed by one of

on err, return err            // any type can be tested for non-zero
on err, return fmt.Errorf(...)
on err, fmt.Println(err)      // doesn't stop the function
on err, hname err             // handler invocation without parens
on err, ignore err            // optional ignore handler logs error if defined

if err, return err            // alternatively, use if

handle hname(err error, clr caller) { // type caller has results of runtime.Caller()
   if err == io.Bad { return err }
   fmt.Println(clr.name, err)
}

try ํ•˜์œ„ ํ‘œํ˜„์‹์€ ํŒจ๋‹‰์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์˜ค๋ฅ˜๊ฐ€ ์˜ˆ์ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ณ€ํ˜•์€ ๋ชจ๋“  ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

f(try g()) // panic on error
f(try_ g()) // ignore any error

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

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

๋‚ด๊ฐ€ try ๋ผ๋Š” ํ‘œํ˜„์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ๋„ˆ๋ฌด ์‰ฝ๊ฒŒ ์ง€๋‚˜์น˜๊ฑฐ๋‚˜ ์ง€๋‚˜์น  ๋งŒํผ ์‰ฝ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”.

ํ‘œํ˜„์œผ๋กœ ์‹œ๋„

// Too hidden, it's in a crowded function with many symbols that complicate the function.

f, err := os.OpenFile(try(FileName()), os.O_APPEND|os.O_WRONLY, 0600)

// Not easy enough, the word "try" already increases horizontal complexity, and it
// being an expression only encourages more horizontal complexity.
// If this code weren't collapsed to multiple lines, it would be extremely
// hard to read and unclear as to what's executing when.

fullContents := try(io.CopyN(
    os.Stdout,
    try(net.Dial("tcp", "localhost:"+try(buf.ReadString("\n"))),
    try(strconv.Atoi(try(buf.ReadString("\n")))),
))

์ง„์ˆ ๋กœ ์‹œ๋„

// easy to see while still not being too verbose

try name := FileName()
os.OpenFile(name, os.O_APPEND|os.O_WRONLY, 0600)

// does not allow for clever one-liners, code remains much more readable.
// also, the code reads in sequence from top-to-bottom.

try port := r.ReadString("\n")
try lengthStr := r.ReadString("\n")
try length := strconv.Atoi(lengthStr)

try con := net.Dial("tcp", "localhost:"+port)
try io.CopyN(os.Stdout, con, length)

ํ…Œ์ดํฌ์•„์›ƒ

์ด ์ฝ”๋“œ๋Š” ํ™•์‹คํžˆ ๊ณ ์•ˆ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์–ป๊ณ ์žˆ๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ try ํ‘œํ˜„์‹์ด ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ๋งŽ์€ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ณต์žกํ•œ ํ‘œํ˜„์˜ ํ•œ๊ฐ€์šด๋ฐ
  2. ๋งŽ์€ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ์—ฌ๋Ÿฌ ์ค„ ๋ฌธ

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

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

fullContents := try(io.CopyN(os.Stdout, try(net.Dial("tcp", "localhost:"+try(r.ReadString("\n"))), try(strconv.Atoi(try(r.ReadString("\n"))))))

*bufio.Reader ์—์„œ ํฌํŠธ๋ฅผ ์ฝ๊ณ  TCP ์—ฐ๊ฒฐ์„ ์‹œ์ž‘ํ•˜๊ณ  ๋™์ผํ•œ *bufio.Reader ์— ์ง€์ •๋œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ stdout ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์—„๊ฒฉํ•œ ์ฝ”๋”ฉ ๊ทœ์น™์„ ๊ฐ€์ง„ ์–ธ์–ด์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ํ—ˆ์šฉ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ gofmt ์ด ๋ฌธ์ œ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ์—„๊ฒฉํ•œ ์ฝ”๋”ฉ ๊ทœ์น™์„ ๊ฐ€์ง„ ์–ธ์–ด์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ํ—ˆ์šฉ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Go์—์„œ๋Š” ํ˜์˜ค์Šค๋Ÿฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”์ฐํ•˜๊ฒŒ ํฌ๋งทํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ทœ๋ฒ”๊ณผ ๋„๊ตฌ๊ฐ€ ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. Go ์—๋„ goto ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

Go์—์„œ๋Š” ํ˜์˜ค์Šค๋Ÿฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”์ฐํ•˜๊ฒŒ ํฌ๋งทํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ทœ๋ฒ”๊ณผ ๋„๊ตฌ๊ฐ€ ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. Go์—๋„ goto๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

๊ทธ๋ ‡๊ธด ํ•˜์ง€๋งŒ, ๋‚˜๋Š” ์ด ์•„์ด๋””์–ด๊ฐ€ ์ •๋ง๋กœ ๋”์ฐํ•˜์ง€ ์•Š์„ ๋•Œ ๋งค์šฐ ๋น„ํŒ์ ์ž…๋‹ˆ๋‹ค.

Try as ๋ฌธ์€ ์ƒ์šฉ๊ตฌ๋ฅผ ํฌ๊ฒŒ ์ค„์ด๋ฉฐ, else ๋ธ”๋ก์ด๋‚˜ ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ด์ „์— ์ œ์•ˆ๋œ ๋Œ€๋กœ ํ‘œํ˜„์‹ ๋ธ”๋ก์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋ฉด ํ‘œํ˜„์‹์œผ๋กœ try ์ด์ƒ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ deandeveloper์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

try (
    name := FileName()
    file := os.OpenFile(name, os.O_APPEND|os.O_WRONLY, 0600)
    port := r.ReadString("\n")
    lengthStr := r.ReadString("\n")
    length := strconv.Atoi(lengthStr)
    con := net.Dial("tcp", "localhost:"+port)
    io.CopyN(os.Stdout, con, length)
)

๋ชฉํ‘œ๊ฐ€ if err!= nil {return err} ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์ฝ”๋“œ ๋ธ”๋ก์„ ํ—ˆ์šฉํ•˜๋Š” try ๋ฌธ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

@deanveloper

fullContents := try(io.CopyN(os.Stdout, try(net.Dial("tcp", "localhost:"+try(r.ReadString("\n"))), try(strconv.Atoi(try(r.ReadString("\n"))))))

๋‚˜๋Š” ๋‚˜๋ฅผ ์œ„ํ•ด ์ฝ์„ ์ˆ˜ ์—†์Œ์„ ์ธ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

fullContents := try(io.CopyN(os.Stdout, 
                               try(net.Dial("tcp", "localhost:"+try(r.ReadString("\n"))),
                                     try(strconv.Atoi(try(r.ReadString("\n"))))))

๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์œ ์‚ฌํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ์ค„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ์žˆ๋Š” "์‹œ๋„"๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

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

๋“ค์—ฌ์“ฐ๊ธฐ์— ๊ด€ํ•ด์„œ๋Š” ๊ทธ๊ฒƒ์ด go fmt์˜ ๋ชฉ์ ์ด๋ฏ€๋กœ ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๋‹ค์ง€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

๊ทธ๋Ÿฌ๋‚˜ ๋กœ์ปฌ ์˜ค๋ฅ˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ ์‹๋ณ„์ž์˜ ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด err ์‹๋ณ„์ž ์ž์ฒด๋ฅผ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ๋ณ€์ˆ˜์˜ ๋ณ„์นญ์œผ๋กœ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

func foo() error {
    defer handleError(&err, etc)
    try(something())
}

๋‹ค์Œ๊ณผ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

func foo() (err error) {
    defer handleError(&err, etc)
    try(something())
}

err ์‹๋ณ„์ž๋Š” ํ•จ์ˆ˜ ๋กœ์ปฌ ๋ณ„์นญ์œผ๋กœ ์ž‘๋™ํ•˜๋”๋ผ๋„ ์œ ๋‹ˆ๋ฒ„์Šค ๋ฒ”์œ„์—์„œ ์ •์˜๋˜๋ฏ€๋กœ err ์˜ ๋ชจ๋“  ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ์ •์˜ ๋˜๋Š” ํ•จ์ˆ˜ ๋กœ์ปฌ ์ •์˜๊ฐ€ ์ด๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ„ํ—˜ํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ”๋‘‘ ์ฝ”ํผ์Šค ์—์„œ ๋ฐ”๋‘‘์˜ 22m ๋ผ์ธ์„ ์Šค์บ”ํ–ˆ๋Š”๋ฐ ๋งค์šฐ ๋“œ๋ญ…๋‹ˆ๋‹ค. err ์ „์—ญ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ณ ์œ ํ•œ ์ธ์Šคํ„ด์Šค๋Š” 4๊ฐœ๋ฟ์ž…๋‹ˆ๋‹ค(๋ชจ๋‘ ์œ ํ˜•์ด๋‚˜ ์ƒ์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ) - ์ด๊ฒƒ์€ vet ๊ฒฝ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

func foo() error {
    f := func() error {
        defer handleError(&err, etc)
        try(something())
        return nil
    }
    return f()
}

๊ทธ๋Ÿฌ๋‚˜ ํ•ญ์ƒ ๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func foo() error {
    f := func() (err error) {
        defer handleError(&err, etc)
        try(something())
        return nil
    }
    return f()
}

try ๋ฅผ ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹Œ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์‹๋ณ„์ž๋กœ ์ฃผ์ œ๋กœ,
๋‚˜๋Š” ๊ธ€์„ ์“ธ ๋•Œ ๋Œ€๊ด„ํ˜ธ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ‹€๋ฆฌ๊ฒŒ ํ•œ ํ›„ ํ›„์ž๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

try(try(os.Create(filename)).Write(data))

"์™œ Rust๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?"์—์„œ FAQ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.

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

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

๊ทธ๋Ÿฌ๋‚˜ Rust ? ์—ฐ์‚ฐ์ž๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๋‹ซ๋Š” ๊ด„ํ˜ธ ๋’ค์— ์ถ”๊ฐ€๋˜๋ฉฐ, ์ด๋Š” ์ธ์ˆ˜ ๋ชฉ๋ก์ด ๊ธธ๋ฉด ๋†“์น˜๊ธฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

?() ๋ฅผ ํ˜ธ์ถœ ๊ตํ™˜์›์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ ๋Œ€์‹ :

x := try(foo(a, b))

๋‹น์‹ ์€ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค :

x := foo?(a, b)

?() ์˜ ์˜๋ฏธ๋Š” ์ œ์•ˆ๋œ try ๋‚ด์žฅ์˜ ์˜๋ฏธ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. try ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์˜ค๋ฅ˜๊ฐ€ nil์ด ์•„๋‹Œ ๊ฒฝ์šฐ ?() ๋ฌธ์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

@ianlancetaylor ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ try ์ ‘๋‘์‚ฌ๋กœ ๋๋‚˜๋Š” ์ˆ˜์‹ญ ๊ฐœ์˜ ๋ผ์ธ์œผ๋กœ ๋๋‚  ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ์ ˆ๋Œ€์ ์œผ๋กœ ์ธ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์ผํ•œ return ํ‘œํ˜„์‹์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ช…์‹œํ•˜๋Š” 2-4ํ–‰ ์กฐ๊ฑด์‹์— ์˜ํ•ด ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๋ถ™์€ ์ˆ˜์‹ญ ํ–‰๋ณด๋‹ค ๋” ๋‚˜์˜๋‹ค๋Š” ๊ฒƒ์€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ try ( else ์ ˆ ํฌํ•จ)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ํŠน๋ณ„/๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ข€ ๋” ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ ‘์„ ์ ์œผ๋กœ re: conditional if ์‹์„ ์ œ์•ˆํ•œ try -as-a-statement: ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์กฐ๊ฑด๋ถ€์™€ ๊ฐ™์€ ์ค„์— ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค led๋ฅผ ๋” ๋งŽ์ด ๋ฌป์–ด ๋ฒ„๋ฆฐ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. , ์กฐ๊ฑด๋ฌธ ์ž์ฒด๋Š” ์ด๋ฏธ ๋ถ๋น„๋Š” ์ค„์˜ ๋งจ ๋์— ์žˆ์œผ๋ฉฐ ๋ณ€์ˆ˜ ํ• ๋‹น์€ ๋ธ”๋ก์œผ๋กœ ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค(๋ธ”๋ก ๋’ค์— ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•จ).

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

@beoran ์ด๊ฒƒ์€ ์šฐ์•„ํ•˜๊ณ  ์ƒ๊ฐํ•  ๋•Œ ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ์–ธ์–ด์˜ try ๋ธ”๋ก๊ณผ ์˜๋ฏธ์ ์œผ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋Š” ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๋กœ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜: 1) ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์—…ํ•œ ์ƒˆ๋กœ์šด Go ์ฝ”๋”์—๊ฒŒ ํ˜ผ๋™์„ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์†”์งํžˆ ๊ฐ€์žฅ ํฐ ๊ด€์‹ฌ์‚ฌ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ €๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ง€๋Šฅ์„ ๋ฏฟ์Šต๋‹ˆ๋‹ค). ์ฝ”๋“œ๋ฒ ์ด์Šค. ๋‚ด ์ฝ”๋“œ์— ๊ด€ํ•œ ํ•œ ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๊ธฐ์กด type / const / var ๋ธ”๋ก์„ ํ”ผํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ˜„์žฌ ์ด์™€ ๊ฐ™์€ ๋ธ”๋ก์„ ํ—ˆ์šฉํ•˜๋Š” ์œ ์ผํ•œ ํ‚ค์›Œ๋“œ๋Š” ์ œ์–ด๋ฌธ์ด ์•„๋‹ˆ๋ผ ์ •์˜์ž…๋‹ˆ๋‹ค.

@yiyus ๋ช…์‹œ์„ฑ์€ (๋‚ด ์ƒ๊ฐ์—) Go์˜ ๋ฏธ๋• ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์— ํ‚ค์›Œ๋“œ ์ œ๊ฑฐ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ try ํ‘œํ˜„์‹์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์—„์ฒญ๋‚œ ์–‘์˜ ์ฝ”๋“œ๋ฅผ ๋“ค์—ฌ์“ฐ๋Š” ๊ฒƒ์€ ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด try ๋ธ”๋ก์ด ์ „ํ˜€ ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@rogpeppe ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฏธ๋ฌ˜ํ•œ ์—ฐ์‚ฐ์ž๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ํ˜ธ์ถœ์— ๋Œ€ํ•ด์„œ๋งŒ ํ•ฉ๋ฆฌ์ ์ด๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ํ•ญ์ƒ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•˜๋Š” ํ˜ธ์ถœ. ๊ทธ๋Ÿฌ๋‚˜ ๋‘˜ ๋‹ค ๋“œ๋ฌธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ตํ™˜์›์—๊ฒŒ ์—ด๋ ค ์žˆ๋Š” ๊ฒฝ์šฐ #32500์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋‚˜๋Š” f(try g()) ๊ฐ€ 1์ค„ ์ฒ˜๋ฆฌ stmt์™€ ํ•จ๊ป˜ https://github.com/golang/go/issues/32437#issuecomment -501074836์—์„œ ํŒจ๋‹‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.
on err, return ...

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

@yiyus https://github.com/golang/go/issues/32437#issuecomment -501139662

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

Go1์€ ์ด๋ฏธ func foo() error ๋ฅผ foo() ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž์˜ ๋ฐ˜ํ™˜ ๊ฐ’์— , error ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๊ธฐ์กด ์ฝ”๋“œ ๋™์ž‘์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. https://github.com/golang/go/issues/32437#issuecomment -500289410 ์ฐธ์กฐ

@rogpeppe ์ค‘์ฒฉ try ์˜ ๊ด„ํ˜ธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์—์„œ: try ์˜ ์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•œ ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๊ณ„ ๋ฌธ์„œ ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@griesemer ๋‚˜๋Š” ๊ฑฐ๊ธฐ์—์„œ ์ง€์ ํ•œ ์ด์œ ๋กœ ๋‹จํ•ญ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž๋กœ try ์— ๋Œ€ํ•ด ๊ทธ๋‹ค์ง€ ์—ด๊ด‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ try ๋ฅผ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ํŠœํ”Œ์—์„œ ์˜์‚ฌ ๋ฉ”์„œ๋“œ๋กœ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 f := os.Open(path).try()

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์šฐ์„ ์ˆœ์œ„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋‹ค์ง€ Go์™€ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@rogpeppe

๋งค์šฐ ํฅ๋ฏธ๋กœ์šด! . ๋‹น์‹ ์€ ์ •๋ง๋กœ ์—ฌ๊ธฐ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ ์•„์ด๋””์–ด๋ฅผ ๊ทธ๋ ‡๊ฒŒ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

for _,fp := range filepaths {
    f := os.Open(path).try(func(err error)bool{
        fmt.Printf( "Cannot open file %s\n", fp );
        continue;
    });
}

BTW, ์•„๋งˆ๋„ guard() try() ์™€ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์„ ํ˜ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์— ์˜ํ•ด ๋…ผ์˜๋˜๊ธฐ ์ „์— ์ด๋ฆ„์„ ๋„์šฉํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๋Œ€ :

for _,fp := range filepaths {
    if f,err := os.Open(path);err!=nil{
        fmt.Printf( "Cannot open file %s\n", fp )
    }
}

?

$ if err!=nil {return err} try a,b := foo() ๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์˜ ์ƒ์šฉ๊ตฌ๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด if err!=nil {...} (๋” ๋‚˜์€ ๊ฒƒ์„ ์ฐพ๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค) ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ์ด ์ •๋ง๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์ผ๋ฐ˜์ ์œผ๋กœ ์žฅ์‹/ํฌ์žฅ์— ์ถ”๊ฐ€ ์ค„์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ์ค„์„ "ํ• ๋‹น"ํ•ฉ๋‹ˆ๋‹ค.

f, err := os.Open(path)  // normal Go \o/
on err, return fmt.Errorf("Cannot open %s, due to %v", path, err)

@networkimprov ๋‚˜๋„ ๊ทธ๋Ÿฐ ๊ฑธ ์ข‹์•„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„. ๋‚ด๊ฐ€ ์ด๋ฏธ ์ œ๊ธฐํ•œ ๋” ๋‘์šด์ ์ด๊ณ  ์„œ์ˆ ์ ์ธ ์šฉ์–ด๋ฅผ ๋ฐ€์–ด๋ถ™์ด๋Š” ๊ฒƒ์€...

f, err := os.Open(path)
relay err { nil, fmt.Errorf("Cannot open %s, due to %v", path, err) }

// marginally shorter, doesn't trigger vertical formatting unless excessively wide
// enclosed expression restricted to a list of values that match the return args

๋˜๋Š”

f, err := os.Open(path)
relay(err) nil, fmt.Errorf("Cannot open %s, due to %v", path, err)

// somewhere between statement and func, prob more pleasing to type w/out completion
// trailing expression restricted to a list of values that match the return args
// maybe excessive width triggers linting noise - with a reformatter available
// providing a reformatter would make swapping old (narrow enough) code easy

@daved ๋งˆ์Œ์— ๋“œ์‹ ๋‹ค๋‹ˆ ๋‹คํ–‰์ž…๋‹ˆ๋‹ค! on err, ... ๋Š” ๋ชจ๋“  ๋‹จ์ผ stmt ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

err := f() // followed by one of

on err, return err            // any type can be tested for non-zero
on err, return fmt.Errorf(...)
on err, fmt.Println(err)      // doesn't stop the function
on err, continue              // retry in a loop
on err, hname err             // named handler invocation without parens
on err, ignore err            // logs error if handle ignore() defined

handle hname(err error, clr caller) { // type caller has results of runtime.Caller()
   if err == io.Bad { return err } // non-local return
   fmt.Println(clr, err)
}

ํŽธ์ง‘: on ๋Š” Javascript์—์„œ ์ฐจ์šฉํ•ฉ๋‹ˆ๋‹ค. if ๊ณผ๋ถ€ํ•˜๋ฅผ ์›ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
์‰ผํ‘œ๋Š” ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ์„ธ๋ฏธ์ฝœ๋ก ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ฒฐ์žฅ?

๋‚˜๋Š” relay ๋ฅผ ์ž˜ ๋”ฐ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค ; ์˜ค๋ฅ˜ ์‹œ ๋ฐ˜ํ™˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

์–ด๋–ค ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋ฉด ๋ณดํ˜ธ ๊ณ„์ „๊ธฐ๊ฐ€ ํŠธ๋ฆฝ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ๊ฐ’์ด 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฆด๋ ˆ์ด๋Š” ํ›„์† ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ œ์–ด ํ๋ฆ„์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

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

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

@eandre ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜์—๋Š” ์ด๋Ÿฌํ•œ ๋™์  ์ •์˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์˜ ๋งŽ์€ ํ˜•ํƒœ๋Š” ์ œ์–ด ํ๋ฆ„์˜ ํ†ต์‹ ์„ ๋‘˜๋Ÿฌ์‹ผ ์•ˆ์ „์„ฑ์„ ๊ฐ์†Œ์‹œํ‚ค๋ฉฐ ์ด๋Š” ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค.

@networkimprov @daved ์ด ๋‘ ๊ฐ€์ง€ ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€๋Š” ์•Š์ง€๋งŒ, ๋‹จ์ˆœํžˆ ํ•œ ์ค„ if err != nil { ... } ๋ช…๋ น๋ฌธ์ด ์–ธ์–ด ๋ณ€๊ฒฝ์„ ๋ณด์ฆํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฐœ์„ ์ด ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ๋Š๊ปด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹จ์ˆœํžˆ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ˜๋ณต์ ์ธ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํ•ญ์ƒ return ๋ฅผ ์จ์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์ž…๋‹ˆ๊นŒ?

@brynbellomy ๋‚ด ์˜ˆ์—๋Š” return ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. relay ๋Š” "์ด ์˜ค๋ฅ˜๊ฐ€ nil์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋‹ค์Œ์ด ๋ฐ˜ํ™˜๋จ"์œผ๋กœ ์ •์˜๋œ ๋ณดํ˜ธ ๊ณ„์ „๊ธฐ์ž…๋‹ˆ๋‹ค.

์ด์ „์˜ ๋‘ ๋ฒˆ์งธ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ:

f, err := os.Open(path)
relay(err) nil, fmt.Errorf("Cannot open %s, due to %v", path, err)

๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

f, err := os.Open(path)
relay(err)

๋‹ค๋ฅธ ๋ฐ˜ํ™˜ ๊ฐ’(๋˜๋Š” ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๊ฐ’์— ๋Œ€ํ•ด ์„ค์ •๋œ ๊ฐ’)์— ๋Œ€ํ•ด 0 ๊ฐ’๊ณผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜๋˜๋Š” ๋ฆด๋ ˆ์ด๋ฅผ ํŠธ๋ฆฝํ•˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ํ˜•์‹:

wrap := func(err error, msg string) error {
    if err != nil {
        fmt.Errorf("%s: %s", msg, err)
    }
    return nil
}

// ...

f, err := os.Open(path)
relay(err, wrap(err, fmt.Sprintf("Cannot open %s", path)))

๋ฆด๋ ˆ์ด๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ฆด๋ ˆ์ด arg์— ์˜ํ•ด ํŠธ๋ฆฝ๋˜์ง€ ์•Š๋Š” ํ•œ ๋‘ ๋ฒˆ์งธ ๋ฆด๋ ˆ์ด arg๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ. ์„ ํƒ์  ๋‘ ๋ฒˆ์งธ ๋ฆด๋ ˆ์ด ์˜ค๋ฅ˜ arg๋Š” ๋ฐ˜ํ™˜๋œ ๊ฐ’์ž…๋‹ˆ๋‹ค.

_go fmt_ ๋‹จ์ผ ํ–‰ if ๋Š” ํ—ˆ์šฉํ•˜์ง€๋งŒ case, for, else, var () ๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋ชจ๋‘ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค ;-)

Go ํŒ€์€ ํ•œ ์ค„ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ์— ๋Œ€ํ•œ ๋งŽ์€ ์š”์ฒญ์„ ๊ฑฐ์ ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

on err, return err ๋ฌธ์€ ๋ฐ˜๋ณต์ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๋ฉฐ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

@magical ๊ท€ํ•˜์˜ ํ”ผ๋“œ๋ฐฑ ์€ ์„ธ๋ถ€ ์ œ์•ˆ์„œ ์˜ ์—…๋ฐ์ดํŠธ๋œ ๋ฒ„์ „์—์„œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ž‘์€ ์ผ์ด์ง€๋งŒ try ๊ฐ€ ํ‚ค์›Œ๋“œ์ธ ๊ฒฝ์šฐ ์ข…๋ฃŒ ๋ฌธ์žฅ์œผ๋กœ ์ธ์‹๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋Œ€์‹ 

func f() error {
  try(g())
  return nil
}

๋‹น์‹ ์€ ๊ทธ๋ƒฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

func f() error {
  try g()
}

( try -statement๋Š” ๋ฌด๋ฃŒ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. try -operator๋Š” ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ๊ฐ€ ์ข‹์€ ์˜ˆ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ตœ์†Œํ•œ์˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

@jimmyfrasche try ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ์ข…๋ฃŒ ๋ฌธ์žฅ์œผ๋กœ ์ธ์‹๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ panic ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ์™ธ์— ์ถ”๊ฐ€๋กœ ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์ ์„ ์ œ์™ธํ•˜๊ณ  try ๋Š” ์ข…๋ฃŒ ๋ฌธ์žฅ์ด ์•„๋‹ˆ๋ฉฐ ์ธ์œ„์ ์œผ๋กœ ๋งŒ๋“ค๋ ค๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

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

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

์œ„์—์„œ ์ œ์•ˆ๋œ ์ฝ”๋“œ ์ˆœ์—ด์„ ๊ณ„์†ํ•ด์„œ ์ข‹์•„ํ•˜๊ฑฐ๋‚˜ ์‹ซ์–ดํ•  ๋•Œ "์ด๊ฒƒ์ด ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ๋” ํ•ฉ๋ฆฌ์ ์ธ ํƒ€ํ˜‘์ธ๊ฐ€/์ด๋ฏธ ์ œ์•ˆ๋œ ๊ฒƒ"์ด๋ผ๋Š” ์ง„์ •ํ•œ ์˜๋ฏธ๋ฅผ ์–ป๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

"์‹œ๋„" ๋ณ€ํ˜• ๋ฐ ๋Œ€์ฒด ์ œ์•ˆ์„ ํ‰๊ฐ€ํ•˜๋Š” ๊ฐ๊ด€์ ์ธ ๊ธฐ์ค€์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

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

์ด๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋ฉด ์—„์ง€์†๊ฐ€๋ฝ์„ ์น˜์ผœ๋“ค๊ณ  ์›๋ž˜ ์ œ์•ˆ์„ ๊ฒ€ํ† ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md

๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๋‹ค๋ฅธ ์ œ์•ˆ ์ค‘ ์ผ๋ถ€๋Š” ์ฃผ์„์„ ์ธ๋ผ์ธํ•˜๊ฑฐ๋‚˜ ๋งํฌ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐฐ์šฐ๊ฑฐ๋‚˜ ๋” ๋†’์€ ํ‰๊ฐ€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์กฐํ•ฉ์„ ์ƒ๊ฐํ•ด ๋‚ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ์ค€ += ํŒจํ‚ค์ง€ ์ „์ฒด ๋ฐ ๊ธฐ๋Šฅ ๋‚ด์—์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ

์ด ์ œ์•ˆ์— ๋Œ€ํ•œ ์ง€์†์ ์ธ ํ”ผ๋“œ๋ฐฑ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ํ† ๋ก ์€ ํ•ต์‹ฌ ๋ฌธ์ œ์—์„œ ์•ฝ๊ฐ„ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋Œ€์ฒด ์ œ์•ˆ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์„ ํ•ด์‹ฑํ•˜๋Š” 12๋ช… ์ •๋„์˜ ๊ธฐ๊ณ ์ž(์ž์‹ ์ด ๋ˆ„๊ตฌ์ธ์ง€ ์•Œ๊ณ  ์žˆ์Œ)๊ฐ€ ์ง€๋ฐฐํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ๋Š” _ํŠน์ •_ ์ œ์•ˆ ์— ๊ด€ํ•œ ๊ฒƒ์ž„์„ ์นœ์ ˆํ•˜๊ฒŒ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฐธ์‹ ํ•œ ๊ตฌ๋ฌธ๋ก ์  ์•„์ด๋””์–ด๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด _์•„๋‹ˆ๋‹ค_ (์ข‹์€ ์ผ์ด์ง€๋งŒ ์ด๊ฒƒ์€ _์ด_ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค).

ํ† ๋ก ์— ๋‹ค์‹œ ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ๋‹ค์‹œ ์ •์ƒ ๊ถค๋„์— ์˜ค๋ฅด๋„๋ก ํ•ฉ์‹œ๋‹ค.

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

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

@crawshaw ๋Š” std ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋“ค์˜€๊ณ  try ๊ฐ€ ๋‹ค๋ฅธ ํ‘œํ˜„์‹ ์•ˆ์— ๊ฑฐ์˜ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋ฏ€๋กœ try ๊ฐ€ ๋ฌปํ˜€ ๋ณด์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์šฐ๋ ค๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๋ฐ˜๋ฐ•ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งค์šฐ ์œ ์šฉํ•œ ์‚ฌ์‹ค ๊ธฐ๋ฐ˜ ํ”ผ๋“œ๋ฐฑ์ด๋ฉฐ, ์ด ๊ฒฝ์šฐ ์„ค๊ณ„๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

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

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

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

๊ฐ์‚ฌ ํ•ด์š”.

(๋Œ€์•ˆ ์ œ์•ˆ์„ ์ง€์ง€ํ•˜๋Š” ๋‘ ์‚ฌ๋žŒ์ด ๊ฐ์ž์˜ ๋ณ„๋„ ๋ฌธ์ œ๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ข‹์€ ์ผ์ด๋ฉฐ ๊ฐ๊ฐ์˜ ๋ฌธ์ œ์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.)

@griesemer
๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง‘์ค‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ์ „์ ์œผ๋กœ ๋™์˜ํ•˜๋ฉฐ ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ๋‚ด๊ฐ€ ๊ธ€์„ ์“ฐ๊ฒŒ ๋งŒ๋“  ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋ฉด ์—„์ง€์†๊ฐ€๋ฝ์„ ์น˜์ผœ๋“ค๊ณ  ์›๋ž˜ ์ œ์•ˆ์„ ๊ฒ€ํ† ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md

๋‘ ๊ฐ€์ง€ ์งˆ๋ฌธ:

  1. ์šฐ๋ฆฌ๊ฐ€ ์žฅ์ (๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ๊ฐ์†Œ, ๊ฐ€๋…์„ฑ ๋“ฑ)๊ณผ ๋‹จ์ (๋ช…์‹œ์ ์ธ ์˜ค๋ฅ˜ ์žฅ์‹ ์—†์Œ/์˜ค๋ฅ˜ ๋ผ์ธ ์†Œ์Šค์˜ ๋‚ฎ์€ ์ถ”์  ๊ฐ€๋Šฅ์„ฑ)์„ ํ‘œ์‹œํ•œ๋‹ค๋ฉด ๋™์˜ํ•˜์‹ญ๋‹ˆ๊นŒ? ๋„์›€ c, d๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์ง€ ์•Š์Œ,
    ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ "๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ d๊ฐ€ ์•„๋‹ˆ๋‹ค", "์–ด๋–ป๊ฒŒ ๊ทธ๊ฒƒ์„ e๋กœ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€"์˜ ๋ชจ๋“  ์–ด์ˆ˜์„ ํ•จ์„ ์žƒ๊ณ  @magical ์ด ์ง€์ ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ์  ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋˜ํ•œ "ํ•˜์ง€๋งŒ ์†”๋ฃจ์…˜ XXX๋Š” d๋ฅผ ๋” ์ž˜ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  2. ๋งŽ์€ ์ธ๋ผ์ธ ๊ฒŒ์‹œ๋ฌผ์€ "์ œ์•ˆ์˜ ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ œ์•ˆ"์ž…๋‹ˆ๋‹ค. - ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€๋Š” ์ค„์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ๊ทธ๊ฒƒ๋“ค์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

LMKWYT.

0 ์ธ์ˆ˜(๋˜๋Š” ๋‹ค๋ฅธ ๋‚ด์žฅ)๊ฐ€ ์žˆ๋Š” try() ๋ฅผ ์•„์ง ๊ณ ๋ ค ์ค‘์ด๊ฑฐ๋‚˜ ์ œ์™ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ์„ ๋ณ€๊ฒฝํ•œ ํ›„์—๋„ ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋” "์ผ๋ฐ˜์ "์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ์šฐ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฐฑ์—…ํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค :upside_down_ face:.
0 ์ธ์ˆ˜(๋˜๋Š” ๋‹ค๋ฅธ ๋‚ด์žฅ)๊ฐ€ ์žˆ๋Š” try() ๊ฐ€ ์ œ์•ˆ์— ์ถ”๊ฐ€๋˜๋ฉด ์ œ์•ˆ์˜ ์˜ˆ์ œ๊ฐ€ try() (๋˜๋Š” ๋‹ค๋ฅธ ๋‚ด์žฅ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜์„ ๋ฐฉ์ง€ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@guybrand ์ฐฌ์„ฑ๊ณผ ๋ฐ˜๋Œ€ ํˆฌํ‘œ๋Š” _๊ฐ์ •_์„ ํ‘œํ˜„ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—๋Š” ๋” ์ด์ƒ ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํˆฌํ‘œ์ˆ˜, ์ฆ‰ ๊ฐ์ •๋งŒ์œผ๋กœ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ชจ๋“  ์‚ฌ๋žŒ(์˜ˆ: 90% ์ด์ƒ)์ด ์ œ์•ˆ์„ ์‹ซ์–ดํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์•„๋งˆ๋„ ๋‚˜์œ ์ง•์กฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๊ธฐ ์ „์— ํ•œ ๋ฒˆ ๋” ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์— ๋งŒ์กฑํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค(์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜์ง€ ๋งˆ์„ธ์š”).

์œ„์—์„œ ํ‘œํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์ œ์•ˆ์˜ ์ด ๋‹จ๊ณ„์—์„œ ๊ฐ์ •์€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์‹ค์ œ ๊ฒฝํ—˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค. ๊ฐ์ •์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๊ฐ์ •์— ๋Œ€ํ•œ ์ฃผ์ œ๋ฅผ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์„ ๋•Œ... :-)

@Goodwine ์•„๋ฌด๋„ ์˜ค๋ฅ˜ ๊ฐ’์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด try() ๋ฅผ ๋ฐฐ์ œํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. _if_ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•˜์ง€๋งŒ @rogpeppe ๊ฐ€ ์ œ์•ˆํ•œ ๋Œ€๋กœ ๋ฏธ๋ฆฌ ์„ ์–ธ๋œ err ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ œ ์ƒ๊ฐ์—๋Š”).

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด ์ œ์•ˆ์€ ์ด๊ฒƒ์„ ๋ฐฐ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ฑฐ๊ธฐ๋กœ ๊ฐ€์ž.

@griesemer
์ €๋ฅผ ์™„์ „ํžˆ ์˜คํ•ดํ•˜์‹  ๊ฒƒ ๊ฐ™์•„์š”.
๋‚˜๋Š” ์ฐฌ์„ฑ/๋ฐ˜๋Œ€ ํˆฌํ‘œ ๋˜๋Š” ์–ด๋–ค ์ œ์•ˆ๋„ ๊ฒ€ํ† ํ•˜์ง€ ์•Š๊ณ  "๋‚˜๋Š” x๋ฅผ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์—„๊ฒฉํ•œ ๊ธฐ์ค€์— ๋”ฐ๋ผ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?" ' ๋˜๋Š” '์˜ˆ์˜๊ฒŒ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค'"

๋‹น์‹ ์ด ์“ด ๊ฒƒ์—์„œ - ๊ทธ๊ฒŒ ์ •ํ™•ํžˆ ๋‹น์‹ ์ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ... ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚ด ์˜๊ฒฌ์„ ์ฐฌ์„ฑํ•˜์‹ญ์‹œ์˜ค.

"๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด ์ œ์•ˆ์ด ๊ฐœ์„ ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชฉํ‘œ์˜ ๋ชฉ๋ก์„ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ, ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š”
A. ์ถฉ๋ถ„ํžˆ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ํŒ๋‹จ
B. ์ œ์•ˆ์ด ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ชฉํ‘œ๋ฅผ ์‹ค์ œ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š”์ง€ ๊ฒฐ์ •
C. (๋‹น์‹ ์ด ์ถ”๊ฐ€ํ•œ๋Œ€๋กœ) ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด์‹ญ์‹œ์˜ค ...

@guybrand ๊ทธ๋“ค์€ ์‹œํ—˜ํŒ 1.14(?)์—์„œ ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค๊ณ  ์‹ค์ œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํ”ผ๋“œ๋ฐฑ์„ ์ˆ˜์ง‘ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๋ถ„๋ช…ํžˆ ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. IOW ๊ฒฐ์ •์ด ๋‚ด๋ ค์กŒ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ on err, <statement> ์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์œ„ํ•ด #32611์„ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

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

(์ด๊ฒƒ์ด ๋‹น์‹ ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ๋” ์ž˜ ๋‹ค๋ฃจ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ ๊ด€๋ จ ๊ธฐ์ค€๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ €๋Š” ์ด ์ œ์•ˆ์ด ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋‚ด์šฉ ์„ ๋ถ„๋ช…ํžˆ ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ท€ํ•˜๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋ชฉ๋ก์ด ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

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

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

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

๋ณธ์งˆ์ ์œผ๋กœ ์ด ์ œ์•ˆ์€ ๊ธฐ๋ณธ ์ œ๊ณต append() ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์ด ๋งค์šฐ ์ผ๋ฐ˜์ ์ด๋ฉด์„œ๋„ ๊ตฌ์ฒด์ ์ธ ์ƒ์šฉ๊ตฌ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ œ๊ณต "๋งคํฌ๋กœ"๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์ • id err!=nil { return err } ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์œ ์šฉํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š”๋ณ„๋กœ ๋„์›€์ด๋˜์ง€ ์•Š์œผ๋ฉฐ ์‹ค์ œ๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์ ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์••๋„์ ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ Go ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ์ข€ ๋” ๋งŽ์€ ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›์•˜๊ณ , ๊ทธ๋ž˜์„œ ์ด ์Šค๋ ˆ๋“œ์˜ ๋…ผ์˜๊ฐ€ ๊ณ„์† ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ์œผ๋กœ์„œ๋Š” ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Go์—์„œ๋Š” ์ด ์ˆœ์„œ์˜ ์ธ์ˆ˜ func(... interface{}, error) ๋ฅผ ๊ฐ–๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋จผ์ € ์ž…๋ ฅํ•œ ๋‹ค์Œ ๋ชจ๋“  ํŒจํ„ด์˜ ๊ฐ€๋ณ€ ๋ฒˆํ˜ธ๋Š” Go ๋ชจ๋“ˆ์˜ ๋ชจ๋“  ๊ณณ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ๊ฐํ• ์ˆ˜๋ก ํ˜„์žฌ์˜ ์ œ์•ˆ์ด ๋งˆ์Œ์— ๋“ ๋‹ค.

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ญ์ƒ if ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ถ”๊ฐ€ํ•  ์ƒ๊ฐ์ด ์žˆ์ง€๋งŒ ์›”์š”์ผ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@mishak87 ์šฐ๋ฆฌ๋Š” ์ƒ์„ธํ•œ ์ œ์•ˆ์„œ ์—์„œ ์ด๊ฒƒ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. "๋ถˆ๊ทœ์น™ํ•œ" ๋‹ค๋ฅธ ๋‚ด์žฅ ๊ธฐ๋Šฅ( try , make , unsafe.Offsetof ๋“ฑ)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด์žฅ ๊ธฐ๋Šฅ์˜ ์šฉ๋„์ž…๋‹ˆ๋‹ค.

@rsc , ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค! ์•„์ง ์ˆ˜์ • ์ค‘์ด๋ผ๋ฉด #id ๋ฌธ์ œ ์ฐธ์กฐ๋ฅผ ์—ฐ๊ฒฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ธ€๊ผด ์Šคํƒ€์ผ์˜ ์‚ฐ์„ธ๋ฆฌํ”„์ฒด?

์ด๊ฒƒ์€ ์•„๋งˆ๋„ ์ด์ „์— ๋‹ค๋ฃจ์–ด์กŒ์„ ๊ฒƒ์ด๋ฏ€๋กœ ๋” ๋งŽ์€ ๋…ธ์ด์ฆˆ๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ์‚ฌ๊ณผํ•˜์ง€๋งŒ try builtin ๋Œ€ try ... else ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ์š”์ ์„ ๋งํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

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

user := try(getUser(userID))

์—๊ฒŒ

user, err := getUser(userID)
if err != nil {  
    // inspect error here
    return err
}

defer ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋“  try() ํ˜ธ์ถœ์— ๋Œ€ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ์ตœ์ƒ์˜ ๊ฒฝํ—˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ผํ•œ ํ•จ์ˆ˜์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ค‘์ฒฉ๋œ try() ํ˜ธ์ถœ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ํ›จ์”ฌ ๋” ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์ปจํ…์ŠคํŠธ ๋˜๋Š” ๊ฒ€์‚ฌ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด

user := try getUser(userID)

๋์— catch ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ทธ ๋’ค์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

user := try getUser(userID) catch {
   // inspect error here
}

ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ผ์‹œ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ catchํ•˜๊ธฐ ์ „์— ์ค„์„ ๋Š๊ณ  ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

try() ์™€ if err != nil ์‚ฌ์ด๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ํ›จ์”ฌ ๋” ์„ฑ๊ฐ€์‹  IMO๋ฅผ ๋Š๋‚๋‹ˆ๋‹ค.

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

try()๊ฐ€ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ์ผ์ƒ ์—…๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ๋•Œ try ... catch ์ด d ์ผ๋ถ€ ์˜ค๋ฅ˜์™€ ๊ด€๋ จ๋œ ์ถ”๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€/์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๋˜ํ•œ try() $๋ฅผ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด if err != nil ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด make() ๋Œ€ new() ๋Œ€ := ์„ ๊ฐ–๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. var . ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์œ ์šฉํ•˜์ง€๋งŒ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋” ์ ๊ฑฐ๋‚˜ ๋‹จ์ผ ๋ฐฉ๋ฒ•์ด๋ผ๋„ ์žˆ์œผ๋ฉด ์ข‹์ง€ ์•Š์„๊นŒ์š”? ๋ฌผ๋ก  ์•„๋ฌด๋„ try๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‚ฌ๋žŒ๋“ค์€ if err != nil์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Go์—์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋ถ„ํ• ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด์— ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜๋“ ์ง€ ์‚ฌ๋žŒ๋“ค์ด ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€/์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด ํ–‰์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋„๋ก ํ•˜๋Š” ๋Œ€์‹  ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€/์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ข‹์€ ๊ฒฐ๊ณผ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

//cc @brynbellomy

@owais๋‹˜ , ๋‹ค์‹œ ์ด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํƒ€๋‹นํ•œ ์ง€์ ์ž…๋‹ˆ๋‹ค(๋””๋ฒ„๊น… ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ์ด์ „ ์— ์–ธ๊ธ‰๋œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค). try ๋Š” ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์™€ ๊ฐ™์€ ํ™•์žฅ์„ ์œ„ํ•ด ๋ฌธ์„ ์—ด์–ด๋‘ก๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ try ํ•จ์ˆ˜๊ฐ€ ๋””๋ฒ„๊น…์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. try - catch ๋˜๋Š” try ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. else .

@owais

defer ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋“  try() ํ˜ธ์ถœ์— ๋Œ€ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ์ตœ์ƒ์˜ ๊ฒฝํ—˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์˜ค๋ฅ˜๋ฅผ ์ ์ ˆํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ(๋˜๋Š” ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Œ)ํ•˜๋Š” ์ง€์—ฐ๋œ ํ•จ์ˆ˜์— ์œ ํ˜• ์Šค์œ„์น˜๋ฅผ ํ•ญ์ƒ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

  2. ํŒ€์ด ํ˜„์žฌ ์ž‘์„ฑ๋œ ์ œ์•ˆ์„ ๊ณ„์† ์ง„ํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์›ํ•˜์ง€ ์•Š๊ณ  ๊ณ ์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด try() ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์Šค์œ„์น˜๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉ์—์„œ? _(๋ฌผ๋ก  CI๋ฅผ ํ†ตํ•ด.)_ ์ด๋Ÿฌํ•œ ๊ณ ๋ ค์— ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

try()๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์Šค์œ„์น˜๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ IMO๊ฐ€ ์•„๋‹Œ Linting ๋„๊ตฌ์— ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ IMO๊ฐ€ ์•„๋‹Œ Linting ๋„๊ตฌ์— ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

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

@mikeschinkel ๊ทธ๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์ผœ๋Š” ๊ฒƒ์„ ์žŠ๋Š” ๊ฒƒ๋„ ์‰ฝ์ง€ ์•Š์„๊นŒ์š”?

์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋Š” ์–ธ์–ด ์‚ฌ์–‘์„ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆ˜์˜์‚ฌ/๋ณดํ‘ธ๋ผ๊ธฐ์—๊ฒŒ ํ›จ์”ฌ ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์ผœ๋Š” ๊ฒƒ์„ ์žŠ๋Š” ๊ฒƒ๋งŒํผ์ด๋‚˜ ์‰ฝ์ง€ ์•Š์„๊นŒ์š”?

์ปดํŒŒ์ผ ์ „์— ๋ฆฐํŠธ๋ฅผ ๊ฐ•์ œ๋กœ ์‹คํ–‰ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋Š” GoLand์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

-nolocalimports ๋Š” ์‚ฌ์–‘์„ ๋ณ€๊ฒฝํ•˜๊ณ  -s ๋Š” ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

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

-nolocalimports ๋Š” ์‚ฌ์–‘์„ ๋ณ€๊ฒฝํ•˜๊ณ  -s ๋Š” ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์‚ฌ์–‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ธ์–ด์˜ ๋ฌธ๋ฒ•์ด ๊ณ„์† ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ์–‘์— ๊ตฌ์ฒด์ ์œผ๋กœ ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ปดํŒŒ์ผ ์ „์— ๋ฆฐํŠธ๋ฅผ ๊ฐ•์ œ๋กœ ์‹คํ–‰ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋Š” GoLand์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/vmware/dispatch/wiki/Configure-GoLand-with-golint

@deanveloper

https://github.com/vmware/dispatch/wiki/Configure-GoLand-with-golint

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

lint๋Š” ํ•ญ์ƒ ์ปดํŒŒ์ผ๋Ÿฌ ์‹คํ–‰์„ ์œ„ํ•œ ์ „์ œ ์กฐ๊ฑด์œผ๋กœ ๋กœ ๊ตฌ์„ฑ๋˜์ง€ ์•Š๊ณ  ๊ตฌ์„ฑ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(AFAIK).

image

์•„๋‹ˆ์š”, ์‚ฌ์–‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ธ์–ด์˜ ๋ฌธ๋ฒ•์ด ๊ณ„์† ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ์–‘์— ๊ตฌ์ฒด์ ์œผ๋กœ ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๋„์›€์ด ๋œ๋‹ค๋ฉด ์–ธ์–ด ์‚ฌ์–‘์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

try() ์˜ ํ•ด์„์€ ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งˆ์ง€๋ง‰ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์˜ค๋ฅ˜์ผ ๋•Œ ๋ฐ˜ํ™˜์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ํ•ด์„์ด์ง€๋งŒ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋„๋ก ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์•ˆ๋…•ํ•˜์„ธ์š”. ๊ฐœ๋ฐœ ์ค‘์— ๋””๋ฒ„๊ทธ ๋ฌธ ๋“ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์ „์ฒด ๋ฌธ์ œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
try() ํ•จ์ˆ˜์—๋Š” ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ ์•„์ด๋””์–ด๊ฐ€ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ emit ์ ˆ์„ try() ์— ๋Œ€ํ•œ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐœ๋ฐœํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ์ธ์‡„ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ˆœ๊ฐ„์— fmt ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ด๊ฒƒ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :

func writeStuff(filename string) (io.ReadCloser, error) {
    f := try(os.Open(filename))
    try(fmt.Fprintf(f, "stuff\n"))

    return f, nil
}

๋””๋ฒ„๊ทธ ๋ฌธ์ด๋‚˜ ์ผ๋ฐ˜ ์ฒ˜๋ฆฌ ๋˜๋Š” ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ์ด์™€ ๊ฐ™์ด ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func writeStuff(filename string) (io.ReadCloser, error) {
    emit err {
        fmt.Printf("something happened [%v]\n", err.Error())
        return nil, err
    }

    f := try(os.Open(filename))
    try(fmt.Fprintf(f, "stuff\n"))

    return f, nil
}

๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์— ์ดˆ๊ธฐ try() ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜ํ™˜์„ ์œ„ํ•œ ํ•œ ๋ฌธ์žฅ ๋˜๋Š” ํ•˜๋‚˜์˜ ๋ผ์ด๋„ˆ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์ƒˆ ํ‚ค์›Œ๋“œ emit ์— ๋Œ€ํ•œ ์ œ์•ˆ์„ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

emit return nil, err

๋ฐฉ์ถœ์€ ๋ณธ์งˆ์ ์œผ๋กœ try() ๊ฐ€ nil๊ณผ ๊ฐ™์ง€ ์•Š์€ ์˜ค๋ฅ˜์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ๊ฒฝ์šฐ ์›ํ•˜๋Š” ๋…ผ๋ฆฌ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ ˆ์ž…๋‹ˆ๋‹ค. emit ํ‚ค์›Œ๋“œ์˜ ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์€ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์ฒซ ๋ฒˆ์งธ ์˜ˆ์ œ์—์„œ ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ํ‚ค์›Œ๋“œ ๋ฐ”๋กœ ๋’ค์— ์ถ”๊ฐ€ํ•˜๋ฉด ์˜ค๋ฅ˜์— ๋ฐ”๋กœ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ @mikeschinkel ์— ๋Œ€ํ•œ ์‘๋‹ต์ž…๋‹ˆ๋‹ค. ํ† ๋ก ์„ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์„ธ๋ถ€ ์‚ฌํ•ญ ๋ธ”๋ก์— ์‘๋‹ต์„ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“ , @networkimprov ๋Š” ์ด ์ œ์•ˆ์ด ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€(๋งŒ์•ฝ ๊ตฌํ˜„๋œ๋‹ค๋ฉด) ์ด ๋…ผ์˜๊ฐ€ ํ…Œ์ด๋ธ”์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค.

์‹œ๋„๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ์„ธ๋ถ€์ •๋ณด
@mikeschinkel

lint๋Š” ํ•ญ์ƒ ์ปดํŒŒ์ผ๋Ÿฌ ์‹คํ–‰์„ ์œ„ํ•œ ์ „์ œ ์กฐ๊ฑด์œผ๋กœ ๋กœ ๊ตฌ์„ฑ๋˜์ง€ ์•Š๊ณ  ๊ตฌ์„ฑ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(AFAIK).

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

(ํŽธ์ง‘: ๋งจ ์•„๋ž˜์— ์•Œ๋ ค์ฃผ๋ ค๊ณ  ํ–ˆ๋˜ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๋™์•ˆ์—๋„ ์ž˜ ์‹คํ–‰๋˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ "Run Kind"๋ฅผ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค)

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

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

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

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

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

์ฆ‰, ImportPath ๋Š” ์‚ฌ์–‘์—์„œ ํ‘œ์ค€ํ™”ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ œ์•ˆ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋„์›€์ด๋œ๋‹ค๋ฉด ์–ธ์–ด ์‚ฌ์–‘์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ [...]

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

@deanveloper

_"์–ด๋Š ์ชฝ์ด๋“  @networkimprov ๋Š” ์ด ์ œ์•ˆ์ด ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€ ์ด ๋…ผ์˜๋ฅผ ํ…Œ์ด๋ธ”์— ์˜ฌ๋ ค์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค(๊ทธ๋ ‡๋‹ค๋ฉด)."_

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

๋‹น์‹ ์—๊ฒŒ ์„ ํƒ๊ถŒ์ด ์ฃผ์–ด์ง€๋ฉด, ๋‚˜๋Š” ๋˜ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ ๋ธ”๋ก์—์„œ ์‘๋‹ตํ•˜๋„๋ก ์„ ํƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ:

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

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

๊ทธ๋ž˜์„œ ์ €๋Š” ์—ฌ๊ธฐ์—์„œ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ์†”๋ฃจ์…˜์ด ์•„๋‹Œ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์„ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค.

_"์‚ฌ์šฉ ์ค‘์ธ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋„ ์‹œ๋„๋ฅผ ๋„๊ฒŒ ๋ฉ๋‹ˆ๋‹ค."_

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

_"์‚ฌ์–‘ ๋ณ€๊ฒฝ ์š”์ฒญ์ž…๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ ์ž์ฒด๊ฐ€ ์‚ฌ์–‘ ๋ณ€๊ฒฝ ์š”์ฒญ์ž…๋‹ˆ๋‹ค._"

์‚ฌ์–‘ ๋ณ€๊ฒฝ์€ ์ ˆ๋Œ€ ์•„๋‹™๋‹ˆ๋‹ค. build ๋ช…๋ น์–ด์˜ _behavior_ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ์Šค์œ„์น˜ ์š”์ฒญ์ด์ง€, ์–ธ์–ด ์‚ฌ์–‘ ๋ณ€๊ฒฝ์ด ์•„๋‹™๋‹ˆ๋‹ค.

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

์œ ์‚ฌํ•˜๊ฒŒ go build ๊ฐ€ ์ด ์Šค์œ„์น˜๋ฅผ ๋ณธ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  try() ๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ์–ธ์–ด ์‚ฌ์–‘ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

_"๋ชจ๋“  Go ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋™์ผํ•ด์•ผ ํ•˜๋Š” ์–ธ์–ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค."_

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

์Šค์œ„์น˜๊ฐ€ ์—†์œผ๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์œผ๋กœ ์ธ์‹ํ•˜๊ณ  ์ˆ˜์šฉํ•˜๊ณ  ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ฌป์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

_"์•„๋‹ˆ์š”, ์•„๋‹™๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋Š” ์–ธ์–ด ์‚ฌ์–‘์„ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค."_

์‹œ๋งจํ‹ฑ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•ด์„œ ์‹œ๋งจํ‹ฑ์„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์€. ๊ทธ๋Ÿฐ ๋‹ค์Œ $#$5 try() #$ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์ปดํŒŒ์ผ ์ค‘์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” _(something like)_ build-guard ๋ผ๋Š” ์ƒˆ๋กœ์šด ์ตœ์ƒ์œ„ ๋ช…๋ น์„ ๋Œ€์‹  ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

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


๋”ฐ๋ผ์„œ ์ด์ œ @networkimprov ์— ์ง„์ •์œผ๋กœ ๋™์˜ํ•œ๋‹ค๋ฉด ๊ทธ๋“ค์ด ์ œ์•ˆํ•œ ๋Œ€๋กœ ๋‚˜์ค‘์— ๋‹ต์žฅ์„ ๋ณด๋ฅ˜ํ•˜์‹ญ์‹œ์˜ค.

๋ฐฉํ•ดํ•ด์„œ ์ฃ„์†กํ•˜์ง€๋งŒ ๋ณด๊ณ ํ•  ์‚ฌ์‹ค์ด ์žˆ์Šต๋‹ˆ๋‹ค :-)

๋ฐ”๋‘‘ํŒ€์€ ์ด๋ฏธ ์—ฐ๊ธฐ๋ฅผ ๋ฒค์น˜๋งˆํ‚นํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ ์ˆ˜์น˜๋Š” ๋ณธ์ ์ด ์—†๋„ค์š”...

$ go test -bench=.
goos: linux
goarch: amd64
BenchmarkAlways2-2      20000000                72.3 ns/op
BenchmarkAlways4-2      20000000                68.1 ns/op
BenchmarkAlways6-2      20000000                68.0 ns/op

BenchmarkNever2-2       100000000               16.5 ns/op
BenchmarkNever4-2       100000000               13.1 ns/op
BenchmarkNever6-2       100000000               13.5 ns/op

์›์ฒœ

package deferbench

import (
   "fmt"
   "errors"
   "testing"
)

func Always(iM, iN int) (err error) {
   defer func() {
      if err != nil {
         err = fmt.Errorf("d: %v", err)
      }
   }()
   if iN % iM == 0 {
      return errors.New("e")
   }
   return nil
}

func Never(iM, iN int) (err error) {
   if iN % iM == 0 {
      return fmt.Errorf("r: %v", errors.New("e"))
   }
   return nil
}

func BenchmarkAlways2(iB *testing.B) { for a := 0; a < iB.N; a++ { Always(1e2, a) }}
func BenchmarkAlways4(iB *testing.B) { for a := 0; a < iB.N; a++ { Always(1e4, a) }}
func BenchmarkAlways6(iB *testing.B) { for a := 0; a < iB.N; a++ { Always(1e6, a) }}

func BenchmarkNever2(iB *testing.B) { for a := 0; a < iB.N; a++ { Never(1e2, a) }}
func BenchmarkNever4(iB *testing.B) { for a := 0; a < iB.N; a++ { Never(1e4, a) }}
func BenchmarkNever6(iB *testing.B) { for a := 0; a < iB.N; a++ { Never(1e6, a) }}

@networkimprov

https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md#efficiency -of-defer์—์„œ (๋ณผ๋“œ์ฒด๋กœ ๊ฐ•์กฐ)

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

์ฆ‰, defer๋Š” ์ด์ œ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์„ ์œ„ํ•œ go1.13์˜ 30% ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด๋ฉฐ go 1.14์˜ non-defer ๋ชจ๋“œ๋งŒํผ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ 1.13 ๋ฐ 1.14 CL์— ๋Œ€ํ•œ ๋ฒˆํ˜ธ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ตœ์ ํ™”๊ฐ€ ํ•ญ์ƒ ์ ๊ณผ์˜ ์ ‘์ด‰์—์„œ ์‚ด์•„๋‚จ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค... ์–ด, ์ƒํƒœ๊ณ„.

1.13 ์—ฐ๊ธฐ๋Š” ์•ฝ 30% ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

name     old time/op  new time/op  delta
Defer-4  52.2ns ยฑ 5%  36.2ns ยฑ 3%  -30.70%  (p=0.000 n=10+10)

์ด๊ฒƒ์€ ์œ„์˜ @networkimprov ํ…Œ์ŠคํŠธ์—์„œ ์–ป์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค(1.12.5์—์„œ ํŒ๊นŒ์ง€).

name       old time/op  new time/op  delta
Always2-4  59.8ns ยฑ 1%  47.5ns ยฑ 1%  -20.57%  (p=0.008 n=5+5)
Always4-4  57.9ns ยฑ 2%  43.5ns ยฑ 1%  -24.96%  (p=0.008 n=5+5)
Always6-4  57.6ns ยฑ 2%  44.1ns ยฑ 1%  -23.43%  (p=0.008 n=5+5)
Never2-4   13.7ns ยฑ 8%   3.8ns ยฑ 4%  -72.27%  (p=0.008 n=5+5)
Never4-4   10.5ns ยฑ 6%   1.3ns ยฑ 2%  -87.76%  (p=0.008 n=5+5)
Never6-4   10.8ns ยฑ 6%   1.2ns ยฑ 1%  -88.46%  (p=0.008 n=5+5)

(์™œ Never ๊ฒƒ๋“ค์€ ํ›จ์”ฌ ๋” ๋น ๋ฅธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ธ๋ผ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?)

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

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ๊ทธ ์ œ์•ˆ์„ ๋ฌด์‹œํ•˜๊ณ  ๋‚˜์ค‘์— ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ด ์Šค๋ ˆ๋“œ์— ๊ฒŒ์‹œํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๊นŒ?

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


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

@griesemer ์กฐ๊ธˆ ๋” ํ™•์žฅํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ์˜์—ญ ์ค‘ ํ•˜๋‚˜๋Š” try ๊ฐ€ ํฌํ•จ๋œ ์„ธ๊ณ„์—์„œ ์ „ํ™˜์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์˜ค๋ฅ˜ ์žฅ์‹ ์Šคํƒ€์ผ ๊ฐ„ ์ „ํ™˜ ๋น„์šฉ.
  • ์Šคํƒ€์ผ ๊ฐ„์— ์ „ํ™˜ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅํ•œ ์‹ค์ˆ˜์˜ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  • ์–ด๋–ค ์ข…๋ฅ˜์˜ ์‹ค์ˆ˜๊ฐ€ (a) ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜์— ์˜ํ•ด ์ฆ‰์‹œ ํฌ์ฐฉ๋˜๋Š”์ง€, vs. (b) vet ๋˜๋Š” staticcheck ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์œ ํ˜•์— ์˜ํ•ด ํฌ์ฐฉ๋˜๋Š”์ง€, vs. (c) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„๊ทธ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์žก์•„์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋„๊ตฌ๊ฐ€ ์Šคํƒ€์ผ ๊ฐ„ ์ „ํ™˜ ์‹œ ๋น„์šฉ๊ณผ ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋„, ํŠนํžˆ gopls (๋˜๋Š” ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ)๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์žฅ์‹ ์Šคํƒ€์ผ ์ „ํ™˜์„ ์ž๋™ํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€.

์˜ค๋ฅ˜ ์žฅ์‹์˜ ๋‹จ๊ณ„

์ด๊ฒƒ์ด ์™„์ „ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋Œ€ํ‘œ์ ์ธ ๋‹จ๊ณ„ ์„ธํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

0. ์˜ค๋ฅ˜ ์žฅ์‹ ์—†์Œ (์˜ˆ: ์žฅ์‹ ์—†์ด try ์‚ฌ์šฉ).
1. ๊ท ์ผํ•œ ์˜ค๋ฅ˜ ์žฅ์‹ (์˜ˆ: ๊ท ์ผ ์žฅ์‹์„ ์œ„ํ•ด try + defer ์‚ฌ์šฉ).
2. N-1๊ฐœ์˜ ์ข…๋ฃŒ์ ์€ ๊ท ์ผํ•œ ์˜ค๋ฅ˜ ์žฅ์‹ ์„ ๊ฐ–์ง€๋งŒ 1๊ฐœ์˜ ์ถœ๊ตฌ์ ์€ ๋‹ค๋ฅธ ์žฅ์‹์„ ๊ฐ–์Šต๋‹ˆ๋‹ค(์˜ˆ: ํ•œ ์œ„์น˜์— ์˜๊ตฌ์ ์ธ ์„ธ๋ถ€ ์˜ค๋ฅ˜ ์žฅ์‹ ๋˜๋Š” ์ž„์‹œ ๋””๋ฒ„๊ทธ ๋กœ๊ทธ ๋“ฑ).
3. ๋ชจ๋“  ์ถœ๊ตฌ ์ง€์ ์—๋Š” ๊ฐ๊ฐ ๊ณ ์œ ํ•œ ์˜ค๋ฅ˜ ์žฅ์‹ ๋˜๋Š” ๊ณ ์œ ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

0๋‹จ๊ณ„์™€ 1๋‹จ๊ณ„๋Š” ํ˜„์žฌ ์ œ์•ˆ์˜ ์Šค์œ„ํŠธ ์Šคํฟ์œผ๋กœ ๋ณด์ด๋ฉฐ ์ƒ๋‹นํžˆ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ๊ณ„ 0->1 ์ „ํ™˜์€ ๊ฐ„๋‹จํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. 0๋‹จ๊ณ„์—์„œ ์žฅ์‹ ์—†์ด try ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด defer fmt.HandleErrorf(&err, "foo failed with %s", arg1) ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ˆœ๊ฐ„์— ์ฒ˜์Œ ์ž‘์„ฑ๋œ ์ œ์•ˆ์„œ ์•„๋ž˜์— ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„์ž…ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ์•ˆ์„œ๊ฐ€ ์ตœ์ข… ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ณ„์นญ์ธ ๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ธฐ๋ณธ ์ œ๊ณต ๋ณ€์ˆ˜ ๋ผ์ธ์„ ๋”ฐ๋ผ ์ œ์•ˆ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ฑ„ํƒํ•˜๋ฉด ์—ฌ๊ธฐ์„œ ์˜ค๋ฅ˜์˜ ๋น„์šฉ๊ณผ ์œ„ํ—˜์ด ์ž‘์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฐ˜๋ฉด์— 1๋‹จ๊ณ„๊ฐ€ defer ๊ฐ€ ์žˆ๋Š” ๊ท ์ผํ•œ ์˜ค๋ฅ˜ ์žฅ์‹์ธ ๊ฒฝ์šฐ ๋‹จ๊ณ„ 1->2 ์ „ํ™˜์ด ์–ด์ƒ‰ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค(๋˜๋Š” ์ผ๋ถ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋งํ–ˆ๋“ฏ์ด "์„ฑ๊ฐ€์‹ "). ํ•˜๋‚˜์˜ ์ถœ๊ตฌ ์ง€์ ์— ํŠน์ • ์žฅ์‹ ๋น„ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋จผ์ € defer ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด์ค‘ ์žฅ์‹์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด). ๊ทธ๋Ÿฐ ๋‹ค์Œ try ์„คํƒ•์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋ฐ˜ํ™˜ ์ง€์ ์„ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. if ๋ฌธ์— ์‚ฌ์šฉํ•˜๋ฉฐ ์˜ค๋ฅ˜ ์ค‘ N-1๊ฐœ๋Š” ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์žฅ์‹๋˜๊ณ  1๊ฐœ๋Š” ๋‹ค๋ฅด๊ฒŒ ์žฅ์‹๋ฉ๋‹ˆ๋‹ค.

1->3๋‹จ๊ณ„ ์ „ํ™˜๋„ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉด ์–ด์ƒ‰ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์žฅ์‹ ์Šคํƒ€์ผ ๊ฐ„ ์ „ํ™˜ ์‹œ ์‹ค์ˆ˜

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

        w := try(os.Create(dst))
        defer func() {
                w.Close()
                if err != nil {
                        os.Remove(dst) // only if a โ€œtryโ€ fails
                }
        }()

๋ˆ„๊ตฐ๊ฐ€ w := try(os.Create(dst)) ์˜ "๋ช…๋ฐฑํ•œ" ์ˆ˜๋™ ๋””์Šˆ๊ฐ€๋ง์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด ๊ทธ ํ•œ ์ค„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

        w, err := os.Create(dst)
        if err != nil {
            // do something here
            return err
        }

์–ธ๋œป ๋ณด๊ธฐ์—๋Š” ์ข‹์•„ ๋ณด์ด์ง€๋งŒ ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š” ๋ธ”๋ก์— ๋”ฐ๋ผ ์ด๋ฆ„์ด ์ง€์ •๋œ ๋ฐ˜ํ™˜ ๋งค๊ฐœ๋ณ€์ˆ˜ err ๋ฅผ ์‹ค์ˆ˜๋กœ ์ˆจ๊ธฐ๊ณ  ํ›„์† defer ์—์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ค‘๋‹จํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์‹ ์Šคํƒ€์ผ ๊ฐ„ ์ž๋™ ์ „ํ™˜

์‹œ๊ฐ„ ๋น„์šฉ๊ณผ ์‹ค์ˆ˜์˜ ์œ„ํ—˜์„ ๋•๊ธฐ ์œ„ํ•ด gopls (๋˜๋Š” ๋‹ค๋ฅธ ์œ ํ‹ธ๋ฆฌํ‹ฐ)์—๋Š” ํŠน์ • try ๋˜๋Š” try ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์„ desugarํ•˜๋Š” ๋ช…๋ น ์œ ํ˜•์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 100% ์‹ค์ˆ˜๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ๋Š” ์ฃผ์–ด์ง„ ํ•จ์ˆ˜์˜ gopls ๋ช…๋ น์ด try ์ œ๊ฑฐ ๋ฐ ๊ต์ฒด์—๋งŒ ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ๋ช…๋ น์€ try ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์„ ์ œ๊ฑฐํ•˜๋ฉด์„œ ์ตœ์†Œํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•จ์ˆ˜ ์ƒ๋‹จ์˜ defer fmt.HandleErrorf(&err, "copy %s %s", src, dst) ๋ฅผ ์ด์ „ try ์œ„์น˜ ๊ฐ๊ฐ์˜ ํ•ด๋‹น ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค(1->2๋‹จ๊ณ„ ๋˜๋Š” 1->3๋‹จ๊ณ„์—์„œ ์ „ํ™˜ํ•  ๋•Œ ๋„์›€์ด ๋จ). ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ ๊ตฌ์šด ์•„์ด๋””์–ด๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ๋ฐ”๋žŒ์งํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๋˜๋Š” ํ˜„์žฌ ์ƒ๊ฐ์œผ๋กœ ์ œ์•ˆ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋” ์ƒ๊ฐํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€์šฉ์  ๊ฒฐ๊ณผ?

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

x1, x2, x3 = try(f())

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

t1, t2, t3, te := f()  // visible temporaries
if te != nil {
        return x1, x2, x3, te
}
x1, x2, x3 = t1, t2, t3

์ •ํ™•ํ•œ ํ˜•์‹์€ ๋“œ๋ฌผ๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์˜ ๋””์Šˆ๊ฐ€๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํŽธ์ง‘๊ธฐ ๋˜๋Š” IDE์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ข…์ข… ๋” ๊ด€์šฉ์ ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋” ์ผ๋ฐ˜์ ์ด๋ฉฐ ์„€๋„์ž‰, := ๋Œ€ = , ๋™์ผํ•œ ๊ธฐ๋Šฅ์—์„œ err ์˜ ๋‹ค๋ฅธ ์šฉ๋„ ๋“ฑ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

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


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

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

1๋‹จ๊ณ„๊ฐ€ ์ง€์—ฐ๋œ ๊ท ์ผํ•œ ์˜ค๋ฅ˜ ์žฅ์‹์ธ ๊ฒฝ์šฐ 1๋‹จ๊ณ„->2๋‹จ๊ณ„ ์ „ํ™˜์ด ์–ด์ƒ‰ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ถœ๊ตฌ ์ง€์ ์— ํŠน์ • ์žฅ์‹ ๋น„ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋จผ์ € defer๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด์ค‘ ์žฅ์‹์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด). ๊ทธ๋Ÿฐ ๋‹ค์Œ N์„ ์‚ฌ์šฉํ•˜์—ฌ try ์‚ฌ์šฉ์„ if ๋ฌธ์œผ๋กœ desugarํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋ฐ˜ํ™˜ ์ง€์ ์„ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. -1๊ฐœ์˜ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์žฅ์‹๋˜๊ณ  1๊ฐœ์˜ ์˜ค๋ฅ˜๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์žฅ์‹๋ฉ๋‹ˆ๋‹ค.

return break ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด 1.12์—์„œ ๋น›์„ ๋ฐœํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. for range once { ... } ๋ธ”๋ก์—์„œ once = "1" ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒํ•˜๋ ค๋Š” ์ฝ”๋“œ ์‹œํ€€์Šค๋ฅผ ๊ตฌ๋ถ„ํ•œ ๋‹ค์Œ ๋‹จ ํ•˜๋‚˜์˜ ์˜ค๋ฅ˜๋งŒ ์žฅ์‹ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ break ์ง€์ ์—์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. return ๋ฐ”๋กœ ์•ž์— ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

fwiw

๋‚ด ๋ฒค์น˜๋งˆํฌ์— ๋Œ€ํ•œ @randall77 ์˜ ๊ฒฐ๊ณผ๋Š” 1.12 ๋ฐ ํŒ ๋ชจ๋‘์— ๋Œ€ํ•ด ํ˜ธ์ถœ ์˜ค๋ฒ„ํ—ค๋“œ๋‹น 40+ns๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋Š” defer๊ฐ€ ์ตœ์ ํ™”๋ฅผ ์–ต์ œํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๊ฐœ์„ ์„ ํ†ตํ•ด ๋…ผ์Ÿ์„ ์—ฐ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@networkimprov Defer๋Š” ํ˜„์žฌ ์ตœ์ ํ™”๋ฅผ ๊ธˆ์ง€ํ•˜๋ฉฐ, ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜์ •ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ฐ˜ ํ˜ธ์ถœ์„ ์ธ๋ผ์ธํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ง€์—ฐ๋œ ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์„ ์ธ๋ผ์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ๊ฐœ์„ ์„ ํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ์ฃผ์žฅ์€ ์–ด๋””์—์„œ ์™”์Šต๋‹ˆ๊นŒ?

๊ทธ ์ฃผ์žฅ์€ ์–ด๋””์—์„œ ์™”์Šต๋‹ˆ๊นŒ?

์˜ค๋ฅ˜ ๋ž˜ํ•‘์„ ์—ฐ๊ธฐํ•˜๋Š” ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ์˜ค๋ฒ„ํ—ค๋“œ๋‹น 40+ns๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

๋‹ค์‹œ swtch.com/try.html ๋ฐ https://github.com/golang/go/issues/32437#issuecomment -502192315:

@rsc , ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค! ์•„์ง ์ˆ˜์ • ์ค‘์ด๋ผ๋ฉด #id ๋ฌธ์ œ ์ฐธ์กฐ๋ฅผ ์—ฐ๊ฒฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ธ€๊ผด ์Šคํƒ€์ผ์˜ ์‚ฐ์„ธ๋ฆฌํ”„์ฒด?

๊ทธ ํŽ˜์ด์ง€๋Š” ์ฝ˜ํ…์ธ ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์ง‘์ค‘ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ž…๋ ฅ ๋งˆํฌ๋‹ค์šด(GitHub-specific #id ๋งํฌ ์—†์Œ)์—์„œ blackfriday์˜ ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ serif ๊ธ€๊ผด์— ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋น„ํ™œ์„ฑํ™”/๊ฒ€ํ†  ์‹œ๋„ :

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

@mikeschinkel , ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋‘ ๋ฒˆ์ด๋‚˜ try ์‚ฌ์šฉ์„ _ignoring_ ์˜ค๋ฅ˜๋กœ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.
6์›” 7์ผ ์— "๊ฐœ๋ฐœ์ž๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋” ์‰ฝ๊ฒŒ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค"๋ผ๋Š” ์ œ๋ชฉ ์•„๋ž˜์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

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

f, _ := os.Open(filename)

๋‚˜๋Š” ๋‚ด ์ž์‹ ์˜ ์ฝ”๋“œ๋ฅผ ๋” ์ž˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์—„์ฒญ๋‚˜๊ฒŒ ์œ ์šฉํ•œ ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๋‹ค๋ฅธ Go ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ์••๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ _"Other People's Code(tm)"_ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ์ข…์ข… ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

์ •๋ง ์ง„์ง€ํ•˜๊ฒŒ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋” ์‰ฝ๊ฒŒ ๋ฌด์‹œํ•˜๊ณ  GitHub๋ฅผ ๊ฒฌ๊ณ ํ•˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋กœ ๋”๋Ÿฝํž ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  6์›” 14์ผ ์— ๋‹ค์‹œ try๋ฅผ "์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•˜๋Š” ์ฝ”๋“œ"๋ผ๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

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

try() ์‹์„ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

try(f()) ๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ f() ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด try ๋Š” ์ฝ”๋“œ ์‹คํ–‰์„ ์ค‘์ง€ํ•˜๊ณ  try ๋ณธ๋ฌธ์˜ ํ•จ์ˆ˜์—์„œ ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๊ฐ€ ๊ทธ๋ƒฅ ๋ฌด์‹œ๋ฉ๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”. ์˜ค๋ฅ˜๋Š” ๋ฌด์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. return ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ฒ˜๋Ÿผ:

{ err := f(); if err != nil { return err } }

์•„๋‹ˆ๋ฉด ์ฒซ ๋ฒˆ์งธ ๋˜๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์˜ defer ,

์˜๋ฏธ๋Š” return ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ง€์—ฐ๋œ ํ•จ์ˆ˜๋Š” " ์ง€์—ฐ๋œ ์—ญ์ˆœ ์œผ๋กœ" ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ž๋™์œผ๋กœ err ๋ผ๋Š” ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ํด๋กœ์ € ๋‚ด๋ถ€์— ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค _(๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?)_.

์˜๋ฏธ๋Š” return ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ง€์—ฐ๋œ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—์„œ ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://golang.org/ref/spec#Defer_statements์—์„œ result ์˜ˆ์ œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž๋™ ์˜ค๋ฅ˜ ์ด๋ฆ„์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์ด๋ฆ„์„ ์–ด๋–ป๊ฒŒ ์ง€์ •ํ•ฉ๋‹ˆ๊นŒ? ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด ํ•จ์ˆ˜์—์„œ ๋‚ด err ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ?

์˜๋ฏธ๋Š” return ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  defer ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๊นŒ? ์—ญ์ˆœ์œผ๋กœ ๋˜๋Š” ์ผ๋ฐ˜ ์ˆœ์„œ๋กœ?

์˜๋ฏธ๋Š” return ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ง€์—ฐ๋œ ํ•จ์ˆ˜๋Š” " ์ง€์—ฐ๋œ ์—ญ์ˆœ ์œผ๋กœ" ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. (์—ญ์ˆœ์€ ์ผ๋ฐ˜์ˆœ์ž…๋‹ˆ๋‹ค.)

์•„๋‹ˆ๋ฉด ํด๋กœ์ €์™€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ func ๋ชจ๋‘์—์„œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๊นŒ? _(์—ฌ๊ธฐ์—์„œ ๊ทธ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ๋‹จ์–ด๋ฅผ ์ฝ์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ฒฐ์ฝ” ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)_

์ด๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๋ชจ๋ฅด์ง€๋งŒ ์•„๋งˆ๋„ ๋Œ€๋‹ต์€ ์•„๋‹ˆ์˜ค์ž…๋‹ˆ๋‹ค. ์ œ์•ˆ์„œ ํ…์ŠคํŠธ์™€ ์‚ฌ์–‘์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ํ•ด๋‹น ํ…์ŠคํŠธ๊ฐ€ ์˜๋ฏธํ•˜๊ฑฐ๋‚˜ ์˜๋ฏธํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์„ค๋ช…์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ์„œ์™€ ์ง€๊ธˆ๊นŒ์ง€์˜ ๋ชจ๋“  ์˜๊ฒฌ์„ ์ฝ์€ ํ›„์—๋„ ์†”์งํžˆ ์œ„์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ _"Captain Obvious"_๋ฅผ ์˜นํ˜ธํ•˜๋Š” ์–ธ์–ด์— ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๊นŒ?

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

x, y := try(f())

์ˆ˜๋‹จ

tmp1, tmp2, tmpE := f()
if tmpE != nil {
   return ..., tmpE
}
x, y := tmp1, tmp2

๋‹ค๋ฅธ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์€ ๊ทธ ์ •์˜์˜ ์˜๋ฏธ๋ฅผ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์˜ค๋ฅ˜๋ฅผ "๋ฌด์‹œ"ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

c, _ := net.Dial("tcp", "127.0.0.1:1234")
io.Copy(os.Stdout, c)

net.Dial์ด ์‹คํŒจํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฌด์‹œ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ํŒจ๋‹‰์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. c๋Š” nil์ด๊ณ  c.Read์— ๋Œ€ํ•œ io.Copy์˜ ํ˜ธ์ถœ์€ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ๋Œ€์กฐ์ ์œผ๋กœ ์ด ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 c := try(net.Dial("tcp", "127.0.0.1:1234"))
 io.Copy(os.Stdout, c)

์šฐ๋ฆฌ๊ฐ€ ์ „์ž๋ณด๋‹ค ํ›„์ž๋ฅผ ์žฅ๋ คํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ๋‹ตํ•˜์ž๋ฉด: ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

@damienfamed75 ๊ท€ํ•˜ ๊ฐ€ ์ œ์•ˆํ•œ emit ๋ฌธ ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดˆ์•ˆ ๋””์ž์ธ ์˜ handle ๋ฌธ๊ณผ ๋™์ผํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. handle ์„ ์–ธ์„ ํฌ๊ธฐํ•œ ์ฃผ๋œ ์ด์œ ๋Š” defer ์™€ ๊ฒน์ณค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. emit ๊ฐ€ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด defer ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@dominikh ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์งˆ๋ฌธํ–ˆ์Šต๋‹ˆ๋‹ค .

acme๊ฐ€ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฅผ ์‹œ์ž‘ํ• ๊นŒ์š”?

์‹œ๋„ ์ œ์•ˆ์— ๋Œ€ํ•œ ๋งŽ์€ ๋ถ€๋ถ„์ด ๋ฏธ์ •์ด๋ฉฐ ์•Œ๋ ค์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ์งˆ๋ฌธ์— ๋‚˜๋Š” ํ™•์‹คํžˆ ๋Œ€๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ์š”.

@rsc

๋‹น์‹ ์˜ ์‘๋‹ต์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

_"์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋‘ ๋ฒˆ์ด๋‚˜ ์˜ค๋ฅ˜ ๋ฌด์‹œ๋กœ try ์‚ฌ์šฉ์„ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค."_

์˜ˆ, ๋‚ด ๊ด€์ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์ˆ ์ ์œผ๋กœ ์ •ํ™•ํ•˜์ง€ ์•Š์€ ๋Œ“๊ธ€์„ ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

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

_" try(f()) ๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ f() ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด try๋Š” ์ฝ”๋“œ ์‹คํ–‰์„ ์ค‘์ง€ํ•˜๊ณ  try๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๋ณธ๋ฌธ์˜ ํ•จ์ˆ˜์—์„œ ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค."_

๊ทธ๊ฒƒ์€ ์–ผ๋งˆ ์ „์— ๋‚ด ์˜๊ฒฌ์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด์—ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ๊ทธ๊ฒƒ์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์Šฌํ”„๊ฒŒ ๋งŒ๋“œ๋Š” ๋‘ ๊ฐ€์ง€ ์ผ์„ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ์›์ธ:

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

  2. return ๋Œ€์‹  break ๋ฐ continue ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ €์™€ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋ณ€ํ™”ํ•˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์— ๋” ํƒ„๋ ฅ์ ์ธ ํŒจํ„ด์ธ try() , ์˜ค๋ฅ˜์— ์ฃผ์„์„ ๋‹ฌ ์ด์œ ๊ฐ€ ์‹ค์ œ๋กœ ์—†๋Š” ๊ฒฝ์šฐ์—๋„.

_"๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜์™€ ํด๋กœ์ € ๋ชจ๋‘์—์„œ ๋ฐ˜ํ™˜๋  ๊ฒƒ์ž…๋‹ˆ๊นŒ? (์—ฌ๊ธฐ์—์„œ ์ด๋ฅผ ์•”์‹œํ•˜๋Š” ๋‹จ์–ด๋ฅผ ์ฝ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ ˆ๋Œ€ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)"_

_"์ด๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๋ชจ๋ฅด์ง€๋งŒ ์•„๋งˆ๋„ ๋Œ€๋‹ต์€ ์•„๋‹ˆ์˜ค์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ์•ˆ ํ…์ŠคํŠธ์™€ ์‚ฌ์–‘์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ํ…์ŠคํŠธ๊ฐ€ ์˜๋ฏธํ•˜๊ฑฐ๋‚˜ ์˜๋ฏธํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์„ค๋ช…์—๋Š” ๊ด€์‹ฌ์ด ์—†์Šต๋‹ˆ๋‹ค."_

๋‹ค์‹œ, ๊ทธ ์งˆ๋ฌธ์€ ์ผ์ฃผ์ผ ์ „์— ์žˆ์—ˆ์œผ๋ฏ€๋กœ ์ด์ œ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด defer ์—๋Š” ํด๋กœ์ €๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ฃ ? ๊ทธ ํด๋กœ์ €์—์„œ ๋Œ์•„์˜ค๋ฉด - ๋‚ด๊ฐ€ ์ž˜๋ชป ์ดํ•ดํ•˜์ง€ ์•Š๋Š” ํ•œ - ํด๋กœ์ €์—์„œ ๋ฐ˜ํ™˜๋  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ func ์—์„œ๋„ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ? _(์˜ˆ์ธ ๊ฒฝ์šฐ ๋‹ต์žฅํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.)_

func example() {
    defer func(err) {
       return err // returns from both defer and example()
    }
    try(SomethingThatReturnsAnError)    
} 

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

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋‹น์‹ ์ด ์˜ค๋ฅ˜๋ฅผ ๊พธ๋ฏธ๋Š” ๊ฒƒ์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ์˜ค๋ฅ˜๋ฅผ ๊พธ๋ฏธ์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์†Œ์ˆ˜์— ๋ถˆ๊ณผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค.


BTW, ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค _(์˜ˆ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์ƒ์˜ .Extend() ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค):_

f := try os.Open(filename) else err {
    err.Extend("Cannot open file %s",filename)
    //break, continue or return err   
}

๋˜๋Š”

try f := os.Open(filename) else err {
    err.Extend("Cannot open file %s",filename)
    //break, continue or return err    
}

๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์‹ค์ œ๋กœ ์–ด๋–ค ๋ฌธ์ž๋„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

f,err := os.Open(filename)
if err != nil {
    err.Extend("Cannot open file %s",filename)
    //break, continue or return err    
}

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

์ˆ˜์ง ๊ณต๊ฐ„์˜ 40%๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

try f := os.Open(filename) 
    else err().Extend("Cannot open file %s",filename)
    end //break, continue or return err    

#fwiw


์–ด์จŒ๋“  , ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด ๋ฐฐ๊ฐ€ ์ถœํ•ญํ•œ ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฐ›์•„๋“ค์ด๋Š” ๋ฒ•์„ ๋ฐฐ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชฉํ‘œ

์—ฌ๊ธฐ์— ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜๊ฒฌ์€ ์ œ์•ˆ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋ ค๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ์˜๋ฌธ์„ ์ œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ 8์›”์— ๋ฐœํ‘œํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฌธ์ œ ์„ค๋ช… ์€ "๋ชฉํ‘œ" ์„น์…˜ ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๊ธฐ์กด ์ฝ”๋“œ๋Š” ๊ณ„์† ์ž‘๋™ํ•ด์•ผ ํ•˜๋ฉฐ ์˜ค๋Š˜๋‚ ์ฒ˜๋Ÿผ ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๊ธฐ์กด ์ฝ”๋“œ์™€ ์ƒํ˜ธ ์šด์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."

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

@mikeschinkel ,

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด, defer ์—๋Š” ํด๋กœ์ €๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ฃ ? ํ•ด๋‹น ํด๋กœ์ €์—์„œ ๋Œ์•„์˜ค๋ฉด - ๋‚ด๊ฐ€ ์˜คํ•ดํ•˜์ง€ ์•Š๋Š” ํ•œ - ํด๋กœ์ €์—์„œ ๋ฐ˜ํ™˜๋  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ func ์—์„œ๋„ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ? _(์˜ˆ์ธ ๊ฒฝ์šฐ ๋‹ต์žฅํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.)_

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

func (d *Data) Op() int {
    d.mu.Lock()
    defer d.mu.Unlock()

     ... code to implement Op ...
}

d.Op์˜ ๋ชจ๋“  ๋ฐ˜ํ™˜์€ return ๋ฌธ ์ดํ›„์— d.Op์˜ ํ˜ธ์ถœ์ž์—๊ฒŒ ์ฝ”๋“œ๊ฐ€ ์ „์†ก๋˜๊ธฐ ์ „์— ์ง€์—ฐ๋œ ์ž ๊ธˆ ํ•ด์ œ ํ˜ธ์ถœ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. d.mu.Unlock ๋‚ด๋ถ€์—์„œ ์ˆ˜ํ–‰๋œ ์ž‘์—…์€ d.Op์˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. d.mu.Unlock์˜ return ๋ฌธ์€ Unlock์—์„œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ž์ฒด์ ์œผ๋กœ d.Op์—์„œ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  d.mu.Unlock์ด ๋ฐ˜ํ™˜๋˜๋ฉด d.Op๋„ ๋ฐ˜ํ™˜๋˜์ง€๋งŒ d.mu.Unlock ๋•Œ๋ฌธ์— ์ง์ ‘์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์‚ฌ์†Œํ•˜์ง€๋งŒ ์ค‘์š”ํ•œ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ์— ๋„๋‹ฌํ•˜๊ธฐ:

func example() {
    defer func(err) {
       return err // returns from both defer and example()
    }
    try(SomethingThatReturnsAnError)    
} 

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

func example() (err error) {
    defer func() {
        if err != nil {
            println("FAILED:", err.Error())
        }
    }()

    try(funcReturningError())
    return nil
}

์ง€์—ฐ๋œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๋ชจ๋“  ๊ฒฐ๊ณผ๋Š” ํ˜ธ์ถœ์ด ์‹คํ–‰๋  ๋•Œ ํ๊ธฐ๋˜๋ฏ€๋กœ ์ง€์—ฐ๋œ ๊ฒƒ์ด ํด๋กœ์ €์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ธ ๊ฒฝ์šฐ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํด๋กœ์ €๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ „ํ˜€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํด๋กœ์ € ๋ณธ๋ฌธ ๋‚ด๋ถ€์— return err ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” "too many arguments to return" ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

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

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

์ผ๋ฐ˜์ ์œผ๋กœ Go๋Š” ์ด๋ฏธ ์™„๋ฒฝํ•˜๊ฒŒ ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์–ธ์–ด, ํŠนํžˆ if ๋ฌธ์ž…๋‹ˆ๋‹ค. @DavexPro ๋Š” Go ๋ธ”๋กœ๊ทธ ํ•ญ๋ชฉ Errors are values โ€‹โ€‹๋ฅผ ๋‹ค์‹œ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ์˜ณ์•˜์Šต๋‹ˆ๋‹ค . ์šฐ๋ฆฌ๋Š” ์˜ค๋ฅ˜์™€ ๊ด€๋ จ๋œ ์™„์ „ํžˆ ๋ณ„๋„์˜ ํ•˜์œ„ ์–ธ์–ด๋ฅผ ์„ค๊ณ„ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ง€๋‚œ ๋ฐ˜๋…„ ์ •๋„ ๋™์•ˆ์˜ ์ฃผ์š” ํ†ต์ฐฐ๋ ฅ์€ ์ ์ ˆํ•œ ๊ฒฝ์šฐ if ๋ฌธ์œผ๋กœ ๋˜๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ํฌํ•จํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์–ธ์–ด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด "check/handle" ์ œ์•ˆ์—์„œ "handle"์„ ์ œ๊ฑฐํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ์ ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ๊ด€์ฐฐ์€ ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๋Œ€๋ถ€๋ถ„์˜ ์•„์ด๋””์–ด๋ฅผ ๊ณ ๋ ค์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ์ข‹์€ ์˜๊ฒฌ์„ ์ฃผ์‹  @brynbellomy ๋•๋ถ„์— ๋‚˜๋Š” ๊ทธ์˜ try-else๋ฅผ ์˜ˆ์‹œ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func doSomething() (int, error) {
    // Inline error handler
    a, b := try SomeFunc() else err {
        return 0, errors.Wrap(err, "error in doSomething:")
    }

    // Named error handlers
    handler logAndContinue err {
        log.Errorf("non-critical error: %v", err)
    }
    handler annotateAndReturn err {
        return 0, errors.Wrap(err, "error in doSomething:")
    }

    c, d := try SomeFunc() else logAndContinue
    e, f := try OtherFunc() else annotateAndReturn

    // ...

    return 123, nil
}

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

func doSomething() (int, error) {
    a, b, err := SomeFunc()
    if err != nil {
        return 0, errors.Wrap(err, "error in doSomething:")
    }

    // Named error handlers
    logAndContinue := func(err error) {
        log.Errorf("non-critical error: %v", err)
    }
    annotate:= func(err error) (int, error) {
        return 0, errors.Wrap(err, "error in doSomething:")
    }

    c, d, err := SomeFunc()
    if err != nil {
        logAndContinue(err)
    }
    e, f, err := SomeFunc()
    if err != nil {
        return annotate(err)
    }

    // ...

    return 123, nil
}

์ฆ‰, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋…ผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ์–ธ์–ด์— ๊ณ„์† ์˜์กดํ•˜๋Š” ๊ฒƒ์ด try-else, try-goto, try-arrow ๋“ฑ ๋ฌด์—‡์ด๋“  ์ƒˆ ๋ช…๋ น๋ฌธ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด try ๊ฐ€ ๋‹จ์ˆœํ•œ ์˜๋ฏธ if err != nil { return ..., err } ๋กœ ์ œํ•œ๋˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๊ณตํ†ต ํŒจํ„ด์„ ์ค„์ด๋˜ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ œ์–ด ํ๋ฆ„์„ ์žฌ๋ฐœ๋ช…ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. if ๋ฌธ์ด๋‚˜ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๊ฐ€ ์ ์ ˆํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด ๊ณ„์† ์‚ฌ์šฉํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

@rsc ๋ช…ํ™•ํžˆ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

_(FWIW ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— func ์—์„œ ๋’ค๋กœ ์ ํ”„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ ํ•ธ๋“ค์„ ๋‹ซ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋ณต์žกํ•œ ๊ฒฝ์šฐ defer ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ญ์ƒ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋์— func for range once{...} ๋‚ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ break s out.)_

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

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

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

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

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

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

if ๋ฌธ์„ ํ•œ ์ค„๋กœ gofmtํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ์ œ๊ณตํ•ด ์ฃผ์‹  @rsc ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์ด๋Ÿฌํ•œ ์ฃผ์žฅ์„ ๋‹ค๋ฅด๊ฒŒ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

3์ค„์—์„œ 1์ค„๋กœ ์ค„์ด๋ฉด ํ›จ์”ฌ ๋” ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 3๊ฐœ ๋Œ€์‹  9๊ฐœ(๋˜๋Š” 5๊ฐœ) ๊ฐœํ–‰์„ ํฌํ•จํ•˜๋Š” if ๋ฌธ์„ ์š”๊ตฌํ•˜๋Š” gofmt๊ฐ€ ํ›จ์”ฌ ๋” ๋ฌด๊ฒ์ง€ ์•Š์„๊นŒ์š”? ์ถ•์†Œ/ํ™•์žฅ์˜ ๋™์ผํ•œ ์š”์†Œ(์–‘)์ž…๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์—๋Š” ์ด์™€ ๊ฐ™์€ ์ ˆ์ถฉ์ ์ด ์žˆ์œผ๋ฉฐ try ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด if ๋ฌธ๋งŒํผ ์ œ์–ด ํ๋ฆ„์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ ‡๊ธด ํ•˜์ง€๋งŒ gofmt ์ œ์•ˆ์€ try ๋ณด๋‹ค ํ›จ์”ฌ ๋ณด์ˆ˜์ ์ธ ์กฐ์น˜๋ฅผ ์ทจํ•˜๋Š” ๊ฒƒ์„ ์ „์ œ๋กœ ํ•˜๋ฉฐ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋Š” ํ•œ try ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋ฏ€๋กœ ๋” ๋…ผ์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ƒˆ ๋ฌธ์ œ/์ œ์•ˆ์„ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค. :+1:

3์ค„์—์„œ 1์ค„๋กœ ์ค„์ด๋ฉด ํ›จ์”ฌ ๋” ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค.

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

n, err := src.Read(buf)
if err == io.EOF {
    return nil
} else if err != nil {
    return err
}

ํ•ด๋‹น ์ฝ”๋“œ์˜ ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ๊ท€ํ•˜์˜ ์˜ˆ์ œ๋กœ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ๊ฑฐ์Šฌ๋ฆด ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

n, err := src.Read(buf)
if err == io.EOF { return nil }
else if err != nil { return err }

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

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

๊ฒฐ๊ตญ ๊ฐœํ–‰ ์ˆ˜๋งŒํผ ๋‹ค๋ฅธ ์œ„์น˜์— ๋ฐ€๋„ ๋Œ€ ๊ฐ€๋…์„ฑ ์„ ์„ ๊ทธ๋ ค๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. try ์ œ์•ˆ์€ ์ค„ ๋ฐ”๊ฟˆ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ตฌ๋ฌธ์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋Š” gofmt ์งˆ๋ฌธ๊ณผ ๋ณ„๊ฐœ๋กœ ๋” ๊ฐ€๋ฒผ์šด ํŽ˜์ด์ง€ ์กด์žฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ช‡๋ช‡ ์‚ฌ๋žŒ๋“ค์€ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๋…ผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ๋ณต์žกํ•œ ํ‘œํ˜„์‹์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•„์—ฐ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฏ€๋กœ try ํ‘œํ˜„์‹์„ ์ฐพ์œผ๋ ค๋ฉด IDE ๋˜๋Š” ๊ธฐํƒ€ ๋„๊ตฌ ์ง€์›์ด ํ•„์š”ํ•˜๋ฏ€๋กœ try๋Š” ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—๋Š” ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ช‡ ๊ฐ€์ง€ ๋„์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ณต์žกํ•˜๊ณ  ์ฝ์„ ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด _๊ฐ€๋Šฅ_ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฌํ•œ ์ฝ”๋“œ๊ฐ€ ์œ ๋น„์ฟผํ„ฐ์Šคํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๋Š” ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค. @josharian ์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๋ฏธ " Go์—์„œ ๊ฐ€์ฆ์Šค๋Ÿฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค ." ๊ฐœ๋ฐœ์ž๋Š” ํŠน์ • ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฐ€์žฅ ์ฝ๊ธฐ ์‰ฌ์šด ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ทœ๋ฒ”์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ํ”ํ•œ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ try์™€ ๊ด€๋ จ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์ฝ๊ธฐ ์œ„ํ•ด IDE ์ง€์›์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š” _์•„๋‹™๋‹ˆ๋‹ค_. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋žŒ๋“ค์ด ์ •๋ง๋กœ ๋”์ฐํ•œ ์ฝ”๋“œ ๋‚จ์šฉ ์‹œ๋„๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์†Œ์ˆ˜์˜ ๊ฒฝ์šฐ์—๋Š” IDE ์ง€์›์ด ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค์šฐ ๋‚˜์œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด ๋ฐ˜๋Œ€๋Š” ๋ชจ๋“  ์–ธ์–ด์˜ ๋ชจ๋“  ์ƒˆ๋กœ์šด ์–ธ์–ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ํ† ๋ก ์—์„œ ์ œ๊ธฐ๋ฉ๋‹ˆ๋‹ค. ๋ณ„๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด Go์— ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๊ฐ€ ์—†๋Š” ์ด์œ ๊ฐ€ ์ „๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด Go์— ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๊ฐ€ ์—†๋Š” ์ด์œ ๊ฐ€ ์ „๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ?

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

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

ํ†ต์‚ฌ๋ก 

์ด ํ† ๋ก ์—์„œ๋Š” ์ œ์•ˆ์—์„œ ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ 6๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ์‹๋ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

(์›๋ž˜ ์ด์•ผ๊ธฐ๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค!)

์ด๋“ค ๋ชจ๋‘ ์žฅ๋‹จ์ ์ด ์žˆ์œผ๋ฉฐ, ์ข‹์€ ์ ์€ ๋ชจ๋‘ ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์€ ์‹คํ—˜์„ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ตฌ๋ฌธ ์ค‘์—์„œ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@brynbellomy์˜ ์ƒ๊ฐ์„ ์ž๊ทนํ•˜๋Š” ์ด ์˜ˆ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := try(parentObjOne.AsCommit())
parentCommitTwo := try(parentObjTwo.AsCommit())
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))

// vs

try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
try parentCommitOne := parentObjOne.AsCommit()
try parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)

// vs

try (
    headRef := r.Head()
    parentObjOne := headRef.Peel(git.ObjectCommit)
    parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
    parentCommitOne := parentObjOne.AsCommit()
    parentCommitTwo := parentObjTwo.AsCommit()
    treeOid := index.WriteTree()
    tree := r.LookupTree(treeOid)
)

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

๊ทธ๋Ÿฌ๋‚˜ @ianlancetaylor๊ฐ€ ๊ด€์ฐฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ โ€œ์‹œ๋„๋Š” ์ฃผ๋„๊ถŒ์„ ๋ฌป์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์ผ๋ จ์˜ try ๋ฌธ์ด ๋˜์–ด ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ํ•˜๋Š” ์ผ์„ ๋ชจํ˜ธํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค."

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

AsCommit์€ ๊ฒฐ์ฝ” ์‹คํŒจํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ฃผ์žฅ์„ ์œ„ํ•ด ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))

// vs

try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)

// vs

try (
    headRef := r.Head()
    parentObjOne := headRef.Peel(git.ObjectCommit)
    parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try (
    treeOid := index.WriteTree()
    tree := r.LookupTree(treeOid)
)

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

๊ทธ๋Ÿฌ๋ฉด ์ฒ˜์Œ 4๊ฐœ์˜ ๊ตฌ๋ฌธ์ด ๋‚จ๊ฒŒ ๋˜๋ฉฐ, ์ด๋Š” ์„œ๋กœ ํ›จ์”ฌ ๋” ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))

// vs

headRef := try r.Head()
parentObjOne := try headRef.Peel(git.ObjectCommit)
parentObjTwo := try remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try index.WriteTree()
tree := try r.LookupTree(treeOid)

// vs

headRef := r.Head()?
parentObjOne := headRef.Peel(git.ObjectCommit)?
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)?
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree()?
tree := r.LookupTree(treeOid)?

// vs

headRef := r.Head?()
parentObjOne := headRef.Peel?(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel?(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree?()
tree := r.LookupTree?(treeOid)

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

(1) ์ •ํ™•ํ•œ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ํŠนํžˆ ์ ‘๋‘์‚ฌ try x.y().z() ์™€ ๋น„๊ตํ•  ๋•Œ ๋งค์šฐ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.
(2) try์— ๋Œ€ํ•ด ์•Œ ํ•„์š”๊ฐ€ ์—†๋Š” ๋„๊ตฌ๋Š” ์ด๋ฅผ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด goimports๋Š” ์กฐ์ • ์—†์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
(3) ํ–ฅํ›„ ํ™•์žฅ ๋ฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์กฐ์ •์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

err recover() ์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋” ์ผ๊ด€์„ฑ ์žˆ๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

func f() error {
 defer func() {
   if err:=error();err!=nil {
     ...
   }
 }()
}

ํŽธ์ง‘ : ๋‚˜๋Š” ๋ช…๋ช… ๋œ ๋ฐ˜ํ™˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด๊ฒƒ์„ ์œ„ํ•ด ๋ช…๋ช… ๋œ ๋ฐ˜ํ™˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@flibustenet , ๋ช‡ ๊ฐ€์ง€ ์œ ์‚ฌํ•œ ์ œ์•ˆ์— ๋Œ€ํ•ด์„œ๋Š” https://swtch.com/try.html#named ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
(๋ชจ๋‘์— ๋‹ตํ•˜๊ธฐ: ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ด๋ฆ„์ด ์ง€์ •๋œ ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ•˜๊ธฐ ์ „์— ๊ธฐ์กด ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.)

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

๊ทธ๋Ÿฌ๋‚˜ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์ตœํ›„ ์ˆ˜๋‹จ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ •์˜ํ•˜๊ณ  ์ด๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๋ชจ๋“  ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ try() ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

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

try (
    headRef := r.Head()
    parentObjOne := headRef.Peel(git.ObjectCommit)
    parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
        parentCommitOne := parentObjOne.AsCommit()
        parentCommitTwo := parentObjTwo.AsCommit()
    treeOid := index.WriteTree()
    tree := r.LookupTree(treeOid)
)

์ด๊ฒƒ์€ ๋‹จ์ˆœํžˆ try ๋ธ”๋ก ๋‚ด ์—์„œ ๋ฐ˜ํ™˜๋œ ๋ชจ๋“  ์˜ค๋ฅ˜๊ฐ€ ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ฐ˜ํ™˜๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค์ด try ๋ธ”๋ก์„ ํ†ต๊ณผํ•˜๋ฉด ๋ธ”๋ก์— ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๋งํ–ˆ๋‹ค

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

์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋‚ด๊ฐ€ try ๋ธ”๋ก์„ ์ƒ๊ฐํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค! ์ œ์™ธ๋˜๋Š” ๊ฒƒ์€ ํ‚ค์›Œ๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” N๊ฐœ์˜ ๋‹ค๋ฅธ ์œ„์น˜์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํŠน์ • ์˜ค๋ฅ˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ œ์™ธ).

์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์‚ฌํ•ญ:

  1. ํ˜ธ์ถœ์ž๋Š” ํ˜ธ์ถœ ์ˆ˜์‹ ์ž ๋‚ด์—์„œ ์ •ํ™•ํžˆ ์–ด๋””์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๋Š” ๋‹จ์ˆœํ•œ ์ œ์•ˆ์—๋„ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ์ง€์ ์— ์ž์ฒด ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ถ”์ธกํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์ด ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  2. try(try(foo(try(bar)).fum()) ์™€ ๊ฐ™์€ ํ‘œํ˜„์‹์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ์—ฌ๋ถ€๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์€ ๋ˆˆ์‚ด์„ ์ฐŒํ‘ธ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. try ๋ธ”๋ก์˜ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ๋Ÿฌํ•œ ์‚ฌ์šฉ์„ ๊ฐ์ง€ํ•˜๊ณ  ๋ชจ๋“  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ try ๋ธ”๋ก ์ˆ˜์ค€์œผ๋กœ ์งœ๋‚ด๊ธฐ ์œ„ํ•ด ๋” ์—ด์‹ฌํžˆ ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ €๋Š” try return-on-error ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ธ”๋ก ์ˆ˜์ค€์—์„œ ์‚ผํ‚ค๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค!
  4. ๋ฐ˜๋ฉด์— ๊ธด ํ‚ค์›Œ๋“œ๋Š” ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฝ๋‹ˆ๋‹ค.

FWIW, ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ด๊ฒƒ์ด ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@rsc

[...]
๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ณต์žกํ•˜๊ณ  ์ฝ์„ ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฌํ•œ ์ฝ”๋“œ๊ฐ€ ์œ ๋น„์ฟผํ„ฐ์Šคํ™”๋  ๊ฒƒ์ด๋ผ๋Š” ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค. @josharian ์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๋ฏธ "Go์—์„œ ํ˜์˜ค์Šค๋Ÿฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."
[...]

headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := try(parentObjOne.AsCommit())
parentCommitTwo := try(parentObjTwo.AsCommit())

"๋‚˜์œ ์ฝ”๋“œ"์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ž…์žฅ์€ ์˜ค๋Š˜๋‚  ๋‹ค์Œ ๋ธ”๋ก๊ณผ ๊ฐ™์€ ๋”์ฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())

์‹ค์ˆ˜๋กœ ์ž˜๋ชป๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋„๋ก ์ค‘์ฒฉ๋œ try ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ƒ๊ฐ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

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

try ํ‘œํ˜„์‹์€ ์ค‘์ฒฉ ํ˜ธ์ถœ์„ ์žฅ๋ คํ•˜์—ฌ ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ์ˆ˜ํ‰์œผ๋กœ ํ™•์žฅํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. try ๋ช…๋ น๋ฌธ์€ ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ์„ธ๋กœ๋กœ ํ™•์žฅํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

@rsc , ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์—,

๋งˆ์ง€๋ง‰ ์ˆ˜๋‹จ์˜ ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ์ฒ˜๋ฆฌ๊ธฐ -- ์˜ค๋ฅ˜๊ฐ€ ์˜ˆ์ƒ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ:

func quit(err error) {
   fmt.Fprintf(os.Stderr, "quit after %s\n", err)
   debug.PrintStack()      // because panic(err) produces a pile of noise
   os.Exit(3)
}

์ปจํ…์ŠคํŠธ: os.File์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(๋‘ ๊ฐ€์ง€ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค: #26650 & #32088).

๊ธฐ๋ณธ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์—๋Š” ๋Ÿฐํƒ€์ž„.Caller()์˜ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ƒ์„ฑ๋œ ๊ตฌ์กฐ์ฒด์ธ caller ์ธ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

_go fmt_ ์žฌ์ž‘์„ฑ๊ธฐ๊ฐ€ ๊ธฐ์กด ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜๋ณ„๋กœ ํ˜•์‹์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

try() ์˜ ๋น„์šฉ(์ฆ‰, ๋‹จ์ )์€ ์œ„์— ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ Go ํŒ€์ด ๋จผ์ € check/handle (์ž์„ ์œผ๋กœ, ์ฐธ์‹ ํ•œ ์•„์ด๋””์–ด)๋ฅผ ์ œ์•ˆํ•œ ๋‹ค์Œ 3์› try() ๋ฅผ ์ œ์•ˆํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์™œ RFP re error handling์„ ๋ฐœํ‘œ ํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ ์ œ์•ˆ๋“ค ์ค‘ ์ผ๋ถ€์— ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์˜๊ฒฌ์„ ์ˆ˜์ง‘ํ•˜์‹ญ์‹œ์˜ค(#29860 ์ฐธ์กฐ). ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ํ˜œ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค!

@rsc

ํ†ต์‚ฌ๋ก 

์ด ํ† ๋ก ์—์„œ๋Š” ์ œ์•ˆ์—์„œ ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ 6๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ์‹๋ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

try {error} {optional wrap func} {optional return args in brackets}

f, err := os.Open(file)
try err wrap { a, b }

... ๊ทธ๋ฆฌ๊ณ , IMO, ์˜๋ฏธ๋ก ์  ์ •ํ™•์„ฑ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ(์ด์ฒด๋ฅผ ํ†ตํ•ด):

f, err := os.Open(file)
relay err

๋˜๋Š”

f, err := os.Open(file)
relay err wrap

๋˜๋Š”

f, err := os.Open(file)
relay err wrap { a, b }

๋˜๋Š”

f, err := os.Open(file)
relay err { a, b }

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

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

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

try ๋ธ”๋ก ์ œ์•ˆ์—์„œ try๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ช…๋ น๋ฌธ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

Java ๋ฐ Python๊ณผ ๊ฐ™์€ ์–ธ์–ด์˜ try-catch ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” Go์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ์ฃผ์š” ์ด์ ์€ ์–ด๋–ค ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๊ณ  ์–ด๋–ค ๊ฒƒ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์„์ง€ ํ•ญ์ƒ ๋ช…ํ™•ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›๋ž˜ ์ œ์•ˆ์— ๋ฌธ์„œํ™”๋œ try ์˜ ์žฅ์ ์€ ์ด ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ฐ„๋‹จํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Goodwine ์˜ ์˜ˆ์ œ์—์„œ ๋นŒ๋ฆฌ์ž๋ฉด ์ถ”์•…ํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ด€์ ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())

... try-catch ์–ธ์–ด์—์„œ ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

parentCommitOne := r.Head().Peel(git.ObjectCommit).AsCommit()
parentCommitTwo := remoteBranch.Reference.Peel(git.ObjectCommit).AsCommit()

... ์ฝ”๋“œ์˜ ์–ด๋–ค ๋ถ€๋ถ„์ด ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์ œ์–ด ํ๋ฆ„์„ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๊ณ  ์–ด๋–ค ๋ถ€๋ถ„์ด ์ „ํ™˜ํ•  ์ˆ˜ ์—†๋Š”์ง€ ์—ฌ์ „ํžˆ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์ž‘์€ ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. tryhard (์ง€๊ธˆ์€ ๊ทธ๋‹ค์ง€ ๋…ธ๋ ฅํ•˜์ง€ ์•Š์Œ)์€ ํŒŒ์ผ ๋‹จ์œ„๋กœ ์ž‘๋™ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ AST ํŒจํ„ด ์ผ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ try ์˜ ์ž ์žฌ์  ํ›„๋ณด๋ฅผ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ์„ค๋ช…์„œ ๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค.

ํŒ ๋ณด๊ณ ์„œ์—์„œ $GOROOT/src ์— ์ ์šฉ > try ์— ๋Œ€ํ•œ 5000(!) ๊ธฐํšŒ. ๋งŽ์€ ์˜คํƒ์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ ์ ˆํ•œ ์ƒ˜ํ”Œ์„ ์ง์ ‘ ํ™•์ธํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐํšŒ๊ฐ€ ์‹ค์ œ์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

( ์ฃผ์˜: ๋‹ค์‹œ ์“ฐ๊ธฐ ๊ธฐ๋Šฅ์€ ํŒŒ์ผ์„ ํŒŒ๊ดดํ•ฉ๋‹ˆ๋‹ค! ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ฑ…์ž„์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. )

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

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

"๋‚˜์œ ์ฝ”๋“œ"์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ž…์žฅ์€ ์˜ค๋Š˜๋‚  ๋‹ค์Œ ๋ธ”๋ก๊ณผ ๊ฐ™์€ ๋”์ฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())

๋‚ด ์ž…์žฅ์€ Go ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…ํ™•ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ผ์„ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‹น์‹ ์ด๋‚˜ ๋™๋ฃŒ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋ณด์ด๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋ฐฉํ•ด๊ฐ€ ๋˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ค์ˆ˜๋กœ ์ž˜๋ชป๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋„๋ก ์ค‘์ฒฉ๋œ try ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ƒ๊ฐ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Go์˜ ๋‹จ์ˆœํ•จ์˜ ์ƒ๋‹น ๋ถ€๋ถ„์€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š” ์ง๊ต ๊ธฐ๋Šฅ์˜ ์„ ํƒ์—์„œ ํŒŒ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ œํ•œ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ง๊ต์„ฑ, ๊ตฌ์„ฑ์„ฑ, ๋…๋ฆฝ์„ฑ์ด ๊นจ์ ธ ๋‹จ์ˆœ์„ฑ์ด ๊นจ์ง‘๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค.

x := expression
y := f(x)

๋‹ค๋ฅธ ๊ณณ์—์„œ x๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ์œ ํšจํ•œ ํ”„๋กœ๊ทธ๋žจ ๋ณ€ํ™˜์ž…๋‹ˆ๋‹ค.

y := f(expression)

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

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

2๋…„ ์ „ https://github.com/golang/go/issues/18130#issuecomment -264195616(์œ ํ˜• ๋ณ„์นญ์˜ ๋งฅ๋ฝ์—์„œ)์— ๋” ๊ธด ์„ค๋ช…์„ ์ผ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์—ฌ๊ธฐ์—๋„ ๋˜‘๊ฐ™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

@๋ฐ”์ฟจ ,

ํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. try ๋ธ”๋ก ์ œ์•ˆ์—์„œ _ํ•„์š”ํ•˜์ง€ ์•Š์€_ try ๋ช…๋ น๋ฌธ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ „ํ†ต์ ์ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์˜ ์ฃผ์š” ํ•จ์ •์€ ๊ฒ€์‚ฌ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ ๋ คํ•˜๋‹ค:

try {
    s = canThrowErrors()
    t = cannotThrowErrors()
    u = canThrowErrors() // a second call
} catch {
    // how many ways can you get here?
}

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

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

do {
    let s = try canThrowErrors()
    let t = cannotThrowErrors()
    let u = try canThrowErrors() // a second call
} catch {
    handle error from try above
}

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

์•”์‹œ์  ๊ฒ€์‚ฌ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ง€๋‚œ 8์›” ๋ฌธ์ œ ๊ฐœ์š”์˜ ๋ฌธ์ œ ์„น์…˜ , ํŠนํžˆ ๋‘ ๊ฐœ์˜ Raymond Chen ๊ธฐ์‚ฌ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํŽธ์ง‘: ๋‚ด๊ฐ€ ์ด ์ž‘์—…์„ ํ•˜๋Š” ๋™์•ˆ ๋“ค์–ด์™”๋˜ @velovix ์˜ ๋Œ“๊ธ€ 3๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

@daved , "๋ณดํ˜ธ ๊ณ„์ „๊ธฐ" ๋น„์œ ๊ฐ€ ํšจ๊ณผ๊ฐ€ ์žˆ์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์€ ํšŒ๋กœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์–ด๋–ค ๋‹จ์–ด๋ผ๋„ ์˜คํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
"break"๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
"continue"๋Š” ํ‰์†Œ์™€ ๊ฐ™์ด ๋‹ค์Œ ๋ฌธ์—์„œ ์‹คํ–‰์„ ๊ณ„์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
"goto" ... ์Œ goto๋Š” ์‹ค์ œ๋กœ ์˜คํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. :-)

https://www.google.com/search?q=define+try ์— "๋ฌด์–ธ๊ฐ€๋ฅผ ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด์‹ญ์‹œ์˜ค" ๋ฐ "์žฌํŒ ๋Œ€์ƒ"์ด๋ผ๊ณ  ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค "f := try(os.Open(file))"์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. os.Open์„ ์‹œ๋„ํ•˜๊ณ (๋˜๋Š” ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ๋ฅผ ์‹œํ–‰) ์‹œ๋„(๋˜๋Š” ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ)๊ฐ€ ์‹คํŒจํ•˜๋ฉด ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ง€๋‚œ 8์›”์— ์ˆ˜ํ‘œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋„ ์ข‹์€ ๋ง์ด์—ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” C++/Java/Python์˜ ์—ญ์‚ฌ์  ์ˆ˜ํ•˜๋ฌผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  try๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด ์ œ์•ˆ์—์„œ try์˜ ํ˜„์žฌ ์˜๋ฏธ๋Š” Swift์˜ try(์ฃผ๋ณ€ do-catch ์ œ์™ธ) ๋ฐ Rust์˜ ์›๋ž˜ try์˜ ์˜๋ฏธ์™€ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค! . ๋‚˜์ค‘์— ํ™•์ธ์ด ๊ฒฐ๊ตญ ์˜ฌ๋ฐ”๋ฅธ ๋‹จ์–ด๋ผ๊ณ  ๊ฒฐ์ •ํ•˜๋ฉด ๋”์ฐํ•˜์ง€ ์•Š๊ฒ ์ง€๋งŒ ์ง€๊ธˆ์€ ์ด๋ฆ„ ์ด์™ธ์˜ ๊ฒƒ์— ์ง‘์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ github.com/josharian/pct ์˜ ํฅ๋ฏธ๋กœ์šด tryhard ๊ฑฐ์ง“ ๋ถ€์ •์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์–ธ๊ธ‰ํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ž๋™ํ™”๋œ try ๊ฐ์ง€๊ฐ€ ๊นŒ๋‹ค๋กœ์šด ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • if err != nil ์˜ ์‹œ๊ฐ์  ๋น„์šฉ์€ ์‚ฌ๋žŒ๋“ค(์ ์–ด๋„ ์ €)์ด ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ try ๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ „์—:

var err error
switch {
case *flagCumulative:
    _, err = fmt.Fprintf(w, "% 6.2f%% % 6.2f%%% 6d %s\n", p, f*float64(runtot), line.n, line.s)
case *flagQuiet:
    _, err = fmt.Fprintln(w, line.s)
default:
    _, err = fmt.Fprintf(w, "% 6.2f%%% 6d %s\n", p, line.n, line.s)
}
if err != nil {
    return err
}

์ดํ›„(์ˆ˜๋™ ์žฌ์ž‘์„ฑ):

switch {
case *flagCumulative:
    try(fmt.Fprintf(w, "% 6.2f%% % 6.2f%%% 6d %s\n", p, f*float64(runtot), line.n, line.s))
case *flagQuiet:
    try(fmt.Fprintln(w, line.s))
default:
    try(fmt.Fprintf(w, "% 6.2f%%% 6d %s\n", p, line.n, line.s))
}

https://golang.org/cl/182717 ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰ ๋ณ€๊ฒฝ: src: apply tryhard -r $GOROOT/src

std ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ try ์— ๋Œ€ํ•œ ์‹œ๊ฐ์  ์•„์ด๋””์–ด๋ฅผ ๋ณด๋ ค๋ฉด CL 182717 ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค.

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

"break"๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
"continue"๋Š” ํ‰์†Œ์™€ ๊ฐ™์ด ๋‹ค์Œ ๋ฌธ์—์„œ ์‹คํ–‰์„ ๊ณ„์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
"goto" ... ์Œ goto๋Š” ์‹ค์ œ๋กœ ์˜คํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. :-)

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

๋” ๊ด€๋ จํ•˜์—ฌ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ๊ณผ ๋‹ฌ๋ฆฌ ๋‚ด๊ฐ€ ์ œ๊ณตํ•œ try/check ํ˜•์‹์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
try {error} {optional wrap func} {optional return args in brackets}

f, err := os.Open(file)
try err wrap { a, b }

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

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

๋‹ค๋ฅธ ๊ตฌ๋ฌธ๊ณผ ๋‹ฌ๋ฆฌ ์ œ๊ณตํ•œ try/check ํ˜•์‹์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ ํ˜•ํƒœ๊ฐ€ ๊ฒฐ๊ตญ ๊ธฐ์กด์˜ ํ†ต์ œ ๊ตฌ์กฐ๋ฅผ ์žฌ์ฐฝ์กฐ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

@networkimprov , ๋‹ค์‹œ https://github.com/golang/go/issues/32437#issuecomment -502879351

์†”์งํžˆ Go ํŒ€์ด ์šฐ๋ฆฌ์—๊ฒŒ ๋จผ์ € ํ™•์ธ/์ฒ˜๋ฆฌ(์ž์„ , ์ฐธ์‹ ํ•œ ์•„์ด๋””์–ด)๋ฅผ ์ œ์•ˆํ•œ ๋‹ค์Œ, ์‚ผํ•ญ์‹ try()๋ฅผ ์ œ์•ˆํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๊ธฐ๋ถ„์ด ๋‚˜์ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์™œ RFP re ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋ฐœํ–‰ํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฉฐ, ๊ทธ ๋‹ค์Œ ๊ฒฐ๊ณผ ์ œ์•ˆ ์ค‘ ์ผ๋ถ€์— ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์˜๊ฒฌ์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค(#29860 ์ฐธ์กฐ). ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ํ˜œ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค!

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

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ๋“  ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์กฐ์–ธ์„ ๊ตฌํ•˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๋ฌด์‹œํ–ˆ๋‹ค๊ณ  ์ฃผ์žฅํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ๊ทธ๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๊ฐ€ ๋ฌด์—‡์ด๋“ ๊ฐ„์— try๊ฐ€ ์–ด๋–ค ์‹ ์œผ๋กœ๋“  "ternaryesque"์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

@rsc , ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒƒ์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค!
https://github.com/golang/go/issues/32437#issuecomment -502840914์—์„œ ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.
https://github.com/golang/go/issues/32437#issuecomment -502879351์˜ ์„ค๋ช… ์š”์ฒญ์— ์‘๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ํ•ธ๋“ค๋Ÿฌ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋’ค์ฒ˜์งˆ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

try {} catch{} ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ํœ ์„ ๋” ๋งŒ๋“ค์ง€ ๋งˆ์„ธ์š”.

try {} catch{} ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ํœ ์„ ๋” ๋งŒ๋“ค์ง€ ๋งˆ์„ธ์š”.

๋‚จ๋“ค์ด ์“ฐ๋Š” ๋ฐ”ํ€ด๊ฐ€ ๋„ค๋ชจ๋‚œ ๋ชจ์–‘์ผ ๋•Œ ๋” ์ข‹์€ ๋ฐ”ํ€ด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”.

@jimwei

์˜ˆ์™ธ ๊ธฐ๋ฐ˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” ๊ธฐ์กด ํœ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์•Œ๋ ค์ง„ ๋ฌธ์ œ๋„ ๊ฝค ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ์ดˆ์•ˆ ๋””์ž์ธ์˜ ๋ฌธ์ œ ์„ค๋ช…์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์˜ ๊ฐœ์š”๋ฅผ ํ›Œ๋ฅญํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

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

https://github.com/golang/go/issues/32437#issuecomment -502837008์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ( try ์— ๋Œ€ํ•œ @rsc ์˜ ์˜๊ฒฌ์„ ์ง„์ˆ ๋กœ)

์ข‹์€ ์ง€์ ์„ ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์ด ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ์–ด๋–ป๊ฒŒ๋“  ํ•ด๋‹น ๋Œ“๊ธ€์„ ๋†“์นœ ์  ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. https://github.com/golang/go/issues/32437#issuecomment -502871889

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

golint ๊ฐ€ ์ค‘์ฒฉ๋œ try ํ˜ธ์ถœ์„ ๊ธˆ์ง€ํ•œ๋‹ค๋ฉด ์ด ์ œ์•ˆ์„ ์ข€ ๋” ๊ฐ์‚ฌํ•˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ‘œํ˜„์‹ ๋‚ด์—์„œ ๋ชจ๋“  try ํ˜ธ์ถœ์„ ๊ธˆ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ์—„๊ฒฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. try ํ‘œํ˜„์‹์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

parentCommitOne := try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit()
parentCommitTwo := try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit()
tree := try(r.LookupTree(try(index.WriteTree())))

์›๋ž˜ ์˜ˆ์ œ๋Š” ์‹ค์ œ๋กœ ๊ฝค ๊ดœ์ฐฎ์•„ ๋ณด์˜€์ง€๋งŒ ์ด ์˜ˆ์ œ์—์„œ๋Š” try ํ‘œํ˜„์‹์„ ์ค‘์ฒฉํ•˜๋ฉด(์‹ฌ์ง€์–ด 2-deep๋งŒ) ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ํฌ๊ฒŒ ์ €ํ•˜๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์ฒฉ๋œ try ํ˜ธ์ถœ์„ ๊ฑฐ๋ถ€ํ•˜๋ฉด "๋””๋ฒ„๊น… ๊ฐ€๋Šฅ์„ฑ" ๋ฌธ์ œ์—๋„ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ํ‘œํ˜„์‹ ์™ธ๋ถ€์— ์žˆ๋Š” ๊ฒฝ์šฐ try ๋ฅผ if ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ํ•˜์œ„ ํ‘œํ˜„์‹ ๋‚ด๋ถ€์˜ try ๋Š” golint ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ์—„๊ฒฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ œ ๋ˆˆ์—๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

x := 5 + try(strconv.Atoi(input))

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

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

@rsc

์šฐ๋ฆฌ๋Š” _"์ด ๊ธฐ๋Šฅ์€ ๋งค์šฐ ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฝ์„ ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ์—๋„ ๋‚จ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"_์™€ "์ด ๊ธฐ๋Šฅ์˜ ์ฃผ์š” ์šฉ๋„๋Š” ์ฝ์„ ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ"์„ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๊ณ  ๋˜ ๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
C์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ์‹œ์‚ฌํ•˜๋Š” ๋ฐ”๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? : ์ •ํ™•ํžˆ ๋‘ ๋ฒˆ์งธ ๋ฒ”์ฃผ์— ์†ํ•ฉ๋‹ˆ๋‹ค. (์ตœ์†Œ์™€ ์ตœ๋Œ€๋ฅผ ์ œ์™ธํ•˜๊ณ ,

try() ๋Œ€ try ์— ๋Œ€ํ•ด ์ฒ˜์Œ์œผ๋กœ ๋‚˜๋ฅผ ๋†€๋ผ๊ฒŒ ํ•œ ๊ฒƒ์€ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž์™€ ์ค‘์ฒฉ ๊ฐ€๋Šฅ์„ฑ์ด ์–ผ๋งˆ๋‚˜ ์œ ์‚ฌํ•˜๋ฉด์„œ๋„ try() ์— ๋Œ€ํ•œ ์ธ์ˆ˜์™€ ์‚ผํ•ญ์— ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฐ˜๋Œ€์ธ์ง€์˜€์Šต๋‹ˆ๋‹ค. _(์˜์—ญ):_

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

์ •์ค‘ํ•˜๊ฒŒ, ๋‘˜ ์‚ฌ์ด์˜ ์ฐจ์ด์— ๋Œ€ํ•œ ํ•ฉ๋ฆฌ์ ์ธ ์ด์œ ๋Š” ๋„ˆ๋ฌด ์ฃผ๊ด€์ ์œผ๋กœ ๋Š๊ปด์ง€๋ฏ€๋กœ ์•ฝ๊ฐ„์˜ ๋‚ด์„ฑ์„ ์š”์ฒญํ•˜๊ณ  ์ตœ์†Œํ•œ ์„ ํ˜ธํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ์‹ซ์–ดํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ์ฐจ์ด๋ฅผ ํ•ฉ๋ฆฌํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. #Please_dont_shoot_the_messenger

_"๋‚ด๊ฐ€ ?๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณธ ์ ์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€์‹  if ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ ๊ฐœ์„ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋‹จ๋ฝ์€ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค.)"_

๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค๋Š˜ PHP๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—์„œ์™€ ๊ฐ™์ด if ์—์„œ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋กœ ๋ช…๋ น๋ฌธ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ ๋ช…๋ น๋ฌธ์„ ์ž์ฃผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

return isset( $_COOKIE[ CookieNames::CART_ID ] )
    ? intval( $_COOKIE[ CookieNames::CART_ID ] )
    : null;

๋น„๊ต ๋Œ€์ƒ:

if ( isset( $_COOKIE[ CookieNames::CART_ID ] ) ) {
    return intval( $_COOKIE[ CookieNames::CART_ID ] );
} else { 
    return null;
}

๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ํ•œ ์ „์ž๊ฐ€ ํ›„์ž๋ณด๋‹ค ํ›จ์”ฌ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

fwiw

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

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

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

๋” ๋ณต์žกํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” ์—ฌ์ „ํžˆ if err != nil {} ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ๊ณ ์œ ํ•œ ์Šคํƒ€์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ํ•˜๋‚˜๋งŒ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์ด Go์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๋„์›€์ด ๋˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด๋ผ๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ  ํ•ญ์ƒ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ if ๋กœ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ณ„์† ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. "์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@rsc , ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒƒ์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค!
#32437 (์ฃผ์„) ์—์„œ ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.
#32437(๋Œ“๊ธ€) ์˜ ์„ค๋ช… ์š”์ฒญ์— ์‘๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ํ•ธ๋“ค๋Ÿฌ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋’ค์ฒ˜์งˆ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

@beoran ์ €๋Š” ์ด ์ œ์•ˆ์ด ๋” ๋‚˜์€ ๊ฐœ์„ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. try(..., func(err) error) ๋˜๋Š” tryf(..., "context of my error: %w") ์˜ ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜์—์„œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์ฒ˜๋Ÿผ?

@flibustenet ์ด๋Ÿฌํ•œ ๋‚˜์ค‘ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ ์ œ์•ˆ์€ ์ด๋Ÿฌํ•œ ํ™•์žฅ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ง€์—ฐ๊ณผ ์ค‘๋ณต๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

https://github.com/golang/go/issues/32437#issuecomment -502975437

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

@beoran ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ try ํ‚ค์›Œ๋“œ( try ๋ฐ try / else )์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ์˜ค๋ฅ˜ ์‚ฌ๋ก€๋ฅผ ํ†ตํ•ฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. try / else ๊ตฌ๋ฌธ์ด ๊ธฐ์กด if err != nil ์Šคํƒ€์ผ์— ๋น„ํ•ด ์ฝ”๋“œ ๊ธธ์ด๋ฅผ ํฌ๊ฒŒ ์ค„์ด์ง€๋Š” ์•Š์ง€๋งŒ try ๊ณผ์˜ ์ผ๊ด€์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. else ์—†์Œ) ์ผ€์ด์Šค. ์ด ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ(try ๋ฐ try-else)๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ฐ˜ํ™˜ ์™ธ์— ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ๋˜๋Š” try ์˜ ๊ธฐ๋ณธ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ๋ฒ„์ „์— ๋ฐ˜๋Œ€ํ•˜์—ฌ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค(๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ๋ฐ˜๋“œ์‹œ ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ถŒ์žฅํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.)

์ผ๊ด€์„ฑ์€ ๊ฐ€๋…์„ฑ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

append ๋Š” ์Šฌ๋ผ์ด์Šค์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. make ๋Š” ์ƒˆ๋กœ์šด ์ฑ„๋„์ด๋‚˜ ๋งต ๋˜๋Š” ์Šฌ๋ผ์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค(๋ฆฌํ„ฐ๋Ÿด์€ ์ œ์™ธ, ๋‚˜๋Š” ๋ณ„๋กœ ๊ฐํฅ์ด ์—†์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ try() ( else ์—†์ด ๊ธฐ๋ณธ ์ œ๊ณต๋จ)๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฃผ์–ด์ง„ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์— ๋ฟŒ๋ ค์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋…์ž. ๋‹ค๋ฅธ ๋‚ด์žฅ ๊ธฐ๋Šฅ(์ฆ‰, ๋งค์šฐ ์–ด๋ ต๊ฑฐ๋‚˜ ์™„์ „ํžˆ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ)์˜ ์ •์‹ ์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์„ฑ๊ณตํ•œ try ๋ฒ„์ „์ด๋ผ๋ฉด ์ผ๊ด€์„ฑ๊ณผ ๊ฐ€๋…์„ฑ ๋•Œ๋ฌธ์— ๋งต/์Šฌ๋ผ์ด์Šค ๋ฆฌํ„ฐ๋Ÿด์„ ํ”ผํ•˜๋ ค๊ณ (๊ทธ๋ฆฌ๊ณ  ์ „์—ผ๋ณ‘์ฒ˜๋Ÿผ new ๋ฅผ ํ”ผํ•˜๋ ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ) ์ด ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

golint๊ฐ€ ์ค‘์ฒฉ๋œ try ํ˜ธ์ถœ์„ ๊ธˆ์ง€ํ•œ๋‹ค๋ฉด ์ด ์ œ์•ˆ์„ ์กฐ๊ธˆ ๋” ๊ฐ์‚ฌํ•˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

try/else ๊ตฌ๋ฌธ์ด ๊ธฐ์กด if err != nil ์Šคํƒ€์ผ๊ณผ ๋น„๊ตํ•˜์—ฌ ์ฝ”๋“œ ๊ธธ์ด๋ฅผ ํฌ๊ฒŒ ์ค„์ด์ง€๋Š” ์•Š์ง€๋งŒ try(๋‹ค๋ฅธ ์—†์Œ) ๊ฒฝ์šฐ์™€ ์ผ๊ด€์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

๋˜ํ•œ ์ œ์•ˆํ•œ ๊ตฌ๋ฌธ์ด try/else ์ผ€์ด์Šค์™€ ์ผ์น˜ํ•˜๋Š” try ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ if/else๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ถ„๊ธฐํ•˜๋Š” ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฐฉ๋ฒ•๋„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์•ฝ๊ฐ„์˜ ์ผ๊ด€์„ฑ์„ ์–ป์ง€๋งŒ ๋‚˜๋จธ์ง€์—์„œ๋Š” ๋งŽ์€ ๋ถˆ์ผ์น˜๋ฅผ ์žƒ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

Go์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” ๊นจ์ง€์ง€ ์•Š์•˜์œผ๋ฉฐ ์ด ์ œ์•ˆ์€ ๋‚ด๊ฐ€ Go์— ๋Œ€ํ•ด ์ข‹์•„ํ•˜๋Š” ๋งŽ์€ ๋””์ž์ธ ์ฒ ํ•™์„ ์œ„๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.

Bill์€ ๋‚ด ์ƒ๊ฐ์„ ์™„๋ฒฝํ•˜๊ฒŒ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

try ์ด ์†Œ๊ฐœ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ€๋ฅด์น˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ, ๋‚ด๊ฐ€ ๋ฆฌ๋ทฐํ•˜๋Š” PR์—์„œ ๊ทธ๊ฒƒ์„ ๋ฐ›์•„๋“ค์ด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ๋‹ค๋ฅธ '๋‚ด๊ฐ€ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” Go์˜ ๊ฒƒ๋“ค' ๋ชฉ๋ก์— ์ถ”๊ฐ€๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ž์„ธํ•œ ๋‚ด์šฉ์€ YouTube์—์„œ Mat Ryer์˜ ์žฌ๋ฏธ์žˆ๋Š” ์ด์•ผ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค).

@ardan-bkennedy, ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ํ•ด๊ฒฐํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋Š” ๋ฌธ์ œ๋ผ๊ณ  ์ œ์•ˆํ•œ ์œ ์ผํ•œ ์‚ฌ๋žŒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋‹ค๋ฅธ ์˜๊ฒฌ์€ https://swtch.com/try.html#nonissue ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๊ธฐ๋กํ–ˆ๊ณ  ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•Œ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์˜ ์ผ๋ถ€๋Š” ์‹ค์ œ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ ์ œ์•ˆ์„ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Robert's tryhard์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ ๋ฌด์—‡์„ ์ฐพ๋Š”์ง€ ์•Œ๋ ค๋‹ฌ๋ผ๊ณ  ์ด์ „ ์— ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ •๋ณด๋Š” ๋ณ€๊ฒฝ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ•˜๋‚˜์˜ ์ถ”์ธก์„ ํ•˜๊ณ  ๋‚˜๋Š” ๋‹ค๋ฅธ ์ถ”์ธก์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋‹ต์€ ์ด๋Ÿฌํ•œ ์ถ”์ธก์„ ๋ฐ์ดํ„ฐ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@ardan-bkennedy, ๋‘ ๋ฒˆ์งธ ํ›„์† ์กฐ์น˜๋ฅผ ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ด€๋ จํ•˜์—ฌ:

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

์ด ์„ ์—๋Š” ๋‚ด๊ฐ€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋Š” ๋‘ ๊ฐ€์ง€ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

tryhard ๋„๊ตฌ๋Š” ๋งค์šฐ ์œ ์ตํ•ฉ๋‹ˆ๋‹ค!
๋‚ด๊ฐ€ ์ž์ฃผ return ...,err ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ http ์ฒ˜๋ฆฌ๊ธฐ์—์„œ ์ด๋ฏธ ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ํ•จ์ˆ˜( pkg/errors ํฌํ•จ)๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์„ ๋•Œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ ์€ ์ฝ”๋“œ ์ค„๋กœ ๊ฐ€๋…์„ฑ์—์„œ ์Šน๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด http ํ•ธ๋“ค๋Ÿฌ์—์„œ defer fmt.HandleErrorf(&err, "handler xyz") ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ์ด์ „๋ณด๋‹ค ๋” ๋งŽ์€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ fmt.Printf ์˜ค๋ฅ˜๋ฅผ ์ „ํ˜€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  try ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งŽ์ด ๋ด…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด defer try(f.Close()) ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ try ๋Š” ๋งˆ์นจ๋‚ด ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ทธ ๋ฐ˜๋Œ€๊ฐ€ ์•„๋‹Œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ํ‘ธ์‹œํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง„์งœ๋กœ ์‹œํ—˜ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์•„์ฃผ ์กฐ๊ธ‰ํ•˜๋‹ค!

@flibustenet ์ด ์ œ์•ˆ์€ defer try(f()) ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( ์ด์œ  ์ฐธ์กฐ). ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด tryhard ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณผ ๋•Œ ์ „ํ›„์˜ if err != nil ๋น„์œจ์„ ๋น„๊ตํ•˜์—ฌ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ๋‹ค์‹œ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ๋” ์ผ๋ฐ˜์ ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์ƒ๊ฐ์— ๊ฐ€์ƒ์˜ ๊ฑฐ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ๋Š” try() ๊ฐ€ ์ถ”๊ฐ€๋œ 1000๊ฐœ์˜ ์žฅ์†Œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” 10000๊ฐœ์˜ if err != nil ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ 1000๊ฐœ๊ฐ€ ๊ฑฐ๋Œ€ํ•ด ๋ณด์ด์ง€๋งŒ ์ „์ฒด์˜ 10%์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. .

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

defer try(f()) ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

defer func() error {
    if err:= f(); err != nil { return err }
    return nil
}()

์ด๊ฒƒ์€(if ๋ฒ„์ „) ํ˜„์žฌ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์—์„œ ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“ค์–ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ณ ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ์œ„์˜ defer ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ž˜๋ชป๋œ ๊ฒƒ์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. defer ๋ฌธ์—์„œ close(file) ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ๊ทธ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ, ๋ง์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ?

defer try(f()) defer try(f) ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ทผ๊ฑฐ๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜คํƒ€๊ฐ€ ์•„๋‹๊นŒ์š”?

go try(f()) ์— ๋Œ€ํ•ด์„œ๋„ ๋น„์Šทํ•œ ์ฃผ์žฅ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

go func() error {
    if err:= f(); err != nil { return err }
    return nil
}()

์—ฌ๊ธฐ์„œ try ๋Š” ์œ ์šฉํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฌดํ•ดํ•ฉ๋‹ˆ๋‹ค.

@ardan-bkennedy ์ƒ๊ฐํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹  ์ด ์ด ์ œ์•ˆ์˜ ์˜๋„๋ฅผ ์ž˜๋ชป ํ‘œํ˜„ํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ๊ทผ๊ฑฐ ์—†๋Š” ์ฃผ์žฅ์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@rsc ๊ฐ€ ์ด์ „์— ๋‹ค๋ฃจ์ง€ ์•Š์€ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด:

  • ์šฐ๋ฆฌ๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ๋‹ค๊ณ  ๋งํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋””์ž์ธ์€ ํ˜„์žฌ ์ฒ˜๋ฆฌ๋Š” ๊ดœ์ฐฎ์ง€๋งŒ ๋งŽ์€ ๊ฒฝ์šฐ ์žฅํ™ฉํ•˜๋‹ค๋Š” ๊ด€์ฐฐ(Go ์ปค๋ฎค๋‹ˆํ‹ฐ!)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ œ์•ˆ์˜ ์ฃผ์š” ์ „์ œ์ž…๋‹ˆ๋‹ค.

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

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

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

๊ฐ์‚ฌ ํ•ด์š”.

return isset( $_COOKIE[ CookieNames::CART_ID ] )
    ? intval( $_COOKIE[ CookieNames::CART_ID ] )
    : null;

return intval( $_COOKIE[ CookieNames::CART_ID ] ) ?? null; FWIW์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜

@bakul ์ธ์ˆ˜๊ฐ€ ์ฆ‰์‹œ ํ‰๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<result list> := f()
defer try(<result list>)

์ด๊ฒƒ์€ f() ๊ฐ€ ๋‚˜์ค‘์„ ์œ„ํ•ด ์—ฐ๊ธฐ๋˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. go try(f()) ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

@bakul ๋ฌธ์„œ์—์„œ defer try(f) ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค( try defer try(f()) $๊ฐ€ ์•„๋‹ˆ๋ผ try(err) ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด err ์œ ํ˜•์ด error ์ธ ๊ฒฝ์šฐ ). ๋”ฐ๋ผ์„œ ์˜คํƒ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ฒ˜์Œ์—๋Š” ํ˜ผ๋™๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. f ๋Š” ๋‹จ์ˆœํžˆ ํ‘œํ˜„์‹์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ „ํ™”.

@deanveloper , @griesemer ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ์„ธ์š” :-) ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@carl-mastrangelo

_" return intval( $_COOKIE[ CookieNames::CART_ID ] ) ?? null; ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค _

PHP 7.x๋ฅผ ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์‹œ, ๋‹น์‹ ์˜ ์ฐก๊ทธ๋ฆฐ ์–ผ๊ตด์„ ๋ณด๋ฉด ๊ทธ๊ฒŒ ์š”์ ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :๋ˆˆ์ง“:

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

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

  1. ์˜ค๋ฅ˜ ์ธํ„ฐํŽ˜์ด์Šค mystruct.Error()๋ฅผ ์ง€์›ํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜ ๊ตฌ์กฐ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ตฌ์กฐ์ฒด์˜ ํ•„๋“œ ๋˜๋Š” ์ต๋ช… ํ•„๋“œ๋กœ ์˜ค๋ฅ˜๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
type ExtErr struct{
  error
  someOtherField string
}  

์ด๊ฒƒ๋“ค ์€ ์šฐ๋ฆฌ ํŒ€์ด ์‹ค์ œ๋กœ ๊ตฌ์ถ•ํ•œ ๋ช‡ ๊ฐ€์ง€ ์Šคํƒ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ Q&A ์ƒํƒœ
Q: try์— ์ „๋‹ฌ๋œ ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋Š” ์˜ค๋ฅ˜ ์œ ํ˜•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋“ค์–ด์˜ค๋Š” ์ธ์ˆ˜๊ฐ€ ์˜ค๋ฅ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
A: "... ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ–ฅํ›„ ์ด ๊ฒฐ์ •์„ ๋‹ค์‹œ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

๋ˆ„๊ตฌ๋‚˜ ์œ ์‚ฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์œ„์˜ ์˜ค๋ฅ˜ ํ™•์žฅ ์˜ต์…˜ ๋ชจ๋‘์— ๊ณตํ†ต์ ์ธ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@mikeschinkel ์ €๋Š” ๋‹น์‹ ์ด ์ฐพ๊ณ  ์žˆ๋Š” Carl์ด ์•„๋‹™๋‹ˆ๋‹ค.

@daved , ๋‹ค์‹œ:

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

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

์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ

์ด ๋ฌธ์ œ์—์„œ ์ œ๊ธฐ๋œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์˜๋ฏธ๋ก ์  ๋ฌธ์ œ๋Š” try๊ฐ€ ์ปจํ…์ŠคํŠธ์™€ ํ•จ๊ป˜ ์˜ค๋ฅ˜ ์ฃผ์„์„ ๋” ์ž˜ ๋˜๋Š” ๋” ๋‚˜์˜๊ฒŒ ์กฐ์žฅํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•ด ๋ชจ๋‘ ๊ฐ™์€ ํŽ˜์ด์ง€์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ ์˜ˆ๋Š” os.Open์ž…๋‹ˆ๋‹ค. Go ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ " ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ Go " ์ธ์šฉ:

์ปจํ…์ŠคํŠธ๋ฅผ ์š”์•ฝํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜ ๊ตฌํ˜„์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค.
os.Open์—์„œ ๋ฐ˜ํ™˜ํ•œ ์˜ค๋ฅ˜๋Š” "permission denied"๊ฐ€ ์•„๋‹ˆ๋ผ "open /etc/passwd: ๊ถŒํ•œ ๊ฑฐ๋ถ€๋จ" ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜์— ๋Œ€ํ•œ Effective Go์˜ ์„น์…˜ ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

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

์˜ค๋Š˜๋‚  Go ๊ทœ์น™์„ ๋”ฐ๋ฅด๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์žˆ์ง€๋งŒ ๋ฐ˜๋Œ€ ๊ทœ์น™์„ ๊ฐ€์ •ํ•˜๋Š” ์ฝ”๋“œ๋„ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ณด๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

f, err := os.Open(file)
if err != nil {
    log.Fatalf("opening %s: %v", file, err)
}

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

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

Gophercon ์ฒดํฌ/ํ•ธ๋“ค ๋“œ๋ž˜ํ”„ํŠธ ๋””์ž์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค:

func CopyFile(src, dst string) error {
    handle err {
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }

    r := check os.Open(src)
    defer r.Close()

    w := check os.Create(dst)
    ...
}

์ด ์ œ์•ˆ์€ ์ด๋ฅผ ์ˆ˜์ •ํ–ˆ์ง€๋งŒ ์•„์ด๋””์–ด๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

func CopyFile(src, dst string) (err error) {
    defer func() {
        if err != nil {
            err = fmt.Errorf("copy %s %s: %v", src, dst, err)
        }
    }()

    r := try(os.Open(src))
    defer r.Close()

    w := try(os.Create(dst))
    ...
}

๊ทธ๋ฆฌ๊ณ  ์ด ๊ณตํ†ต ํŒจํ„ด์— ๋Œ€ํ•ด ์•„์ง ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๋„์šฐ๋ฏธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

func CopyFile(src, dst string) (err error) {
    defer HelperToBeNamedLater(&err, "copy %s %s", src, dst)

    r := try(os.Open(src))
    defer r.Close()

    w := try(os.Create(dst))
    ...
}

์š”์ปจ๋Œ€, ์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ํ•ฉ๋ฆฌ์„ฑ๊ณผ ์„ฑ๊ณต์€ ๋‹ค์Œ ๊ฐ€์ •๊ณผ ๋…ผ๋ฆฌ์  ๋‹จ๊ณ„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

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

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

๊ฐ์‚ฌ ํ•ด์š”.

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

๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ํ•จ์ˆ˜๋Š” ์ „์ฒด๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ•จ์ˆ˜ ์ˆ˜์ค€ ์ปจํ…์ŠคํŠธ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์‹คํŒจํ•œ ํŠน์ • ํ•˜์œ„ ์กฐ๊ฐ(์ด ํ•˜์œ„ ์กฐ๊ฐ์ด ์ด๋ฏธ ์ž์ฒด ๋ณด๊ณ ํ•จ)์ด ์•„๋‹ˆ๋ผ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ try ๊ฐ€ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ๊ณณ์€ ์˜ค๋ฅ˜๋ฅผ ์ปจํ…์ŠคํŠธํ™”ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์˜ค๋ฅ˜์— ๋Œ€์‘ํ•ด์•ผ ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค.

Cleaner, ๋” ์šฐ์•„ํ•˜๊ณ  ์ž˜๋ชป๋œ ์˜ˆ๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์—์„œ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์ž˜๋ชป๋œ ํ•จ์ˆ˜์˜ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. try ๋ฐ defer ์Šคํƒ€์ผ ์˜ค๋ฅ˜ ๋ž˜ํ•‘์„ ์‚ฌ์šฉํ•˜์—ฌ Go์— ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

func AddNewGuy(name string) (guy Guy, err error) {
    defer func() {
        if err != nil {
            err = fmt.Errorf("adding guy %v: %v", name, err)
        }
    }()

    guy = Guy{name: name}
    guy.Team = ChooseRandomTeam()
    try(guy.Team.Add(guy))
    try(AddToLeague(guy))
    return guy, nil
}

guy.Team.Add(guy) ๋Š” ์„ฑ๊ณตํ–ˆ์ง€๋งŒ AddToLeague(guy) ๋Š” ์‹คํŒจํ•˜๋ฉด ํŒ€์ด ๋ฆฌ๊ทธ์— ์—†๋Š” ์ž˜๋ชป๋œ Guy ๊ฐœ์ฒด๋ฅผ ๊ฐ–๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ guy.Team.Add(guy) ๋ฅผ ๋กค๋ฐฑํ•˜๊ณ  ๋” ์ด์ƒ try ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

func AddNewGuy(name string) (guy Guy, err error) {
    defer func() {
        if err != nil {
            err = fmt.Errorf("adding guy %v: %v", name, err)
        }
    }()

    guy = Guy{name: name}
    guy.Team = ChooseRandomTeam()
    try(guy.Team.Add(guy))
    if err := AddToLeague(guy); err != nil {
        guy.Team.Remove(guy)
        return Guy{}, err
    }
    return guy, nil
}

๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ๋ฐ˜ํ™˜ ๊ฐ’์— ๋Œ€ํ•ด 0 ๊ฐ’์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด return Guy{}, err ๋ฅผ try(err) ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  defer -ed ํ•จ์ˆ˜๋Š” ์—ฌ์ „ํžˆ ์‹คํ–‰๋˜๊ณ  ์ปจํ…์ŠคํŠธ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ํ•ด๊ฒฐํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋Š” ๋ฌธ์ œ๋ผ๊ณ  ์ œ์•ˆํ•œ ์œ ์ผํ•œ ์‚ฌ๋žŒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋‹ค๋ฅธ ์˜๊ฒฌ์€ https://swtch.com/try.html#nonissue ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๊ธฐ๋กํ–ˆ๊ณ  ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@rsc ๋˜ํ•œ ํ˜„์žฌ ์˜ค๋ฅ˜ ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ์ œ๋ฐœ ์ €๋ฅผ ํฌํ•จ์‹œ์ผœ ์ฃผ์„ธ์š”.

Robert's tryhard์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ ๋ฌด์—‡์„ ์ฐพ๋Š”์ง€ ์•Œ๋ ค๋‹ฌ๋ผ๊ณ  ์ด์ „ ์— ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ •๋ณด๋Š” ๋ณ€๊ฒฝ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ•˜๋‚˜์˜ ์ถ”์ธก์„ ํ•˜๊ณ  ๋‚˜๋Š” ๋‹ค๋ฅธ ์ถ”์ธก์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋‹ต์€ ์ด๋Ÿฌํ•œ ์ถ”์ธก์„ ๋ฐ์ดํ„ฐ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://go-review.googlesource.com/c/go/+/182717/1/src/cmd/link/internal/ld/macho_combine_dwarf.go ๋ฅผ ๋ณด์•˜๊ณ  ์ด์ „ ์ฝ”๋“œ๊ฐ€ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. try ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํ˜„์žฌ ์‹คํ–‰์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ˜„์žฌ Go๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.

์˜๊ฒฌ์ด ๋‹ค๋ฅผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋งค์šฐ ์ฃผ๊ด€์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

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

๊ธฐ์กด์˜ ๋ชจ๋“  Go ์‚ฌ์šฉ์ž๊ฐ€ ์ด์ œ ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ฐํ•˜๋„๋ก ์žฌ๊ต์œกํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ฝ”๋“œ์—์„œ try ์‚ฌ์šฉ์„ ๊ฑฐ๋ถ€ํ•˜๋Š” ์ผ๋ถ€ ์‚ฌ์šฉ์ž/ํšŒ์‚ฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๋ช‡ ๊ฐ€์ง€๋Š” ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ ค๋ฉด gofmt๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ "๋ถˆ๋Ÿ‰" ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ๋กœ์šด ์‹œ๋„ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋ ค๋ฉด. gofmt์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์‚ฌ๋žŒ๋“ค์ด go1.13 ์ด์ „์„ ์‚ฌ์šฉํ•˜์—ฌ try๋กœ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ์š”?

์ด ๋ณ€๊ฒฝ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ทน๋ณตํ•ด์•ผ ํ•  ๋‹ค๋ฅธ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ๋†“์ณค์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜๊ณ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ๋ฏฟ์ง€ ์•Š๋Š”๋‹ค.

์•Œ๋ ‰์Šค

@griesemer
97 err's none catch๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ์—์„œ tryhard๋ฅผ ์‹œ๋„ํ•˜๋Š” ๋™์•ˆ 2๊ฐœ์˜ ํŒจํ„ด์ด ๋ฒˆ์—ญ๋˜์ง€ ์•Š์•˜์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.
1 :

    if err := updateItem(tx, fields, entityView.DataBinding, entityInstance); err != nil {
        tx.Rollback()
        return nil, err
    }

์•„๋งˆ๋„ err := ์™€ ๋ฆฌํ„ด ๋ผ์ธ ์‚ฌ์ด์˜ tx.Rollback() ๋•Œ๋ฌธ์— ๋Œ€์ฒด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์€ defer์— ์˜ํ•ด์„œ๋งŒ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๊ณ  ๋ชจ๋“  ์˜ค๋ฅ˜ ๊ฒฝ๋กœ๊ฐ€ tx.Rollback()
์ด๊ฒŒ ์˜ณ์€ ๊ฑฐ๋‹ˆ ?

  1. ๋˜ํ•œ ๋‹ค์Œ์„ ์ œ์•ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
if err := db.Error; err != nil {
        return nil, err
    } else if itemDb, err := GetItem(c, entity, entityView, ItemRequest{recNo}); err != nil {
        return nil, err
    } else {
        return itemDb, nil
    }

๋˜๋Š”

    if err := db.Error; err != nil {
        return nil, err
    } else {
            if itemDb, err := GetItem(c, entity, entityView, ItemRequest{recNo}); err != nil {
                return nil, err
            } else {
                return itemDb, nil
            }
        return result, nil
    }

์ด๊ฒƒ์€ ์„€๋„์ž‰ ๋•Œ๋ฌธ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์ค‘์ฒฉ ์‹œ๋„๊ฐ€ ๋กœ ๋ณ€ํ™˜๋ ๊นŒ์š”? ์˜๋ฏธ - ์ด ์‚ฌ์šฉ์„ ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ err := ... return err๋กœ ๋‚จ๊ฒจ๋‘๋„๋ก ์ œ์•ˆํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@guybrand Re: ์ฐพ์€ ๋‘ ๊ฐ€์ง€ ํŒจํ„ด:

1) ๋„ค, tryhard ๋Š” ๋ณ„๋กœ ๋…ธ๋ ฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ๋ณต์žกํ•œ ๊ฒฝ์šฐ์—๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒฝ๋กœ์—์„œ tx.Rollback() ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ defer ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด if ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์ฝ”๋“œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

2) ์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. tryhard ๋Š” ์ด ๋” ๋ณต์žกํ•œ ํŒจํ„ด์„ ์ฐพ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๊ฒƒ์€ ๋ช‡ ๊ฐ€์ง€ ๋น ๋ฅธ ๋‹ต๋ณ€์„ ์–ป๊ธฐ ์œ„ํ•œ ์‹คํ—˜์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ œ๋Œ€๋กœ ํ•˜๋ ค๋ฉด ์กฐ๊ธˆ ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@alexbrainman

์‚ฌ๋žŒ๋“ค์ด go1.13 ์ด์ „์„ ์‚ฌ์šฉํ•˜์—ฌ try๋กœ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ์š”?

๋‚ด ์ดํ•ด๋Š” ์–ธ์–ด ์ž์ฒด์˜ ๋ฒ„์ „์ด ์ปดํŒŒ์ผ๋˜๋Š” ๊ฐ ์ฝ”๋“œ ์กฐ๊ฐ์— ๋Œ€ํ•œ go.mod ํŒŒ์ผ์˜ go ์–ธ์–ด ๋ฒ„์ „ ์ง€์‹œ๋ฌธ์— ์˜ํ•ด ์ œ์–ด๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋‚ด go.mod ๋ฌธ์„œ์—๋Š” go ์–ธ์–ด ๋ฒ„์ „ ์ง€์‹œ๋ฌธ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฐ€์ƒ์œผ๋กœ ์ƒˆ๋กœ์šด try ๋‚ด์žฅ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด Go 1.15์™€ ๊ฐ™์€ ๊ฒƒ์ด๋ผ๋ฉด, ๊ทธ ์‹œ์ ์—์„œ go.mod ํŒŒ์ผ์ด go 1.12 ์ธ ์‚ฌ๋žŒ์€ ์ƒˆ๋กœ์šด try ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Go 1.15 ํˆด์ฒด์ธ์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋”๋ผ๋„ go.mod ์— ์„ ์–ธ๋œ Go ์–ธ์–ด ๋ฒ„์ „์„ go 1.12 ์—์„œ go 1.15 ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. try ์˜ 1.15 ์–ธ์–ด ๊ธฐ๋Šฅ.

๋ฐ˜๋ฉด์— try ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๊ณ  ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ go.mod ํŒŒ์ผ์ด Go ์–ธ์–ด ๋ฒ„์ „์„ go 1.15 ๋กœ ์„ ์–ธํ•˜๋Š” ๋ชจ๋“ˆ์— ์žˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€ ๋‹ค์Œ์„ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ Go 1.12 ํˆด์ฒด์ธ์œผ๋กœ ๋นŒ๋“œํ•˜๋ฉด Go 1.12 ํˆด์ฒด์ธ์ด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. Go 1.12 ํˆด์ฒด์ธ์€ try ์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ์•Œ์ง€ ๋ชปํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ์— ์‹คํŒจํ•œ ์ฝ”๋“œ๊ฐ€ go.mod ํŒŒ์ผ์— ์žˆ๋Š” ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Go 1.15๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ์ถ”๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. . ์‹ค์ œ๋กœ ์˜ค๋Š˜์˜ Go 1.12 ๋„๊ตฌ ๋ชจ์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€๊ธˆ ๋ฐ”๋กœ ์ด ์‹คํ—˜์„ ์‹œ๋„ํ•˜๊ณ  ๊ฒฐ๊ณผ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.\hello.go:3:16: undefined: try
note: module requires Go 1.15

Go2 ์ „ํ™˜ ์ œ์•ˆ ๋ฌธ์„œ ์— ํ›จ์”ฌ ๋” ๊ธด ๋…ผ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์ •ํ™•ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋” ์ž˜ ๋…ผ์˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: #30791 ๋˜๋Š” ์ตœ๊ทผ golang-nuts ์Šค๋ ˆ๋“œ ).

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

์ด๊ณ„ = ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜
$find /path/to/repo -name '*.go' -exec cat {} \; | wc -l
Errs = err := ๊ฐ€ ์žˆ๋Š” ์ค„ ์ˆ˜ (์ด๊ฒƒ์€ ์•„๋งˆ๋„ err = ๋ฐ myerr := ๊ฐ€ ๋ˆ„๋ฝ๋˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ปค๋ฒ„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค)
$find /path/to/repo -name '*.go' -exec cat {} \; | grep "err :=" | wc -l
tryhard = tryhard๊ฐ€ ์ฐพ์€ ์ค„ ์ˆ˜

์—ฐ๊ตฌ๋ฅผ ์œ„ํ•ด ํ…Œ์ŠคํŠธํ•œ ์ฒซ ๋ฒˆ์งธ ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ˜ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๊ณ„ = 5106
์˜ค๋ฅ˜ = 111
๋…ธ๋ ฅํ•˜๋‹ค = 16

๋” ํฐ ์ฝ”๋“œ ๊ธฐ๋ฐ˜
์ด๊ณ„ = 131777
์˜ค๋ฅ˜ = 3289
ํŠธ๋ผ์ดํ•˜๋“œ = 265

์ด ํ˜•์‹์ด ํ—ˆ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ์— ๋˜์ง€๋Š” ๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์ด ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ err := (๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ err = , ๋‚ด๊ฐ€ ๋ฐฐ์šฐ๋ ค๊ณ  ์‹œ๋„ํ•œ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ ๋‹จ 4 ๊ฐœ)์˜ ํ–‰ ์ˆ˜๋ฅผ ์„ธ๋Š” ๊ฒƒ์ด ๋น ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”.

https://github.com/golang/go/issues/32437#issuecomment -503276339์˜ @griesemer ์—์„œ

์˜ˆ๋ฅผ ๋“ค์–ด ์ด ์ฝ”๋“œ ๋ฅผ ์‚ดํŽด๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

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

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

  1. ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ์ง์ „์— outf.Close() ์— ๋Œ€ํ•œ ๋ช…์‹œ์  ํ˜ธ์ถœ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฐ˜ํ™˜ ๊ฐ’์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๊ณ  ์ง€์—ฐ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํŒŒ์ผ์„ ๋‹ซ๊ณ  ์•„์ง ์—†๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ
func foo() (err error) {
    outf := try(os.Create())
    defer func() {
        cerr := outf.Close()
        if err == nil {
            err = cerr
        }
    }()

    ...
}
  1. ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด defer outf.Close() ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— try(outf.Close()) ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” "์ด์ค‘ ๋‹ซ๊ธฐ" ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
  2. ํ˜ธ์ถœ์ž๊ฐ€ ํŒŒ์ผ์ด ์ ์ ˆํ•˜๊ฒŒ ๋‹ซํ˜”๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๊ฐ€ ๊ฒฝ๋กœ ๋Œ€์‹  ์—ด๋ฆฐ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฆฌํŒฉํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ
func foo() error {
    outf := try(os.Create())
    if err := helper(outf); err != nil {
        outf.Close()
        return err
    }
    try(outf.Close())
    return nil
}

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

์ด ๋ถ„์„์ด ๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ€์ƒ์œผ๋กœ ์ƒˆ๋กœ์šด try ๋‚ด์žฅ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด Go 1.15์™€ ๊ฐ™์€ ๊ฒƒ์— ํฌํ•จ๋œ๋‹ค๋ฉด, ๊ทธ ์‹œ์ ์—์„œ go.mod ํŒŒ์ผ์ด go 1.12 ์ธ ์‚ฌ๋žŒ์€ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@pudds ์„ค๋ช…ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์˜ ์„ค๋ช…์€ ๋‚ด ๋จธ๋ฆฌ๋ฅผ ๋„˜์–ด.

์•Œ๋ ‰์Šค

@alexbrainman

์‚ฌ๋žŒ๋“ค์ด go1.13 ์ด์ „์„ ์‚ฌ์šฉํ•˜์—ฌ try๋กœ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ์š”?

try ๊ฐ€ ๊ฐ€์ƒ์œผ๋กœ Go 1.15์™€ ๊ฐ™์€ ์ œํ’ˆ์— ํฌํ•จ๋œ๋‹ค๋ฉด ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋งค์šฐ ์งง์€ ๋Œ€๋‹ต์€ Go 1.13์„ ์‚ฌ์šฉํ•˜์—ฌ try ๋กœ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

.\hello.go:3:16: undefined: try
note: module requires Go 1.15

(์ ์–ด๋„ ๋‚ด๊ฐ€ ์ „ํ™˜ ์ œ์•ˆ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•œ ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๋Š” ํ•œ).

@alexbrainman ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋งŽ์€ ์ˆ˜์˜ ์˜๊ฒฌ์€ "์ด๊ฒƒ์€ Go์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค", "Go๋Š” ๊ทธ๋ ‡๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค" ๋˜๋Š” "์—ฌ๊ธฐ์„œ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"์™€ ๊ฐ™์€ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๋‹ค. _existing_ Go๋Š” ๊ทธ๋ ‡๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

https://github.com/golang/go/issues/32437#issuecomment -503297387 ์— ๋”ฐ๋ฅด๋ฉด ๋‹จ์ผ ๊ธฐ๋Šฅ์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒฝ์šฐ ๋ถ„๋ช…ํžˆ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œํŽธ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

        if err := gen.Execute(tmp, s); err != nil {
                return fmt.Errorf("template error: %v", err)
        }

        if err := tmp.Close(); err != nil {
                return fmt.Errorf("cannot write temp file: %v", err)
        }
        closed = true

        if err := os.Rename(tmp.Name(), *genOutput); err != nil {
                return fmt.Errorf("cannot finalize file: %v", err)
        }
        removed = true

( closed ๋ฐ removed ๋Š” ์ ์ ˆํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ง€์—ฐ์— ์‚ฌ์šฉ๋จ)

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

processing path/to/dir: template: gen:42:17: executing "gen" at <.Broken>: can't evaluate field Broken in type main.state

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

์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

processing path/to/dir: rename /tmp/blahDs3x42aD commands.gen.go: No such file or directory

๋‚ด ํ”„๋กœ๊ทธ๋žจ์ด ์ด๋ฆ„์„ ๋ฐ”๊พธ๋ ค๊ณ  ํ•˜๋Š” _์ด์œ _์— ๋Œ€ํ•œ ๋‹จ์„œ ์—†์ด ์˜๋ฏธ๋ก ์€ ๋ฌด์—‡์ด๋ฉฐ ์˜๋„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? "cannot finalize file:"์„ ์•ฝ๊ฐ„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ •๋ง ๋„์›€์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์˜ˆ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์„ค๋“๋ ฅ์ด ์—†๋‹ค๋ฉด ๋ช…๋ น์ค„ ์•ฑ์—์„œ ๋‹ค์Œ ์˜ค๋ฅ˜ ์ถœ๋ ฅ์„ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

processing path/to/dir: open /some/path/here: No such file or directory

๊ทธ๊ฒŒ ๋ฌด์Šจ ๋œป์ด์•ผ? ์•ฑ์ด ๊ฑฐ๊ธฐ์— ํŒŒ์ผ์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ ์ด์œ ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(os.Open๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒ์„ฑ์ธ ์ค„๋„ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค! ์ค‘๊ฐ„ ๊ฒฝ๋กœ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ENOENT์ž…๋‹ˆ๋‹ค.). ์ด๊ฒƒ์€ ์ด ํ•จ์ˆ˜์—์„œ _every_ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ, ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ "์ž˜๋ชป ์žก๊ณ " ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์ง€์—ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ณ„๋„์˜ ์ž‘์€ ๊ธฐ๋Šฅ์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ฐ ํ•ญ๋ชฉ์„ ๋ฐ€์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@guybrand ์ด๋Ÿฌํ•œ ์ˆซ์ž ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. tryhard ์ˆซ์ž๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํŠน์ • ์˜ค๋ฅ˜ ์žฅ์‹์ด ๋งŽ์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํ›Œ๋ฅญํ•˜๋ฉฐ if ๋ฌธ์ด ์˜ฌ๋ฐ”๋ฅธ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

๋„๊ตฌ์— ๋„๋‹ฌํ•˜๋ฉด ๊ฐœ์„ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ถ„์„ํ•ด ์ฃผ์‹  @zeebo๋‹˜ , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ ์— ๋Œ€ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ์ง€ ๋ชปํ•˜์ง€๋งŒ outf ๋Š” loadCmdReader (173ํ–‰)์˜ ์ผ๋ถ€์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ 204ํ–‰์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์ด outf ์˜ ์ด์œ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@tv42 https://github.com/golang/go/issues/32437#issuecomment -503340426์˜ ์˜ˆ์—์„œ "์ž˜๋ชป"ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด if ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ๋‹ค๋ฅธ ์‘๋‹ต์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. try ๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์œผ๋ฉฐ defer ๋Š” ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ๋ฟ์ž…๋‹ˆ๋‹ค(์ด ์Šค๋ ˆ๋“œ์˜ ๋‹ค๋ฅธ ์–ธ์–ด ๋ณ€๊ฒฝ ์ œ์•ˆ์€ ์ด ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก if ์ƒˆ๋กœ์šด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋„์ž…ํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๋Š” ์ง„์ˆ ). ์„ธ๋ถ€ ์ œ์•ˆ์˜ FAQ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@griesemer ๊ทธ๋ ‡๋‹ค๋ฉด ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋‹น์‹ ๊ณผ @rsc ๊ฐ€ ๋™์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ๋‚ด๊ฐ€ "์ž˜๋ชป๋œ ์ผ์„ ํ•˜๊ณ  ์žˆ๋‹ค"๊ณ  ๋งํ•˜๋ฉฐ ์ด์— ๋Œ€ํ•ด ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

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

์—ฐ๊ธฐํ•˜๋‹ค

Gophercon ์ฒดํฌ/ํ•ธ๋“ค ์ดˆ์•ˆ ์—์„œ ์ด ์ œ์•ˆ์œผ๋กœ์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ defer ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด handle ๋ฅผ ์‚ญ์ œํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์ด ์ง€์—ฐ๋œ ํ˜ธ์ถœ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ์— ์˜ํ•ด ์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค(์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์ด์ „ ์ฃผ์„ ์ฐธ์กฐ).

func CopyFile(src, dst string) (err error) {
    defer HelperToBeNamedLater(&err, "copy %s %s", src, dst)

    r := check os.Open(src)
    defer r.Close()

    w := check os.Create(dst)
    ...
}

์ด ์˜ˆ์—์„œ ์˜ค๋ฅ˜ ์ฃผ์„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ defer์˜ ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ์€ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

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

  2. _์ฃผ์†Œ ํ‘œํ˜„._ ๋ช‡๋ช‡ ์‚ฌ๋žŒ๋“ค์€ ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Go ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฃผ์†Œ ํ‘œํ˜„์„ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค๋Š” ์šฐ๋ ค๋ฅผ ์ œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ์ธํ„ฐํŽ˜์ด์Šค์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์ด๋ฅผ ์š”๊ตฌํ•˜๋ฏ€๋กœ ์ด๋Š” ํฐ ๋‹จ์ ์œผ๋กœ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  3. _Defer ์ž์ฒด._ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ defer๋ฅผ ์–ธ์–ด ๊ฐœ๋…์œผ๋กœ ์ „ํ˜€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์šฐ๋ ค๋ฅผ ์ œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์†Œ ํ‘œํ˜„์‹๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ defer๋Š” ๊ฒฐ๊ตญ ๋ฐฐ์›Œ์•ผ ํ•˜๋Š” ํ•ต์‹ฌ ์–ธ์–ด ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. defer f.Close() ๋ฐ defer l.mu.Unlock() $์™€ ๊ฐ™์€ ํ‘œ์ค€ ๊ด€์šฉ๊ตฌ๋Š” ๋„ˆ๋ฌด ์ผ๋ฐ˜์ ์ด์–ด์„œ ์–ธ์–ด์˜ ๋ชจํ˜ธํ•œ ๊ตฌ์„์œผ๋กœ defer๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์„ ์ •๋‹นํ™”ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

  4. _Performance._ ์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜ ๋งจ ์œ„์— ์žˆ๋Š” defer์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ defer ํŒจํ„ด์„ ๋งŒ๋“ค ๋•Œ๋งˆ๋‹ค ๊ฐ ๋ฐ˜ํ™˜์—์„œ ์ˆ˜๋™์œผ๋กœ ํ˜ธ์ถœ์„ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ 0์ด ๋˜๋„๋ก ๋งŒ๋“œ๋Š” ์ž‘์—…์— ๋Œ€ํ•ด ์ˆ˜๋…„ ๋™์•ˆ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋‹ค์Œ Go ๋ฆด๋ฆฌ์Šค๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ํƒ๊ตฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋”๋ผ๋„ ์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์•ฝ 50ns์˜ ํ˜„์žฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๊ธˆ์ง€๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ์†Œ์ˆ˜์˜ ํ˜ธ์ถœ์€ defer๊ฐ€ ๋” ๋นจ๋ผ์งˆ ๋•Œ๊นŒ์ง€ ๊ณ„์† if ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์ง€๋‚œ 8์›”์— ์ด ํ† ๋ก ์„ ์‹œ์ž‘ํ•œ ์ดํ›„๋กœ ์ €๋Š” "์ด ์ฝ”๋“œ๊ฐ€ ๊ฒ€์‚ฌ/ํ•ธ๋“ค๊ณผ ํ•จ๊ป˜ ์–ด๋–ป๊ฒŒ ๋ณด์ผ ๊ฒƒ์ธ๊ฐ€?"๋ผ๋Š” ์ •์‹ ์ ์ธ ์—ฐ์Šต์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” "with try/defer?" ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋งˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๋‹ต์€ ๋‚ด๊ฐ€ ๋งค๋ฒˆ ๋ฆฌํ„ดํ•  ๋•Œ๋งˆ๋‹ค ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ์ƒ๋žตํ•˜๋Š” ๋Œ€์‹  ํ•œ ๊ณณ(์ง€์—ฐ)์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋” ๋‚˜์€ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

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

func CopyFile(src, dst string) (err error) {
    defer errd.Add(&err, "copy %s %s", src, dst)

    r := check os.Open(src)
    defer r.Close()

    w := check os.Create(dst)
    ...
}

CopyFile์„ ๋””๋ฒ„๊น… ์ค‘์ด๊ณ  ๋ฐ˜ํ™˜๋œ ์˜ค๋ฅ˜ ๋ฐ ์Šคํƒ ์ถ”์ (๋””๋ฒ„๊ทธ ์ธ์‡„๋ฅผ ์‚ฝ์ž…ํ•˜๋ ค๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌ)์„ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func CopyFile(src, dst string) (err error) {
    defer errd.Trace(&err)
    defer errd.Add(&err, "copy %s %s", src, dst)

    r := check os.Open(src)
    defer r.Close()

    w := check os.Create(dst)
    ...
}

๋“ฑ๋“ฑ.

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

์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

์‚ฌ๋žŒ๋“ค์€ if err != nil ๋ฌธ์„ ๊ณ„์† ์ž‘์„ฑํ•˜๋ฉด์„œ ์ง€์—ฐ ๋„์šฐ๋ฏธ๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋Š˜๋‚  ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์˜ํ–ฅ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

@tv42 , @griesemer๋‹˜ ๋ง์”€์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๊ฐ€ "์™„๋ฃŒ" ๋‹จ๊ณ„์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ์„ ์›ํ™œํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋œ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด if ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ๊ธฐ๋Šฅ์—์„œ ์ด๋Ÿฌํ•œ ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@guybrand , tryhard ์ˆซ์ž๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ํŠน์ • ์˜ˆ๊ฐ€ ๋ณ€ํ™˜๋˜์ง€ ์•Š์€ ์ด์œ ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ๋” ์ข‹์„ ๊ฒƒ์ด๋ฉฐ ๋” ๋‚˜์•„๊ฐ€ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ถ€์ ์ ˆํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @tv42 ๋‹˜ ์˜ ์˜ˆ์‹œ์™€ ์„ค๋ช…์ด ๊ทธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

defer ์— ๋Œ€ํ•œ ์šฐ๋ ค์— ๋Œ€ํ•ด @griesemer . ๋‚˜๋Š” ๊ทธ emit ๋˜๋Š” ์ดˆ๊ธฐ ์ œ์•ˆ์„œ handle ๋กœ ๊ฐ€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. err ๊ฐ€ nil์ด ์•„๋‹ˆ๋ฉด emit/handle ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜์˜ ๋์ด ์•„๋‹ˆ๋ผ ๊ทธ ์ˆœ๊ฐ„์— ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. defer๋Š” ๋งˆ์ง€๋ง‰์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. emit/handle err ๊ฐ€ nil์ธ์ง€ ์•„๋‹Œ์ง€์— ๋”ฐ๋ผ ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์—ฐ๊ธฐ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ผ๋ถ€ ๋ฐ์ดํ„ฐ:

๋‚ด๊ฐ€ ์ข…๊ต์ ์œผ๋กœ "๋„ค์ดํ‚ค๋“œ ์˜ค๋ฅ˜ ๋ฆฌํ„ด"์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋งค์ง„ํ•ด ์˜จ ~70k LOC ํ”„๋กœ์ ํŠธ ์ค‘์—์„œ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ 612๊ฐœ์˜ ๋„ค์ดํ‚ค๋“œ ์˜ค๋ฅ˜ ๋ฆฌํ„ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๊ธฐ๋ก๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ ๋ฉ”์‹œ์ง€๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ๋งŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋จ). try()๋Š” ์‚ฌ์ „ ์ •์˜๋œ ์˜ค๋ฅ˜๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฐ๊ธฐํ•˜๊ณ  ๋” ๋งŽ์€ ์œ„์น˜์—์„œ try๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๋„ค์ดํ‚ค๋“œ ๋ฆฌํ„ด๋‹น ๋‹จ ๋‘ ์ค„๋ณด๋‹ค ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๊ณต๊ธ‰์—…์ฒด ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” ~620k+ LOC ์ค‘ 1600๊ฐœ์˜ ๊ธฐ๋ณธ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์šฐ๋ฆฌ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ข…๊ต์ ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์žฅ์‹ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@rsc ๋‚˜์ค‘์— try func Wrap(msg string) func(error) error ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ์˜ค๋ฅ˜/errc ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ try(f(), errc.Wrap("f failed")) ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@damienfamed75 ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ emit ๋Š” try ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋ฉฐ ํ•ด๋‹น ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ถฉ๋ถ„ํžˆ ๋ช…ํ™•ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

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

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

@guybrand (๋ฐ @griesemer)์˜ ๋‘ ๋ฒˆ์งธ ์ธ์‹ํ•  ์ˆ˜ ์—†๋Š” ํŒจํ„ด์€ https://github.com/griesemer/tryhard/issues/2 ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

@daved

๋งŽ์€ ๊ณต๊ฐœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ์ •์— ์˜ํ•ด ์ขŒ์šฐ๋  ๋•Œ ๋ฐ์ดํ„ฐ์—์„œ ๊ฐ€์น˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋„์ถœ๋ ๊นŒ์š”?

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

๊ทธ๋ž˜์„œ ์ ์–ด๋„ ํฌ๋ง์€ ์žˆ์Šต๋‹ˆ๋‹ค. :)

tryhard ์„(๋ฅผ) ์‹œ๋„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฝ์šฐ ์•„์ง ์‹œ๋„ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋„๊ตฌ๊ฐ€ ๋ณ€๊ฒฝํ•œ ์‚ฌํ•ญ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ err != nil ์˜ ๋‚˜๋จธ์ง€ ์ธ์Šคํ„ด์Šค๋ฅผ grepํ•˜๊ณ  ๋‹ค์Œ์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ๋‚จ๊ฒผ๋Š”์ง€, ์™œ.

(๋˜ํ•œ https://github.com/griesemer/tryhard/์— ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์™€ PR์ด ์žˆ์Šต๋‹ˆ๋‹ค.)

@rsc ๋Š” ๋‚ด๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ defer HandleFunc(&err, ...) ํŒจํ„ด์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์ด์œ ์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ์•Œ๋ชธ ๋ฐ˜ํ™˜์ด๋‚˜ ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ์—ฐ๊ด€์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ๋„ˆ๋ฌด "์˜๋ฆฌํ•œ"๋Š๋‚Œ์ž…๋‹ˆ๋‹ค.

๋ช‡ ๋‹ฌ ์ „์—(์•„๋งˆ๋„ 1๋…„?) ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ œ์•ˆ์ด ์žˆ์—ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์žŠ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ์š”์ฒญํ•œ ๋‚ด์šฉ์„ ์žŠ์–ด๋ฒ„๋ ธ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์œผ๋กœ ์‘๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค.

func myFunction() (i int, err error) {
    defer func() {
        if err != nil {
            err = fmt.Errorf("wrapping the error: %s", err)
        }
    }()

    // ...
    return 0, err

    // ...
    return someInt, nil
}

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

์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ ๋Š” return ..., err ๋ฅผ ์“ธ ๋•Œ err ๊ฐ€ ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ๋ณด๋‚ด๊ธฐ ์ „์— ๊ฐ’์ด ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. ์ด์ „์— return ๋Š” Go์—์„œ ํ•ญ์ƒ "์‹ ์„ฑํ•œ" ์ž‘์—…์ฒ˜๋Ÿผ ๋ณด์˜€๊ณ  ์‹ค์ œ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ž, ์ˆซ์ž์™€ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. :)

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ”Œ๋žซํผ์˜ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค ์†Œ์Šค์— ๋Œ€ํ•ด tryhard๋ฅผ ์‹คํ–‰ํ•˜๊ณ  loccount ๋ฐ grep 'if err'์˜ ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ–ˆ์Šต๋‹ˆ๋‹ค. loccount / grep 'if err' ์ฃผ๋ฌธ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. | ํ™”์žฅ์‹ค / ๋…ธ๋ ฅ:

1382 / 64 / 14
108554 / 66 / 5
58401 / 22 / 5
2052/247/39
12024 / 1655 / 1

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

๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ์€ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ try()๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ค ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ์ ์–ด๋„ tryhard๊ฐ€ ํ›จ์”ฌ ๋‚˜์•„์งˆ ๋•Œ๊นŒ์ง€๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ $#$ try() ์˜ if err != nil { return err } ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ผ๋ฐ˜์ ์ธ go ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋‹ฌ๋ฆฌ ์‹ค์ œ๋กœ ๋งค์šฐ ๋“œ๋ฌผ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ์กด์ค‘ํ•˜์ง€๋งŒ, Go ์ปดํŒŒ์ผ๋Ÿฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ์ฝ”๋“œ ๊ธฐ๋ฐ˜๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž์ฃผ ๋ณด๋Š” Go ๋””์ž์ด๋„ˆ๋Š” ์ด ๋•Œ๋ฌธ์— try() ์˜ ์œ ์šฉ์„ฑ์„ ๊ณผ๋Œ€ ํ‰๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@beoran tryhard ๋Š” ํ˜„์žฌ ๋งค์šฐ ์ดˆ๋ณด์ ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ try ๊ฐ€ ๋“œ๋ฌธ ์ด์œ  ์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค๋ฅ˜๋ฅผ ์žฅ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์—? ๋Œ์•„๊ฐ€๊ธฐ ์ „์— ๋‹ค๋ฅธ ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—? ๋‹ค๋ฅธ ๊ฒƒ?

@rsc , @griesemer

์˜ˆ ๋ฅผ ๋“ค์–ด tryHard๊ฐ€ ๋†“์นœ ๋‘ ๊ฐœ์˜ ๋ฐ˜๋ณต ์ƒ˜ํ”Œ์„ ์—ฌ๊ธฐ ์— ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” "if Err :="๋กœ ์œ ์ง€๋˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ํ•ด๊ฒฐ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ์žฅ์‹ ์˜ ๊ฒฝ์šฐ ์ฝ”๋“œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐ˜๋ณต ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(ํ•˜๋‚˜์˜ ์ฝ”๋“œ ์กฐ๊ฐ์— ๋‘ ๊ฐ€์ง€๋ฅผ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค).

if v, err := someFunction(vars...) ; err != nil {
        return fmt.Errorf("extra data to help with where did error occur and params are %s , %d , err : %v",
            strParam, intParam, err)
    } else if v2, err := passToAnotherFunc(v,vars ...);err != nil {
        extraData := DoSomethingAccordingTo(v2,err)
        return formatError(err,extraData)
    } else {

    }

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

๋‹ค์‹œ ๋งํ•ด์„œ, "์˜ค๋ฅ˜ A ๋กœ๊น… ๋ฐ ์˜ค๋ฅ˜ B ๋ฐœ์ƒ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋กœ ์Šค๋งˆํŠธํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•˜๋ ค๋ฉด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ํ™•์žฅํ•˜๋Š” ์ด ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์— ๋Œ€ํ•œ ์–ธ๊ธ‰ ์™ธ์—๋„
์ด๊ฒƒ์€ "์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  '๋‹ค๋ฅธ ์‚ฌ๋žŒ'์ด๋‚˜ '๋‹ค๋ฅธ ๊ธฐ๋Šฅ'์ด ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ ์ด์ƒ"์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

์ฆ‰, "์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ"๋ณด๋‹ค "๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ"์— try()๊ฐ€ ๋” ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์‹คํ–‰ ๊ฐ€๋Šฅ ํŒŒ์ผ("์•ฑ")๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” Total/Errs/tryHard ๋น„๊ต๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://github.com/golang/go/issues/32437#issuecomment -503297387์— ์„ค๋ช…๋œ ์ƒํ™ฉ์— ์ •ํ™•ํžˆ ์ฒ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
์–ด๋–ค ์ˆ˜์ค€์—์„œ๋Š” ์˜ค๋ฅ˜๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค try ๋กœ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. if err!=nil ๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์ˆ˜์ค€์—์„œ๋Š” return err ๋ชจ๋“  ๋ฐ˜ํ™˜์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ณ ํ†ต์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด try ๋ฐ defer ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•˜์—ฌ ๊ธฐ๋Šฅ ์‹œ์ž‘ ์‹œ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ๋กœ๊ฑฐ๋กœ ์ด๋ฏธ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ €์—๊ฒŒ try ์™€ ๊ธฐ๋Šฅ๋ณ„ ์žฅ์‹์€ ์ด๋ฏธ ์ดŒ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

@thepudds

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

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

try ๋กœ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

.\hello.go:3:16: undefined: try
note: module requires Go 1.15

(์ ์–ด๋„ ๋‚ด๊ฐ€ ์ „ํ™˜ ์ œ์•ˆ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•œ ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๋Š” ํ•œ).

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

try๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ grepํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  note: module requires Go 1.15 ๋Š” ์ด ์ƒํ™ฉ์—์„œ ์ตœ์•…์˜ ๋„์›€์ž…๋‹ˆ๋‹ค. ์™œ module ์ž…๋‹ˆ๊นŒ? ์™œ Go 1.15 ์ž…๋‹ˆ๊นŒ?

@griesemer

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

์ฐจ๋ผ๋ฆฌ ์ œ๋„ค๋ฆญ์— ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Go์— ์ œ๋„ค๋ฆญ์ด ์žˆ์œผ๋ฉด ์ด์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์š”์ ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ: ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ๋Š๋ผ๋Š” ๋ฐฉ์‹์— ์ต์ˆ™ํ•ด์ง‘๋‹ˆ๋‹ค. ...

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

๋˜๋Š” ๋‹ค์Œ ์‚ฌ๊ณ  ์‹คํ—˜์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. Imagine Go์—๋Š” defer ๋ฌธ์ด ์—†์—ˆ๊ณ  ์ด์ œ ๋ˆ„๊ตฐ๊ฐ€ defer ์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์‚ฌ๋ก€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. defer ์—๋Š” ์–ธ์–ด์˜ ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ๊ฐ™์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ƒˆ ์–ธ์–ด๋Š” ๋” ์ด์ƒ defer ์ด์ „์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 10๋…„ ๋™์•ˆ ํ•จ๊ป˜ ์‚ด์•„๋ณด๋‹ˆ ์™„์ „ํžˆ "๋ฐ”๋‘‘"์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋ช‡ ๋…„์ด ์ง€๋‚œ ํ›„์—๋„ ์—ฌ์ „ํžˆ defer ๋ณธ๋ฌธ์— ์†์•„ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋‹ซํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ defer ๋Š” ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ์™€ ๊ด€๋ จํ•˜์—ฌ ์ŠคํŽ˜์ด๋“œ์— ๊ทธ ๋Œ€๊ฐ€๋ฅผ ์ง€๋ถˆํ•ฉ๋‹ˆ๋‹ค. defer ์—†๋Š” Go๋Š” ์ƒ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—๋Š” ์•„๋ฌด๋Ÿฐ ์ด์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— try ์— ๋Œ€ํ•ด ๋น„์Šทํ•œ ๊ฐ€๊ฒฉ์„ ์ง€๋ถˆํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋‚ด ์ž‘์€ ํ”„๋กœ์ ํŠธ(์•ฝ 1200์ค„์˜ ์ฝ”๋“œ)๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. https://go-review.googlesource.com/c/go/+/182717/1/src/cmd/link/internal/ld/macho_combine_dwarf.go ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ์œ ์‚ฌํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ œ ์˜๊ฒฌ์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ์ฃผ์ผ ํ›„์— ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค. ๋‚ด ๋งˆ์Œ์€ ํ•ญ์ƒ ๋ฌด์–ธ๊ฐ€๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ๊ณ  ์žŠ์–ด ๋ฒ„๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

...์•„์ง ์ด๋ฅด์ง€๋งŒ ์ด ์ œ์•ˆ์ด ๋‚˜์˜จ์ง€ 2์ฃผ๋ฐ–์— ์•ˆ๋๋Š”๋ฐ...

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

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

์•Œ๋ ‰์Šค

@griesemer ๋ฉ‹์ง„ ์ œ์•ˆ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. tryhard๋Š” ์ œ๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์œ ์šฉํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๊ฐ์‚ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@rsc ์ž˜ ์„ค๋ช…๋œ ์‘๋‹ต๊ณผ ๋„๊ตฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ํ•œ๋™์•ˆ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ํŒ”๋กœ์šฐํ–ˆ๋Š”๋ฐ @beoran์˜ ๋‹ค์Œ ๋Œ“๊ธ€์€ ์ €์—๊ฒŒ ์˜ค์‹นํ•จ ์„ ์ค๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜์„ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ „์— ์—ฌ๋Ÿฌ bad written code ๋ฅผ ๊ด€๋ฆฌํ•œ ์ ์ด ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ๋ชจ๋“  ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ตœ์•…์˜ ์•…๋ชฝ์ด๋ผ๊ณ  ์ฆ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ์— A likes๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ช…์‹œ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์ด๋ฅผ ๋”ฐ๋ฅผ ๊ฒƒ์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹ˆ๋ฉฐ AA , AB ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฐฉ๋ฒ•์—๋Š” ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

To my surprise, people already think the code below is cool ... it's an abomination ๋Š” ๊ธฐ๋ถ„์ด ์ƒํ•œ ์‚ฌ๋žŒ์—๊ฒŒ ์‚ฌ๊ณผ๋ฅผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())

AsCommit ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋‹ค์Œ์„ ๋ณผ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค.

func AsCommit() error(){
    return try(try(try(tail()).find()).auth())
}

๊ด‘๊ธฐ๋Š” ๊ณ„์†๋˜๊ณ  ์†”์งํžˆ ๋‚˜๋Š” ์ด๊ฒƒ์ด @robpike simplicity is complicated (์œ ๋จธ)์˜ ์ •์˜๋ผ๊ณ  ๋ฏฟ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@rsc ์˜ˆ์ œ ๊ธฐ๋ฐ˜

// Example 1
headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))

// Example 2 
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)

// Example 3 
try (
    headRef := r.Head()
    parentObjOne := headRef.Peel(git.ObjectCommit)
    parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try (
    treeOid := index.WriteTree()
    tree := r.LookupTree(treeOid)
)

์•ฝ๊ฐ„์˜ else ๊ฐ€ ์žˆ๋Š” Example 2 ์— ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์ตœ์„ ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์˜ค๋ฅ˜๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋‚ณ์„ ์ˆ˜ ์žˆ๋Š” abomination ๋กœ ๋ณ€์ดํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ
  • try ๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. go ๋Š” if ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  try tree := r.LookupTree(treeOid) else { ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋” ์ž์—ฐ์Šค๋Ÿฌ์›Œ์ง‘๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜๋Š” ๋งค์šฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ๊ฐ€์‹œ์„ฑ์ด ํ•„์š”ํ•˜๋ฉฐ ์ด๊ฒƒ์ด go๊ฐ€ ์ „ํ†ต์ ์ธ try & catch ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)

parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()

try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid) else { 
    // Heal the world 
   // I may return with return keyword 
   // I may not return but set some values to 0 
   // I may remember I need to log only this 
   // I may send a mail to let the cute monkeys know the server is on fire 
}

์กฐ๊ธˆ ์ด๊ธฐ์ ์ธ ๋ง์”€์„ ๋“œ๋ฆฐ ์  ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@josharian ์—ฌ๊ธฐ์— ๋„ˆ๋ฌด ๋งŽ์ด ๋ฐํž ์ˆ˜๋Š” ์—†์ง€๋งŒ ๊ทธ ์ด์œ ๋Š” ๋งค์šฐ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ์šฐ๋ฆฌ๋Š” ์˜ค๋ฅ˜๋ฅผ ์žฅ์‹ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๋˜ํ•œ ์ค‘์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋˜๋Š” if err := foo() ; err != nil { /* various handling*/ ; return err } ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ try() ๊ฐ€ ์„ค๊ณ„๋œ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์šฐ๋ฆฌ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ ๋งค์šฐ ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–ธ์–ด์— 'try()'๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: try()๊ฐ€ ๊ตฌํ˜„๋  ์˜ˆ์ •์ด๋ผ๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋Š” tryhard๋ฅผ ํ›จ์”ฌ ๋” ๊ฐœ์„ ํ•˜์—ฌ ๊ธฐ์กด ์ฝ”๋“œ ๊ธฐ๋ฐ˜์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐ ๋„๋ฆฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

func findDelimiter(r io.Reader) ([]byte, error) {
    emit err {
        // if this doesn't return then continue from where we left off
        // at the try function that was called last.
        if err != io.EOF {
            return nil, err
        }
    }

    bufReader := bufio.NewReader(r)

    token := try(bufReader.ReadSlice('|'))

    return token, nil
}

๋˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋” ๋‹จ์ˆœํ™”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

func findDelimiter(r io.Reader) ([]byte, error) {
    emit err != io.EOF {
        return nil, err
    }

    bufReader := bufio.NewReader(r)

    token := try(bufReader.ReadSlice('|'))

    return token, nil
}

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

func writeStuff(filename string) (io.ReadCloser, error) {
    emit err {
        return nil, err
    }

    f := try(os.Open(filename))

    try(fmt.Fprintf(f, "stuff\n"))

    return f, nil
}

์ด ์˜ˆ์ œ์™€ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

func writeStuff(filename string) (io.ReadCloser, error) {
    // when not defining a handler then try's default handler kicks in to
    // return nil valued then error as usual.

    f := try(os.Open(filename))

    try(fmt.Fprintf(f, "stuff\n"))

    return f, nil
}

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

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

@velovix , ๋‹ค์‹œ https://github.com/golang/go/issues/32437#issuecomment -503314834:

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

์ด๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ๋„ฃ๋Š” ์ •๋ง ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

@olekukonko , ๋‹ค์‹œ https://github.com/golang/go/issues/32437#issuecomment -503508478:

To my surprise, people already think the code below is cool ... it's an abomination ๋Š” ๊ธฐ๋ถ„์ด ์ƒํ•œ ์‚ฌ๋žŒ์—๊ฒŒ ์‚ฌ๊ณผ๋ฅผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())

Grepping https://swtch.com/try.html , ํ•ด๋‹น ํ‘œํ˜„์‹์€ ์ด ์Šค๋ ˆ๋“œ์—์„œ ์„ธ ๋ฒˆ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
@goodwine ์ด ๊ทธ๊ฒƒ์„ ๋‚˜์œ ์ฝ”๋“œ๋กœ ๋‚ด์„ธ์› ๊ณ , ๋‚˜๋Š” ๋™์˜ํ–ˆ๊ณ  @velovix ๋Š” "๊ทธ๊ฒƒ์ด ์ถ”ํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ... ๋‹น์‹ ์ด try-catch ์–ธ์–ด์—์„œ ์ž์ฃผ ๋ณด๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค ... ์—ฌ์ „ํžˆ ์ฝ”๋“œ์˜ ์–ด๋–ค ๋ถ€๋ถ„์ด ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋กœ ์ธํ•ด ํ๋ฆ„์„ ์ œ์–ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."

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

๋‚˜๋Š” ๋˜ํ•œ ๋‹จ์ง€ ๋‹ค์‹œ ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

์˜ค๋ฅ˜๋Š” ๋งค์šฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ๊ฐ€์‹œ์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

@guybrand , re https://github.com/golang/go/issues/32437#issuecomment -503287670 ๊ทธ๋ฆฌ๊ณ  ๋ฐ‹์—…์— ๋„ˆ๋ฌด ๋Šฆ์„ ์ˆ˜ ์žˆ์–ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์˜ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋กœ์˜ ๋ณ€ํ™˜์ด nil-ness๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž ์ง€์ • *MyError ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•(์˜ˆ: ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ)์ด ์žˆ๊ณ  err == nil์„ ์„ฑ๊ณต ์‹ ํ˜ธ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

func f() (int, *MyError)
func g() (int, error) { x, err := f(); return x, err }

f๊ฐ€ nil *MyError๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด g๋Š” nil์ด ์•„๋‹Œ ์˜ค๋ฅ˜์™€ ๋™์ผํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์˜๋„ํ•œ ๊ฒƒ๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. *MyError๊ฐ€ ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ ๋Œ€์‹  ์ธํ„ฐํŽ˜์ด์Šค์ธ ๊ฒฝ์šฐ ๋ณ€ํ™˜์€ nilness๋ฅผ ์œ ์ง€ํ•˜์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฏธ๋ฌ˜ํ•ฉ๋‹ˆ๋‹ค.

try์˜ ๊ฒฝ์šฐ try๊ฐ€ nil์ด ์•„๋‹Œ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋งŒ ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, f๊ฐ€ ์‹คํŒจํ•  ๋•Œ nil์ด ์•„๋‹Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•œ ์‹ค์ œ๋กœ ๊ดœ์ฐฎ๊ณ  f๊ฐ€ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ nil ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•œ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

func g() (int, error) {
    return try(f()), nil
}

๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ์ด๊ฒƒ์„ ๋ณด๊ณ  ๊ทธ๊ฒƒ์„

func g() (int, error) {
    return f()
}

๊ฐ™์•„์•ผ ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

๋ชจ๋‘์—๊ฒŒ ์ˆจ์„ ๊ณ ๋ฅด๊ณ  ์‹คํ—˜ํ•  ์‹œ๊ฐ„์„ ์ฃผ๊ธฐ ์œ„ํ•ด ์ด ๋Œ€ํ™”๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ๋‹ค์Œ ์ฃผ ๋ฐ˜ ๋™์•ˆ ๋ฌธ์ œ๋ฅผ ์ž ๊ธ‰๋‹ˆ๋‹ค.

์ž ๊ธˆ์€ 1p PDT/4p EDT(์ง€๊ธˆ๋ถ€ํ„ฐ ์•ฝ 3์‹œ๊ฐ„ ํ›„)์— ์‹œ์ž‘๋˜์–ด ์‚ฌ๋žŒ๋“ค์ด ๋ณด๋ฅ˜ ์ค‘์ธ ๊ฒŒ์‹œ๋ฌผ์„ ์ œ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 7์›” 1์ผ์— ๋” ๋งŽ์€ ๋…ผ์˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๊ทธ ์œ„ํ‚ค ํŽ˜์ด์ง€๋Š” ํ™•์ธ/์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ํŽ˜์ด์ง€๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ๋‚˜๋Š” ์œ„ํ‚ค์—์„œ ์ •์› ๊ฐ€๊พธ๊ธฐ๋ฅผ ๊ณ„์†ํ•  ์‹œ๊ฐ„์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@networkimprov , ์ •์› ๊ฐ€๊พธ๊ธฐ์— ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback์— ์ƒˆ๋กœ์šด ์ƒ๋‹จ ์„น์…˜์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ณด๋‹ค ๋‚˜์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฝ์— ๋Œ€ํ•œ ๋กœ๋ฒ„ํŠธ์˜ 1p PDT / 4p EDT ๋…ธํŠธ๋„ ๋†“์ณ์„œ ์กฐ๊ธˆ ์ด๋ฅธ ์‹œ๊ฐ„์— ์ž ๊ทธ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์˜ค๋ž˜, ๋‹ค์‹œ ์˜คํ”ˆํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์“ธ ๊ณ„ํš์ด์—ˆ๊ณ , ๊ทธ๊ฒƒ์ด ์ž ๊ฒจ ์žˆ๊ธฐ ์ „์— ์™„๋ฃŒํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜์„œ - ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ธ์ •์ ์ธ ์ž…์žฅ์„ ๋ถ„๋ช…ํžˆ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์Šคํƒ ์ถ”์ ์„ ๋ฑ‰์–ด๋‚ด๋Š” ๊ฒฝ์šฐ์—๋„ ์˜ค๋ฅ˜๋ฅผ ๊พธ๋ฏธ๊ณ  ์ฃผ์„์„ ๋‹ฌ๊ธฐ ์œ„ํ•ด ์ด๋ฏธ defer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ด ์ด์œ ์ž…๋‹ˆ๋‹ค.

๋ณด๋‹ค:
https://github.com/ugorji/go-ndb/blob/master/ndb/ndb.go#L331
https://github.com/ugorji/go-serverapp/blob/master/app/baseapp.go#L129
https://github.com/ugorji/go-serverapp/blob/master/app/webrouter.go#L180

๋ชจ๋‘ errorutil.OnError(*error)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

https://github.com/ugorji/go-common/blob/master/errorutil/errors.go#L193

์ด๊ฒƒ์€ Russ/Robert๊ฐ€ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์ง€์—ฐ ๋„์šฐ๋ฏธ์˜ ๋ผ์ธ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

FWIW์—์„œ ์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋งˆ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ go-like IMHO์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ช…๋ช…๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉฐ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์—์„œ ๊ถŒ์žฅ๋˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋งˆ๋ฒ•์ด๋ผ๋Š” ๊ฐœ๋…์— ์ด์˜๋ฅผ ์ œ๊ธฐํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ ‡๊ฒŒ ๋งํ•ฉ๋‹ˆ๋‹ค.

๋‘˜์งธ, ํ•จ์ˆ˜๋กœ try(...)์— ๋ช‡ ๊ฐ€์ง€ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ํ‚ค์›Œ๋“œ๋ณด๋‹ค ํ•œ ๊ฐ€์ง€ ๋ถ„๋ช…ํ•œ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๋œ 2๊ฐ€์ง€ ํ™•์žฅ ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ™•์žฅํ•  ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • func(error) ์˜ค๋ฅ˜ ํ˜•์‹์˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ™•์žฅํ•˜์‹ญ์‹œ์˜ค.

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

์—ฐ์žฅ ์‹œ๋„๊ฐ€ ํ•„์š”ํ•œ์ง€, ํ•„์š”ํ•˜๋‹ค๋ฉด ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€์•ผ ํ• ์ง€๋Š” ์•„์ง ๊ฒฐ์ •๋˜์ง€ ์•Š์•˜๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ๋ฐฉํ–ฅ์€ ๋‚ด๊ฐ€ ์˜์›ํžˆ ์‹ซ์–ดํ•˜์ง€๋งŒ ๊ณ„์†ํ•ด์„œ ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋น„์šฉ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” "if err != nil { return err }" ๋ง๋”๋“ฌ์„ ๋Œ€๋ถ€๋ถ„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ์‹œ๋„๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ try ๊ฐ€ ์ธ๋ผ์ธ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ผ๋Š” ์ ์„ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

var u User = db.loadUser(try(strconv.Atoi(stringId)))

AS ๋ฐ˜๋Œ€:

var id int // i have to define this on its own if err is already defined in an enclosing block
id, err = strconv.Atoi(stringId)
if err != nil {
  return
}
var u User = db.loadUser(id)

๋ณด์‹œ๋‹ค์‹œํ”ผ, ์ €๋Š” 6์ค„์„ 1์ค„๋กœ ์ค„์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ค‘ 5์ค„์€ ์ง„์ •ํ•œ ์ƒ์šฉ๊ตฌ์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‹ค๋ฃจ์—ˆ์œผ๋ฉฐ ๋งŽ์€ go ์ฝ”๋“œ์™€ ํŒจํ‚ค์ง€๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด github์—์„œ ๋‚ด๊ฐ€ ์˜จ๋ผ์ธ์— ๊ฒŒ์‹œํ•œ ์ผ๋ถ€ ๋˜๋Š” go-codec ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์—ฌ๊ธฐ์— ์žˆ๋Š” ๋งŽ์€ ์˜๊ฒฌ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„ ํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•œ ๋งŒํผ ์ œ์•ˆ์— ๋Œ€ํ•œ ์ง„์ •ํ•œ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

go์˜ ํ•ต์‹ฌ ์›์น™ ์ค‘ ํ•˜๋‚˜์ธ ์ž˜ ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ๋Š” ์ง๊ต ๊ฐœ๋…์„ ๊ธฐ์–ตํ•ฉ์‹œ๋‹ค. ์ด ์ œ์•ˆ์€ go์˜ ์ง๊ต ๊ฐœ๋…(์ง€์—ฐ, ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜ ๋“ฑ)์„ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์š” ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
go ์‚ฌ์šฉ์ž๋Š” if err != nil { return err } ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋…„๊ฐ„ ๋ณดํŽธ์ ์œผ๋กœ ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. Go ์‚ฌ์šฉ์ž ์„ค๋ฌธ์กฐ์‚ฌ๋Š” ์ด๊ฒƒ์ด ์‹ค์ œ ๋ฌธ์ œ์ž„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ฐ”๋‘‘ ํŒ€์€ ์ด๊ฒƒ์ด ์‹ค์ œ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œ์ˆ˜์˜ ํฐ ์†Œ๋ฆฌ๊ฐ€ ๋ฐ”๋‘‘ํŒ€์˜ ์ž…์žฅ์„ ๋„ˆ๋ฌด ์น˜์šฐ์น˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์•„ ๋‹คํ–‰์ด๋‹ค.

์•”์‹œ์  goto if err != nil๋กœ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋ฐฉํ–ฅ์ด๋ผ๊ณ  ํŒ๋‹จํ•˜๋ฉด "์‹œ๋„ ํ•˜๋‹ค ๋ฆฌํ„ด"์„ "์‹œ๋„ ํ•˜๋‹ค ๊ณ ํ† "๋กœ ๊ฐœ์กฐํ•˜๊ธฐ ํž˜๋“ค๊นŒ์š”,
goto๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋ฅผ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์ •์˜ํ–ˆ๋‹ค๋ฉด?

@ugorji๋‹˜, ๋ฉ”๋ชจํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์•”์‹œ์  goto if err != nil๋กœ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋ฐฉํ–ฅ์ด๋ผ๊ณ  ํŒ๋‹จํ•˜๋ฉด "์‹œ๋„ ํ•˜๋‹ค ๋ฆฌํ„ด"์„ "์‹œ๋„ ํ•˜๋‹ค ๊ณ ํ† "๋กœ ๊ฐœ์กฐํ•˜๊ธฐ ํž˜๋“ค๊นŒ์š”,
goto๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋ฅผ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์ •์˜ํ–ˆ๋‹ค๋ฉด?

๋„ค, ๋งž์Šต๋‹ˆ๋‹ค. #26058์— ๋Œ€ํ•œ ํ† ๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ์ƒ๊ฐ์— 'try-goto'์—๋Š” ์ ์–ด๋„ ์„ธ ๋ฒˆ์˜ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
(1) ํ• ๋‹น๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์— ์‘๋‹ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
(2) ์–ด๋–ค ์‹œ๋„๊ฐ€ ์‹คํŒจํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์Šคํƒ ์ •๋ณด๋ฅผ ์žƒ๊ฒŒ ๋˜๋ฉฐ, ๋ฐ˜๋Œ€๋กœ return+defer ์ผ€์ด์Šค์—์„œ ์—ฌ์ „ํžˆ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(3) ๋ˆ„๊ตฌ๋‚˜ goto์—์„œ ๋ฏธ์›Œํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, try ์ด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
try ๋ฅผ ํ•œ ๋ฒˆ ์ถ”๊ฐ€ํ•ด ๋ณด์•˜๋Š”๋ฐ ๋งˆ์Œ์— ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
ํŒจ์น˜ - https://github.com/asheglov/go/pull/1
Reddit ์ฃผ์ œ - https://www.reddit.com/r/golang/comments/6vt3el/the_try_keyword_proofofconcept/

@griesemer

https://github.com/golang/go/issues/32825#issuecomment -507120860์—์„œ ๊ณ„์† ...

try ์˜ ๋‚จ์šฉ์ด ์ฝ”๋“œ ๊ฒ€ํ† , ์‹ฌ์‚ฌ ๋ฐ/๋˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ํ‘œ์ค€์— ์˜ํ•ด ์™„ํ™”๋  ๊ฒƒ์ด๋ผ๋Š” ์ „์ œ์™€ ํ•จ๊ป˜ try ์˜ ์œ ์—ฐ์„ฑ์„ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ์–ธ์–ด ๋ณ€๊ฒฝ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ง€ํ˜œ๋กญ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ˆ˜๋™ ๋‹ค์ด๋ ‰ํŠธ ๋ฐ ์ž๋™ ๋‹ค์ด๋ ‰ํŠธ ๋ชจ๋“œ๊ฐ€ ์ ํ•ฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

wrap := func(err error) error {
  return fmt.Errorf("failed to process %s: %v", filename, err)
}

f, err := os.Open(filename)
if err != nil {
    return nil, wrap(err)
}
defer f.Close()

info, err := f.Stat()
if err != nil {
    return nil, wrap(err)
}
// in errors, named better, and optimized
WrapfFunc := func(format string, args ...interface{}) func(error) error {
  return func(err error) error {
    if err == nil {
      return nil
    }
    s := fmt.Sprintf(format, args...)
    return errors.Errorf(s+": %w", err)
  }
}

```๊ฐ€๋‹ค
wrap := errors.WrapfFunc("%s ์ฒ˜๋ฆฌ ์‹คํŒจ", ํŒŒ์ผ ์ด๋ฆ„)

f, err := os.Open(ํŒŒ์ผ ์ด๋ฆ„)
์‹œ๋„(๋žฉ(์˜ค๋ฅ˜))
f.Close() ์—ฐ๊ธฐ

์ •๋ณด, ์˜ค๋ฅ˜ := f.Stat()
์‹œ๋„(๋žฉ(์˜ค๋ฅ˜))

Manual Pass-through, and Automatic Pass-through modes are also simple enough to be agreeable (despite often being a code smell):
```go
f, err := os.Open(filename)
if err != nil {
    return nil, err
}
defer f.Close()

info, err := f.Stat()
if err != nil {
    return nil, err
}
f := try(os.Open(filename))
defer f.Close()

info := try(f.Stat())

๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜๋™ ๊ฐ„์ ‘ ๋ฐ ์ž๋™ ๊ฐ„์ ‘ ๋ชจ๋“œ๋Š” ๋ชจ๋‘ ๋ฏธ๋ฌ˜ํ•œ ์‹ค์ˆ˜์˜ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋ถˆ์พŒํ•ฉ๋‹ˆ๋‹ค.

defer errd.Wrap(&err, "failed to do X for %s", filename)

var f *os.File
f, err = os.Open(filename)
if err != nil {
    return
}
defer f.Close()

var info os.FileInfo
info, err = f.Stat()
if err != nil {
    return
}
defer errd.Wrap(&err, "failed to do X for %s", filename)

f := try(os.Open(filename))
defer f.Close()

info := try(f.Stat())

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

Try๋Š” ๊ทธ ์ €์ฃผ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๊ฐ€ ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

info := try(try(os.Open(filename)).Stat())

ํŒŒ์ผ ๋ˆ„์ถœ.

try ๋ฌธ์€ ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋ณด๋„ˆ์Šค๋กœ ๋” ์ž˜ ๋ณด์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@sirkon try ๋Š” ํŠน๋ณ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ์–ธ์–ด๋Š” ์ค‘์ฒฉ๋œ try ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. try ๊ฐ€ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋ณด์ด๋”๋ผ๋„ ๋ง์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด try ์˜ ์œ ์ผํ•œ ์žฅ์• ๋ฌผ์ด๋ผ๋ฉด ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( go vet ๋˜๋Š” ์–ธ์–ด ์ œํ•œ). ์ด๊ฒƒ์—์„œ ๊ณ„์† ์ง„ํ–‰ํ•ฉ์‹œ๋‹ค - ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ๊ทธ๊ฒƒ์„ ๋งŽ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

์—ฌ๊ธฐ์„œ ๋„˜์–ด๊ฐ€์ž - ์šฐ๋ฆฌ๋Š” ์ „์—๋„ ๋งŽ์ด ๋“ค์—ˆ์–ด

โ€œ์ด๊ฑด ๋„ˆ๋ฌด ์ง€๋ฃจํ•ด, ์ด์ฏค์—์„œ ๋„˜์–ด๊ฐ€์žโ€

๋˜ ๋‹ค๋ฅธ ์ข‹์€ ์•„๋‚ ๋กœ๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

- ๋‹น์‹ ์˜ ์ด๋ก ์€ ์‚ฌ์‹ค๊ณผ ๋ชจ์ˆœ๋ฉ๋‹ˆ๋‹ค!
- ์‚ฌ์‹ค์ด ๋” ๋‚˜์˜๋‹ค!

ํ—ค๊ฒ”

๋‚˜๋Š” ๋‹น์‹ ์ด ์‹ค์ œ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ถ”์•…ํ•œ ๋ฐฉ๋ฒ•.

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

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

์—ฌ๊ธฐ์„œ ๋…ผ์Ÿ์ด ๊ณ„์†๋˜๋Š” ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ๋ฐ˜๋ณต ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

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

๊ฐ์‚ฌ ํ•ด์š”.

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

์ด ๊ธ€์„ ์“ฐ๋Š” ์‹œ์ ์—์„œ "๋‚ด๋ฒ„๋ ค ๋‘์„ธ์š”" ์Šค๋ ˆ๋“œ๋Š” ์ฐฌ์„ฑ 1322, ๋ฐ˜๋Œ€ 158์ž…๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๋Š” 158 ์œ„, 255 ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์ด ์Šค๋ ˆ๋“œ์˜ ์ง์ ‘์ ์ธ ๋์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฌธ์ œ๋ฅผ ๊ณ„์† ํ‘ธ์‹œํ•ด์•ผ ํ•˜๋Š” ๋งค์šฐ ์ข‹์€ ์ด์œ ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์š”๊ตฌํ•˜๋Š” ๋ฐ”๋ฅผ ํ•ญ์ƒ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋™์‹œ์— ์ •ํ™•ํ•œ ์‹œ๊ฐ„์— ์ œํ’ˆ์„ ํŒŒ๊ดดํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ตœ์†Œํ•œ ์ด ํŠน์ • ์ œ์•ˆ์€ ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

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

์ถ”์‹ : ์ œ๋„ค๋ฆญ์ด ์ œ์•ˆ๋˜๋ฉด ์–ด๋–ค ๋ฐ˜๋Œ€๊ฐ€ ์ผ์–ด๋‚ ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ํšŒ์‚ฌ์—๋Š” ์•ฝ 12๊ฐœ์˜ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด tryhard ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ–ˆ๊ณ  933๊ฐœ์˜ ์ž ์žฌ์ ์ธ try() ํ›„๋ณด๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ try() ํ•จ์ˆ˜๋Š” ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ์ƒ์šฉ๊ตฌ ๋ฌธ์ œ ์ด์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›Œ๋ฅญํ•œ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ์ถœ์ž์™€ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜/๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์ ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๋งˆ์ง€๋ง‰ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

var file= try(parse())

func parse()(err, result) {
}

์˜ค๋ฅ˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ๋ฐฉํ•ดํ•˜๋Š” err!=nil err==nil ํŒจํ„ด์„ ๋Š์Šจํ•˜๊ฒŒ ํ—ˆ์šฉํ•˜๋Š” ๋Œ€์‹  ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‹œํ–‰ํ•˜์—ฌ IMO์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ์˜ ์œ„ํ—˜์„ ๋†’์ž…๋‹ˆ๋‹ค.

func Foo() (err error) {
    var file, ferr = os.Open("file1.txt")
    if ferr == nil {
               defer file.Close()
        var parsed, perr = parseFile(file)
        if perr != nil {
            return
        }
        fmt.Printf("%s", parsed)
    }
    return nil
}

try()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ผ๊ด€๋˜๋ฉฐ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

func Foo() (err error) {
    var file = try(os.Open("file.txt"))
        defer file.Close()
    var parsed = try(parseFile(file))
    fmt.Printf(parsed)
    return
}

@lpar ๊ฐ€ Heroku์˜ ๋ชจ๋“  ์•„์นด์ด๋ธŒ๋˜์ง€ ์•Š์€ Go ๋ฆฌํฌ์ง€ํ† ๋ฆฌ(๊ณต๊ฐœ ๋ฐ ๋น„๊ณต๊ฐœ)์—์„œ ์ˆ˜ํ–‰ํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜์„ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋Š” ์ด ์š”์ง€์— ์žˆ์Šต๋‹ˆ๋‹ค: https://gist.github.com/freeformz/55abbe5da61a28ab94dbb662bfc7f763

cc @davecheney

@ubikenobi ๋‹น์‹ ์˜ ๋” ์•ˆ์ „ํ•œ ๊ธฐ๋Šฅ์€ ~is~๊ฐ€ ์ƒˆ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์˜ค๋ฅ˜ ํ›„์— ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•จ์ˆ˜๊ฐ€ ์˜ค๋ฅ˜์— ๊ด€ํ•œ ๋ชจ๋“  ๊ฒƒ์ด๊ณ  ๋ฐ˜ํ™˜๋œ ๋‹ค๋ฅธ ๊ฐ’์ด ์˜ค๋ฅ˜ ์ž์ฒด์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(์ด์ „ ๊ฐ’์„ "๋ณดํ˜ธ"ํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Œ) ๊ทธ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ผ๋ฐ˜์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ err == nil ๋Š” ์ผ๋ถ€ ์กฐ๊ธฐ ์ˆ˜์ต์— ๋Œ€ํ•œ ํ•ฉ๋ฒ•์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@๋ฐ์ด๋น„๋“œ

๋ˆ„์ˆ˜์— ๋Œ€ํ•ด ์ง€์ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์˜ˆ์ œ ๋ชจ๋‘์— defer.Close()๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. (์ง€๊ธˆ ์—…๋ฐ์ดํŠธ๋จ).

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

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

  • 4๋ช…์˜ ๋‹ค๋ฅธ ์—”์ง€๋‹ˆ์–ด๋กœ ๊ตฌ์„ฑ๋œ ํŒ€๊ณผ ํ•จ๊ป˜ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€๊ทœ๋ชจ Go API์— ๋Œ€ํ•ด tryhard ๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. 45580์ค„์˜ Go ์ฝ”๋“œ์—์„œ tryhard ๋Š” ๋‹ค์‹œ ์“ธ 301๊ฐœ์˜ ์˜ค๋ฅ˜๋ฅผ ์‹๋ณ„ํ–ˆ๊ฑฐ๋‚˜(๋”ฐ๋ผ์„œ +301/-903 ๋ณ€๊ฒฝ์ด ๋จ) ๊ฐ ์˜ค๋ฅ˜๊ฐ€ ์•ฝ 3์ค„์ด ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ์ฝ”๋“œ์˜ ์•ฝ 2%๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์ค‘์š”ํ•˜๊ฒŒ ๋Š๊ปด์ง€๋Š” ์ฃผ์„, ๊ณต๋ฐฑ, ๊ฐ€์ ธ์˜ค๊ธฐ ๋“ฑ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚˜๋Š” try ๊ฐ€ ๋‚ด ์ž‘์—…์„ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”์‹œํ‚ฌ์ง€ ํƒ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด tryhard์˜ ๋ผ์ธ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ ์ฃผ๊ด€์ ์œผ๋กœ ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋งค์šฐ ๋ฉ‹์ง€๊ฒŒ ํ˜๋Ÿฌ๊ฐ‘๋‹ˆ๋‹ค! ๋™์‚ฌ try ๋Š” ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ๋ญ”๊ฐ€ ์ž˜๋ชป๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋Š๊ปด์ง€๊ณ  ์ด๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” if err != nil ๋ฅผ ์“ฐ๋Š” ๋ฐ ๋งค์šฐ ์ต์ˆ™ํ•˜๋ฉฐ, ๋ณ„๋กœ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์ง€๋งŒ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ์—๋„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์ด์ „์˜ ๋นˆ ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ฒƒ(์ฆ‰, ๋นˆ ์Šฌ๋ผ์ด์Šค/๋งต/๋ณ€์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ)์€ err ์ž์ฒด๋ณด๋‹ค ๋” ์ง€๋ฃจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ํ† ๋ก ์˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ธฐ๋Š” ์กฐ๊ธˆ ์–ด๋ ต์ง€๋งŒ ์ด๊ฒƒ์ด ์˜ค๋ฅ˜ ๋ž˜ํ•‘์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. try(json.Unmarshal(b, &accountBalance), "failed to decode bank account info for user %s", user) ์™€ ๊ฐ™์€ ์ปจํ…์ŠคํŠธ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ try ๊ฐ€ ๊ฐ€๋ณ€์ ์ด๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŽธ์ง‘: ์ด ์ง€์ ์€ ์•„๋งˆ๋„ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚ฌ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ๋„ํ•˜์ง€ ์•Š์€ ์žฌ์ž‘์„ฑ์„ ๋ณด๋ฉด ์ด๊ฒƒ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
  • ๋‚˜๋Š” ์ด๊ฒƒ์— ํˆฌ์ž…๋˜๋Š” ์ƒ๊ฐ๊ณผ ๋ฐฐ๋ ค์— ์ •๋ง๋กœ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ๊ณผ ์•ˆ์ •์„ฑ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์ •๋ง ์ค‘์š”ํ•˜๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€ Go 2์˜ ๋…ธ๋ ฅ์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์ •๋ง ์ˆœ์กฐ๋กœ์› ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

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

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

@kingishb ๋ฐœ๊ฒฌ๋œ _try_ ์ŠคํŒŸ ์ค‘ ๊ธฐ๋ณธ์ด ์•„๋‹Œ ํŒจํ‚ค์ง€์˜ ๊ณต๊ฐœ ๊ธฐ๋Šฅ์— ๋ช‡ ๊ฐœ ์žˆ์Šต๋‹ˆ๊นŒ? ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณต์šฉ ํ•จ์ˆ˜๋Š” ํŒจํ‚ค์ง€ ๊ณ ์œ (์˜ˆ: ๋ž˜ํ•‘ ๋˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํŠธ) ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค....

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

ํ˜„์žฌ ๋ฉ”ํŠธ๋ฆญ์—์„œ ๋งŽ์€ ์˜คํƒ์ง€๊ฐ€ ํ†ต๊ณผํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ์•ˆ๋œ ๊ด€ํ–‰(https://blog.golang.org/errors-are-values)์„ ๋”ฐ๋ฅด๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ˆ„๋ฝ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? try ๋Š” ๊ทธ๋Ÿฌํ•œ ๊ด€ํ–‰์˜ ์‚ฌ์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ ๊ต์ฒด์˜ ์ฃผ์š” ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค(์•„๋งˆ๋„ ์ •๋ง ํฅ๋ฏธ๋กœ์šด ์œ ์ผํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ๋‹ค์‹œ, ์ด๊ฒƒ์€ ๋” ๋งŽ์€ ์‹ค์‚ฌ ์—†์ด ๊ธฐ์กด ์†Œ์Šค๋ฅผ ๊ธ๋Š” ๊ฒƒ์€ ๋ฌด์˜๋ฏธํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ด ์ฃผ์‹  @ubikenobi , @freeformz ๋ฐ @kingishb ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ œ์ณ๋‘๊ณ , -err="" ์˜ต์…˜๊ณผ ํ•จ๊ป˜ tryhard ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜ ๋ณ€์ˆ˜๊ฐ€ err ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ฝ”๋“œ(์˜ˆ: e ). ์ด๊ฒƒ์€ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์— ๋”ฐ๋ผ ๋ช‡ ๊ฐ€์ง€ ๋” ๋งŽ์€ ๊ฒฝ์šฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ๋˜ํ•œ ์˜คํƒ ๊ฐ€๋Šฅ์„ฑ๋„ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ).

๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ @griesemer . ๋‘ ๊ฐœ์˜ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์— ๋Œ€ํ•ด tryhard ๋ฅผ ์‹คํ–‰ํ–ˆ์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

ํด๋ก v 1.82 / ํŠธ๋ผ์ดํ•˜๋“œ
13280 Go ์ฝ”๋“œ ๋ผ์ธ / ์‹œ๋„๋ฅผ ์œ„ํ•ด ์‹๋ณ„๋œ 148(1%)

๋‹ค๋ฅธ ์„œ๋น„์Šค:
9768 Go ์ฝ”๋“œ ๋ผ์ธ/์‹œ๋„์šฉ์œผ๋กœ ์‹๋ณ„๋œ 50๊ฐœ(0.5%)

๊ทธ ํ›„ tryhard ๋Š” ๋‹ค์–‘ํ•œ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ์„ธํŠธ๋ฅผ ๊ฒ€์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

314343 Go ์ฝ”๋“œ ๋ผ์ธ / ์‹œ๋„์šฉ์œผ๋กœ ์‹๋ณ„๋œ 1563(0.5%)

๋น ๋ฅธ ์ ๊ฒ€์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. try ๊ฐ€ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ‚ค์ง€ ์œ ํ˜•์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ž˜ํ•‘๋œ ์„œ๋น„์Šค์—์„œ ๋ฐ˜ํ™˜๋œ (GRPC) ์˜ค๋ฅ˜๋ฅผ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ์–ด๋Œ‘ํ„ฐ/์„œ๋น„์Šค ๋ž˜ํผ์ž…๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

  • err var๋Š” defer ์— ๋Œ€ํ•ด ์–ธ์ œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๊นŒ? "์•”์‹œ์ ๋ณด๋‹ค ๋ช…์‹œ์ "์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
  • ์šฐ๋ฆฌ๋Š” ๊ฐ„๋‹จํ•œ ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ ์ •ํ™•ํžˆ ํ•œ ๊ณณ์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์˜ค๋ฅ˜๋Š” ์ปจํ…์ŠคํŠธ๋กœ ๋ž˜ํ•‘๋˜์–ด ๋ฌด์—‡์ด ์–ด๋””์„œ ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. defer ๋Š” ๋ณด๊ธฐ ํ‰ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ํž˜๋“  ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • @davecheney ๋Š” ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ์ œ์•ˆ์€ ์ด ๊ฒŒ์‹œ๋ฌผ์˜ ๋ชจ๋“  ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์นจ๋‚ด os.Exit ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ํ™•์ธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ํŒจํ‚ค์ง€(๊ณต๊ธ‰์—…์ฒด ํฌํ•จ)์—์„œ tryhard ๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ์ฝ”๋“œ ์ˆ˜๊ฐ€ 873934 ์—์„œ 851178 ๋กœ ๋–จ์–ด์ง€๋Š” $# 2478 ๋ฅผ ๋ณด๊ณ ํ–ˆ์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋ฒ„๋ž˜ํ•‘(stdlib๊ฐ€ ์Šคํƒ ์ถ”์  ์˜ค๋ฅ˜ ๋ž˜ํ•‘์— ๋Œ€ํ•œ ์ง€์›์ด ์—†์Œ)์œผ๋กœ ์ธํ•œ ๊ฒƒ์ธ์ง€ ๋˜๋Š” ํ•ด๋‹น ์ฝ”๋“œ์˜ ์ƒ๋‹น ๋ถ€๋ถ„์ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๊ด€ํ•œ ๊ฒƒ์ธ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ•ด์„ํ•˜๋Š” ๋ฐฉ๋ฒ•.

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์•„๋Š” ๊ฒƒ์€ ์ด๋ฒˆ ์ฃผ์—๋งŒ if err != nil { return nil } ์™€ ๊ฐ™์€ ๋ณต์‚ฌ ํŒŒ์Šคํƒ€์™€ $#$5 error: cannot process ....file: cannot parse ...file: cannot open ...file #$ ์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์ฐฝํ”ผํ•œ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

\ Go ๊ฐœ๋ฐœ์ž๊ฐ€ ~3000๋ช…์— ๋ถˆ๊ณผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ํ•œ ๋‚˜๋Š” ํˆฌํ‘œ ์ˆ˜์— ๋„ˆ๋ฌด ๋งŽ์€ ๋น„์ค‘์„ ๋‘์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋น„ ์ œ์•ˆ์— ๋Œ€ํ•œ ๋†’์€ ํˆฌํ‘œ์œจ์€ ๋‹จ์ˆœํžˆ ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ HN ๋ฐ Reddit์˜ ์ตœ์ƒ์œ„์— ์˜ฌ๋ž๋‹ค๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. -ํˆฌํ‘œ ์ˆ˜์— ๋Œ€ํ•ด ๋†€๋ž„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์šฐ๋ฆฌ๋Š” ๊ฐ€์žฅ ํฐ(ํ…Œ์ŠคํŠธ๋ฅผ ํฌํ•จํ•œ ยฑ163,000์ค„์˜ ์ฝ”๋“œ) ์„œ๋น„์Šค์—์„œ tryhard -err="" ๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. 566๋ฒˆ์˜ ํ•ญ๋ชฉ์ด ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์ผ๋ถ€๊ฐ€ if err != nil ๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ์ž‘์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ํ›จ์”ฌ ๋” ๋งŽ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค(๋ฐ˜๋ณต ๋ฐฉ์ง€์— ๋Œ€ํ•œ Rob Pike์˜ "์˜ค๋ฅ˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค" ๊ธฐ์‚ฌ๊ฐ€ ๋– ์˜ค๋ฆ„).

@griesemer ์š”์ ์— ์ƒˆ ํŒŒ์ผ ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. -err=""๋กœ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ™•์ธํ•ด๋ณด๋‹ˆ ์•ฝ๊ฐ„์˜ ๋ณ€ํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋„ ์˜ค๋Š˜ ์•„์นจ์— tryhard ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์„œ ์ตœ์‹ ๋ฒ„์ „๋„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

@griesemer ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด tryhard๊ฐ€ ๋” ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

a) ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ˜ธ์ถœ ์‚ฌ์ดํŠธ์˜ ์ˆ˜
b) ๋‹จ์ผ ๋ฌธ if err != nil [&& ...] ํ•ธ๋“ค๋Ÿฌ์˜ ์ˆ˜( on err #32611์— ๋Œ€ํ•œ ํ›„๋ณด)
c) ๋ฌด์—‡์ด๋“  ๋ฐ˜ํ™˜ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ˆ˜( defer #32676์— ๋Œ€ํ•œ ํ›„๋ณด์ž)
d) err ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ˆ˜( try() ํ›„๋ณด)
e) ๊ธฐ๋ณธ์ด ์•„๋‹Œ ํŒจํ‚ค์ง€์˜ ๋‚ด๋ณด๋‚ธ ๊ธฐ๋Šฅ์— ์žˆ๋Š” ํ•ญ๋ชฉ์˜ ์ˆ˜(์˜คํƒ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ)

์ด LoC๋ฅผ return err ์˜ ์ธ์Šคํ„ด์Šค์™€ ๋น„๊ตํ•˜๋ฉด ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. IMO.

@networkimprov ๋™์˜ํ•จ - ์œ ์‚ฌํ•œ ์ œ์•ˆ์ด ์ด์ „์— ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋‚ ์— ์‹œ๊ฐ„์„ ์ฐพ๋„๋ก ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด tryhard๋ฅผ ์‹คํ–‰ํ•œ ํ†ต๊ณ„์ž…๋‹ˆ๋‹ค(์ข…์†์„ฑ์ด ์•„๋‹Œ ์ฝ”๋“œ๋งŒ ํ•ด๋‹น).

์ „์—:

  • 882 .go ํŒŒ์ผ
  • 352434 ์œ„์น˜
  • 329909 ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์œ„์น˜

๋…ธ๋ ฅํ•œ ํ›„:

  • 2701 ๊ต์ฒด(ํ‰๊ท  3.1 ๊ต์ฒด/ํŒŒ์ผ)
  • 345364 loc(-2.0%)
  • 322838 ๋น„์–ด ์žˆ์ง€ ์•Š์€ loc(-2.1%)

ํŽธ์ง‘: ์ด์ œ @griesemer๊ฐ€ ์š”์•ฝ ํ†ต๊ณ„๋ฅผ ํฌํ•จํ•˜๋„๋ก tryhard ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€๊ฐ€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค.

  • if ๋ช…์„ธ์„œ์˜ 39.2%๋Š” if <err> != nil ์ž…๋‹ˆ๋‹ค.
  • ์ด ์ค‘ 69.6%๊ฐ€ try ํ›„๋ณด์ž์ž…๋‹ˆ๋‹ค.

tryhard๊ฐ€ ์ฐพ์€ ๋Œ€์ฒด ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด try ์˜ ์‚ฌ์šฉ์ด ๋งค์šฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ ์œ ํ˜•๊ณผ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์ด ๋ถ„๋ช…ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ tryhard๊ฐ€ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์ง€๋งŒ try๋กœ๋ถ€ํ„ฐ ํฐ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ผ๋ถ€ ์žฅ์†Œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์€ ๊ฐ„๋‹จํ•œ ์œ ์„  ํ”„๋กœํ† ์ฝœ(๋‹จ์ˆœํ•จ/๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ํŽธ์ง‘๋จ)์— ๋”ฐ๋ผ ๋ฉ”์‹œ์ง€๋ฅผ ๋””์ฝ”๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

func (req *Request) Decode(r Reader) error {
    typ, err := readByte(r)
    if err != nil {
        return err
    }
    req.Type = typ
    req.Body, err = readString(r)
    if err != nil {
        return unexpected(err)
    }

    req.ID, err = readID(r)
    if err != nil {
        return unexpected(err)
    }
    n, err := binary.ReadUvarint(r)
    if err != nil {
        return unexpected(err)
    }
    req.SubIDs = make([]ID, n)
    for i := range req.SubIDs {
        req.SubIDs[i], err = readID(r)
        if err != nil {
            return unexpected(err)
        }
    }
    return nil
}

// unexpected turns any io.EOF into an io.ErrUnexpectedEOF.
func unexpected(err error) error {
    if err == io.EOF {
        return io.ErrUnexpectedEOF
    }
    return err
}

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

func (req *Request) Decode(r Reader) (err error) {
    defer func() { err = unexpected(err) }()

    req.Type = try(readByte(r))
    req.Body = try(readString(r))
    req.ID = try(readID(r))

    n := try(binary.ReadUvarint(r))
    req.SubIDs = make([]ID, n)
    for i := range req.SubIDs {
        req.SubIDs[i] = try(readID(r))
    }
    return nil
}

@cespare ํŒํƒ€์Šคํ‹ฑ ๋ฆฌํฌํŠธ!

์™„์ „ํžˆ ์ถ•์†Œ๋œ ์Šค๋‹ˆํŽซ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ์ข‹์ง€๋งŒ ๊ด„ํ˜ธ๋Š” ๋‚ด๊ฐ€ ์˜ˆ์ƒํ•œ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„ ๋‚ด์˜ try ๋Š” ์˜ˆ์ƒํ•œ ๋งŒํผ ๋‚˜์ฉ๋‹ˆ๋‹ค.

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

func (req *Request) Decode(r Reader) (err error) {
    defer func() { err = wrapEOF(err) }()

    req.Type = try readByte(r)
    req.Body = try readString(r)
    req.ID = try readID(r)

    n := try binary.ReadUvarint(r)
    req.SubIDs = make([]ID, n)
    for i := range req.SubIDs {
        req.SubIDs[i], err = readID(r)
        try err
    }
    return nil
}

*๊ณต์ •ํ•˜๊ฒŒ ๋งํ•˜๋ฉด ์ฝ”๋“œ ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๊ทธ๋ƒฅ ์ €๋ ดํ•œ ๋ฆฝ์Šคํ‹ฑ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์ •๋ง ๋‚˜์œ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ์— ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ด์ ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ?

unexpected() ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ฝ”๋“œ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

try ๋Š” ๋” ๋‚˜์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์ง€๋งŒ ๋” ๋‚˜์œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@cespare ๋””์ฝ”๋”๋Š” ๋‚ด๋ถ€์— ์˜ค๋ฅ˜ ์œ ํ˜•์ด ์žˆ๋Š” ๊ตฌ์กฐ์ฒด๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋“  ์ž‘์—… ์ „์— err == nil ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ถ€์šธ ok๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

@makhov "์ •๋ง ๋‚˜์œ ์ฝ”๋“œ"๋ž€ ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

a, b, c, err := someFn()
if err != nil {
  return ..., errors.Wrap(err, ...)
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜๋ฏธ์ ์œผ๋กœ ๋™์ผํ•œ[1] ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

a, b, c, err := someFn()
try(errors.Wrap(err, ...))

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

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

54K LOC๋กœ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ tryhard ๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ 1116๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” diff๋ฅผ ๋ณด์•˜๊ณ , try์—์„œ ํฐ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด if err != nil ์œ ํ˜•์˜ ๊ตฌ์กฐ๋ฅผ ๊ฑฐ์˜ ์™„์ „ํžˆ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋œ ์ปจํ…์ŠคํŠธ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. try ๊ฐ€ ์‹ค์ œ๋กœ ์ฝ”๋“œ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋งŒ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฆ‰, ํ˜„์žฌ ํ˜•์‹์˜ try ๋Š” ๋‹ค์Œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ํƒ€์ดํ•‘ ๊ฐ์†Œ(์•„๋ž˜ "**"๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ฐœ์ƒ๋‹น ์ตœ๋Œ€ 30์ž ๊ฐ์†Œ)
-       **if err := **json.NewEncoder(&buf).Encode(in)**; err != nil {**
-               **return err**
-       **}**
+       try(json.NewEncoder(&buf).Encode(in))

๋‚˜๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

  • ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•
  • ์‹คํ–‰ ๊ฒฝ๋กœ ๋ถ„ํ• ์— ๋Œ€ํ•œ ์‹œ๊ฐ์  ํ ๋ˆ„๋ฝ

์ด ์Šค๋ ˆ๋“œ์˜ ์•ž๋ถ€๋ถ„์—์„œ ์ผ๋“ฏ์ด try ๋กœ ์‚ด ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚ด ์ฝ”๋“œ์—์„œ ์‹œ๋„ํ•ด ๋ณธ ํ›„์—๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์–ธ์–ด์— ์ด๊ฒƒ์„ ๋„์ž…ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด $.02

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

์ƒ๊ฐ๋งŒ ์ข€...

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

์ด์ œ try๊ฐ€ ๊ตฌํ˜„๋˜์—ˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค. ์ด ๊ด€์šฉ๊ตฌ๋Š”
๊ทธ ์‚ฌ์šฉ ์‚ฌ๋ก€? ๊ณ ๋ คํ•˜๋ฉด:

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

๊ทธ๋ž˜์„œ ์•„๋งˆ๋„ ๊ทธ ๊ด€์šฉ๊ตฌ๋Š” try๋กœ ๋Œ€์ฒด๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Em ter, 2019๋…„ 7์›” 2์ผ 18:06, ์•Œ๋ฆผ @github.com escreveu:

@cespare https://github.com/cespare ๋””์ฝ”๋”๋„ ๊ตฌ์กฐ์ฒด๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด๋ถ€์˜ ์˜ค๋ฅ˜ ์œ ํ˜•, err == nil์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ถ€์šธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ์žฅํ™ฉํ•จ์€ ๋‚ด ์ƒ๊ฐ์— ์ข‹์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, try์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ œ์–ด ํ๋ฆ„์ด ๋ณ€๊ฒฝ๋œ ์œ„์น˜์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋ณต๊ตฌ์™€ ์œ ์‚ฌํ•œ ๋‚ด์žฅ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ์ €๋ ดํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด try() ๋Œ€์‹  ๋ณ„๋„์˜ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

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

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

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

@lesrrat ์ด ๋Œ“๊ธ€์—์„œ ๋‚ด ์˜๊ฒฌ์„ ๋งํ•˜์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ "try"๊ฐ€ ์šฐ๋ฆฌ์—๊ฒŒ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๋ฉด if ๋ฌธ์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ† ํฐ์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ if ๋ฌธ์— 200๊ฐœ์˜ ์กฐ๊ฑด์„ ์ž‘์„ฑํ•˜๋ฉด ๋งŽ์€ ์ค„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

if try(foo()) == 1 && try(bar()) == 2 {
  // err
}
n1, err := foo()
if err != nil {
  // err
}
n2, err := bar()
if err != nil {
  // err
}
if n1 == 1 && n2 == 2 {
  // err
}

@mattn ๊ทธ๊ฒŒ โ€‹โ€‹๊ทธ๋ ‡๊ธด ํ•˜์ง€๋งŒ _์ด๋ก ์ ์œผ๋กœ๋Š”_ ๋‹น์‹ ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ์˜ณ์Šต๋‹ˆ๋‹ค. try ๊ฐ€ ๋”ฑ ๋“ค์–ด๋งž๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‹ค์ƒํ™œ์—์„œ ์ตœ์†Œํ•œ _I_๋Š” ๋ฒˆ์—ญ์„ ํ†ตํ•ด _๋‚ด ์ฝ”๋“œ_์—์„œ ์‹œ๋„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ทธ๋Ÿฌํ•œ ๊ตฌ์„ฑ์˜ ๋ฐœ์ƒ์„ ๊ฑฐ์˜ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ œ์ณ๋‘๊ณ , ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋‚ด ์ฝ”๋“œ์—์„œ ๋‹น์‹ ์˜ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์“ธ ๊ฒƒ์ด๋‹ค

n1 := try(foo())
n2 := try(bar())
if n1 == 1 && n2 == 2 {
   return errors.New(`boo`)
}

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ n1/n2/....n(n)s์˜ ์ธ์Šคํ„ด์Šค๋‹น ๊ฑฐ์˜ ๊ฐ™์€ ์–‘์˜ ํƒ€์ดํ•‘์„ ์ ˆ์•ฝํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ‚ค์›Œ๋“œ(๋˜๋Š” ๊ธฐ๋Šฅ)๊ฐ€ ์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ˜ธ์ถœ ์ปจํ…์ŠคํŠธ๊ฐ€ n+1 ๊ฐ’์„ ์˜ˆ์ƒํ•˜๋ฉด ๋ชจ๋‘ ์ด์ „๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ถœ ์ปจํ…์ŠคํŠธ๊ฐ€ n๊ฐœ์˜ ๊ฐ’์„ ์˜ˆ์ƒํ•˜๋ฉด ์‹œ๋„ ๋™์ž‘์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

(์ด๊ฒƒ์€ ๋ชจ๋“  ๋”์ฐํ•œ ํ˜ผ๋ž€์ด ๋ฐœ์ƒํ•˜๋Š” n=1์ธ ๊ฒฝ์šฐ์— ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.)

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

@balasanjay ์˜ˆ, ๋ž˜ํ•‘ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋˜ํ•œ ๋กœ๊น…, ๋‹ค๋ฅธ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋ฐ˜์‘(์˜ˆ: sql.NoRows ? ์˜ค๋ฅ˜ ๋ณ€์ˆ˜๋กœ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?), ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋…์ž์—๊ฒŒ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ์„ ์—ฐ ์งํ›„์— defer f.Close() ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์ด์œ ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ฆ‰์‹œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด ์ œ์•ˆ์ด " ์˜ค๋ฅ˜๋Š” ๊ฐ’ ์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Go๊ฐ€ ์„ค๊ณ„๋œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ œ์•ˆ์€ ๊ทœ์น™์— ์ •๋ฉด์œผ๋กœ ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค.

try(errors.Wrap(err, ...)) ๋Š” ์ด ์ œ์•ˆ๊ณผ ํ˜„์žฌ Go ๋””์ž์ธ ๋ชจ๋‘์™€ ๋ชจ์ˆœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋˜ ๋‹ค๋ฅธ ๋”์ฐํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

@lestrrat์— ๋™์˜ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ foo() ๋ฐ bar()๋Š” ์‹ค์ œ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
SomeFunctionWithGoodName(Parm1, Parms2)

์ œ์•ˆ๋œ @mattn ๊ตฌ๋ฌธ์€ ์‹ค์ œ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

if  try(SomeFunctionWithGoodName(Parm1, Parms2)) == 1 && try(package.SomeOtherFunction(Parm1, Parms2,Parm3))) == 2 {


} 

๊ฐ€๋…์„ฑ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์—‰๋ง์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.
someRetVal, err := SomeFunctionWithGoodName(Parm1, Parms2)
1 ๋˜๋Š” 2์™€ ๊ฐ™์€ const์™€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ž์ฃผ ์‚ฌ์šฉ๋˜๋ฉฐ ๋” ๋‚˜๋น ์ง€์ง€๋Š” ์•Š์ง€๋งŒ ์ด์ค‘ ํ• ๋‹น ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

if  a := try(SomeFunctionWithGoodName(Parm1, Parms2)) && b:= try(package.SomeOtherFunction(Parm1, Parms2,Parm3))) {


} 

๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€("tryhard๊ฐ€ ๋‚˜๋ฅผ ์–ผ๋งˆ๋‚˜ ๋„์™”๋Š”๊ฐ€"):

  1. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์‹คํ–‰ ํŒŒ์ผ ์‚ฌ์ด์— ํฐ ์ฐจ์ด๋ฅผ ๋ณผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ์ด ์ฐจ์ด๋ฅผ ์–ป๋Š”๋‹ค๋ฉด ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ๋‚ด ์ œ์•ˆ์€ ์ฝ”๋“œ์˜ ์ค„์— ์žˆ๋Š” %save๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฝ”๋“œ์˜ ์˜ค๋ฅ˜ ์ˆ˜์™€ ๋ฆฌํŒฉํ„ฐ๋ง๋œ ์ˆ˜๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    (์ด์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ฒฌํ•ด๋Š”
    $find /path/to/repo -name '*.go' -exec cat {} \; | grep "err :=" | wc -l
    )

@makhov

์ด ์ œ์•ˆ์€ "์˜ค๋ฅ˜๋Š” ๊ฐ€์น˜์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.

์„ค๋งˆ. ์˜ค๋ฅ˜๋Š” ์—ฌ์ „ํžˆ ์ด ์ œ์•ˆ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. try() ๋Š” if err != nil { return ...,err } ์˜ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๊ฐ€ ๋˜์–ด ์ œ์–ด ํ๋ฆ„์„ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. error ์œ ํ˜•์€ ์ด๋ฏธ ๋‚ด์žฅ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— "ํŠน๋ณ„"ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์€ error ์œ ํ˜•์„ ๋ณด์™„ํ•˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํŠน๋ณ„ํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.

@ngrilly ๋‹จ์ˆœํ™”? ์–ด๋–ป๊ฒŒ?

func (req *Request) Decode(r Reader) error {
    defer func() { err = unexpected(err) }()

    req.Type = try(readByte(r))
    req.Body = try(readString(r))
    req.ID = try(readID(r))

    n := try(binary.ReadUvarint(r))
    req.SubIDs = make([]ID, n)
    for i := range req.SubIDs {
        req.SubIDs[i] = try(readID(r))
    }
    return nil
}

๋ฃจํ”„ ๋‚ด๋ถ€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜์—ˆ์Œ์„ ์–ด๋–ป๊ฒŒ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? foo ๊ฐ€ ์•„๋‹Œ err var์— ํ• ๋‹น๋œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์ฝ”๋“œ์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์—ผ๋‘์— ๋‘๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๊นŒ?

@daved

๊ด„ํ˜ธ๋Š” ๋‚ด๊ฐ€ ์˜ˆ์ƒํ•œ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค. [...] ํ‚ค์›Œ๋“œ๋Š” ํ›จ์”ฌ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๊ณผ ๋‹ค๋ฅธ ์ ์€ ์•ฝ๊ฐ„ ์ดˆํ˜„์‹ค์ ์ž…๋‹ˆ๋‹ค.

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

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

@makhov

๋‹จ์ˆœํ™”?

ํ™•์ธ. ์˜ฌ๋ฐ”๋ฅธ ๋‹จ์–ด๋Š” "๋‹จ์ถ•"์ž…๋‹ˆ๋‹ค.

try() ๋Š” if err != nil { return ..., err } ํŒจํ„ด์„ ๋‚ด์žฅ try() ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ถœ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ์—์„œ ๋ฐ˜๋ณต ํŒจํ„ด์„ ์‹๋ณ„ํ•˜๊ณ  ์ƒˆ ํ•จ์ˆ˜์—์„œ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๋ฃจํ”„ ๋‚ด๋ถ€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜์—ˆ์Œ์„ ์–ด๋–ป๊ฒŒ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋ฃจํ”„์˜ try() ๋Š” ๋ฃจํ”„ ์™ธ๋ถ€์˜ ๋‚˜๋จธ์ง€ ํ•จ์ˆ˜์—์„œ try() ์™€ ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. readID() ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ•จ์ˆ˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(if ์žฅ์‹ ํ›„).

foo๊ฐ€ ์•„๋‹Œ err var์— ํ• ๋‹น๋œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ฝ”๋“œ ์˜ˆ์ œ์— foo ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค...

@makhov ๋ฐ˜ํ™˜๋œ ์˜ค๋ฅ˜์˜ ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์•„ ์Šค๋‹ˆํŽซ์ด ๋ถˆ์™„์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์ œ์•ˆ์„ ๋น ๋ฅด๊ฒŒ ๋‹ค์‹œ ์ฝ์—ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ์ด๋ฆ„ err ์ด ๊ธฐ๋ณธ ์ด๋ฆ„์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค).

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

func (req *Request) Decode(r Reader) (err error) {
    defer func() { err = unexpected(err) }()

    req.Type = try(readByte(r))
    req.Body = try(readString(r))
    req.ID = try(readID(r))

    n := try(binary.ReadUvarint(r))
    req.SubIDs = make([]ID, n)
    for i := range req.SubIDs {
        req.SubIDs[i] = try(readID(r))
    }
    return nil
}

@pierrec ์•„๋งˆ๋„ recover() ์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ช…๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์—†๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
defer func() {err = unexpected(tryError())}

@makhov ๋” ๋ช…์‹œ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func (req *Request) Decode(r Reader) error {
    req.Type, err := readByte(r)
        try(err) // or add annotation like try(annotate(err, ...))
    req.Body, err := readString(r)
        try(err)
    req.ID, err := readID(r)
        try(err)

    n, err := binary.ReadUvarint(r)
        try(err)
    req.SubIDs = make([]ID, n)
    for i := range req.SubIDs {
        req.SubIDs[i], err := readID(r)
                try(err)
    }
    return nil
}

@pierrec ์ข‹์•„, ๋ฐ”๊ฟ”๋ณด์ž:

func (req *Request) Decode(r Reader) error {
        var errOne, errTwo error
    defer func() { err = unexpected(???) }()

    req.Type = try(readByte(r))
    โ€ฆ
}

@reuse ๊ทธ๋ฆฌ๊ณ  ์™œ ์ด๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๊นŒ?

func (req *Request) Decode(r Reader) error {
    req.Type, err := readByte(r)
        if err != nil { return err }
        โ€ฆ
}

์–ด๋–ค ์ˆœ๊ฐ„์— ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ๊ทธ ์งง์€ ๊ฒƒ์ด ๊ฐ€๋…์„ฑ๋ณด๋‹ค ๋‚ซ๋‹ค๊ณ  ๊ฒฐ์ • ํ–ˆ์Šต๋‹ˆ๊นŒ?

@flibustenet ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ›จ์”ฌ ์ข‹์•„ ๋ณด์ด์ง€๋งŒ ์ด ์ž‘์€ "๊ฐœ์„ "์„ ์œ„ํ•ด ๊นจ์ง„ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ํ•„์š”ํ•œ์ง€ ์•„์ง ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋ฒ„์ „์˜ Go์—์„œ ๋นŒ๋“œ๋ฅผ ์ค‘์ง€ํ•˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋งค์šฐ ์งœ์ฆ์ด ๋‚ฉ๋‹ˆ๋‹ค.

package main

func main() {
    // ...
   try("a", "b")
    // ...
}

func try(a, b string) {
    // ...
}

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

@flibustenet ์˜ˆ, ๊ทธ๊ฒƒ์€ try()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ try๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ด€์šฉ์  ๋ฐฉ๋ฒ•์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@cespare ๋‹น์‹ ์ด ์ž‘์„ฑํ•œ ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ defer์˜ ๋ฐ˜ํ™˜ ๊ฐ’ ์ˆ˜์ •์€ try ์˜ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ์ด๋ฏธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://play.golang.com/p/ZMauFmt9ezJ

(๋ง์”€ํ•˜์‹  ๋‚ด์šฉ์„ ์ œ๊ฐ€ ์ž˜๋ชป ์ดํ•ดํ–ˆ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค)

@jan-g ๊ด€๋ จ https://github.com/golang/go/issues/32437#issuecomment -507961463: ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•”์‹œ์  ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ฌธ์ œ๋Š” ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์— ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ๋ณด์ด์ง€ ์•Š๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ํ™•์ธ๋  ๋•Œ ์šฐ๋ฆฌ๋Š” ์ ˆ๋Œ€์ ์œผ๋กœ ๋ช…์‹œํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋ฌต์‹œ์  ์ ‘๊ทผ์€ ๋˜ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ๋ช…์‹œ์ ์ด๋ผ๋Š” Go์˜ ์ผ๋ฐ˜ ์›์น™์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค.

@griesemer

๋‚ด ํ”„๋กœ์ ํŠธ(https://github.com/komuw/meli) ์ค‘ ํ•˜๋‚˜์—์„œ tryhand ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด ๋ณ€ํ™”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

gobin github.com/griesemer/tryhard
     Installed github.com/griesemer/[email protected] to ~/go/bin/tryhard

```๋ฐฐ์‹œ
~/go/bin/tryhard -err "" -r
0

most of my err handling looks like;
```Go
import "github.com/pkg/errors"

func CreateDockerVolume(volName string) (string, error) {
    volume, err := VolumeCreate(volName)
    if err != nil {
        return "", errors.Wrapf(err, "unable to create docker volume %v", volName)
    }
    return volume.Name, nil
}

@komuw ์šฐ์„  tryhard ํŒŒ์ผ ์ด๋ฆ„์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ ์ธ์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

tryhard -err="" -r .  // <<< note the dot
tryhard -err="" -r filename

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

func CreateDockerVolume(volName string) (string, error) {
    volume, err := VolumeCreate(volName)
    if err != nil {
        return "", errors.Wrapf(err, "unable to create docker volume %v", volName)
    }
    return volume.Name, nil
}

์ด๊ฒƒ์€ ๋‹ค์†Œ ํฅ๋ฏธ๋กœ์šด ์˜ˆ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๋ณผ ๋•Œ ๋‚˜์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ˜์‘์€ ์ด๊ฒƒ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ง๋”๋“ฌ ์˜ค๋ฅ˜ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฌป๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

unable to create docker volume: VolumeName: could not create volume VolumeName: actual problem

๋Œ€๋‹ต์€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด VolumeCreate ํ•จ์ˆ˜(๋‹ค๋ฅธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

func (cli *Client) VolumeCreate(ctx context.Context, options volumetypes.VolumeCreateBody) (types.Volume, error) {
        var volume types.Volume
        resp, err := cli.post(ctx, "/volumes/create", nil, options, nil)
        defer ensureReaderClosed(resp)
        if err != nil {
                return volume, err
        }
        err = json.NewDecoder(resp.body).Decode(&volume)
        return volume, err
}

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

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

@neild
VolumeCreate ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ์žฅ์‹ํ•˜๋”๋ผ๋„ ์žฅ์‹์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์—ฌ์ „ํžˆ CreateDockerVolume ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. VolumeCreate ๋Š” ๋‹ค์–‘ํ•œ ๋‹ค๋ฅธ ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๊ณ  ๋ฌด์–ธ๊ฐ€๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๊ธฐ๋ก๋จ) ๋ฌด์—‡์ด ์‹คํŒจํ–ˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ CreateDockerVolume ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  VolumeCreate ๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์€ APIclient ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค os.Open ๋Š” ํŒŒ์ผ ์ด๋ฆ„, ์˜ค๋ฅ˜ ์ด์œ  ๋“ฑ์„ ์ž˜ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ์ง€๋งŒ
func ReadConfigFile(...
func WriteDataFile(...
๊ธฐํƒ€ - os.Open ํ˜ธ์ถœ์€ ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋ก, ์ถ”์  ๋ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ณด๊ณ  ์‹ถ์€ ์‹ค์ œ ์‹คํŒจ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

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

์ด ์Šค๋ ˆ๋“œ๋ฅผ ํƒˆ์„ ์‹œํ‚ค๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ...

์•„๋งˆ๋„ VolumeCreate ํ•จ์ˆ˜๋Š” ์‹ค์ œ๋กœ ์˜ค๋ฅ˜๋ฅผ ๊พธ๋ฏธ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๊ฒฝ์šฐ์—๋Š”
CreateDockerVolume ํ•จ์ˆ˜
์ถ”๊ฐ€ ์žฅ์‹์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋ฉฐ,

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

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

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

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

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด๋ฏธ ์ด๊ฒƒ์„ ์ƒ๊ฐํ–ˆ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค์–‘ํ•œ ํ† ๋ก ์„ ๊ฑฐ์ณค๊ณ  ๋น„์Šทํ•œ ์ œ์•ˆ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

@jonbodner https://go-review.googlesource.com/c/go/+/182717 ์€ ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๋Œ€ํ•œ ์ข‹์€ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์žŠ์–ด ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด ๋” ์—„๊ฒฉํ•˜๊ฒŒ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@jonbodner https://go-review.googlesource.com/c/go/+/182717 ์€ ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๋Œ€ํ•œ ์ข‹์€ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด:

  1. 1์ค„์€ 4์ค„์„ ๋ณดํŽธ์ ์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค( if ... { return err } ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ 2์ค„).
  2. ๋ฐ˜ํ™˜๋œ ๊ฒฐ๊ณผ์˜ ํ‰๊ฐ€๋Š” ์‹คํŒจ ๊ฒฝ๋กœ์—์„œ๋งŒ ์ตœ์ ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ง€ ์™ธ๊ด€์ƒ์˜ ๋ณ€๊ฒฝ์œผ๋กœ ๋ณด์ด๋Š” ์ด ์•ฝ 6,000๊ฐœ์˜ ๊ต์ฒด: ๊ธฐ์กด ์˜ค๋ฅ˜๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”.)

๋‚ด๊ฐ€ ๋ฉ”์ธํ…Œ์ด๋„ˆ์˜ ์ž๊ฒฉ์œผ๋กœ ๋‚ด ์ž์‹ ์˜ ์ฝ”๋“œ๋กœ ์ด๋Ÿฐ ์ผ์„ ํ•˜๋Š” ๊ฒƒ์„ ๊ท€์ฐฎ๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€? ๊ต์ฒด ๋„๊ตฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” ํ•œ ์•„๋‹™๋‹ˆ๋‹ค. golang/go ์ €์žฅ์†Œ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

PS CL์˜ ํฅ๋ฏธ๋กœ์šด ๋ฉด์ฑ… ์กฐํ•ญ:

... Some transformations may be incorrect due to the limitations of the tool (see https://github.com/griesemer/tryhard)...

xerrors ์™€ ๊ฐ™์ด ํƒ€์‚ฌ ํŒจํ‚ค์ง€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์‹ญ์‹œ์˜ค.

https://github.com/junpayment/gotry

  • ์ œ๊ฐ€ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๋ถ„์˜ ์œ ์Šค์ผ€์ด์Šค์—๋Š” ์งง์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

===

์ œ์ณ๋‘๊ณ , ๋‚ด๊ฐ€ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋‘ ๊ฐ€์ง€ ๊ฑฑ์ •๋˜๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1. ํ–‰์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๊ฒฌ์ด ์žˆ์œผ๋‚˜, defer(๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ) ์ ˆ์— ๋Œ€ํ•œ ๊ณ ๋ ค๋Š” ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์„ธ๋ถ€์ ์ธ ๊ฒฝ์šฐ.

foo, err: = Foo ()
if err! = nil {
  if err.Error () = "AAA" {
    some action for AAA
  } else if err.Error () = "BBB" {
    some action for BBB
  } else if err.Error () = "CCC" {
    some action for CCC
  } else {
    return err
  }
}

์ด๊ฒƒ์„ ๋‹จ์ˆœํžˆ try๋กœ ๋ฐ”๊พธ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

handler: = func (err error) {
  if err.Error () = "AAA" {
    some action for AAA
  } else if err.Error () = "BBB" {
    some action for BBB
  } else if err.Error () = "CCC" {
    some action for CCC
  } else {
    return err
  }
}
foo: = try (Foo (), handler)

2. ์‹ค์ˆ˜๋กœ ์˜ค๋ฅ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋‹ค๋ฅธ ๋‚˜์œ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type Bad struct {}
func (bad * Bad) Error () {
  return "i really do not intend to be an error"
}

@junpayment gotry ํŒจํ‚ค์ง€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค - try ์— ๋Œ€ํ•œ ๋Š๋‚Œ์„ ์•ฝ๊ฐ„ ์–ป๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด์ง€๋งŒ Try ๋ฅผ ๋ชจ๋‘ type-assertํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ์„ฑ๊ฐ€์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. interface{} ์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

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

@jonbodner https://go-review.googlesource.com/c/go/+/182717 ์€ ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๋Œ€ํ•œ ์ข‹์€ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

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

@griesemer

์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ชจ๋“  Try ๊ฒฐ๊ณผ๋ฅผ ์œ ํ˜• ์–ด์„ค์…˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€{} ๋‹ค์†Œ ์„ฑ๊ฐ€์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„ค๊ฐ€ ์˜ณ์•„. ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ˜ธ์ถœ์ž๊ฐ€ ํ˜•์‹์„ ์บ์ŠคํŒ…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ œ๊ฐ€ ์‹ค์ˆ˜๋ฅผ. ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์•„๋‹Œ defer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค๋ช…ํ–ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฃ„์†ก ํ•ด์š”.

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

์˜ค๋ฅ˜๋ฅผ ์ž์„ธํžˆ ๋‹ค๋ฃจ๊ณ ์ž ํ•  ๋•Œ ๊ทธ ์˜ํ–ฅ์€ ๋”์šฑ ๋‘๋“œ๋Ÿฌ์งˆ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ฝ”๋“œ ์ค„ ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋Œ€์‹  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์œ„์น˜๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ œ์•ˆ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ •ํ™•ํžˆ๋Š” ๋“œ๋ฌธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

@beoran Go Corpus(https://github.com/rsc/corpus)์˜ ์ดˆ๊ธฐ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ƒํƒœ์˜ tryhard ๋Š” ๋ง๋ญ‰์น˜์—์„œ ๋ชจ๋“  err != nil ๊ฒ€์‚ฌ์˜ 41.7%๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. "_test.go" ํŒจํ„ด์„ ์ œ์™ธํ•˜๋ฉด ์ด ์ˆ˜์น˜๋Š” 51.1%๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค( tryhard ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์—์„œ๋งŒ ์ž‘๋™ํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ์—์„œ ๋งŽ์€ ๊ฒƒ์„ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค). ์ฃผ์˜ํ•  ์ ์€ ์ด ์ˆซ์ž๋ฅผ ์•ฝ๊ฐ„์˜ ์†Œ๊ธˆ์œผ๋กœ ์ทจํ•˜๋ฉด $ tryhard ์˜ ํ•ดํ‚น๋œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„๋ชจ(์˜ˆ: ์ฝ”๋“œ์—์„œ err != nil ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ„์น˜์˜ ์ˆ˜)๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. tryhard ๊ฐ€ ์ด๋Ÿฌํ•œ ํ†ต๊ณ„ ์ž์ฒด๋ฅผ ๋ณด๊ณ ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

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

// Before.
a, err := foo()
if err != nil {
  return 0, nil, errors.Wrapf(err, "some message %v", b)
}

// After.
a, err := foo()
try(errors.Wrapf(err, "some message %v", b))

์ด๊ฒƒ์€ error.Wrap์—์„œ ์ „๋‹ฌ๋œ ์˜ค๋ฅ˜ ์ธ์ˆ˜๊ฐ€ nil ๋•Œ nil ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋™์ž‘์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. (github.com/pkg/errors๋„ ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๊ณ ์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๋ž˜ํ•‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋‚ด๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ nil ์˜ค๋ฅ˜๋ฅผ ๋ณด์กดํ•˜๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ํŒจํ„ด์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํฌ์ŠคํŠธ- try , ๋‚˜๋Š” ์ƒ์ƒํ•œ๋‹ค). ์ƒˆ๋กœ์šด ์„ธ๋Œ€์˜ ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„๋งˆ๋„ ์ด๋Ÿฌํ•œ ์ „ํŒŒ ๋„์šฐ๋ฏธ์˜ ์ด๋ฆ„์„ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋น„ ํ…Œ์ŠคํŠธ err != nil ์ฒดํฌ ์•„์›ƒ์˜ 50%์— ์ ์šฉ๋œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ํŒจํ„ด์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง„ํ™” ์ „์— ์ œ์•ˆํ•œ ๋Œ€๋กœ Go ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋Ÿฐํƒ€์ž„์ด ๊ณ ์œ ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. .

CreateDockerVolume https://github.com/golang/go/issues/32437#issuecomment -508199875 ์˜ˆ์ œ ์ •๋ณด
๋‚˜๋Š” ์ •ํ™•ํžˆ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์‚ฌ์šฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. lib์—์„œ ๊ฐ ์˜ค๋ฅ˜์˜ ์ปจํ…์ŠคํŠธ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•˜๊ณ  lib๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ try $๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ „์ฒด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด defer ์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•  ๋•Œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๊ฒƒ์„ ๋ชจ๋ฐฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

func MyLib() error {
    return errors.New("Error from my lib")
}
func MyOtherLib() error {
    return errors.New("Error from my otherLib")
}

func Caller(a, b int) error {
    eh := func(err error) error {
        return fmt.Errorf("From Caller with %d and %d i found this error: %v", a, b, err)
    }

    err := MyLib()
    if err != nil {
        return eh(err)
    }

    err = MyOtherLib()
    if err != nil {
        return eh(err)
    }

    return nil
}

try+defer ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›Œ๋ฅญํ•˜๊ณ  ๊ด€์šฉ์ ์œผ๋กœ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

func Caller(a, b int) (err error) {
    defer fmt.Errorf("From Caller with %d and %d i found this error: %v", a, b, &err)

    try(MyLib())
    try(MyOtherLib())

    return nil
}

@griesemer

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

๋‘˜๋Ÿฌ์‹ธ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๋ช…๋ช…๋œ ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ํ•ด๋‹น ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์–ด๋–ค ๊ฐ’์ด๋“  ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์ด๋ฆ„ ์—†๋Š” ๋‹ค๋ฅธ ๊ฒฐ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ํ•ด๋‹นํ•˜๋Š” 0 ๊ฐ’์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค(์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ’์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผ).

์ด๋Š” ์ด ํ”„๋กœ๊ทธ๋žจ์ด https://play.golang.org/p/KenN56iNVg7์—์„œ 0 ๋Œ€์‹  1์„ ์ธ์‡„ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

์ด ๋„ค์ดํ‚ค๋“œ ๋ฆฌํ„ด(non-locality) ์†์„ฑ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ซ์–ดํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ try ๊ฐ€ ํ•ญ์ƒ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ์ธ์ˆ˜์˜ 0 ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ƒ๊ฐ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ(์ „ํ˜€ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ)?

๋ช‡ ๊ฐ€์ง€ ๊ณ ๋ ค ์‚ฌํ•ญ:

์ด๋กœ ์ธํ•ด ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๊ฐ’์˜ ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ๋œ ์ผ๋ถ€ ํŒจํ„ด์ด try ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ถ€๋ถ„ ์“ฐ๊ธฐ ์ƒํ™ฉ์—์„œ๋„ ์ž‘์„ฑ๋œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” io.Writer ๊ตฌํ˜„์˜ ๊ฒฝ์šฐ. ์ฆ‰, try ๋Š” ์–ด์จŒ๋“  ์ด ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์˜ˆ: n += try(wrappedWriter.Write(...)) ๋Š” ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์˜ ๊ฒฝ์šฐ n ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ์ˆซ์ž๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ๊ฐ’๊ณผ ์˜ค๋ฅ˜๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋‹ค์†Œ ๋“œ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” try ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

๋˜ํ•œ ์•Œ๊ณ  ๊ณ„์‹œ๊ฒ ์ง€๋งŒ tryhard ๋Š” ์ด๋ฏธ ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ถ€์ˆ˜์ ์ธ ์ด์ ์œผ๋กœ tryhard ๊ฐ€ ๋” ์ •ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.

@jonbodner https://go-review.googlesource.com/c/go/+/182717 ์€ ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๋Œ€ํ•œ ์ข‹์€ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„ํ•  ๊ฒƒ์ด๋‹ค.

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

๋‚˜๋ฅผ ์œ„ํ•ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•œ ๋‘ ๊ฐ€์ง€ ํŒจํ„ด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๋งˆ์ง€๋ง‰์œผ๋กœ ์ฃผ์˜ํ•  ์ ์€ ์ฝ”๋“œ์˜ ๋ชจ๋“  ์ค„์—์„œ ์˜ค๋ฅ˜๋ฅผ ์žฅ์‹ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋งŽ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋ฅผ ์žฅ์‹ํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•œ ๊ณณ์ด ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ณณ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ํ›Œ๋ฅญํ•œ ์ง€์นจ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋“ค์€ ํ•ญ์ƒ ์˜ค๋ฅ˜๋ฅผ ์žฅ์‹ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ "unable to open file: conf.json" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ์ด ์—ด๋ฆฌ์ง€ ์•Š์„ ๋•Œ๋งˆ๋‹ค ํ•ญ์ƒ ์žฅ์‹ํ•˜๋Š” ๊ฒƒ์€ ๋งŽ์€ ๊ฐ€์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "unable ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์–ป์œผ๋ ค๋ฉด: db ์—ฐ๊ฒฐ์„ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: ์‹œ์Šคํ…œ ํŒŒ์ผ์„ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: conf.json".

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

  • ์˜ค๋ฅ˜๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: "ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์—†์Œ: conf.json").
  • ์ปจํ…์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ์˜ค๋ฅ˜ ํ”„๋ ˆ์ž„์„ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GetUserName --> GetConnection --> LoadSystemFile.
  • ์ปจํ…์ŠคํŠธ์— ์ถ”๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ๋‹ค์†Œ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: MyAppError{error}

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ try ์ œ์•ˆ์˜ ๋ชฉํ‘œ์™€ ๊ทธ๊ฒƒ์ด ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋†’์€ ์ˆ˜์ค€์˜ ๊ฒƒ๋“ค์„ ๊ณ„์† ๊ฐ„๊ณผํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋Š๋ผ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์Šคํƒ์˜ ์ƒ์œ„์—์„œ ์ฒ˜๋ฆฌ๋˜๋„๋ก ์˜ค๋ฅ˜๋ฅผ ์ „ํŒŒํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ธ ๊ฒฝ์šฐ if err != nil { return err }์˜ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด์‹ญ์‹œ์˜ค.
  2. err == nil์ธ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜ ๊ฐ’์˜ ๋‹จ์ˆœํ™”๋œ ์‚ฌ์šฉ ํ—ˆ์šฉ
  3. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์ดํŠธ์—์„œ ๋” ๋งŽ์€ ์˜ค๋ฅ˜ ์žฅ์‹, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋กœ ์ ํ”„, ๋ฐ˜ํ™˜ ์˜๋ฏธ ์ฒด๊ณ„ ๋Œ€์‹  goto ์‚ฌ์šฉ ๋“ฑ์„ ํ—ˆ์šฉํ•˜๋„๋ก ์†”๋ฃจ์…˜์„ ๋‚˜์ค‘์— ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๋…ผ๋ฆฌ๋ฅผ ์–ด์ง€๋Ÿฝํžˆ์ง€ ์•Š๋„๋ก ํ•˜์‹ญ์‹œ์˜ค. ์ฆ‰, ์ผ์ข…์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฝ๊ฐ„ ์˜†์— ๋‘์‹ญ์‹œ์˜ค.

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

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด 2)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ๋˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์ด๊ฒฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ์˜ˆ๋ฅผ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

var u user = try(db.LoadUser(try(strconv.ParseInt(stringId)))

์˜ˆ์™ธ๊ฐ€ ํ‘œ์ค€์ธ Java์—์„œ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

User u = db.LoadUser(Integer.parseInt(stringId)))

์•„๋ฌด๋„ ์ด ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  2์ค„๋กœ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

int id = Integer.parseInt(stringId)
User u = db.LoadUser(id))

try ๋Š” ์ธ๋ผ์ธ์œผ๋กœ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๊ณ  ํ•ญ์ƒ ์ž์ฒด ๋ผ์ธ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ง€์นจ์— ๋”ฐ๋ผ ์—ฌ๊ธฐ์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์˜ค๋Š˜๋‚  ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

var u user
var err error
var id int
id, err = strconv.ParseInt(stringId)
if err != nil {
  return u, errors.Wrap("cannot load userid from string: %s: %v", stringId, err)
}
u, err = db.LoadUser(id)
if err != nil {
  return u, errors.Wrap("cannot load user given user id: %d: %v", id, err)
}
// now work with u

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

๋‚˜๋Š” ๊ณผ๊ฑฐ ์ƒํ™œ์—์„œ ์ž๋ฐ”์—์„œ ์ธก๋ฉด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ž‘์—…ํ–ˆ๋˜ ๊ฒƒ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ณณ์—์„œ ๋ชฉํ‘œ๋Š”

์ด๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(์˜ˆ: ๋กœ๊น…)์˜ ํ•ต์‹ฌ์ด ์•„๋‹Œ ๋™์ž‘์„ ๊ธฐ๋Šฅ์˜ ํ•ต์‹ฌ์ธ ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ํ”„๋กœ๊ทธ๋žจ์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (wikipedia https://en.wikipedia.org/wiki/Aspect-oriented_programming์—์„œ ์ธ์šฉ).
์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ์˜ ์ค‘์‹ฌ์ด ์•„๋‹ˆ๋ผ ์ •ํ™•์„ฑ์˜ ์ค‘์‹ฌ์ž…๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. " ํ•˜์ง€๋งŒ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋งค์šฐ ์ค‘์š” ํ•˜๊ธฐ ๋•Œ๋ฌธ์—" ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์ค‘์‹ฌ์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์–ด์ง€๋Ÿฝํžˆ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์˜†์— ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

์ด๋ฅผ Error Formatter์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ์ด์ œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ํ•˜์ง€ ์•Š์€ ์ฝ๊ธฐ ์–ด๋ ค์šด a: b: c: d: e: underlying error ์Šคํƒ€์ผ ์—†์ด ์˜ค๋ฅ˜ ํ”„๋ ˆ์ž„๊ณผ ์˜ค๋ฅ˜ ์ž์ฒด๋ฅผ ํ’๋ถ€ํ•˜๊ฒŒ ๊ฒ€์‚ฌํ•˜๊ณ  ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋ฉ”์‹œ์ง€ ํ˜•์‹์„ ๋ฉ‹์ง€๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ์ง€์นจ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

๋งˆ์ง€๋ง‰์œผ๋กœ ์œ„์˜ 3)์—์„œ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ •์˜์— ๋”ฐ๋ฅด๋ฉด ํ‚ค์›Œ๋“œ๋Š” ์•ž์œผ๋กœ ์ด๋ฆ„์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ํ˜„์žฅ ์˜ค๋ฅ˜ ์žฅ์‹์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ (๋ฐ˜ํ™˜ ์˜๋ฏธ๋ก  ๋Œ€์‹ ) goto ์˜๋ฏธ๋ก ์„ ์ง€์›ํ•˜๋Š” ํ™•์žฅ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จผ์ € ์ „์ฒด ์†”๋ฃจ์…˜์„ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ‚ค์›Œ๋“œ๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ”๋‘‘ ํŒ€์€ ๋ฐ”๋‘‘ 2๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ๊ฐ€๋Šฅํ•œ ํ•œ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๋ฐํ˜”์Šต๋‹ˆ๋‹ค. try ํ•จ์ˆ˜๋Š” ์ด๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ๋‚˜์ค‘์— ํ™•์žฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฐ„๋‹จํ•œ gofix๋Š” try ํ•จ์ˆ˜๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด 2 ์„ผํŠธ ๋‹ค์‹œ!

19๋…„ 7์›” 4์ผ์— Sanjay Menakuru [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@griesemer

[ ... ]
Twitter์—์„œ ์ง€์ ํ–ˆ๋“ฏ์ด try ๋Š” ์•Œ๋ชธ์ฒ˜๋Ÿผ ํ–‰๋™ํ•ฉ๋‹ˆ๋‹ค.
๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์ด ์•”์‹œ์ ์ธ ๊ฒฝ์šฐ ๋ฐ˜ํ™˜. ๋ฌด์—‡์„ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด
์‹ค์ œ ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
try ์ž์ฒด์— ๋Œ€ํ•œ ํ˜ธ์ถœ์—์„œ ์ƒ๋‹นํ•œ ๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค์ดํ‚ค๋“œ ๋ฆฌํ„ด(non-locality)์˜ ์ด ์†์„ฑ์ด ์ผ๋ฐ˜์ ์œผ๋กœ
์‹ซ์–ด์š”, try ๊ฐ€ ํ•ญ์ƒ 0์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?
์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ์ธ์ˆ˜์˜ ๊ฐ’(์ „ํ˜€ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒฝ์šฐ)?

๋„ค์ดํ‚ค๋“œ ๋ฐ˜ํ™˜์€ ๋ฐ˜ํ™˜ ์ธ์ˆ˜์˜ ์ด๋ฆ„์ด ์ง€์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ
์‹œ๋„๊ฐ€ ๋‹ค๋ฅธ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด defer ๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ „๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ try ํ‚ค์›Œ๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํŒจํ„ด์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด๋ฏธ ์ˆ˜์ž…ํ’ˆ์—์„œ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ:

๋ช…์‹œ์  ์ฒ˜๋ฆฌ

res, err := doSomething()
if err != nil {
    return err
}

๋ช…์‹œ์  ๋ฌด์‹œ

res, _ := doSomething()

์ง€์—ฐ ์ฒ˜๋ฆฌ

try ๊ฐ€ ํ•˜๋ ค๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๋™์ž‘์ž…๋‹ˆ๋‹ค.

res, . := doSomething()

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

@balasanjay (๋ฐ @lootch): ์—ฌ๊ธฐ ์— ์žˆ๋Š” ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๋”ฐ๋ผ ์˜ˆ, https://play.golang.org/p/KenN56iNVg7 ํ”„๋กœ๊ทธ๋žจ์ด 1์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

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

[ํŽธ์ง‘: ์ด ์งˆ๋ฌธ(์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ๊ฒฐ๊ณผ๋ฅผ ์ง€์šธ ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€)์€ try ์ œ์•ˆ์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์ ์ธ return ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ œ์•ˆ๋œ ๋Œ€์•ˆ์€ ๋™์ผํ•œ ์งˆ๋ฌธ์— ๋‹ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.]

n += try(wrappedWriter.Write(...)) ์ž‘๊ฐ€์˜ ์˜ˆ์™€ ๊ด€๋ จํ•˜์—ฌ : ์˜ˆ, ์˜ค๋ฅ˜์˜ ๊ฒฝ์šฐ์—๋„ n ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ try ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค try ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ๊ฒฐ๊ณผ ๊ฐ’์„ 0์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. try ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. try ๋Š” ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๊น”๋”ํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๊ณ  ํ˜ธ์ถœ์ž์˜ ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜). try ๊ตฌํ˜„ ์—์„œ ์ž„์‹œ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ท€ํ•˜์˜ ์˜ˆ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” if ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผ ํ•˜๋ฉฐ ๋ฐ˜ํ™˜๋œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ n ์— ํ†ตํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ๋‚ด๊ฐ€ ๋‹น์‹ ์˜ ๊ฑฑ์ •์„ ์˜คํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@griesemer : ๋‹ค๋ฅธ ๋ฐ˜ํ™˜ ๊ฐ’์„ 0 ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด try ๊ฐ€ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. a) ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ b) ๊ฐ’์ด 0์ด๊ณ  ์‹œ๋„ํ•  ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ง€์ •๋œ ๋Œ€๋กœ try ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ์ด๋ฆ„์˜ ๋ฐ˜ํ™˜ ๊ฐ’ ๊ฐ’์„ ์œ ์ง€ํ•˜๋ฏ€๋กœ try ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด ํ•จ์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋„ค์ดํ‚ค๋“œ ๋ฆฌํ„ด๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ์ด๋ฉฐ(์–ด๋–ค ๊ฐ’์ด ๋ฆฌํ„ด๋˜๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด ์ „์ฒด ํ•จ์ˆ˜๋ฅผ ์Šค์บ”ํ•ด์•ผ ํ•จ) ์•„๋งˆ๋„ https://github.com/golang/go/issues/21291์„ ์ œ์ถœํ•œ ์ด์œ ์˜€์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ ์ด๋ฆ„์ด ์ง€์ •๋œ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์žˆ๋Š” ํฐ ํ•จ์ˆ˜์˜ try ๊ฐ€ ๊ธฐ๋ณธ ๋ฐ˜ํ™˜๊ณผ ๋™์ผํ•œ ๊ธฐ์ค€์œผ๋กœ ๊ถŒ์žฅ๋˜์ง€ ์•Š์•„์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(https://github.com/golang/go/wiki/CodeReviewComments #named-result-parameters). ๋Œ€์‹  ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ์ธ์ˆ˜์˜ 0 ๊ฐ’์„ ํ•ญ์ƒ ๋ฐ˜ํ™˜ํ•˜๋„๋ก try ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ์— ๋ฐ”๋‘‘ ํŒ€์— ๋Œ€ํ•ด ๋‹นํ™ฉ์Šค๋Ÿฝ๊ณ  ๊ธฐ๋ถ„์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. try ๋Š” ํ•ด๊ฒฐํ•˜๋ ค๋Š” ํŠน์ • ๋ฌธ์ œ(์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ์žฅํ™ฉํ•จ)์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

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

ํ•˜๊ธฐ ์‰ฌ์šด ๊ฒฝ์šฐ go ํŒ€์ด try ๋ฅผ ๊ฐ€๋ณ€ ๋‚ด์žฅํ˜•์œผ๋กœ ๋งŒ๋“ค๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

try(outf.Seek(linkstart, 0))
try(io.Copy(outf, exef))

๋œ๋‹ค

try(outf.Seek(linkstart, 0)), io.Copy(outf, exef)))

๋‹ค์Œ์œผ๋กœ ์žฅํ™ฉํ•œ ๊ฒƒ์€ try ์— ๋Œ€ํ•œ ์—ฐ์†์ ์ธ ํ˜ธ์ถœ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@nvictor Go๋Š” ๋น„์ง๊ต์  ๊ธฐ๋Šฅ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ฏธ๋ž˜์— try ๊ฐ€ ์•„๋‹Œ ๋” ๋‚˜์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์†”๋ฃจ์…˜์„ ์•Œ์•„๋‚ธ๋‹ค๋ฉด ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋ณต์žกํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค(ํ˜„์žฌ ์†”๋ฃจ์…˜์€ "์ถฉ๋ถ„ํžˆ ์ข‹์Šต๋‹ˆ๋‹ค").

try ๋ณด๋‹ค ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋งŒ์กฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฒœ์ฒœํžˆ ๊ทธ ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์ถ”๊ฐ€๋˜๋ฉด ํ™”๋ฅผ ๋‚ด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜์œ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹จ์ง€ ์šฐ๋ฆฌ๊ฐ€ ๋” ๋‚˜์€ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋ณด๊ธฐ์—๋Š” ๋ธ”๋ก ์ฝ”๋“œ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด์ œ try ํ•ธ๋“ค err func์ฒ˜๋Ÿผ

์ด ํ† ๋ก (๋ฐ Reddit์˜ ํ† ๋ก )์„ ์ฝ์„ ๋•Œ ํ•ญ์ƒ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๊ฐ™์€ ์ƒ๊ฐ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ try ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ( https://faiface.github.io/post/how-to-use-try/)์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ค‘์š”ํ•œ ๊ฒƒ์„ ๋†“์ณค๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!

@faiface ๋‚˜๋Š” ๋‹น์‹ ์ด ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

if err != nil {
    return resps, err
}

try(err) .

๊ทธ ์™ธ์— - ํ›Œ๋ฅญํ•œ ๊ธฐ์‚ฌ!

@DmitriyMV ์ฐธ! ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜์—ฌ ๊ณ ์ „์ ์ธ if err != nil ์˜ ์˜ˆ๊ฐ€ ์ ์–ด๋„ ํ•˜๋‚˜๋Š” ์žˆ์ง€๋งŒ ์•„์ฃผ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‘ ๊ฐ€์ง€ ์šฐ๋ ค ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์ข€ ๋” ์‚ฌ์†Œํ•˜๊ณ  ๋ฌธ์ฒด์ ์ธ ๋ฌธ์ œ๋Š” ์ด์ œ try(actualThing()) ์— ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๊ฐ€ ๋ž˜ํ•‘๋˜๋Š”์ง€ ์œ ๊ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. try() ๋กœ ๋ž˜ํ•‘๋œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ๋ผ์ธ์„ ๋ณด๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํ•˜๊ฒŒ ๋Š๊ปด์ง„๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ์กฐ์ •์œผ๋กœ ํ•ด๊ฒฐ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

a, b, err := myFunc()
check(err, "calling myFunc on %v and %v", a, b)

check() ๋Š” try() ์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๋™์ž‘์„ ์‚ญ์ œํ•˜๊ณ  ๋Œ€์‹  ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฐ˜ํ™˜์„ ์œ ๋ฐœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด try() ์˜ ๋งŽ์€ ์ด์ ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

  • ๊ทธ๊ฒƒ์€ ๋‚ด์žฅ
  • ๊ทธ๊ฒƒ์€ ์—ฐ๊ธฐํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ์ œ์–ด ํ๋ฆ„ WRT๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ž˜ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ์กด ๊ด€ํ–‰๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • errors.Wrap(err, "context message") ์™€ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ž˜ํ•‘์„ ์œ„ํ•œ ํ˜„์žฌ ์ œ์•ˆ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊นจ๋—ํ•œ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. a, b, err := myFunc() ๋ผ์ธ์— ์ƒ์šฉ๊ตฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • defer fmt.HandleError(&err, "msg") ๋กœ ์˜ค๋ฅ˜๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ถŒ์žฅํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • check ์˜ ์„œ๋ช…์€ ๋ž˜ํ•‘ํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ์ž„์˜์˜ ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฑฐ ์ข‹์€๋ฐ ๋ฐ”๋‘‘ํŒ€์ด ์ด๊ฑฐ ๊ผญ ๊ฐ€์ ธ๊ฐ€์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„์š”. ์ด๊ฒƒ์€ ์‹œ๋„๋ณด๋‹ค ๋” ๋ช…ํ™•ํ•˜๊ฒŒ !!!

@buchanae ์ €๋Š” try ๊ฐ€ ์˜ค๋ฅ˜์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š”๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

ํ˜„ ๋‹จ๊ณ„์—์„œ๋Š” ๊ทธ๋ƒฅ ๋ฒ„๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์ƒ๊ฐํ•ด๋ณด๊ฒ ์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ๊ธ€์„ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์„ #32811์—๋„ ์˜ฌ๋ ธ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์œ ์—ฐ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ผ์ข…์˜ ์ผ๋ฐ˜ C ๋งคํฌ๋กœ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์ด์™€ ๊ฐ™์ด:

define returnIf(err error, desc string, args ...interface{}) {
    if (err != nil) {
        return fmt.Errorf("%s: %s: %+v", desc, err, args)
    }
}

func CopyFile(src, dst string) error {
    r, err := os.Open(src)
    :returnIf(err, "Error opening src", src)
    defer r.Close()

    w, err := os.Create(dst)
    :returnIf(err, "Error Creating dst", dst)
    defer w.Close()

    ...
}

๋ณธ์งˆ์ ์œผ๋กœ returnIf๋Š” ์œ„์—์„œ ์ •์˜ํ•œ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒด/์ธ๋ผ์ธ๋ฉ๋‹ˆ๋‹ค. ์œ ์—ฐ์„ฑ์€ ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์„ ํ•˜๋Š๋ƒ์— ๋‹ฌ๋ ค ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—๋””ํ„ฐ๊ฐ€ ์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์—๋””ํ„ฐ์—์„œ ์ด๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด๊ฒƒ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ์ด์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ •์˜๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋œ ๋งˆ์ˆ ์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฅผ ํ†ตํ•ด ์ž ์žฌ์ ์œผ๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋Š” ํ•œ ์ค„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐœ์ƒํ•œ ์œ„์น˜(์ปจํ…์ŠคํŠธ)์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋˜ํ•œ ๋งคํฌ๋กœ ์•ž์— ์ฝœ๋ก ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์•„๋‹Œ ๋งคํฌ๋กœ์ž„์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@nvictor

๋” ๋‚˜์•„๊ฐ€ go ํŒ€์ด try ๋ฅผ ๊ฐ€๋ณ€ ๋‚ด์žฅํ˜•์œผ๋กœ ๋งŒ๋“ค๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

try(foo(), bar()) foo ์™€ bar ๊ฐ€ ๊ฐ™์€ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด try(foo(), bar())๋Š” ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ• ๊นŒ์š”?

ํ˜„ ๋‹จ๊ณ„์—์„œ๋Š” ๊ทธ๋ƒฅ ๋ฒ„๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์ƒ๊ฐํ•ด๋ณด๊ฒ ์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ๊ธ€์„ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์„ #32811์—๋„ ์˜ฌ๋ ธ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์œ ์—ฐ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ผ์ข…์˜ ์ผ๋ฐ˜ C ๋งคํฌ๋กœ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

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

@jonbodner ํ˜„์žฌ Go์— ์œ„์ƒ์ ์ธ โ€‹โ€‹๋งคํฌ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜์ž๋Š” ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ์ œ์•ˆ๋œ ๊ตฌ๋ฌธ์ด๋‚˜ ์–ด๋–ค ๊ฒƒ๋„ ์—†์ง€๋งŒ ์œ„์ƒ์ ์ธ โ€‹โ€‹๋งคํฌ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์•„์ด๋””์–ด๋Š” _๋ฐ˜๋Œ€_ ๋งŽ์ด ์—†์Šต๋‹ˆ๋‹ค. #32620

@Allenyn , ๋ฐฉ๊ธˆ ์ธ์šฉ ํ•œ @buchanae ์˜ ์ด์ „ ์ œ์•ˆ์— ๋Œ€ํ•ด:

a, b, err := myFunc()
check(err, "calling myFunc on %v and %v", a, b)

ํ† ๋ก ์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ๋ณธ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด fmt ์˜ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ๋‚ด์žฅ ํ•จ์ˆ˜์— ํฌํ•จ๋˜๋Š” ๊ฒƒ์€ ์—ฌ๊ธฐ์—์„œ ์žˆ์„ ๋ฒ•ํ•˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด @josharian ์˜ ์‘๋‹ต ์ฐธ์กฐ).

์ฆ‰, ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด fmt ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๋‚ด์žฅ์œผ๋กœ ์ง์ ‘ ๋Œ์–ด์˜ค๋Š” ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํฌํ•จํ•˜์—ฌ ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋Š” ํ† ๋ก ์˜ ์ฒซ๋‚  ์ •๋„์— @eihigh ๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์œผ๋กœ, ์ด๋Š” @buchanae ์˜ ์ œ์•ˆ๊ณผ ์œ ์‚ฌํ•˜๋ฉฐ try ๋‚ด์žฅ์„ ๋Œ€์‹  ๋‹ค์Œ ์„œ๋ช…์„ ๊ฐ–๋„๋ก ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

func try(error, optional func(error) error)

์ด ๋Œ€์•ˆ try ์€ ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น ์„œ๋ช…์€ ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋‚ด๋ถ€์— ์ค‘์ฒฉ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ค„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” bikeshedding ์ด๋ฆ„์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์ง€๋งŒ try check ์™€ ๊ฐ™์€ ๋Œ€์ฒด ์ด๋ฆ„์œผ๋กœ ๋” ์ž˜ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์  in-place ์ฃผ์„์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์šฐ๋ฏธ๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด ์›ํ•˜๋Š” ๊ฒฝ์šฐ defer ๋Š” ๊ท ์ผํ•œ ์ฃผ์„์— ๋Œ€ํ•œ ์˜ต์…˜์œผ๋กœ ๋‚จ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์ค‘์— #32811( catch ๋‚ด์žฅ) ๋ฐ #32611( $# on err, <statement> ํ—ˆ์šฉ์„ ์œ„ํ•œ on ํ‚ค์›Œ๋“œ)์—์„œ ๊ด€๋ จ ์ œ์•ˆ์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ๋…ผ์˜ํ•˜๊ฑฐ๋‚˜, ์ถ”์ฒœ ๋˜๋Š” ์ถ”์ฒœ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ํ•ด๋‹น ์ œ์•ˆ์— ๊ฐ€๋Šฅํ•œ ์กฐ์ •์„ ์ œ์•ˆํ•˜๊ธฐ์— ์ข‹์€ ์žฅ์†Œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jonbodner ํ˜„์žฌ Go์— ์œ„์ƒ์ ์ธ โ€‹โ€‹๋งคํฌ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜์ž๋Š” ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ์ œ์•ˆ๋œ ๊ตฌ๋ฌธ์ด๋‚˜ ์–ด๋–ค ๊ฒƒ๋„ ์—†์ง€๋งŒ ์œ„์ƒ์ ์ธ โ€‹โ€‹๋งคํฌ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์•„์ด๋””์–ด๋Š” _๋ฐ˜๋Œ€_ ๋งŽ์ด ์—†์Šต๋‹ˆ๋‹ค. #32620

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

@jonbodner ์œ„์ƒ์ ์ธ โ€‹โ€‹๋งคํฌ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋…ผ์Ÿ์ด ๋๋‚  ๊ฒƒ์ด๋ผ๊ณ ๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •๋ฐ˜๋Œ€. ์ผ๋ฐ˜์ ์ธ ๋น„ํŒ์€ try ๊ฐ€ ๋ฐ˜ํ™˜์„ "์ˆจ๊ธด๋‹ค"๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งคํฌ๋กœ์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๊ด€์ ์—์„œ ๋งคํฌ๋กœ๋Š” ์—„๊ฒฉํžˆ ๋‚˜๋น ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Go๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ์œ„์ƒ ๋งคํฌ๋กœ๋ฅผ ํ—ˆ์šฉํ•˜๋”๋ผ๋„ try ๊ฐ€ Universe ๋ธ”๋ก์— ๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ๋‚ด์žฅ ๋งคํฌ๋กœ์—ฌ์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ๋…ผ์Ÿํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. try ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์œ„์ƒ ๋งคํฌ๋กœ์— ํ›จ์”ฌ ๋” ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ์ด ๋…ผ๋ฆฌ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค ;-)

@ngrilly ๋งคํฌ๋กœ๊ฐ€ ๋ˆˆ์— ๋„๊ณ  ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Rust๊ฐ€ ํ•˜๋Š” ๋ฐฉ์‹์€ ๋งคํฌ๋กœ๊ฐ€ ํ•ญ์ƒ ! (์ฆ‰, try!(...) ๋ฐ println!(...) )๋กœ ์ง„ํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ„์ƒ์ ์ธ ๋งคํฌ๋กœ๊ฐ€ ์ฑ„ํƒ๋˜๊ณ  ๋ณด๊ธฐ ์‰ฝ๊ณ  ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ›จ์”ฌ ๋” ์ž˜ ๋งž์„ ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐœ๋ณ„์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ๋ณด๋‹ค ๋ฒ”์šฉ์ ์ธ ์†”๋ฃจ์…˜์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@thepudds func(error) error ์œ ํ˜•์˜ ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค(์ด ๊ฐ€๋Šฅ์„ฑ์€ ์ œ์•ˆ์„œ์—์„œ ๋…ผ์˜๋˜๋ฉฐ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ). ๊ทธ๋Ÿฌ๋‚˜ try ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Go ํŒ€์—์„œ ์ œ์•ˆํ•œ try ๋Š” ์ข€ ๋” ์ผ๋ฐ˜์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

@deanveloper ์˜ˆ, Rust์˜ ๋งคํฌ๋กœ ๋์— ์žˆ๋Š” ! ๋Š” ์˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Go์—์„œ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‚ด๋ณด๋‚ธ ์‹๋ณ„์ž๋ฅผ ์ƒ๊ธฐ์‹œํ‚ต๋‹ˆ๋‹ค :-)

์ปดํŒŒ์ผ ์†๋„๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋„๊ตฌ์™€ ๊ด€๋ จ๋œ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ Go์—์„œ ์œ„์ƒ์ ์ธ โ€‹โ€‹๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค(๋ฆฌํŒฉํ† ๋ง ๋„๊ตฌ๋Š” ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋งคํฌ๋กœ๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•˜์ง€๋งŒ ํ™•์žฅ๋˜์ง€ ์•Š์€ ๋งคํฌ๋กœ๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•จ). . ์–ด๋ ต๋‹ค ๊ทธ ๋™์•ˆ try ์˜ ์ด๋ฆ„์ด try! ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ;-)

๊ฐ„๋‹จํ•œ ์•„์ด๋””์–ด: if/for ๊ตฌ๋ฌธ์˜ ๋ณธ๋ฌธ์— ๋‹จ์ผ ๋ฌธ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์ด ๋ฌธ์ด if ๋˜๋Š” for ์™€ ๊ฐ™์€ ์ค„์— ์žˆ๋Š” ๊ฒฝ์šฐ ์ค‘๊ด„ํ˜ธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

fd, err := os.Open("foo")
if err != nil return err

ํ˜„์žฌ error ์œ ํ˜•์€ ์ผ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ๊ฒƒ์„ ํŠน๋ณ„ํ•œ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. try ๋Š” ๊ทธ๊ฒƒ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ error ๋ฅผ ํŠน๋ณ„ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด /bin/sh ์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ || ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

fd, err := os.Open("foo") || return err

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

๋‚˜๋Š” ์—ฌ๋Ÿฌ๋ถ„ ์ค‘ ์ผ๋ถ€๊ฐ€ ๊ณตํฌ์— ์›€์ธ ๋Ÿฌ๋“œ๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ.

@bakul if err != nil return err ์—์„œ err != nil ํ‘œํ˜„์‹์ด ๋๋‚˜๋Š” ์œ„์น˜์™€ return err ๋ฌธ์ด ์‹œ์ž‘๋˜๋Š” ์œ„์น˜๋ฅผ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ท€ํ•˜์˜ ์•„์ด๋””์–ด๋Š” try ๋กœ ์ œ์•ˆ๋œ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ํฐ ์–ธ์–ด ๋ฌธ๋ฒ•์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์•„์ด๋””์–ด๋Š” Zig ์—์„œ catch |err| return err ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” "๊ณตํฌ์— ๋ฐ˜๋™"ํ•˜์ง€ ์•Š๊ณ  ๋‚˜๋Š” ์™œ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Zig์—๋Š” catch |err| return err ์˜ ๋ฐ”๋กœ ๊ฐ€๊ธฐ์ธ try ํ‚ค์›Œ๋“œ๋„ ์žˆ์œผ๋ฉฐ Go ํŒ€์ด ์—ฌ๊ธฐ์—์„œ ๊ธฐ๋ณธ ์ œ๊ณต ๊ธฐ๋Šฅ์œผ๋กœ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด try ์ด๋ฉด ์ถฉ๋ถ„ํ•˜๊ณ  catch ํ‚ค์›Œ๋“œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ;-)

@ngrilly , ํ˜„์žฌ <expr> <statement> ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด ๋ณ€๊ฒฝ์ด ๋ฌธ๋ฒ•์„ ๋” ๋ชจํ˜ธํ•˜๊ฒŒ ๋งŒ๋“ค์ง€๋Š” ์•Š์ง€๋งŒ ์กฐ๊ธˆ ๋” ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ try ์ œ์•ˆ๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ a) ์—ฌ๊ธฐ์— ๋ฐ˜ํ™˜์ด ๋ช…์‹œ์ ์ž…๋‹ˆ๋‹ค. b) try์—์„œ์™€ ๊ฐ™์ด ์ค‘์ฒฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  c) ์ด๊ฒƒ์€ ์‰˜ ์‚ฌ์šฉ์ž(zig ์‚ฌ์šฉ์ž๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์€ ์ˆ˜)์—๊ฒŒ ์นœ์ˆ™ํ•œ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— catch ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋Œ€์•ˆ์œผ๋กœ ์ œ๊ธฐํ–ˆ์ง€๋งŒ ์†”์งํžˆ ๋งํ•ด์„œ ๋‚˜๋Š” ํ•ต์‹ฌ go ์–ธ์–ด ๋””์ž์ด๋„ˆ๊ฐ€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ์™„๋ฒฝํ•˜๊ฒŒ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

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

$ tryhard $HOME/go/src
...
--- stats ---
  55620 (100.0% of   55620) function declarations
  14936 ( 26.9% of   55620) functions returning an error
 116539 (100.0% of  116539) statements
  27327 ( 23.4% of  116539) if statements
   7636 ( 27.9% of   27327) if <err> != nil statements
    119 (  1.6% of    7636) <err> name is different from "err" (use -l flag to list file positions)
   6037 ( 79.1% of    7636) return ..., <err> blocks in if <err> != nil statements
   1599 ( 20.9% of    7636) more complex error handler in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
     17 (  0.2% of    7636) non-empty else blocks in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
   5907 ( 77.4% of    7636) try candidates (use -l flag to list file positions)

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

$ tryhard .
--- ํ†ต๊ณ„ ---
2930(2930์˜ 100.0%) ํ•จ์ˆ˜ ์„ ์–ธ
1408(2930์˜ 48.1%) ํ•จ์ˆ˜๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•จ
10497(10497์˜ 100.0%) ๋ฌธ
2265(10497์˜ 21.6%) if ๋ฌธ
1383(2265์˜ 61.1%)!= nil ๋ฌธ
0 ( 1383์˜ 0.0%)์ด๋ฆ„์ด "err"๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค(-l ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ
ํŒŒ์ผ ์œ„์น˜ ๋‚˜์—ด)
645(1383์˜ 46.6%) ๋ฐ˜ํ™˜ ...,์ธ ๊ฒฝ์šฐ ์ฐจ๋‹จ!= ์—†์Œ
์ง„์ˆ 
738(1383์˜ 53.4%) ๋” ๋ณต์žกํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ!= ์—†์Œ
์ง„์ˆ ; try ์‚ฌ์šฉ ๋ฐฉ์ง€(-l ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์œ„์น˜ ๋‚˜์—ด)
1(1383์˜ 0.1%) ๋น„์–ด ์žˆ์ง€ ์•Š์€ else ๋ธ”๋ก์€ if!= ์—†์Œ
์ง„์ˆ ; try ์‚ฌ์šฉ ๋ฐฉ์ง€(-l ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์œ„์น˜ ๋‚˜์—ด)
638(1383์˜ 46.1%) ํ›„๋ณด๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค(ํŒŒ์ผ์„ ๋‚˜์—ดํ•˜๋ ค๋ฉด -l ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
์ง์œ„)
$ ์ด๋™ ๋ชจ๋“œ ๊ณต๊ธ‰์—…์ฒด
$ ํŠธ๋ผ์ดํ•˜๋“œ ๋ฒค๋”
--- ํ†ต๊ณ„ ---
37757(37757์˜ 100.0%) ํ•จ์ˆ˜ ์„ ์–ธ
12557(37757์˜ 33.3%) ํ•จ์ˆ˜๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•จ
88919(88919์˜ 100.0%) ๋ฌธ
20143 (88919์˜ 22.7%) if ๋ฌธ
6555(20143์˜ 32.5%)!= nil ๋ฌธ
109(6555์˜ 1.7%)์ด๋ฆ„์ด "err"๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค(-l ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ
ํŒŒ์ผ ์œ„์น˜ ๋‚˜์—ด)
5545(6555์˜ 84.6%) ๋ฐ˜ํ™˜ ...,์ธ ๊ฒฝ์šฐ ์ฐจ๋‹จ!= ์—†์Œ
์ง„์ˆ 
1010(6555์˜ 15.4%) ๋” ๋ณต์žกํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ!= ์—†์Œ
์ง„์ˆ ; try ์‚ฌ์šฉ ๋ฐฉ์ง€(-l ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์œ„์น˜ ๋‚˜์—ด)
12(6555์˜ 0.2%) ๋น„์–ด ์žˆ์ง€ ์•Š์€ else ๋ธ”๋ก์€ if!= ์—†์Œ
์ง„์ˆ ; try ์‚ฌ์šฉ ๋ฐฉ์ง€(-l ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์œ„์น˜ ๋‚˜์—ด)
5427(6555์˜ 82.8%) ํ›„๋ณด๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค(ํŒŒ์ผ์„ ๋‚˜์—ดํ•˜๋ ค๋ฉด -l ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
์ง์œ„)

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

@mirtchovski

$ tryhard .
--- stats ---
   2930 (100.0% of    2930) function declarations
   1408 ( 48.1% of    2930) functions returning an error
  10497 (100.0% of   10497) statements
   2265 ( 21.6% of   10497) if statements
   1383 ( 61.1% of    2265) if <err> != nil statements
      0 (  0.0% of    1383) <err> name is different from "err" (use -l flag to list file positions)
    645 ( 46.6% of    1383) return ..., <err> blocks in if <err> != nil statements
    738 ( 53.4% of    1383) more complex error handler in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
      1 (  0.1% of    1383) non-empty else blocks in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
    638 ( 46.1% of    1383) try candidates (use -l flag to list file
positions)
$ go mod vendor
$ tryhard vendor
--- stats ---
  37757 (100.0% of   37757) function declarations
  12557 ( 33.3% of   37757) functions returning an error
  88919 (100.0% of   88919) statements
  20143 ( 22.7% of   88919) if statements
   6555 ( 32.5% of   20143) if <err> != nil statements
    109 (  1.7% of    6555) <err> name is different from "err" (use -l flag to list file positions)
   5545 ( 84.6% of    6555) return ..., <err> blocks in if <err> != nil statements
   1010 ( 15.4% of    6555) more complex error handler in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
     12 (  0.2% of    6555) non-empty else blocks in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
   5427 ( 82.8% of    6555) try candidates (use -l flag to list file
positions)
$

@av86743 ,

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. "์ด๋ฉ”์ผ ํšŒ์‹ ์€ Markdown์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

tryhard $HOME/go/src
/Users/gri/go/src/cmd/go/testdata/src/badpkg/x.go:1:1: expected 'package', found pkg
/Users/gri/go/src/cmd/go/testdata/src/notest/hello.go:6:1: expected declaration, found Hello
/Users/gri/go/src/cmd/go/testdata/src/syntaxerror/x_test.go:3:11: expected identifier
--- stats ---
  45424 (100.0% of   45424) func declarations
   8346 ( 18.4% of   45424) func declarations returning an error
  71401 (100.0% of   71401) statements
  16666 ( 23.3% of   71401) if statements
   4812 ( 28.9% of   16666) if <err> != nil statements
     86 (  1.8% of    4812) <err> name is different from "err" (-l flag lists details)
   3463 ( 72.0% of    4812) return ..., <err> blocks in if <err> != nil statements
   1349 ( 28.0% of    4812) complex error handler in if <err> != nil statements; cannot use try (-l flag lists details)
     17 (  0.4% of    4812) non-empty else blocks in if <err> != nil statements; cannot use try (-l flag lists details)
   3345 ( 69.5% of    4812) try candidates (-l flag lists details)

์ด์ œ ๋ชจ๋“  if ๋ฌธ์˜ 29%(28.9%)๊ฐ€ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ(์ด์ „๋ณด๋‹ค ์•ฝ๊ฐ„ ๋งŽ์Œ), ๊ทธ ์ค‘ ์•ฝ 70%๊ฐ€ try (์•ฝ๊ฐ„ ์ด์ „๋ณด๋‹ค ์ ์Œ).

https://golang.org/cl/185177 ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰ ๋ณ€๊ฒฝ: src: apply tryhard -err="" -ignore="vendor" -r $GOROOT/src

@griesemer "๋ณต์žกํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ"๋Š” ๊ณ„์‚ฐํ–ˆ์ง€๋งŒ "๋‹จ์ผ ๋ช…๋ น๋ฌธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ"๋Š” ๊ณ„์‚ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ "๋ณต์žกํ•œ" ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋‹จ์ผ ๋ช…๋ น๋ฌธ์ธ ๊ฒฝ์šฐ on err #32611์€ try() -- 2์ค„ ๋Œ€ 3์ค„ x 70%๋งŒํผ ์ƒ์šฉ๊ตฌ ์ ˆ์•ฝ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  on err ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ์ผ๊ด€๋œ ํŒจํ„ด์˜ ์ด์ ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

@nvictor

try ๋Š” ํ•ด๊ฒฐํ•˜๋ ค๋Š” ํŠน์ • ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.
์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ์žฅํ™ฉํ•จ.

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ์žฅํ™ฉํ•จ์€ _๋ฌธ์ œ_๊ฐ€ ์•„๋‹ˆ๋ผ Go์˜ ๊ฐ•์ ์ž…๋‹ˆ๋‹ค.

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

์ž‘์„ฑ ์‹œ์ ์— ๊ท€ํ•˜์˜ _opt -in_์€ ๋ฏธ๋ž˜์˜ ๋‹น์‹ ์„ ํฌํ•จํ•œ ๋ชจ๋“  ๋…์ž์˜ _ํ•„์ˆ˜_์ž…๋‹ˆ๋‹ค.

๋ถ„๋ช…ํ•œ ์žฅ์ 

ํ๋ฆฟํ•œ ์ œ์–ด ํ๋ฆ„์„ '์žฅ์ '์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

try , Java ๋ฐ C++ ๊ตญ์™ธ ๊ฑฐ์ฃผ์ž์˜ ์Šต๊ด€์„ ์œ„ํ•ด ๋ชจ๋“  Gophers๊ฐ€ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ๋งˆ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ ์†Œ์ˆ˜์˜ ๋ช‡ ์ค„์„ ๋‚จ๊ฒจ์„œ ๋ช‡ ๊ณณ์—์„œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค( tryhard ์‹คํ–‰์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด).

๋‚˜๋Š” ๋‚ด ๋ฐฉ์‹์ด ๋” ๋‹จ์ˆœํ•œ oneErr ๋งคํฌ๋กœ ๊ฐ€ ๋” ๋งŽ์€ ์ค„์„ ์“ฐ๋Š” ๋ฐ ์—ฌ์œ ๊ฐ€ ์žˆ๊ณ  ๋Œ€๋‹ค์ˆ˜์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์žฅํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

x, err = fa()
onErr break

r, err := fb(x)
onErr return 0, nil, err

if r, err := fc(x); onErr && triesleft > 0 {
  triesleft--
  continue retry
}

_(์ €๋Š” ' if err!= nil ํ˜ผ์ž ๋‘๊ธฐ' ์บ ํ”„์— ์žˆ์œผ๋ฉฐ ๋” ๋งŽ์€ ์ง•์ง•๊ฑฐ๋ฆผ์„ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์œ„์˜ ๋ฐ˜๋Œ€ ์ œ์•ˆ์ด ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)_

ํŽธ์ง‘ํ•˜๋‹ค:

ํ•˜๊ธฐ ์‰ฌ์šด ๊ฒฝ์šฐ go ํŒ€์ด try ๋ฅผ ๊ฐ€๋ณ€ ๋‚ด์žฅํ˜•์œผ๋กœ ๋งŒ๋“ค๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
try(outf.Seek(linkstart, 0)), io.Copy(outf, exef)))

~์“ฐ๊ธฐ๊ฐ€ ์งง๊ณ  ์ฝ๊ธฐ๊ฐ€ ๊ธธ๋ฉฐ ๋ฏธ๋„๋Ÿฌ์ง€๊ฑฐ๋‚˜ ์˜คํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์œ ์ง€ ๋ณด์ˆ˜ ๋‹จ๊ณ„์—์„œ ๋ฒ—๊ฒจ์ง€๊ณ  ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค.~

๋‚ด๊ฐ€ ํ‹€๋ ธ์–ด. ์‹ค์ œ๋กœ ๊ฐ€๋ณ€ try ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ค„๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ค‘์ฒฉ๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค.

try( outf.Seek(linkstart, 0),
 io.Copy(outf, exef),
)

์ฒซ ๋ฒˆ์งธ ์˜ค๋ฅ˜ ํ›„์— try(โ€ฆ) ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

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

๋‚˜๋Š” Elixir์˜ with statement์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ œ์•ˆํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค: https://www.openmymind.net/Elixirs-With-Statement/

golang์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด

switch a, b, err1 := go_func_01(),
       apple, banana, err2 := go_func_02(),
       fans, dissman, err3 := go_func_03()
{
   normal_func()
else
   err1 -> handle_err1()
   err2 -> handle_err2()
   _ -> handle_other_errs()
}

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ "Go๋Š” ๋” ์ ์€ ๊ธฐ๋Šฅ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค"์™€ "Go์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋” ์ข‹์•„์ง€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋” ์ปค์ง‘๋‹ˆ๋‹ค"์— ๋Œ€ํ•œ ์œ„๋ฐ˜์ž…๋‹ˆ๊นŒ? ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด...

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์˜ˆ์ „ ๋ฐฉ์‹์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งŒ์กฑํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

if err != nil {
    return โ€ฆ, err
}

๊ทธ๋ฆฌ๊ณ  ํ™•์‹คํžˆ try ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค ... ์ด์œ ๋Š” ๋‘ ๊ฐ€์ง€์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์–ธ๋œป๋ณด๊ธฐ์— ์•ˆ์— ๋ฌด์—‡์ด ๋“ค์–ด ์žˆ๋Š”์ง€ ์ถ”์ธกํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. try s๋Š” ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, try( ... try( ... try ( ... ) ... ) ... ) , ์ฝ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

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

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

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

@eric-hawthorne ์„ฑ๋Šฅ ์—ฐ๊ธฐ๋Š” ๋ณ„๋„์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. Try๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์ง€์—ฐ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ง€์—ฐ ์—†์ด ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@fabian-f ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ œ์•ˆ์€ if err != nil ๋ธ”๋ก์˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ๊ฐ ์˜ค๋ฅ˜ ์ธ๋ผ์ธ์— ๋Œ€ํ•ด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ณ„๋„๋กœ ์žฅ์‹ํ•˜๋Š” ์ฝ”๋“œ ๊ต์ฒด๋ฅผ ๊ถŒ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@eric-hawthorne ๋””์ž์ธ ๋ฌธ์„œ ์ธ์šฉ:

Q: ์˜ค๋ฅ˜ ๋ž˜ํ•‘์— defer๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋Š๋ ค์ง€์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

A: ํ˜„์žฌ defer ๋ฌธ์€ ์ผ๋ฐ˜์ ์ธ ์ œ์–ด ํ๋ฆ„์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ์˜ "์ˆ˜๋™" ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ์„ฑ๋Šฅ ๋ฉด์—์„œ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์—ฐ๊ธฐ์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ ์„ฑ๋Šฅ์„ ์•ฝ 30% ํ–ฅ์ƒ์‹œํ‚ฌ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” CL 171758๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์—ฌ๊ธฐ Reddit์— ๋งํฌ๋œ Rust์˜ ํฅ๋ฏธ๋กœ์šด ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ๋ถ€๋ถ„์€ 47:55 ์— ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ฐ€์žฅ ํฐ ๊ณต๊ฐœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์ธ https://github.com/dpinela/mflg ์—์„œ tryhard๋ฅผ ์‹œ๋„ํ–ˆ๊ณ  ๋‹ค์Œ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

--- stats ---
    309 (100.0% of     309) func declarations
     36 ( 11.7% of     309) func declarations returning an error
    305 (100.0% of     305) statements
     73 ( 23.9% of     305) if statements
     29 ( 39.7% of      73) if <err> != nil statements
      0 (  0.0% of      29) <err> name is different from "err"
     19 ( 65.5% of      29) return ..., <err> blocks in if <err> != nil statements
     10 ( 34.5% of      29) complex error handler in if <err> != nil statements; cannot use try
      0 (  0.0% of      29) non-empty else blocks in if <err> != nil statements; cannot use try
     15 ( 51.7% of      29) try candidates

ํ•ด๋‹น ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ๋‚ด๋ถ€ ํŽธ์ง‘๊ธฐ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  I/O๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ try๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ try๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. git diff --stat ๋Š” ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 application.go                  | 42 +++++++++++-------------------------------
 internal/atomicwrite/write.go   | 35 ++++++++++++++---------------------
 internal/clipboard/clipboard.go | 17 +++--------------
 internal/config/config.go       | 15 +++++++--------
 internal/termesc/term.go        |  5 +----
 render.go                       |  8 ++------
 6 files changed, 38 insertions(+), 84 deletions(-)

(์ „์ฒด ์ฐจ์ด์  ์€ ์—ฌ๊ธฐ .)

tryhard๊ฐ€ "๋ณต์žกํ•œ" ๊ฒƒ์œผ๋กœ ๋ณด๊ณ ํ•˜๋Š” 10๊ฐœ์˜ ํ•ธ๋“ค๋Ÿฌ ์ค‘ 5๊ฐœ๋Š” internal/atomicwrite/write.go์—์„œ ๊ฑฐ์ง“ ๋ถ€์ •์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•˜๊ธฐ ์œ„ํ•ด pkg/errors.WithMessage๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ž˜ํ•‘์€ ๊ทธ๋“ค ๋ชจ๋‘์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ๋™์ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— try ๋ฐ deferred ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š”์ด diff (+14, -21 ์ค„)๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

@@ -20,21 +20,20 @@ const (
 // The file is created with mode 0644 if it doesn't already exist; if it does, its permissions will be
 // preserved if possible.
 // If some of the directories on the path don't already exist, they are created with mode 0755.
-func Write(filename string, contentWriter func(io.Writer) error) error {
+func Write(filename string, contentWriter func(io.Writer) error) (err error) {
+       defer func() { err = errors.WithMessage(err, errString(filename)) }()
+
        dir := filepath.Dir(filename)
-       if err := os.MkdirAll(dir, defaultDirPerms); err != nil {
-               return errors.WithMessage(err, errString(filename))
-       }
-       tf, err := ioutil.TempFile(dir, "mflg-atomic-write")
-       if err != nil {
-               return errors.WithMessage(err, errString(filename))
-       }
+       try(os.MkdirAll(dir, defaultDirPerms))
+       tf := try(ioutil.TempFile(dir, "mflg-atomic-write"))
        name := tf.Name()
-       if err = contentWriter(tf); err != nil {
-               os.Remove(name)
-               tf.Close()
-               return errors.WithMessage(err, errString(filename))
-       }
+       defer func() {
+               if err != nil {
+                       tf.Close()
+                       os.Remove(name)
+               }
+       }()
+       try(contentWriter(tf))
        // Keep existing file's permissions, when possible. This may race with a chmod() on the file.
        perms := defaultPerms
        if info, err := os.Stat(filename); err == nil {
@@ -42,14 +41,8 @@ func Write(filename string, contentWriter func(io.Writer) error) error {
        }
        // It's better to save a file with the default TempFile permissions than not save at all, so if this fails we just carry on.
        tf.Chmod(perms)
-       if err = tf.Close(); err != nil {
-               os.Remove(name)
-               return errors.WithMessage(err, errString(filename))
-       }
-       if err = os.Rename(name, filename); err != nil {
-               os.Remove(name)
-               return errors.WithMessage(err, errString(filename))
-       }
+       try(tf.Close())
+       try(os.Rename(name, filename))
        return nil
 }

์˜ค๋ฅ˜์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ง€์—ฐ์„ ์ฃผ๋ชฉํ•˜์„ธ์š”. nil ์˜ค๋ฅ˜์— ๋Œ€ํ•ด nil์„ ๋ฐ˜ํ™˜ํ•˜๋Š” WithMessage ๋•๋ถ„์— ํ•œ ์ค„์— ํŽธ์•ˆํ•˜๊ฒŒ ๋งž์ถœ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ž˜ํผ๋Š” ์ œ์•ˆ์„œ์—์„œ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ๋„ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ "๋ณต์žกํ•œ" ํ•ธ๋“ค๋Ÿฌ ์ค‘ ๋‘ ๊ฐœ๋Š” ReadFrom ๋ฐ WriteTo ๊ตฌํ˜„์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

var line string
line, err = br.ReadString('\n')
b.lines = append(b.lines, line)
if err != nil {
  if err == io.EOF {
    err = nil
  }
  return
}
func (b *Buffer) WriteTo(w io.Writer) (int64, error) {
    var n int64
    for _, line := range b.lines {
        nw, err := w.Write([]byte(line))
        n += int64(nw)
        if err != nil {
            return n, err
        }
    }
    return n, nil
}

์ด๊ฒƒ๋“ค์€ ์‹ค์ œ๋กœ ์‹œ๋„ํ•  ์ˆ˜ ์—†์—ˆ์œผ๋ฏ€๋กœ ๊ทธ๋ƒฅ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

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

n, err := strconv.ParseInt(s[1:], 16, 32)
if err != nil {
    return Color{}, errors.WithMessage(err, fmt.Sprintf("color: parse %q", s))
}

๋งˆ์ง€๋ง‰ ๊ฒƒ์€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋”๋ผ๋„ ํ•ญ์ƒ (0์ด ์•„๋‹Œ) ๊ตฌ์„ฑ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ํ•จ์ˆ˜์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋Š” ํ•˜๋‚˜๋งŒ ์žˆ์—ˆ์œผ๋ฏ€๋กœ ์‹œ๋„์—์„œ ์ „ํ˜€ ๋„์›€์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

-func Load() (*Config, error) {
-       c := Config{
+func Load() (c *Config, err error) {
+       defer func() { err = errors.WithMessage(err, "error loading config file") }()
+
+       c = &Config{
                TabWidth:    4,
                ScrollSpeed: 1,
                Lang:        make(map[string]LangConfig),
        }
-       f, err := basedir.Config.Open(filepath.Join("mflg", "config.toml"))
-       if err != nil {
-               return &c, errors.WithMessage(err, "error loading config file")
-       }
+       f := try(basedir.Config.Open(filepath.Join("mflg", "config.toml")))
        defer f.Close()
-       _, err = toml.DecodeReader(f, &c)
+       _, err = toml.DecodeReader(f, c)
        if c.TextStyle.Comment == (Style{}) {
                c.TextStyle.Comment = Style{Foreground: &color.Color{R: 0, G: 200, B: 0}}
        }
        if c.TextStyle.String == (Style{}) {
                c.TextStyle.String = Style{Foreground: &color.Color{R: 0, G: 0, B: 200}}
        }
-       return &c, errors.WithMessage(err, "error loading config file")
+       return c, err
 }

์‚ฌ์‹ค, ๋ฐ˜ํ™˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์œ ์ง€ํ•˜๋Š” try์˜ ๋™์ž‘์— ์˜์กดํ•˜๋Š” ๊ฒƒ(๋„ค์ดํ‚ค๋“œ ๋ฐ˜ํ™˜๊ณผ ๊ฐ™์€)์€ ์ œ ์ƒ๊ฐ์— ๋”ฐ๋ผํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋” ์–ด๋ ต๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋ฅผ ๋” ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋Š” if err != nil ๋ฅผ ๊ณ ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

TL;DR: try๋Š” ์ด ์ฝ”๋“œ์˜ ์ƒ๋‹นํžˆ ์ž‘์€ ๋น„์œจ(์ค„ ์ˆ˜ ๊ธฐ์ค€)์—์„œ๋งŒ ์œ ์šฉํ•˜์ง€๋งŒ ๋„์›€์ด ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ •๋ง ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

(์—ฌ๊ธฐ์„œ ๋ฉ์ฒญ์ด). ์—ฌ๋Ÿฌ ์ธ์ˆ˜์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด. ์–ด๋•Œ์š”:

package trytest

import "fmt"

func errorInner() (string, error) {
   return "", fmt.Errorf("inner error")
}

func errorOuter() (string, error) {
   tryreturn errorInner()
   return "", nil
}

func errorOuterWithArg() (string, error) {
   var toProcess string
   tryreturn toProcess, _ = errorOuter()
   return toProcess + "", nil
}

func errorOuterWithArgStretch() (bool, string, error) {
   var toProcess string
   tryreturn false, ( toProcess,_ = errorOuterWithArg() )
   return true, toProcess + "", nil
}

์ฆ‰, tryreturn์€ ๋งˆ์ง€๋ง‰์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฐ’์˜ ๋ฐ˜ํ™˜์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
๊ฐ’์ด ์—†์œผ๋ฉด ์‹คํ–‰์ด ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋™์˜ํ•˜๋Š” ์›์น™:
-

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

๋‚ด๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ตฌ๋ฌธ:
-

  • reterr _x_ ๋ฌธ( if err != nil { return _x_ } ๊ตฌ๋ฌธ ์„คํƒ•, ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ž„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ๋ช…๋ช…๋จ)

๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” ํ•˜๋‚˜์˜ ๋ฉ‹์ง„ ์งง๊ณ  ๋ช…ํ™•ํ•œ ์ค„์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func foo() error {
    a, err := bar()
    reterr err

    b, err := baz(a)
    reterr fmt.Errorf("getting the baz of %v: %v", a, err)

    return nil
}

3์ค„ ๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func foo() error {
    a, err := bar()
    if err != nil {
        return err
    }

    b, err := baz()
    if err != nil {
        return fmt.Errorf("getting the baz of %v: %v", a, err)
    }

    return nil
}

๋‚ด๊ฐ€ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋“ค:



    • "์ด๊ฒƒ์€ ์–ธ์–ด๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๋„ˆ๋ฌด ์ž‘์€ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค"

      ๋‚˜๋Š” ๋™์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ Go ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ฒช๋Š” ๊ฐ€์žฅ ํฐ ๋งˆ์ฐฐ์˜ ์›์ธ์„ ์ œ๊ฑฐํ•˜๋Š” ์‚ถ์˜ ์งˆ ๋ณ€ํ™”์ด๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ 4์ค„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

@Qhesz ์‹œ๋„์™€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

func foo() error {
    a, err := bar()
    try(err)

    b, err := baz(a)
    try(wrap(err, "getting the baz of %v", a))

    return nil
}

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

"์‹œ๋„"๋Š” ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ด์ƒํ•œ ๋‹จ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. "try(action())"์€ ์˜์–ด๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๋ฐ˜๋ฉด "try(value)"๋Š” ์‹ค์ œ๋กœ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋‹จ์–ด์˜€๋‹ค๋ฉด ๋” ์ข‹์•˜์„ ํ…๋ฐ.

๋˜ํ•œ try(wrap(...)) ๋Š” wrap(...) ๋จผ์ € ํ‰๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ ์ค‘ ์–ด๋Š ์ •๋„๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ตœ์ ํ™”๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? (๋‹จ์ง€ if err != nil ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜๋ฉด?)

๋˜ํ•œ #32611๋„ ๋ชจํ˜ธํ•˜๊ฒŒ ์œ ์‚ฌํ•œ ์ œ์•ˆ์ด๋ฉฐ, ๋Œ“๊ธ€์—๋Š” ํ•ต์‹ฌ Go ํŒ€๊ณผ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›, ํŠนํžˆ ํ‚ค์›Œ๋“œ์™€ ๊ธฐ๋ณธ ์ œ๊ณต ๊ธฐ๋Šฅ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•œ ๊ณ„๋ชฝ์ ์ธ ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@Qhesz ๋„ค์ด๋ฐ์— ๋Œ€ํ•ด ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. "check(action())" ๋˜๋Š” "check(err)"์ด ์ž˜ ์ฝ๊ธฐ ๋•Œ๋ฌธ์— check ๊ฐ€ ๋” ์ ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@reusee ์›๋ž˜ ์ดˆ์•ˆ ๋””์ž์ธ์ด check ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ์•„์ด๋Ÿฌ๋‹ˆํ•ฉ๋‹ˆ๋‹ค.

19๋…„ 7์›” 6์ผ์— mirtchovski [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

$ tryhard .
--- ํ†ต๊ณ„ ---
2930(2930์˜ 100.0%) ํ•จ์ˆ˜ ์„ ์–ธ
1408(2930์˜ 48.1%) ํ•จ์ˆ˜๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•จ
[ ... ]

์—ฌ๊ธฐ์„œ ์žฅ๋‚œ์ด ์•„๋‹ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋กœ ์˜ค๋ฅ˜"?

๋ฃจ์‹œ์˜ค.

์œ„์˜ ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์ตœ์ข… ์ƒ๊ฐ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹err์ด nil์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰๋˜๋Š” wrap() ๊ตฌ๋ฌธ try(err, wrap("getting the baz of %v: %v", a, err)) ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. try(wrap(err, "getting the baz of %v", a)) ๋Œ€์‹ .

@Qhesz wrap ์˜ ๊ฐ€๋Šฅํ•œ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func wrap(err error, format string, args ...interface{}) error {
    if err == nil {
        return nil
    }
    return fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), err)
}

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ wrap ์ธ๋ผ์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉด wrap #$ ์ ˆ๊ณผ if err != nil ์ ˆ ๊ฐ„์— ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@reusee if err == nil ๋ง์”€ํ•˜์‹  ๊ฒƒ ๊ฐ™์•„์š” ;)

@Qhesz wrap ์˜ ๊ฐ€๋Šฅํ•œ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func wrap(err error, format string, args ...interface{}) error {
  if err == nil {
      return nil
  }
  return fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), err)
}

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ wrap ์ธ๋ผ์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉด wrap #$ ์ ˆ๊ณผ if err != nil ์ ˆ ๊ฐ„์— ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

%w ์ด(๊ฐ€) ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค go verb

(๊ทธ๊ฐ€ %v๋ฅผ ์˜๋ฏธํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค...)

๋”ฐ๋ผ์„œ ํ‚ค์›Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜์ง€๋งŒ ๋‚ด์žฅ์ด ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์„ ํ˜ธ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด ์ œ์•ˆ์— ๋™์˜ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

  • try $๊ฐ€ ์•„๋‹ˆ๋ผ check ์˜€์Šต๋‹ˆ๋‹ค.
  • Go ๋„๊ตฌ์˜ ์ผ๋ถ€๋Š” ๋ช…๋ น๋ฌธ์ฒ˜๋Ÿผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด์— ์˜ํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.) ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด panic() ์™€ ๊ฐ™์€ ํ‘œํ˜„์‹ ๋‚ด์—์„œ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ~ ๋งคํฌ๋กœ์ด๊ณ  ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ํ‘œ์‹œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๊ตฌ๋ณ„๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด Rust๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ check!(...) ์ด์ง€๋งŒ ํŠน์ • ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ๊ฐ•ํ•œ ์˜๊ฒฌ์ด ์—†์Šต๋‹ˆ๋‹ค)~ Changed my mind

๊ทธ๋Ÿฌ๋ฉด ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งŒ๋“œ๋Š” ๋ชจ๋“  ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ์‚ฌ๊ณผ, ๋‚˜๋Š” ์ด์ œ์„œ์•ผ ๋‚ด๊ฐ€ ๋ฐฉ๊ธˆ ๋งํ•œ ๊ฒƒ๊ณผ ๊ฑฐ์˜ ์œ ์‚ฌํ•œ ๊ฐœ์š”๋ฅผ ์œ„์˜ ๋Œ“๊ธ€์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

@deanveloper ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@olekukonko @Qhesz %w๊ฐ€ ํŒ์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค: https://tip.golang.org/pkg/fmt/#Errorf

์ด ์ฃผ์ œ์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ฝ์ง€ ๋ชปํ•œ ์ ์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ๊ฐ€ ๋ณด์ง€ ๋ชปํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Go1์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ฐ€์‹ค ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐœ๋ณ„ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ๋ฐ˜๋ณต์ ์ธ "์ข‹์€" ์ฝ”๋“œ; ๋ฐ "๋‚˜์œ" ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” if-err ๋ธ”๋ก์— ์‹ค์ œ๋กœ ์ผ๋ถ€ ๋…ผ๋ฆฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ try ์Šคํƒ€์ผ ๊ตฌ์„ฑ์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์ถ”๊ฐ€ ๋…ผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง์œผ๋กœ์จ ์ด ์ข‹์€ ๋ฐฉ๋ฒ•์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ์— ์ž˜๋ชป๋œ ์ฝ”๋“œ๋Š” ์ข…์ข… ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์ž…๋‹ˆ๋‹ค.

..., _ := might_error()

์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ

might_error()

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

..., XXX := might_error()

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

๋ฌผ๋ก  ์ด๊ฒƒ์€ returnif handle(err) ์œ ํ˜• ์†”๋ฃจ์…˜์„ ๋ฐฐ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ›Œ๋ฅญํ•˜๊ฒŒ ์ตœ์†Œํ•œ์˜ ๋””์ž์ธ์— ๋Œ€ํ•œ ๊ธฐ์—ฌ์ž๋“ค์— ๋Œ€ํ•œ ์นญ์ฐฌ๊ณผ ํ•จ๊ป˜ ๊ท ํ˜•์„ ์œ„ํ•ด ์‹œ๋„์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๋ฐ”๋‘‘ ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์–ผ๋ฆฌ ์–ด๋‹ตํ„ฐ์˜€์œผ๋ฉฐ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์ฝ”๋“œ๋ฅผ ์ƒ์‚ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” AWS์˜ Serverless ๊ทธ๋ฃน์—์„œ ์ผํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์˜ฌํ•ด ๋ง์— Go ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค๋ฅผ ์ถœ์‹œํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ฒดํฌ์ธ์€ ์ œ๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” C, Perl, Java, Ruby๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ์ •๋ง ์˜ค๋ž˜๋œ ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋ฌธ์ œ๋Š” ๋งค์šฐ ์œ ์šฉํ•œ ํ† ๋ก  ์š”์•ฝ์— ์ด์ „์— ๋‚˜ํƒ€๋‚ฌ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฐ˜๋ณตํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. Go๋Š” ์ž‘๊ณ  ๊ฐ„๋‹จํ•œ ์–ธ์–ด์ด๋ฏ€๋กœ ํƒ€์˜ ์ถ”์ข…์„ ๋ถˆํ—ˆํ•˜๋Š” ๊ฐ€๋…์„ฑ์„ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ํ˜œํƒ์ด ์ •๋ง๋กœ ์งˆ์ ์œผ๋กœ ์ƒ๋‹นํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ๊ทธ๊ฒƒ์— ์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ฐ˜์‚ฌ์ ์œผ๋กœ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋„๋Ÿฌ์šด ๋น„ํƒˆ๊ธธ์€ ์ •์ƒ์— ์˜ค๋ฅด๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋‹ˆ ์ฒซ ๋ฐœ์„ ๋–ผ์ง€ ๋ง™์‹œ๋‹ค.
  2. ๋””๋ฒ„๊น… ์ด‰์ง„์— ๋Œ€ํ•œ ์œ„์˜ ์ฃผ์žฅ์— ์ƒ๋‹นํžˆ ์˜ํ–ฅ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ €์ˆ˜์ค€ ์ธํ”„๋ผ ์ฝ”๋“œ์—์„œ "Do A. Check it working if it works. ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. Do B. ์ž‘๋™ํ–ˆ๋Š”์ง€ ํ™•์ธ... ๋“ฑ" "Check" ์ค„์€ printf ๋˜๋Š” ์ค‘๋‹จ์ ์„ ์ž…๋ ฅํ•˜๋Š” ๊ณณ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋” ๋˜‘๋˜‘ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ฒฐ๊ตญ ์ €๋Š” ๊ทธ ์ค‘๋‹จ์  ๊ด€์šฉ๊ตฌ๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  3. ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ฐ€์ •ํ•˜๋ฉด "try"๋Š” if err != nil { return } ์™€ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ œ ์ƒ๊ฐ์—๋Š”?) ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋ช…๋ช…๋œ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ข‹์•„ํ•˜๊ณ  ์˜ค๋ฅ˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ์ด์ ์„ ๊ณ ๋ คํ•  ๋•Œ ๋ช…๋ช…๋œ err ๋ฐ˜ํ™˜ ๊ฐ’์˜ ๋น„์œจ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์กฐ ์ฆ๊ฐ€; ์‹œ๋„์˜ ์ด์ ์„ ์•ฝํ™”์‹œํ‚ต๋‹ˆ๋‹ค.
  4. ๋‚˜๋Š” ์ฒ˜์Œ์— gofmt๊ฐ€ ์œ„์˜ ์ค„์— ์žˆ๋Š” ๋‹จ์ผ ๋ผ์ด๋„ˆ๋ฅผ ์ถ•๋ณตํ•˜๋„๋ก ํ•˜๋Š” ์ œ์•ˆ์„ ์ข‹์•„ํ–ˆ์ง€๋งŒ, ๊ท ํ˜•์—์„œ IDE๋Š” ์˜์‹ฌํ•  ์—ฌ์ง€ ์—†์ด ์–ด์จŒ๋“  ์ด ๋””์Šคํ”Œ๋ ˆ์ด ๊ด€์šฉ๊ตฌ๋ฅผ ์ฑ„ํƒํ•  ๊ฒƒ์ด๊ณ  ํ•œ ๋ผ์ด๋„ˆ๋Š” debug-here ์ด์ ์„ ํฌ์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  5. "try"๋ฅผ ํฌํ•จํ•˜๋Š” ํ‘œํ˜„์‹ ์ค‘์ฒฉ์˜ ์ผ๋ถ€ ํ˜•ํƒœ๋Š” ์šฐ๋ฆฌ ์ง์—…์˜ ์ปดํ”Œ๋ฆฌ์ผ€์ดํ„ฐ๊ฐ€ Java ์ŠคํŠธ๋ฆผ ๋ฐ ์Šคํ”Œ๋ฆฌํ„ฐ ๋“ฑ๊ณผ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ํ˜ผ๋ž€์„ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๋ฐ”๋‘‘์€ ์šฐ๋ฆฌ ์‚ฌ์ด์˜ ์˜๋ฆฌํ•œ ๊ธฐ์ˆ ์„ ๋ณด์—ฌ์ค„ ๊ธฐํšŒ๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋Š” ๋ฐ ๋‹ค๋ฅธ ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋ณด๋‹ค ๋” ์„ฑ๊ณต์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ํ•œ๋ฒˆ ๋ฉ‹์ง„ ์ œ์•ˆ๊ณผ ๊ฑด์„ค์ ์ธ ํ† ๋ก ์— ๋Œ€ํ•ด ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ถ•ํ•˜์˜ ๋ง์”€์„ ์ „ํ•ฉ๋‹ˆ๋‹ค.

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

try() ๋„์ž…์€ ๊ณ ์ƒํ•˜๊ณ  ๊ฐ€์น˜ ์žˆ๋Š” ์ œ์•ˆ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค(์˜ˆ: if ์˜ 29% - ~40% ๋Š” $ if err != nil ํ™•์ธ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ํ‘œ๋ฉด์ ์œผ๋กœ๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ๋œ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋ฉด ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์ด ํ–ฅ์ƒ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. try() ๋„์ž…์œผ๋กœ ์ธํ•œ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ์•ฝ๊ฐ„์˜ ํŠน์ˆ˜ ์‚ฌ๋ก€์—์„œ ์ธ์ง€ ๋ถ€ํ•˜์˜ ํ˜•ํƒœ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Go์˜ ๊ฐ€์žฅ ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” ๋‹จ์ˆœํ•˜๊ณ  ๋ฌด์–ธ๊ฐ€๋ฅผ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ธ์ง€ ๋ถ€ํ•˜๊ฐ€ โ€‹โ€‹๋งค์šฐ ์ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์–ธ์–ด ์‚ฌ์–‘์ด ํฌ๊ณ  ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” C++์— ๋น„ํ•ด). ์ •์‹ ์  ๋ณต์žก์„ฑ์˜ ์ •๋Ÿ‰์  ๋ฉ”ํŠธ๋ฆญ์„ ๋†’์ด๋Š” ๋Œ€๊ฐ€๋กœ ํ•˜๋‚˜์˜ ์ •๋Ÿ‰์  ๋ฉ”ํŠธ๋ฆญ( if err != nil ์˜ LoC)์„ ์ค„์ด๋Š” ๊ฒƒ์€ ์‚ผํ‚ค๊ธฐ ํž˜๋“  ์•Œ์•ฝ์ž…๋‹ˆ๋‹ค(์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๊ฐ€์žฅ ์†Œ์ค‘ํ•œ ์ž์›์ธ ๋‘๋‡Œ์— ๋Œ€ํ•œ ์ •์‹ ์  ์„ธ๊ธˆ).

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

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

IMNSHO, xerr ๋ฐ ์ œ๋„ค๋ฆญ ์ œ์•ˆ์€ if err != nil ์˜ ์ƒ์šฉ๊ตฌ๋ฅผ ์ •๋ณตํ•˜๊ธฐ ์ „์— 6-12๊ฐœ์›” ๋™์•ˆ ํ”„๋กœ๋•์…˜ ๋‹จ๊ณ„์—์„œ ๋ฒ ์ดํ‚นํ•  ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์€ ๋ณด๋‹ค ํ’๋ถ€ํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ์ƒˆ๋กœ์šด ๊ด€์šฉ์  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์œ„ํ•œ ๊ธธ์„ ์—ด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•œ ๊ด€์šฉ์  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๊ทธ๋•Œ์„œ์•ผ try() ๋˜๋Š” ๊ธฐํƒ€์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ œ๊ฐ€ ์šฐ๋ คํ•˜๋Š” ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. try() ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋ณต์žกํ•˜์ง€ ์•Š์ง€๋งŒ ์ด์ „์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์•˜๋˜ ์ธ์ง€ ์˜ค๋ฒ„ํ—ค๋“œ์ž…๋‹ˆ๋‹ค.
  2. err != nil ๋ฅผ try() ์˜ ๊ฐ€์ •๋œ ๋™์ž‘์œผ๋กœ ๋ฒ ์ดํ‚นํ•จ์œผ๋กœ์จ ์–ธ์–ด๋Š” ์Šคํƒ ์œ„๋กœ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ err ์‚ฌ์šฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฏธํ•™์ ์œผ๋กœ try() ๋Š” ๊ฐ•์ œ์ ์ธ ์˜๋ฆฌํ•จ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ Go ์–ธ์–ด๊ฐ€ ์ฆ๊ธฐ๋Š” ๋ช…์‹œ์ ์ด๊ณ  ๋ช…๋ฐฑํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑ์‹œํ‚ฌ ๋งŒํผ ์˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ๊ด€์ ์ธ ๊ธฐ์ค€์„ ํฌํ•จํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒƒ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๊ฒƒ์€ ๊ฐœ์ธ์ ์ธ ์ทจํ–ฅ๊ณผ ๊ฒฝํ—˜์˜ ๋ฌธ์ œ์ด๋ฉฐ ์ˆ˜๋Ÿ‰ํ™”ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  4. switch / case ๋ช…๋ น๋ฌธ ๋ฐ ์˜ค๋ฅ˜ ๋ž˜ํ•‘์„ ์‚ฌ์šฉํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” ์ด ์ œ์•ˆ์— ์˜ํ•ด ์†๋Œ€์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ๋†“์นœ ๊ธฐํšŒ๋กœ ์ธํ•ด ์ด ์ œ์•ˆ์ด ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๊ฒƒ์„ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ถ€๋„๋Ÿฌ์›Œํ•œ๋‹ค๊ณ  ๋ฏฟ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. -์•Œ๋ ค์ง„ (๋˜๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ ์•Œ๋ ค์ง„-์•Œ ์ˆ˜ ์—†์Œ).

๋งˆ์ง€๋ง‰์œผ๋กœ try() ์ œ์•ˆ์€ ์šฐ๋ฆฌ๊ฐ€ C++๋ฅผ ๋‚จ๊ฒจ๋‘๊ณ  ํƒˆ์ถœํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์–ธ์–ด๋ณ„ ๋‰˜์•™์Šค์˜ ํ™์ˆ˜๋ฅผ ๋ง‰๊ณ  ์žˆ๋˜ ๋Œ์˜ ์ƒˆ๋กœ์šด ๋ŒํŒŒ๊ตฌ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

TL;DR: #nevertry ๋ฐ˜์‘์ด ์•„๋‹ˆ๋ผ "์ง€๊ธˆ์€ ์•„๋‹ˆ๊ณ , ์•„์ง์€ ์•„๋‹ˆ๊ณ , xerr ์™€ ์ œ๋„ค๋ฆญ์ด ์ƒํƒœ๊ณ„์—์„œ ์„ฑ์ˆ™๋œ ํ›„์— ๋‹ค์‹œ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค. "

์œ„์— ๋งํฌ๋œ #32968์€ ์™„์ „ํžˆ ๋ฐ˜๋Œ€ ์ œ์•ˆ์€ ์•„๋‹ˆ์ง€๋งŒ try ๋งคํฌ๋กœ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์œ„ํ—˜ํ•œ ์ค‘์ฒฉ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋‚ด ์˜๊ฒฌ ๋ถˆ์ผ์น˜์— ๊ธฐ๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. #32946๊ณผ ๋‹ฌ๋ฆฌ ์ด๊ฒƒ์€ ์‹ฌ๊ฐํ•œ ์ œ์•ˆ์ด๋ฉฐ ์‹ฌ๊ฐํ•œ ๊ฒฐํ•จ์ด ์—†๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ฐœ์ทŒ:

์„ค๊ณ„ ์ œ์•ฝ(์ถฉ์กฑ)

๋‚ด์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ ํ•œ ์ค„์— ์ค‘์ฒฉ๋˜์ง€ ์•Š์œผ๋ฉฐ 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
  }

๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ฆ๊ธฐ์„ธ์š”!

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

๋‚ด ์ด์œ :

  1. ๋‚˜์™€ ๋‚ด๊ฐ€ Go๋ฅผ ๊ฐ€๋ฅด์นœ ์‚ฌ๋žŒ ์ค‘ ๋ˆ„๊ตฌ๋„ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ _์ ˆ๋Œ€๋กœ_ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ๋‚˜๋Š” ์˜ค๋ฅ˜ ํŠธ๋žฉ์„ ๊ฑด๋„ˆ๋›ฐ์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ(๋‚ด๊ฐ€ ์ง์ ‘ ์ˆ˜ํ–‰) ์—ฌ๋Ÿฌ ์‹œ๋„ ๋ธ”๋ก์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๊ตฌํ˜„์ด ํ๋ ค์ง‘๋‹ˆ๋‹ค.

try ์˜ Go ๊ตฌํ˜„์ด ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๊ตฌํ˜„๊ณผ ๋‹ค๋ฅด๋ฉด ๋” ๋งŽ์€ ํ˜ผ๋ž€์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ œ์•ˆ์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ €์šธ์งˆํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์‚ฌ์–‘์— ๋Œ€ํ•œ ๋‚˜์˜ ๋น„ํŒ์„ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์‚ฌ์–‘์—์„œ ๊ฐ€์žฅ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ go ๋ฌธ์—์„œ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋กœ try๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
...
๋”ฐ๋ผ์„œ defer ๋ฌธ์—์„œ๋„ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋กœ try๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

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

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

์ œ์•ˆ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.

try with signature(์˜์‚ฌ ์ฝ”๋“œ)๋ผ๋Š” ์ƒˆ๋กœ์šด ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

func try(expr) (T1, T2, โ€ฆ Tn)

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

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

  2. ๋˜ํ•œ ์ด ์ œ์•ˆ์€ ์ž์ฒด ํ•จ์ˆ˜ ์„œ๋ช…์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๊ฑฐ๋‚˜ ์ ์–ด๋„ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์„œ๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func try(R1, R2, ... Rn) ((R|T)1, (R|T)2, ... (R|T)(n-1), ?Rn) 
// where T is the return params of the function that try is being called from
// where `R` is a return value from a function, `Rn` must be an error
// try will return the R values if Rn is nil and not return Tn at all
// if Rn is not nil then the T values will be returned as well as Rn at the end 
  1. ์ œ์•ˆ์€ ์ธ์ˆ˜์™€ ํ•จ๊ป˜ try๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ผ์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. try ๊ฐ€ ์ธ์ˆ˜์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?
try(arg1, arg2,..., err)

์ด๊ฒƒ์ด ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์ด์œ ๋Š” try ๊ฐ€ expr ์ธ์ˆ˜๋ฅผ ์ˆ˜๋ฝํ•˜๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜๋Š” ์‹ค์ œ๋กœ ํ•จ์ˆ˜์—์„œ n๊ฐœ์˜ ๋ฐ˜ํ™˜ ์ธ์ˆ˜์™€ ๋‹ค๋ฅธ ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์œผ๋กœ, ์‚ฌ์‹ค์„ ๋” ์ž˜ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์€ ๊ธฐ๋Šฅ์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์˜๋ฏธ๋ก ์  ์ผ๊ด€์„ฑ์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์— ๋Œ€ํ•œ ๋‚˜์˜ ๋งˆ์ง€๋ง‰ ๋ถˆ๋งŒ์€ ๊ทธ๊ฒƒ์ด ๋‚ด์žฅ ํ•จ์ˆ˜์˜ ์˜๋ฏธ๋ก ์  ์˜๋ฏธ๋ฅผ ๋”์šฑ ๊นจ๋œจ๋ ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜๊ฐ€ ๋•Œ๋•Œ๋กœ "์ •์ƒ์ ์ธ" ๊ธฐ๋Šฅ์˜ ์˜๋ฏธ๋ก ์  ๊ทœ์น™(๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€)์—์„œ ๋ฉด์ œ๋  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด์— ๋ฌด๊ด€์‹ฌํ•˜์ง€ ์•Š์ง€๋งŒ, ์ด ์ œ์•ˆ์€ " golang ๋‚ด๋ถ€์˜ ๊ธฐ๋Šฅ์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” "์ •์ƒ" ๊ทœ์น™.

์ด ์ œ์•ˆ์€ try ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฒƒ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ† ํฐ๋„ ์•„๋‹ˆ๊ณ  ๊ธฐ๋Šฅ๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์˜๋ฏธ๋ก ์  ์ผ๊ด€์„ฑ์„ ๋งŒ๋“œ๋Š” ์ธก๋ฉด์—์„œ ์„ค์ •ํ•˜๊ธฐ์—๋Š” ์ข‹์ง€ ์•Š์€ ์„ ๋ก€์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์–ธ์–ด.

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

f, err := os.Open("/dev/stdout")
throw err

์ด๊ฒƒ์€ ์ถ”๊ฐ€ ์ฝ”๋“œ ํ–‰์„ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ œ๊ธฐํ•œ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  try ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด "๋Œ€์ฒด" ํ•จ์ˆ˜ ์„œ๋ช… ๊ฒฐํ•จ์„ ์ œ๊ฑฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

edit1 : defer ๋ฐ go ์˜ ์˜ˆ์™ธ์— ๋Œ€ํ•ด ์ฐธ๊ณ ํ•˜์„ธ์š”. ๋นŒํŠธ์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ฌด์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค try ๊ธฐ๋Šฅ์— ๊ฒฐ๊ณผ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

@nathanjsweet ๋‹น์‹ ์ด ์ฐพ๋Š” ์ œ์•ˆ์€ #32611์ž…๋‹ˆ๋‹ค :-)

@nathanjsweet ๋ง์”€ํ•˜์‹  ๋‚ด์šฉ ์ค‘ ์ผ๋ถ€๋Š” ์‚ฌ์‹ค์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด ์–ธ์–ด๋Š” append cap complex imag len make new real ๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ defer ๋˜๋Š” go ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์–‘ ์ •์˜ ํ•จ์ˆ˜ unsafe.Alignof unsafe.Offsetof unsafe.Sizeof $ ์™€ ํ•จ๊ป˜ defer ๋˜๋Š” go ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ด‘๋ฒ”์œ„ํ•œ ์˜๊ฒฌ์„ ๋ณด๋‚ด ์ฃผ์‹  @nathanjsweet ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. @ianlancetaylor ๋Š” ์ด๋ฏธ ๊ท€ํ•˜์˜ ์ฃผ์žฅ์ด ๊ธฐ์ˆ ์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๋‹ค๊ณ  ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ํ™•์žฅํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1) go ๋ฐ defer ๊ฐ€ ์žˆ๋Š” try ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์‚ฌ์–‘ ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. try ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋‚ด์žฅ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ธ ๊ณณ. ์ด๊ฒƒ์€ ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ฏธ defer append(a, 1) ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ๋ฐ”๋‹ฅ์— ๋–จ์–ด๋œจ๋ฆฌ๋Š” ๋‹ค๋ฅธ ๋นŒํŠธ์ธ์˜ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ด ์ œํ•œ ์‚ฌํ•ญ์€ ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•ด try ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค( try ๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ œ์™ธ). (๋””์ž์ธ ๋ฌธ์„œ์—์„œ ์ด๋Ÿฌํ•œ ์ œํ•œ ์‚ฌํ•ญ์„ ์–ธ๊ธ‰ํ•œ ์ด์œ ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์ฒ ์ €ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์‹ค์ œ๋กœ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋””์ž์ธ ๋ฌธ์„œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ฝ์œผ๋ฉด try ์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. go ๋˜๋Š” defer try ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. - ์ด๋Š” ๋‹จ์ˆœํžˆ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ์„ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ์‹ค์šฉ์ ์ธ ์กฐ์น˜์ž…๋‹ˆ๋‹ค. ์ด๋Š” "ํฐ ์š”์ฒญ"์ž…๋‹ˆ๋‹ค. go ๋ฐ defer ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.)

2) ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ try ์ด "๋ฏธํ•™์ ์œผ๋กœ ์—ญ๊ฒน๋‹ค"๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ๊ธฐ์ˆ ์ ์œผ๋กœ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ œ์•ˆํ•œ ๋‹ค์Œ ์„œ๋ช…์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ๊ทœ์น™์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค. new , make , append , unsafe.Offsetof ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋ชจ๋‘ ์ผ๋ฐ˜ Go ํ•จ์ˆ˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š” ํŠน์ˆ˜ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค. try ์— ๋Œ€ํ•œ ์ธ์ˆ˜์— ํ•„์š”ํ•œ ์ธ์ˆ˜(๊ตฌ์กฐ ํ•„๋“œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค!)์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์š”๊ตฌ์‚ฌํ•ญ์˜ ์ข…๋ฅ˜๊ฐ€ ์ •ํ™•ํžˆ ์žˆ๋Š” unsafe.Offsetof ๋ฅผ ๋ณด์‹ญ์‹œ์˜ค(๋‹จ์ผ ๊ฐ’ ์œ ํ˜•์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. error ๋˜๋Š” error ๋ฅผ ๋งˆ์ง€๋ง‰ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ). ์šฐ๋ฆฌ๋Š” ์‚ฌ์–‘์—์„œ ์ด๋Ÿฌํ•œ ์„œ๋ช…์„ ๊ณต์‹์ ์œผ๋กœ ํ‘œํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‚ด์žฅ ๊ธฐ๋Šฅ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๊ธฐ์กด ํ˜•์‹์— ๋งž์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ๋‚ด์žฅ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  ์šฐ๋ฆฌ๋Š” ๊ทธ๋“ค์˜ ๊ทœ์น™์„ ์‚ฐ๋ฌธ์œผ๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด _์ด์œ _ ์„ค๊ณ„์ƒ ์ฒ˜์Œ๋ถ€ํ„ฐ Go์—์„œ ํƒˆ์ถœ์šฉ ํ•ด์น˜๊ฐ€ _์ธ_ ๋‚ด์žฅ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋””์ž์ธ ๋ฌธ์„œ๋Š” ์ด์— ๋Œ€ํ•ด ๋งค์šฐ ๋ช…์‹œ์ ์ž…๋‹ˆ๋‹ค.

3) ์ œ์•ˆ์€ try ๊ฐ€ ์ธ์ˆ˜(ํ•˜๋‚˜ ์ด์ƒ)์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ผ์— ๋Œ€ํ•ด์„œ๋„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋””์ž์ธ ๋ฌธ์„œ๋Š” try ๊ฐ€ ๋“ค์–ด์˜ค๋Š” ์ธ์ˆ˜ ํ‘œํ˜„์‹์„ (ํ•˜๋‚˜) ๋ฐ›์•„๋“ค์ธ๋‹ค๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ๋ช…์‹œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ฐ์‚ฌ ํ•ด์š”.

@griesemer

๋˜ํ•œ ๋””์ž์ธ ๋ฌธ์„œ๋Š” ์ด์— ๋Œ€ํ•ด ๋งค์šฐ ๋ช…์‹œ์ ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์ง€์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ฝ๊ณ  ๋†€๋ž๋‹ค.

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

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

  1. ์–ด๋–ค ๋ฉด์—์„œ๋Š” ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์Šคํƒ์„ ํ’€์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ์ œ์–ด ํ๋ฆ„ ๋…ผ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค(์˜ˆ panic ๋ฐ os.Exit ).
  2. ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๊ทœ์น™์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋กœ unsafe.Offsetof ์˜ ์˜ˆ๋ฅผ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. , ์ด ๊ฒฝ์šฐ ๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ์š”๊ตฌ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. unsafe.Offsetof ์—๋Š” ํ•˜๋‚˜์˜ ์ธ์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ๋ฐ˜๋ฉด try ์—๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’(์˜ˆ: try(os.Open("/dev/stdout")) )์ฒ˜๋Ÿผ ๋ณด์ด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œํ˜„์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ๋Š” ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(ํ‘œํ˜„์‹์ด try(os.Open("/dev/stdout")...) ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒฝ์šฐ).

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

๋˜ํ•œ ๋””์ž์ธ ๋ฌธ์„œ๋Š” ์ด์— ๋Œ€ํ•ด ๋งค์šฐ ๋ช…์‹œ์ ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์ง€์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ฝ๊ณ  ๋†€๋ž๋‹ค.

์ œ์•ˆ์„œ์˜ "๊ฒฐ๋ก " ์„น์…˜ ์— ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๋†“์นœ ๊ฒƒ์— ๋†€๋ž์Šต๋‹ˆ๋‹ค ;-)

@ngrilly ์ด ์ œ์•ˆ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ go ์–ธ์–ด ์‚ฌ์–‘์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. @griesemer ๊ฐ€ go ์–ธ์–ด ์‚ฌ์–‘์ด ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ๊ตฌ๋ฌธ ๊ทœ์น™์„ ๊นจ๋Š” ๋ฐ ํŠนํžˆ ์œ ์šฉํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

@nathanjsweet

์–ด๋–ค ๋ฉด์—์„œ๋Š” ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์Šคํƒ์„ ํ’€์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ์ œ์–ด ํ๋ฆ„ ๋…ผ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค(panic ๋ฐ os.Exit ์ฒ˜๋Ÿผ)

os.Exit ๊ฐ€ ์œ ์šฉํ•œ ์˜๋ฏธ์—์„œ ์Šคํƒ์„ ํ•ด์ œํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ๋œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. panic ์™€ try ๋ชจ๋‘ ์ง€์—ฐ๋œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์Šคํƒ ์œ„๋กœ ์ด๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— os.Exit ๊ฐ€ ์ด์ƒํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์šฐ๋ฆฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ tryhard ๋ฅผ ์‹คํ–‰ํ–ˆ๊ณ  ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์–ป์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค:

--- stats ---
  15298 (100.0% of   15298) func declarations
   3026 ( 19.8% of   15298) func declarations returning an error
  33941 (100.0% of   33941) statements
   7765 ( 22.9% of   33941) if statements
   3747 ( 48.3% of    7765) if <err> != nil statements
    131 (  3.5% of    3747) <err> name is different from "err"
   1847 ( 49.3% of    3747) return ..., <err> blocks in if <err> != nil statements
   1900 ( 50.7% of    3747) complex error handler in if <err> != nil statements; cannot use try
     19 (  0.5% of    3747) non-empty else blocks in if <err> != nil statements; cannot use try
   1789 ( 47.7% of    3747) try candidates

๋จผ์ € Go(1.13 ์ด์ „)์—๋Š” ์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— error ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ž์ฒด ์˜ค๋ฅ˜ ์œ ํ˜•์„ ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ํ•จ์ˆ˜๋Š” $ ๋Œ€์‹  error foo.Error ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„ ์–ธ๋œ๋‹ค๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. error , ์ด ๋ถ„์„๊ธฐ๊ฐ€ ์ด๋ฅผ ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ์ด ๊ฒฐ๊ณผ๊ฐ€ "๊ณต์ •"ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

'๋„ค! ํ•ด๋ณด์ž'๋ผ๋Š” ์ง„์˜์— ์žˆ์—ˆ๊ณ , 1.13์ด๋‚˜ 1.14 ๋ฒ ํƒ€ ์— ํฅ๋ฏธ๋กœ์šด ์‹คํ—˜์ด ๋  ๊ฒƒ ๊ฐ™์€๋ฐ _" 47.7% ... ํ›„๋ณด๋ฅผ ์‹œ๋„ํ•ด๋ณด์„ธ์š”."_. ๊ทธ๊ฒƒ์€ ์ด์ œ ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์ผ์„ ํ•˜๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํฌ์ธํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•( new(Foo) vs &Foo{} )๊ณผ make([]Foo) ๋ฐ []Foo{} ๋กœ ์Šฌ๋ผ์ด์Šค ๋˜๋Š” ๋งต์„ ๋งŒ๋“œ๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. .

์ด์ œ ์ €๋Š” "์ด๊ฒƒ์„ _์‹œ๋„_ ํ•ด๋ด…์‹œ๋‹ค."์˜ ์บ ํ”„์— ์žˆ์Šต๋‹ˆ๋‹ค.^) ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ์ฝ”๋”ฉ ํŒจํ„ด์„ ๊ฒŒ์œผ๋ฅด๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์ปจํ…์ŠคํŠธ ์ถ”๊ฐ€๋ฅผ ์ค‘๋‹จํ•  ๊ฒƒ์ด์ง€๋งŒ, ์–ด์จŒ๋“  ์˜ค๋Š” xerrors impl์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋” ๋‚˜์€ ์ปจํ…์ŠคํŠธ๋ฅผ ์–ป๋Š”๋‹ค๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋” ๊ตฌ์ฒด์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹  @Goodwine๋‹˜ , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

(์—ฌ๋‹ด์œผ๋กœ ์ €๋Š” ์–ด์ ฏ๋ฐค์— tryhard ๋ฅผ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝํ•˜์—ฌ "๋ณต์žกํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ" ์ˆ˜๋ฅผ ๋ณต์žกํ•œ ์ฒ˜๋ฆฌ๊ธฐ์™€ return ..., expr ํ˜•์‹์˜ ๋ฐ˜ํ™˜์˜ ๋‘ ๊ฐ€์ง€ ๊ฐœ์ˆ˜๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ๊ฐ’์€ <err> ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ถ”๊ฐ€ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

์ด ์ด์ƒํ•œ ํ‘œํ˜„ ์ธ์ˆ˜ ๋Œ€์‹  ๊ฐ€๋ณ€์ ์œผ๋กœ ์ œ์•ˆ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋ฉด ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ณ€๊ฒฝ๋˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ๋ช…์‹œ์  ๊ฐ€๋ณ€ ... ์ž…๋‹ˆ๋‹ค. ์˜ˆ:

try(os.Open("/dev/stdout")...)

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

f, err := os.Open("/dev/stdout")
try(WrapErrorf(err, "whatever wrap does: %v"))

์ด ์•„์ด๋””์–ด๊ฐ€ ํ•˜๋Š” ํ•œ ๊ฐ€์ง€๋Š” try ๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋œ ์ ์ ˆํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

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

์ด ์ œ์•ˆ์—์„œ ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ go ์–ธ์–ด ์‚ฌ์–‘์—์„œ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์–ธ์–ด ์‚ฌ์–‘์—์„œ ์ฐพ๊ณ  ์žˆ๋˜ ์ถ”์ถœ์ž…๋‹ˆ๋‹ค.

"ํ‘œํ˜„์‹ ๋ฌธ" ์„น์…˜์—์„œ:

๋‹ค์Œ ๋‚ด์žฅ ํ•จ์ˆ˜๋Š” ๋ช…๋ น๋ฌธ ์ปจํ…์ŠคํŠธ์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. append cap complex imag len make new real unsafe.Alignof unsafe.Offsetof unsafe.Sizeof

"Go ๋ฌธ" ๋ฐ "Defer statements" ์„น์…˜์—์„œ:

๋‚ด์žฅ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์€ ํ‘œํ˜„์‹ ๋ฌธ๊ณผ ๊ฐ™์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

"๋‚ด์žฅ ๊ธฐ๋Šฅ" ์„น์…˜์—์„œ:

๋‚ด์žฅ ํ•จ์ˆ˜์—๋Š” ํ‘œ์ค€ Go ์œ ํ˜•์ด ์—†์œผ๋ฏ€๋กœ ํ˜ธ์ถœ ํ‘œํ˜„์‹์—๋งŒ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

@griesemer ๊ฐ€ go ์–ธ์–ด ์‚ฌ์–‘์ด ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ๊ตฌ๋ฌธ ๊ทœ์น™์„ ๊นจ๋Š” ๋ฐ ํŠนํžˆ ์œ ์šฉํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

๋‚ด์žฅ ํ•จ์ˆ˜๋Š” Go ๊ตฌ๋ฌธ ๊ทœ์น™(๊ด„ํ˜ธ, ์ธ์ˆ˜ ์‚ฌ์ด์˜ ์‰ผํ‘œ ๋“ฑ)์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ž‘์—…์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

@nathanjsweet ๊ทธ๊ฒƒ์€ ์ด๋ฏธ ๊ณ ๋ ค๋˜์—ˆ์ง€๋งŒ(์‚ฌ์‹ค์€ ์‹ค์ˆ˜์˜€์Šต๋‹ˆ๋‹ค) try ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. https://go-review.googlesource.com/c/proposal/+/181878 ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

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

@griesemer ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฌธ์ œ์— ์‘๋‹ตํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด ์‹œ์ ์—์„œ ๊ฐ™์€ ์งˆ๋ฌธ์— ๋งŽ์€ ๋Œ€๋‹ต์„ ํ–ˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋™์‹œ์— ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

@nathanjsweet ์—ฌ๊ธฐ ์— ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๋Œ€ํ•ด :

Go์—์„œ ๋‚ด์žฅ์˜ ์—ญํ• ์— ๋Œ€ํ•ด ๋‘๋“œ๋Ÿฌ์ง€๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒฐ๋ก  ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

try ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๋Œ€ํ•ด: ์˜ˆ, unsafe.Offsetof ๊ฐ€ ์ธ์ˆ˜์— ๋„ฃ๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์€ $#$2 try #$ ์˜ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‘˜ ๋‹ค ๊ตฌ๋ฌธ์ ์œผ๋กœ ํ‘œํ˜„์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ํ•ด๋‹น ํ‘œํ˜„์‹์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. try ์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์€ ํ”„๋ŸฐํŠธ ์—”๋“œ ๊ตฌ๋ฌธ ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์กฐ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์„ ์ •๋„๋กœ Go์˜ ๊ตฌ๋ฌธ์— ์‰ฝ๊ฒŒ ๋งž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์—๊ฒŒ ์ด์ƒํ•˜๋‹ค๊ณ  ๋Š๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๊ธฐ์ˆ ์  ์ด์œ ์™€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@griesemer ์ตœ์‹  _tryhard_๋Š” "๋ณต์žกํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ"๋ฅผ ๊ณ„์‚ฐํ•˜์ง€๋งŒ "๋‹จ์ผ ๋ช…๋ น๋ฌธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ"๋Š” ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์„๊นŒ์š”?

@networkimprov ๋‹จ์ผ ๋ช…๋ น๋ฌธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‹จ์ผ non-return ๋ฌธ์„ ํฌํ•จํ•˜๋Š” if ๋ธ”๋ก?

@griesemer , ๋‹จ์ผ ๋ช…๋ น๋ฌธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ๋Š” ๋ฐ˜ํ™˜์„ ํฌํ•จํ•˜์—ฌ _any_ ๋‹จ์ผ ๋ช…๋ น๋ฌธ์„ ํฌํ•จํ•˜๋Š” if err != nil ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

@networkimprov ์™„๋ฃŒ. "๋ณต์žกํ•œ ํ•ธ๋“ค๋Ÿฌ"๋Š” ์ด์ œ "๋‹จ์ผ ๋ฌธ ๋‹ค์Œ ๋ถ„๊ธฐ"์™€ "๋ณต์žกํ•œ ๋‹ค์Œ ๋ถ„๊ธฐ"๋กœ ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ด๋Ÿฌํ•œ ์นด์šดํŠธ๋Š” ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋Ÿฌํ•œ ์นด์šดํŠธ์—๋Š” nil์— ๋Œ€ํ•ด ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•˜๋Š” ๋ชจ๋“  if ๋ฌธ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ tryhard ์˜ ๊ธฐ๋ณธ๊ฐ’์ธ -err="" ์ธ ๊ฒฝ์šฐ). tryhard ). ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ tryhard ๋Š” ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ๋‹จ์ผ ๋ช…๋ น๋ฌธ ์ฒ˜๋ฆฌ๊ธฐ ๊ธฐํšŒ์˜ ์ˆ˜๋ฅผ ๋งŽ์ด ๊ณผ๋Œ€ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด archive/tar/common.go , 701ํ–‰์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@networkimprov tryhard ๋Š” ์ด์ œ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๊ฐ€ try ํ›„๋ณด๊ฐ€ ์•„๋‹Œ ์ด์œ ์— ๋Œ€ํ•œ ๋ณด๋‹ค ์ •ํ™•ํ•œ ์นด์šดํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. try ์นด์šดํŠธ์˜ ์ „์ฒด ์ˆ˜๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋” ๋งŽ์€ ๋‹จ์ผ ๋ฐ ๋ณต์žกํ•œ ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•œ ๊ธฐํšŒ ์ˆ˜๋Š” ์ด์ œ ๋” ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๋ณต์žกํ•œ then ์ „์— if ๋ฌธ์˜ ๋ถ„๊ธฐ๋Š” if ์— <varname> != nil ๊ฒ€์‚ฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๊ฐ€ ํฌํ•จ๋˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ try ๋ฅผ ์กฐ๊ธˆ ๋” ์†์œผ๋กœ ์‹œํ—˜ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ํ”„๋กœํ† ํƒ€์ž… ๊ตฌํ˜„์œผ๋กœ ์—ฌ๊ธฐ์— WASM ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

https://ccbrown.github.io/wasm-go-playground/experimental/try-builtin/

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ try๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ์—์„œ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด ์—ฌ๊ธฐ์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ์ตœ์‹  ๊ตฌํ˜„์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” Go ํฌํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/ccbrown/go/pull/1

๋‚˜๋Š” '์‹œ๋„'๋ฅผ ์ข‹์•„ํ•œ๋‹ค. ๋‚˜๋Š” err์˜ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๊ด€๋ จ ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ํ•จ๊ป˜ err๊ณผ ํ•จ๊ป˜ := vs =๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •๊ธฐ์ ์ธ ์ฃผ์˜๋ฅผ ์‚ฐ๋งŒํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ๋™์ผํ•œ ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฒŒ์ฑ„ ๋ฐ˜์ถœ.

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

ํ†ต๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

--- stats ---
    370 (100.0% of     370) func declarations
    115 ( 31.1% of     370) func declarations returning an error
   1159 (100.0% of    1159) statements
    258 ( 22.3% of    1159) if statements
    123 ( 47.7% of     258) if <err> != nil statements
     64 ( 52.0% of     123) try candidates
      0 (  0.0% of     123) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
     54 ( 43.9% of     123) { return ... zero values ..., expr }
      2 (  1.6% of     123) single statement then branch
      3 (  2.4% of     123) complex then branch; cannot use try
      1 (  0.8% of     123) non-empty else branch; cannot use try

์ผ๋ถ€ ๋…ผํ‰:
1) ์ด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์žˆ๋Š” ๋ชจ๋“  if ๋ฌธ์˜ 50%๋Š” ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์—ˆ๊ณ  try ๋Š” ๊ทธ ์ค‘ ~์ ˆ๋ฐ˜์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด (์ž‘์€) ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์žˆ๋Š” ๋ชจ๋“  if ๋ฌธ์˜ 4๋ถ„์˜ 1์ด try ์˜ ํ˜•์‹ํ™”๋œ ๋ฒ„์ „์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

status.Annotate ) ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ๋ช‡ ์ฃผ ์ „์— ์šฐ์—ฐํžˆ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ gRPC ์ƒํƒœ ์ฝ”๋“œ. ์˜ˆ๋ฅผ ๋“ค์–ด, RPC๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ด€๋ จ ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ PERMISSION_DENIED์ธ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋„์šฐ๋ฏธ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋œ ์˜ค๋ฅ˜๋Š” ์—ฌ์ „ํžˆ PERMISSION_DENIED์˜ ๊ด€๋ จ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. RPC ํ•ธ๋“ค๋Ÿฌ๊นŒ์ง€ ์—ฐ๊ฒฐ๋˜๋ฉด RPC๋Š” ์—ฐ๊ฒฐ๋œ ์ƒํƒœ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ์ƒˆ ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ๊ฒƒ์— ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถ„๋ช…ํžˆ ๋ชจ๋“  ์˜ค๋ฅ˜์˜ 50%์— ๋Œ€ํ•ด ์ฃผ์„ ์—†์ด ์˜ค๋ฅ˜๋ฅผ ์ „ํŒŒํ–ˆ์Šต๋‹ˆ๋‹ค. ( tryhard ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— 10%๋ฅผ ์˜ˆ์ธกํ–ˆ์Šต๋‹ˆ๋‹ค).

3) status.Annotate ๋Š” nil ์˜ค๋ฅ˜๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: status.Annotatef(err, "some message: %v", x) ๋Š” nil iff err == nil $ ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค). ๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฒ”์ฃผ์˜ ์‹œ๋„ํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ํ›„๋ณด์ž๋ฅผ ์‚ดํŽด๋ณด์•˜๊ณ  ๋ชจ๋‘ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

```
// Before
enc, err := keymaster.NewEncrypter(encKeyring)                                                     
if err != nil {                                                                                    
  return status.Annotate(err, "failed to create encrypter")                                        
}

// After
enc, err := keymaster.NewEncrypter(encKeyring)                                                                                                                                                                  
try(status.Annotate(err, "failed to create encrypter"))
```

To be clear, I'm not saying this transformation is always necessarily a good idea, but it seemed worth mentioning since it boosts the count significantly to a bit under half of all `if` statements.

4) defer ๊ธฐ๋ฐ˜ ์˜ค๋ฅ˜ ์ฃผ์„์€ $# try ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—†์ด ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†”์งํžˆ ๋งํ•ด์„œ try ์™€ ๋‹ค์†Œ ์ง๊ตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๋™์•ˆ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœ ์ˆ˜์‹ ์ž๊ฐ€ ์ƒ์„ฑํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋” ์ดํ•ด๊ฐ€ ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌ๋ก€๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด gRPC ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์—ฌ๋Ÿฌ ์ฝ”๋“œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

```
resp, err := s.someClient.SomeMethod(ctx, req)
if err != nil {
  return ..., status.Annotate(err, "failed to call SomeMethod")
}
```

This is actually a bit redundant in retrospect, since gRPC already prefixes its errors with something like "/Service.Method to [ip]:port : ".

There was also code that called standard library functions using the same pattern:

```
hreq, err := http.NewRequest("GET", targetURL, nil)
if err != nil {
  return status.Annotate(err, "http.NewRequest failed")
}
```

In retrospect, this code demonstrates two issues: first, `http.NewRequest` isn't calling a gRPC API, so using `status.Annotate` was unnecessary, and second, assuming the standard library also return errors with callee context, this particular use of error annotation was unnecessary (although I am fairly certain the standard library does not consistently follow this pattern).

์–ด์จŒ๋“  ์ด ํ”„๋กœ์ ํŠธ๋กœ ๋Œ์•„์™€์„œ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šด ์—ฐ์Šต์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€, @griesemer : tryhard ์— "๋น„ ์‹œ๋„ ํ›„๋ณด์ž"์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ๋ถ„๋ชจ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
ํŽธ์ง‘ : ์•„๋ž˜์— ๋‹ต๋ณ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ†ต๊ณ„๋ฅผ ์ž˜๋ชป ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ํ”ผ๋“œ๋ฐฑ์ด ์ œ์•ˆ์œผ๋กœ ๋„˜์–ด๊ฐ”์–ด์•ผ ํ•˜๋Š” ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์—์„œ ํ•˜์ง€ ๋ง ๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ์˜๊ฒฌ์„ ์š”์ง€ ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

@balasanjay ์‚ฌ์‹ค์— ๊ธฐ๋ฐ˜ํ•œ ์˜๊ฒฌ์„ ๋ณด๋‚ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

tryhard ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์งˆ๋ฌธ๊ณผ ๊ด€๋ จํ•˜์—ฌ: "๋น„์‹œ๋„ ํ›„๋ณด์ž"(๋” ๋‚˜์€ ์ œ๋ชฉ ์ œ์•ˆ ํ™˜์˜)๋Š” ๋‹จ์ˆœํžˆ if ๋ฌธ์ด "์˜ค๋ฅ˜ ๊ฒ€์‚ฌ"(์˜ˆ: , ์˜ค๋ฅ˜ ๋ณ€์ˆ˜ <err> ์— ๋Œ€ํ•œ ํ• ๋‹น์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์ด ์žˆ์—ˆ๊ณ  ์†Œ์Šค์—์„œ if <err> != nil ํ™•์ธ์ด ๋’ค๋”ฐ๋ž์ง€๋งŒ try ๋กœ ์ธํ•ด ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ if ๋ธ”๋ก์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ "๋น„ ์‹œ๋„ ํ›„๋ณด" ์ถœ๋ ฅ์— ๋‚˜ํƒ€๋‚˜๋Š” ์ˆœ์„œ๋Œ€๋กœ $ <err> ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” return if ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋” ๋ณต์žกํ•œ return (๋˜๋Š” ๊ธฐํƒ€) ๋ฌธ์ด ์žˆ๋Š” $# if 9$#$ ๋ฌธ, "then" ๋ถ„๊ธฐ์— ์—ฌ๋Ÿฌ ๋ฌธ์ด ์žˆ๋Š” if ๋ฌธ, ๋‹ค์Œ์ด ํฌํ•จ๋œ if ๋ฌธ ๋น„์–ด ์žˆ์ง€ ์•Š์€ else ๋ถ„๊ธฐ. ์ด๋Ÿฌํ•œ if ๋ฌธ ์ค‘ ์ผ๋ถ€๋Š” ์ด๋Ÿฌํ•œ ์กฐ๊ฑด ์ค‘ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋™์‹œ์— ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ์ˆซ์ž๋Š” ํ•ฉ์‚ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. try ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

์ธก์ • ๋ฐฉ๋ฒ• ๋ฐ/๋˜๋Š” ๋Œ€์ƒ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์ œ์•ˆ์ด ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ๋“ฃ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ๋ฐฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ์กฐ์ •์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

@subfuzion ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๋Œ€์ฒด ์ œ์•ˆ์„ ์ฐพ๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://github.com/golang/go/issues/32437#issuecomment -501878888 ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๊ฐ์‚ฌ ํ•ด์š”.

๊ฒฐ๊ณผ์— ๊ด€๊ณ„์—†์ด ๊ณ„์‚ฐ๋˜๋Š” ๊ฒฝ์šฐ:

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

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

@griesemer ์•„ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํ†ต๊ณ„๋ฅผ ์ž˜๋ชป ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. "if err != nil statements" ์นด์šดํ„ฐ(123)๋ฅผ ๋ถ„๋ชจ๋กœ ์‚ฌ์šฉํ•˜๊ณ  "try ํ›„๋ณด์ž" ์นด์šดํ„ฐ(64)๋ฅผ ๋ถ„๋ชจ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์งˆ๋ฌธ์„ ๋˜์งˆ ๊ฒƒ์ด๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

@mattpalmer ์‚ฌ์šฉ ํŒจํ„ด์€ ์•ฝ 10๋…„ ๋™์•ˆ ํ™•๋ฆฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. try ์˜ ๋””์ž์ธ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นœ ๊ฒƒ์€ ๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ์ •ํ™•ํ•œ ์‚ฌ์šฉ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ์šฉ ํŒจํ„ด์„ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

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

@subfuzion ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ์ œ์•ˆ์ด๊ณ  ๋งŽ์€ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด์ƒํ•˜๋‹ค

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

@griesemer ํŒ€์ด ์‹คํ—˜์˜ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ํŠน์ • ์ง€ํ‘œ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@iand

๋‚˜๋Š” ์–ผ๋งˆ ์ „์— @rsc ์—๊ฒŒ ์ด๊ฒƒ์„ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค(https://github.com/golang/go/issues/32437#issuecomment-503245958):

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

๋Œ€๋‹ต์€ ๋ชฉ์ ์ด ์žˆ์—ˆ์ง€๋งŒ ๊ณ ๋ฌด์ ์ด์ง€ ์•Š๊ณ  ๋‚ด์šฉ์ด ๋ถ€์กฑํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/golang/go/issues/32437#issuecomment-503295558):

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

์ถ”๊ฐ€ ๊ฐ์ •์ด ์ œ๊ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค(https://github.com/golang/go/issues/32437#issuecomment-503408184).

try ๊ฐ€ ์ด์ „์— ๋…ผ์˜๋˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ๋ถ„๋ช…ํžˆ ๋” ๋‚˜์€ ์ฝ”๋“œ๋กœ ์ด์–ด์ง€๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ๋†€๋ž์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๋‚˜๋Š” "๋ถ„๋ฅ˜๋œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์‚ฌ๋ก€ ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๊นŒ?"๋ผ๋Š” ๋‚ด ์ž์‹ ์˜ ์งˆ๋ฌธ์— ๋Œ€๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™ ์ง์ ‘, ์ˆ˜๋™ ํ†ต๊ณผ, ์ˆ˜๋™ ๊ฐ„์ ‘, ์ž๋™ ์ง์ ‘, ์ž๋™ ํ†ต๊ณผ, ์ž๋™ ๊ฐ„์ ‘์˜ 6๊ฐ€์ง€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“œ ์ค‘ 2๊ฐœ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์ด‰์ง„์— ์ƒ๋‹นํ•œ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด๊ณ  ์žˆ๋Š” ๊ฐ„์ ‘ ๋ชจ๋“œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฒ ํ…Œ๋ž‘ ๊ณ ํผ์—๊ฒŒ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๊ธˆ์ง€๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ๊ทธ ์šฐ๋ ค๋Š” ๊ฒ‰์œผ๋กœ ๋ณด๊ธฐ์—๋Š” ๋ฌด์‹œ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. (https://github.com/golang/go/issues/32437#issuecomment-507332843).

๋˜ํ•œ ๊ฒฐ๊ณผ์˜ ๊ฐ€์น˜๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€ํ™˜ ์ „์— ์ž๋™ํ™”๋œ ๋ณ€ํ™˜์„ ๊ฒ€ํ† ํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค(https://github.com/golang/go/issues/32437#issuecomment-507497656). ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๊ณ ๋ง™๊ฒŒ๋„ ์ œ๊ณต๋˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋” ๋‚˜์€ ํšŒ๊ณ ์ „์„ ๊ฐ–๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ƒ‰์ •ํ•˜๊ณ  ์ผ์น˜๋œ ๋ฐฉ์‹์œผ๋กœ ๊ฐ„์ ‘์ ์ธ ๋ฐฉ๋ฒ•์˜ ์˜ํ–ฅ์„ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ(๋‚ด ์ƒ๊ฐ์—) ์‚ฌ์šฉ์ž๊ฐ€ ์ ๋Œ€์ ์œผ๋กœ ์ทจ๊ธ‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐœ๋ฐœ์ž๋Š” ๊ฒŒ์œผ๋ฅธ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์น˜์žˆ๋Š” ํ›„๋ณด์ž๋ฅผ ๋†“์น˜๋Š” ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์‹คํŒจ๋„ ์ง€์ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค (https://github.com/golang/go/issues/32437#issuecomment-507505243).

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

@iand @rsc ๊ฐ€ ์ œ๊ณตํ•œ ๋‹ต๋ณ€ ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๋Œ€๋‹ต์˜ ์–ด๋Š ๋ถ€๋ถ„์ด "์‹ค์งˆ ๋ถ€์กฑ"์ธ์ง€ ๋˜๋Š” "์˜๊ฐ์„ ์ฃผ๋Š”" ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ "๋ฌผ์งˆ"์„ ๋” ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ ํ‰๊ฐ€ ํ”„๋กœ์„ธ์Šค ์˜ ๋ชฉ์ ์€ "๋ณ€๊ฒฝ์ด ์˜ˆ์ƒ๋˜๋Š” ์ด์ ์„ ์ œ๊ณตํ–ˆ๋Š”์ง€ ๋˜๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋น„์šฉ์„ ๋ฐœ์ƒ์‹œ์ผฐ๋Š”์ง€"(ํ”„๋กœ์„ธ์Šค์˜ 5๋‹จ๊ณ„)๋ฅผ ๊ถ๊ทน์ ์œผ๋กœ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

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

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

@iand @rsc ๊ฐ€ ์ œ๊ณตํ•œ ๋‹ต๋ณ€ ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๋Œ€๋‹ต์˜ ์–ด๋Š ๋ถ€๋ถ„์ด "์‹ค์งˆ ๋ถ€์กฑ"์ธ์ง€ ๋˜๋Š” "์˜๊ฐ์„ ์ฃผ๋Š”" ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ "๋ฌผ์งˆ"์„ ๋” ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

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

@iand ์‹ค์ œ๋กœ - ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋‚˜์˜ ๊ฐ๋…์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

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

@griesemer

์–ด๋–ค ์‚ฌ์šฉ ํŒจํ„ด์„ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์กด์˜ nil-check ํŒจํ„ด์ด ์•„๋‹ˆ๋ผ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ try ์ฃผ๋ณ€์œผ๋กœ ๋ฐœ์ „ํ•  ์‚ฌ์šฉ ํŒจํ„ด์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค์šฉ ๋ฐ ๋‚จ์šฉ์˜ ๊ฐ€๋Šฅ์„ฑ์€ ํŠนํžˆ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์˜๋ฏธ๋ก ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ try-catch๋ฅผ ์‚ฌ์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ง€์†์ ์ธ ์œ ์ž…์œผ๋กœ ์ธํ•ด ํฌ๊ฒŒ ์•Œ๋ ค์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ๊ณผ ํ•ต์‹ฌ ์–ธ์–ด์˜ ์žฅ๊ธฐ์ ์ธ ์•ˆ์ •์„ฑ์— ๋Œ€ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ์€ x ํŒจํ‚ค์ง€ ๋˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ˆ˜์ค€์—์„œ ์ด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค(ํŒจํ‚ค์ง€ errors/try ๋˜๋Š” errors.Try() ).

@mattparlmer ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•ด ์ฃผ์„ธ์š”. ํ•˜์ง€๋งŒ g, m(์‹คํ–‰ ํ๋ฆ„์„ ์žฌ์ •์˜ํ•˜๋Š” ๋ฐ ํ•„์š”)์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด ์ œ์•ˆ์ด Go ๋Ÿฐํƒ€์ž„์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@fabian-f

@mattparlmer ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•ด ์ฃผ์„ธ์š”. ํ•˜์ง€๋งŒ g, m(์‹คํ–‰ ํ๋ฆ„์„ ์žฌ์ •์˜ํ•˜๋Š” ๋ฐ ํ•„์š”)์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด ์ œ์•ˆ์ด Go ๋Ÿฐํƒ€์ž„์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋””์ž์ธ ๋ฌธ์„œ ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ ๋ณ€ํ™˜์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

try ์˜ ์˜๋ฏธ๋Š” if ๋ฐ return ์ธก๋ฉด์—์„œ ์™„์ „ํžˆ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. if ๋ฐ return ๋ณด๋‹ค ์‹ค์ œ๋กœ "์‹คํ–‰ ํ๋ฆ„์„ ๋ฌด์‹œ"ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์šฐ๋ฆฌ ํšŒ์‚ฌ์˜ 300k ๋ผ์ธ Go ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์ ธ์˜จ tryhard ๋ณด๊ณ ์„œ์ž…๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ์‹คํ–‰:

--- stats ---
  13879 (100.0% of   13879) func declarations
   4381 ( 31.6% of   13879) func declarations returning an error
  38435 (100.0% of   38435) statements
   8028 ( 20.9% of   38435) if statements
   4496 ( 56.0% of    8028) if <err> != nil statements
    453 ( 10.1% of    4496) try candidates
      4 (  0.1% of    4496) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
   3066 ( 68.2% of    4496) { return ... zero values ..., expr }
    356 (  7.9% of    4496) single statement then branch
    345 (  7.7% of    4496) complex then branch; cannot use try
     63 (  1.4% of    4496) non-empty else branch; cannot use try

์šฐ๋ฆฌ๋Š” juju์˜ errgo ํŒจํ‚ค์ง€(https://godoc.org/github.com/juju/errgo)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๋งˆ์Šคํ‚นํ•˜๊ณ  ์Šคํƒ ์ถ”์  ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์žฌ์ž‘์„ฑ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๋ณธ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์„ ํ”ผํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ try ๋ฅผ ์ฑ„ํƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

--- stats ---
  13879 (100.0% of   13879) func declarations
   4381 ( 31.6% of   13879) func declarations returning an error
  38435 (100.0% of   38435) statements
   8028 ( 20.9% of   38435) if statements
   4496 ( 56.0% of    8028) if <err> != nil statements
   3114 ( 69.3% of    4496) try candidates
      7 (  0.2% of    4496) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
    381 (  8.5% of    4496) { return ... zero values ..., expr }
    358 (  8.0% of    4496) single statement then branch
    345 (  7.7% of    4496) complex then branch; cannot use try
     63 (  1.4% of    4496) non-empty else branch; cannot use try

๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์˜ ~70%๋Š” try ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ œ์•ˆ์„œ์— ๋Œ€ํ•œ ๋‚˜์˜ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋Š” ๋‚ด๊ฐ€ ์ฝ์€ ์˜๊ฒฌ์ด๋‚˜ ํ† ๋ก  ์š”์•ฝ์—์„œ ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์€ ์ฃผ์„ ์˜ค๋ฅ˜์˜ ์ƒ๋Œ€์  ๋น„์šฉ์„ ์ƒ๋‹นํžˆ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

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

๊ณ ๋ คํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@mattparlmer

์ด ๋ชจ๋“  ๊ฒƒ๊ณผ ํ•ต์‹ฌ ์–ธ์–ด์˜ ์žฅ๊ธฐ์  ์•ˆ์ •์„ฑ์— ๋Œ€ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ์€ x ํŒจํ‚ค์ง€ ๋˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ˆ˜์ค€์—์„œ ์ด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(ํŒจํ‚ค์ง€ errors/try ๋˜๋Š” errors.Try() ) ๋‚ด์žฅ์œผ๋กœ ๋„์ž…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

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

๋˜ํ•œ try ๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋” ์žฅํ™ฉํ•œ ์ด๋ฆ„์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ถ€๋ถ„์ ์œผ๋กœ ์‚ฌ์šฉ์˜ ์š”์ ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์†Œ์Šค ์ฝ”๋“œ ์ „์ฒ˜๋ฆฌ๊ธฐ๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‘ ๋ฒˆ์ด๋‚˜ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/rhysd/trygo ๋ฐ https://github.com/lunixbochs/og๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

tegola์˜ ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ์ค‘ ~60%๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ tegola ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ tryhard์˜ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค. (http://github.com/go-spatial/tegola)

--- try candidates ---
      1  tegola/atlas/atlas.go:84
      2  tegola/atlas/map.go:232
      3  tegola/atlas/map.go:238
      4  tegola/atlas/map.go:248
      5  tegola/atlas/map.go:253
      6  tegola/basic/geometry_math.go:248
      7  tegola/basic/geometry_math.go:251
      8  tegola/basic/geometry_math.go:268
      9  tegola/basic/geometry_math.go:276
     10  tegola/basic/json_marshal.go:33
     11  tegola/basic/json_marshal.go:153
     12  tegola/basic/json_marshal.go:276
     13  tegola/cache/azblob/azblob.go:54
     14  tegola/cache/azblob/azblob.go:61
     15  tegola/cache/azblob/azblob.go:67
     16  tegola/cache/azblob/azblob.go:74
     17  tegola/cache/azblob/azblob.go:80
     18  tegola/cache/azblob/azblob.go:105
     19  tegola/cache/azblob/azblob.go:109
     20  tegola/cache/azblob/azblob.go:204
     21  tegola/cache/azblob/azblob.go:259
     22  tegola/cache/file/file.go:42
     23  tegola/cache/file/file.go:56
     24  tegola/cache/file/file.go:110
     25  tegola/cache/file/file.go:116
     26  tegola/cache/file/file.go:129
     27  tegola/cache/redis/redis.go:41
     28  tegola/cache/redis/redis.go:46
     29  tegola/cache/redis/redis.go:51
     30  tegola/cache/redis/redis.go:56
     31  tegola/cache/redis/redis.go:70
     32  tegola/cache/redis/redis.go:79
     33  tegola/cache/redis/redis.go:84
     34  tegola/cache/s3/s3.go:85
     35  tegola/cache/s3/s3.go:102
     36  tegola/cache/s3/s3.go:112
     37  tegola/cache/s3/s3.go:118
     38  tegola/cache/s3/s3.go:123
     39  tegola/cache/s3/s3.go:138
     40  tegola/cache/s3/s3.go:164
     41  tegola/cache/s3/s3.go:172
     42  tegola/cache/s3/s3.go:179
     43  tegola/cache/s3/s3.go:284
     44  tegola/cache/s3/s3.go:340
     45  tegola/cmd/tegola/cmd/cache/format.go:97
     46  tegola/cmd/tegola/cmd/cache/seed_purge.go:94
     47  tegola/cmd/tegola/cmd/cache/seed_purge.go:103
     48  tegola/cmd/tegola/cmd/cache/seed_purge.go:170
     49  tegola/cmd/tegola/cmd/cache/tile_list.go:51
     50  tegola/cmd/tegola/cmd/cache/tile_list.go:64
     51  tegola/cmd/tegola/cmd/cache/tile_name.go:35
     52  tegola/cmd/tegola/cmd/cache/tile_name.go:43
     53  tegola/cmd/tegola/cmd/root.go:58
     54  tegola/cmd/tegola/cmd/root.go:61
     55  tegola/cmd/xyz2svg/cmd/draw.go:62
     56  tegola/cmd/xyz2svg/cmd/draw.go:70
     57  tegola/cmd/xyz2svg/cmd/draw.go:214
     58  tegola/config/config.go:96
     59  tegola/internal/env/parse.go:30
     60  tegola/internal/env/parse.go:69
     61  tegola/internal/env/parse.go:116
     62  tegola/internal/env/parse.go:174
     63  tegola/internal/env/parse.go:221
     64  tegola/internal/env/types.go:67
     65  tegola/internal/env/types.go:86
     66  tegola/internal/env/types.go:105
     67  tegola/internal/env/types.go:124
     68  tegola/internal/env/types.go:143
     69  tegola/maths/makevalid/main.go:189
     70  tegola/maths/makevalid/main.go:207
     71  tegola/maths/makevalid/main.go:221
     72  tegola/maths/makevalid/main.go:295
     73  tegola/maths/makevalid/main.go:504
     74  tegola/maths/makevalid/makevalid.go:77
     75  tegola/maths/makevalid/makevalid.go:89
     76  tegola/maths/makevalid/makevalid.go:118
     77  tegola/maths/makevalid/makevalid_test.go:93
     78  tegola/maths/makevalid/makevalid_test.go:163
     79  tegola/maths/makevalid/plyg/ring.go:518
     80  tegola/maths/triangle.go:1023
     81  tegola/mvt/layer.go:73
     82  tegola/mvt/layer.go:79
     83  tegola/mvt/vector_tile/vector_tile.pb.go:64
     84  tegola/provider/gpkg/gpkg.go:138
     85  tegola/provider/gpkg/gpkg.go:223
     86  tegola/provider/gpkg/gpkg_register.go:46
     87  tegola/provider/gpkg/gpkg_register.go:51
     88  tegola/provider/gpkg/gpkg_register.go:186
     89  tegola/provider/gpkg/gpkg_register.go:227
     90  tegola/provider/gpkg/gpkg_register.go:240
     91  tegola/provider/gpkg/gpkg_register.go:245
     92  tegola/provider/gpkg/gpkg_register.go:256
     93  tegola/provider/gpkg/gpkg_register.go:377
     94  tegola/provider/postgis/postgis.go:112
     95  tegola/provider/postgis/postgis.go:117
     96  tegola/provider/postgis/postgis.go:122
     97  tegola/provider/postgis/postgis.go:127
     98  tegola/provider/postgis/postgis.go:136
     99  tegola/provider/postgis/postgis.go:142
    100  tegola/provider/postgis/postgis.go:148
    101  tegola/provider/postgis/postgis.go:153
    102  tegola/provider/postgis/postgis.go:158
    103  tegola/provider/postgis/postgis.go:163
    104  tegola/provider/postgis/postgis.go:181
    105  tegola/provider/postgis/postgis.go:198
    106  tegola/provider/postgis/postgis.go:264
    107  tegola/provider/postgis/postgis.go:441
    108  tegola/provider/postgis/postgis.go:446
    109  tegola/provider/postgis/postgis.go:529
    110  tegola/provider/postgis/postgis.go:559
    111  tegola/provider/postgis/postgis.go:603
    112  tegola/provider/postgis/util.go:31
    113  tegola/provider/postgis/util.go:36
    114  tegola/provider/postgis/util.go:200
    115  tegola/server/bindata/bindata.go:89
    116  tegola/server/bindata/bindata.go:109
    117  tegola/server/bindata/bindata.go:129
    118  tegola/server/bindata/bindata.go:149
    119  tegola/server/bindata/bindata.go:169
    120  tegola/server/bindata/bindata.go:189
    121  tegola/server/bindata/bindata.go:209
    122  tegola/server/bindata/bindata.go:229
    123  tegola/server/bindata/bindata.go:370
    124  tegola/server/bindata/bindata.go:374
    125  tegola/server/bindata/bindata.go:378
    126  tegola/server/bindata/bindata.go:382
    127  tegola/server/bindata/bindata.go:386
    128  tegola/server/bindata/bindata.go:402
    129  tegola/server/middleware_gzip.go:71
    130  tegola/server/middleware_gzip.go:78
    131  tegola/server/server_test.go:85

--- <err> name is different from "err" ---
      1  tegola/basic/json_marshal.go:276

--- { return ... zero values ..., expr } ---
      1  tegola/basic/geometry_math.go:214
      2  tegola/basic/geometry_math.go:222
      3  tegola/basic/geometry_math.go:230
      4  tegola/cache/azblob/azblob.go:131
      5  tegola/cache/azblob/azblob.go:140
      6  tegola/cache/azblob/azblob.go:149
      7  tegola/cache/azblob/azblob.go:171
      8  tegola/cache/file/file.go:47
      9  tegola/cache/s3/s3.go:92
     10  tegola/cmd/internal/register/maps.go:108
     11  tegola/cmd/tegola/cmd/cache/flags.go:20
     12  tegola/cmd/tegola/cmd/cache/tile_name.go:51
     13  tegola/cmd/tegola/cmd/cache/worker.go:112
     14  tegola/cmd/tegola/cmd/cache/worker.go:123
     15  tegola/cmd/tegola/cmd/root.go:73
     16  tegola/cmd/tegola/cmd/root.go:78
     17  tegola/cmd/xyz2svg/cmd/root.go:60
     18  tegola/provider/gpkg/gpkg.go:90
     19  tegola/provider/gpkg/gpkg.go:95
     20  tegola/provider/gpkg/gpkg_register.go:264
     21  tegola/provider/gpkg/gpkg_register.go:297
     22  tegola/provider/gpkg/gpkg_register.go:302
     23  tegola/provider/gpkg/gpkg_register.go:313
     24  tegola/provider/gpkg/gpkg_register.go:328
     25  tegola/provider/postgis/postgis.go:193
     26  tegola/provider/postgis/postgis.go:208
     27  tegola/provider/postgis/postgis.go:222
     28  tegola/provider/postgis/postgis.go:228
     29  tegola/provider/postgis/postgis.go:234
     30  tegola/provider/postgis/postgis.go:243
     31  tegola/provider/postgis/postgis.go:249
     32  tegola/provider/postgis/postgis.go:255
     33  tegola/provider/postgis/postgis.go:304
     34  tegola/provider/postgis/postgis.go:315
     35  tegola/provider/postgis/postgis.go:319
     36  tegola/provider/postgis/postgis.go:364
     37  tegola/provider/postgis/postgis.go:456
     38  tegola/provider/postgis/postgis.go:520
     39  tegola/provider/postgis/postgis.go:534
     40  tegola/provider/postgis/postgis.go:565
     41  tegola/provider/postgis/util.go:108
     42  tegola/provider/postgis/util.go:113
     43  tegola/server/bindata/bindata.go:29
     44  tegola/server/bindata/bindata.go:245
     45  tegola/server/bindata/bindata.go:271
     46  tegola/server/bindata/bindata.go:396

--- single statement then branch ---
      1  tegola/cache/azblob/azblob.go:241
      2  tegola/cache/file/file.go:87
      3  tegola/cache/s3/s3.go:321
      4  tegola/cmd/internal/register/caches.go:18
      5  tegola/cmd/internal/register/providers.go:43
      6  tegola/cmd/internal/register/providers.go:62
      7  tegola/cmd/internal/register/providers.go:75
      8  tegola/config/config.go:192
      9  tegola/config/config.go:207
     10  tegola/config/config.go:217
     11  tegola/internal/env/dict.go:43
     12  tegola/internal/env/dict.go:121
     13  tegola/internal/env/dict.go:197
     14  tegola/internal/env/dict.go:273
     15  tegola/internal/env/dict.go:348
     16  tegola/internal/env/parse.go:79
     17  tegola/internal/env/parse.go:126
     18  tegola/internal/env/parse.go:184
     19  tegola/internal/env/parse.go:231
     20  tegola/maths/makevalid/plyg/ring.go:541
     21  tegola/maths/maths.go:239
     22  tegola/maths/validate/validate.go:49
     23  tegola/maths/validate/validate.go:53
     24  tegola/maths/validate/validate.go:59
     25  tegola/maths/validate/validate.go:69
     26  tegola/mvt/feature.go:94
     27  tegola/mvt/feature.go:99
     28  tegola/mvt/feature.go:592
     29  tegola/mvt/feature.go:603
     30  tegola/mvt/layer.go:90
     31  tegola/mvt/tile.go:48
     32  tegola/provider/postgis/postgis.go:570
     33  tegola/provider/postgis/postgis.go:586
     34  tegola/tile.go:172

--- complex then branch; cannot use try ---
      1  tegola/cache/azblob/azblob.go:226
      2  tegola/cache/file/file.go:78
      3  tegola/cache/file/file.go:122
      4  tegola/cache/s3/s3.go:195
      5  tegola/cache/s3/s3.go:206
      6  tegola/cache/s3/s3.go:219
      7  tegola/cache/s3/s3.go:307
      8  tegola/provider/gpkg/gpkg.go:39
      9  tegola/provider/gpkg/gpkg.go:45
     10  tegola/provider/gpkg/gpkg.go:131
     11  tegola/provider/gpkg/gpkg.go:154
     12  tegola/provider/gpkg/gpkg_register.go:171
     13  tegola/provider/gpkg/gpkg_register.go:195

--- stats ---
   1294 (100.0% of    1294) func declarations
    246 ( 19.0% of    1294) func declarations returning an error
   2693 (100.0% of    2693) statements
    551 ( 20.5% of    2693) if statements
    238 ( 43.2% of     551) if <err> != nil statements
    131 ( 55.0% of     238) try candidates
      1 (  0.4% of     238) <err> name is different from "err"
--- non-try candidates ---
     46 ( 19.3% of     238) { return ... zero values ..., expr }
     34 ( 14.3% of     238) single statement then branch
     13 (  5.5% of     238) complex then branch; cannot use try
      0 (  0.0% of     238) non-empty else branch; cannot use try

๊ทธ๋ฆฌ๊ณ  ๋™๋ฐ˜ ํ”„๋กœ์ ํŠธ: (http://github.com/go-spatial/geom)

--- try candidates ---
      1  geom/bbox.go:202
      2  geom/encoding/geojson/geojson.go:152
      3  geom/encoding/geojson/geojson.go:157
      4  geom/encoding/wkb/internal/tcase/symbol/symbol.go:73
      5  geom/encoding/wkb/internal/tcase/tcase.go:161
      6  geom/encoding/wkb/internal/tcase/tcase.go:172
      7  geom/encoding/wkb/wkb.go:50
      8  geom/encoding/wkb/wkb.go:110
      9  geom/encoding/wkt/internal/token/token.go:176
     10  geom/encoding/wkt/internal/token/token.go:252
     11  geom/internal/parsing/parsing.go:44
     12  geom/internal/parsing/parsing.go:85
     13  geom/internal/rtreego/rtree_test.go:110
     14  geom/multi_line_string.go:34
     15  geom/multi_polygon.go:35
     16  geom/planar/clip/linestring.go:82
     17  geom/planar/clip/linestring.go:181
     18  geom/planar/clip/point.go:23
     19  geom/planar/intersect/xsweep.go:106
     20  geom/planar/makevalid/makevalid.go:92
     21  geom/planar/makevalid/makevalid.go:191
     22  geom/planar/makevalid/setdiff/polygoncleaner.go:283
     23  geom/planar/makevalid/setdiff/polygoncleaner.go:345
     24  geom/planar/makevalid/setdiff/polygoncleaner.go:543
     25  geom/planar/makevalid/setdiff/polygoncleaner.go:554
     26  geom/planar/makevalid/setdiff/polygoncleaner.go:572
     27  geom/planar/makevalid/setdiff/polygoncleaner.go:578
     28  geom/planar/simplify/douglaspeucker.go:84
     29  geom/planar/simplify/douglaspeucker.go:88
     30  geom/planar/simplify.go:13
     31  geom/planar/triangulate/constraineddelaunay/triangle.go:186
     32  geom/planar/triangulate/constraineddelaunay/triangulator.go:134
     33  geom/planar/triangulate/constraineddelaunay/triangulator.go:138
     34  geom/planar/triangulate/constraineddelaunay/triangulator.go:142
     35  geom/planar/triangulate/constraineddelaunay/triangulator.go:173
     36  geom/planar/triangulate/constraineddelaunay/triangulator.go:176
     37  geom/planar/triangulate/constraineddelaunay/triangulator.go:203
     38  geom/planar/triangulate/constraineddelaunay/triangulator.go:248
     39  geom/planar/triangulate/constraineddelaunay/triangulator.go:396
     40  geom/planar/triangulate/constraineddelaunay/triangulator.go:466
     41  geom/planar/triangulate/constraineddelaunay/triangulator.go:553
     42  geom/planar/triangulate/constraineddelaunay/triangulator.go:583
     43  geom/planar/triangulate/constraineddelaunay/triangulator.go:667
     44  geom/planar/triangulate/constraineddelaunay/triangulator.go:672
     45  geom/planar/triangulate/constraineddelaunay/triangulator.go:677
     46  geom/planar/triangulate/constraineddelaunay/triangulator.go:814
     47  geom/planar/triangulate/constraineddelaunay/triangulator.go:818
     48  geom/planar/triangulate/constraineddelaunay/triangulator.go:823
     49  geom/planar/triangulate/constraineddelaunay/triangulator.go:865
     50  geom/planar/triangulate/constraineddelaunay/triangulator.go:870
     51  geom/planar/triangulate/constraineddelaunay/triangulator.go:875
     52  geom/planar/triangulate/constraineddelaunay/triangulator.go:897
     53  geom/planar/triangulate/constraineddelaunay/triangulator.go:901
     54  geom/planar/triangulate/constraineddelaunay/triangulator.go:907
     55  geom/planar/triangulate/constraineddelaunay/triangulator.go:1107
     56  geom/planar/triangulate/constraineddelaunay/triangulator.go:1146
     57  geom/planar/triangulate/constraineddelaunay/triangulator.go:1157
     58  geom/planar/triangulate/constraineddelaunay/triangulator.go:1202
     59  geom/planar/triangulate/constraineddelaunay/triangulator.go:1206
     60  geom/planar/triangulate/constraineddelaunay/triangulator.go:1216
     61  geom/planar/triangulate/delaunaytriangulationbuilder.go:66
     62  geom/planar/triangulate/incrementaldelaunaytriangulator.go:46
     63  geom/planar/triangulate/incrementaldelaunaytriangulator.go:78
     64  geom/planar/triangulate/quadedge/lastfoundquadedgelocator.go:65
     65  geom/planar/triangulate/quadedge/quadedgesubdivision.go:976
     66  geom/slippy/tile.go:133

--- { return ... zero values ..., expr } ---
      1  geom/internal/parsing/parsing.go:125
      2  geom/planar/triangulate/constraineddelaunay/triangulator.go:428
      3  geom/planar/triangulate/constraineddelaunay/triangulator.go:447
      4  geom/planar/triangulate/constraineddelaunay/triangulator.go:460

--- single statement then branch ---
      1  geom/bbox.go:259
      2  geom/encoding/wkb/internal/decode/decode.go:29
      3  geom/encoding/wkb/internal/decode/decode.go:55
      4  geom/encoding/wkb/internal/decode/decode.go:63
      5  geom/encoding/wkb/internal/decode/decode.go:70
      6  geom/encoding/wkb/internal/decode/decode.go:79
      7  geom/encoding/wkb/internal/decode/decode.go:84
      8  geom/encoding/wkb/internal/decode/decode.go:93
      9  geom/encoding/wkb/internal/decode/decode.go:99
     10  geom/encoding/wkb/internal/decode/decode.go:105
     11  geom/encoding/wkb/internal/decode/decode.go:114
     12  geom/encoding/wkb/internal/decode/decode.go:119
     13  geom/encoding/wkb/internal/decode/decode.go:135
     14  geom/encoding/wkb/internal/decode/decode.go:140
     15  geom/encoding/wkb/internal/decode/decode.go:149
     16  geom/encoding/wkb/internal/decode/decode.go:155
     17  geom/encoding/wkb/internal/decode/decode.go:161
     18  geom/encoding/wkb/internal/decode/decode.go:170
     19  geom/encoding/wkb/internal/decode/decode.go:176
     20  geom/encoding/wkb/internal/tcase/token/token.go:162
     21  geom/encoding/wkt/internal/token/token.go:136

--- complex then branch; cannot use try ---
      1  geom/encoding/wkb/internal/tcase/tcase.go:74
      2  geom/encoding/wkt/internal/symbol/symbol.go:125
      3  geom/planar/intersect/xsweep.go:165
      4  geom/planar/makevalid/makevalid.go:85
      5  geom/planar/makevalid/makevalid.go:172
      6  geom/planar/makevalid/triangulate.go:19
      7  geom/planar/makevalid/triangulate.go:28
      8  geom/planar/makevalid/triangulate.go:36
      9  geom/planar/makevalid/triangulate.go:58
     10  geom/planar/triangulate/constraineddelaunay/triangulator.go:358
     11  geom/planar/triangulate/constraineddelaunay/triangulator.go:373
     12  geom/planar/triangulate/constraineddelaunay/triangulator.go:453
     13  geom/planar/triangulate/constraineddelaunay/triangulator.go:1237
     14  geom/planar/triangulate/constraineddelaunay/triangulator.go:1243
     15  geom/planar/triangulate/constraineddelaunay/triangulator.go:1249

--- stats ---
    820 (100.0% of     820) func declarations
    146 ( 17.8% of     820) func declarations returning an error
   1715 (100.0% of    1715) statements
    391 ( 22.8% of    1715) if statements
    111 ( 28.4% of     391) if <err> != nil statements
     66 ( 59.5% of     111) try candidates
      0 (  0.0% of     111) <err> name is different from "err"
--- non-try candidates ---
      4 (  3.6% of     111) { return ... zero values ..., expr }
     21 ( 18.9% of     111) single statement then branch
     15 ( 13.5% of     111) complex then branch; cannot use try
      0 (  0.0% of     111) non-empty else branch; cannot use try

์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋น„์šฉ ๋ฌธ์ œ๋กœ #32611์—์„œ ๋‹ค์‹œ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค...

์„ธ ๊ฐ€์ง€ ๋น„์šฉ ํด๋ž˜์Šค๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  1. ์„ค๊ณ„ ๋ฌธ์„œ์— ์ž์„ธํžˆ ๋‚˜์™€ ์žˆ๋Š” ์‚ฌ์–‘์— ๋Œ€ํ•œ ๋น„์šฉ์ž…๋‹ˆ๋‹ค.
  2. ํˆด๋ง ๋น„์šฉ(์˜ˆ: ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ์ •)์€ ์„ค๊ณ„ ๋ฌธ์„œ์—์„œ๋„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.
  3. ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์œ„์™€ #32825์—์„œ ์ž์„ธํžˆ ์„ค๋ช…ํ•œ ์ƒํƒœ๊ณ„ ๋น„์šฉ.

๋ฅด๋…ธ. 1 & 2, try() ์˜ ๋น„์šฉ์€ ์ ๋‹นํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์˜ค๋ฅผ ์ง€๋‚˜์น˜๊ฒŒ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. 3, ๋Œ€๋ถ€๋ถ„์˜ ๋Œ“๊ธ€ ์ž‘์„ฑ์ž๋Š” try() ๊ฐ€ ์šฐ๋ฆฌ ์ฝ”๋“œ ๋ฐ/๋˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์˜์กดํ•˜๋Š” ์ฝ”๋“œ ์ƒํƒœ๊ณ„๋ฅผ ์†์ƒ์‹œ์ผœ ์ƒ์‚ฐ์„ฑ๊ณผ ์ œํ’ˆ ํ’ˆ์งˆ์„ ์ €ํ•˜์‹œํ‚ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋„๋ฆฌ ํผ์ ธ ์žˆ๊ณ  ํ•ฉ๋ฆฌ์ ์ธ ์ธ์‹์€ "์‚ฌ์‹ค์ด ์•„๋‹Œ" ๋˜๋Š” "๋ฏธํ•™์ "์œผ๋กœ ํ„ํ•˜๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ๋น„์šฉ์€ ์‚ฌ์–‘์ด๋‚˜ ๋„๊ตฌ์— ๋Œ€ํ•œ ๋น„์šฉ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

@griesemer "3 ๋‹ค์Šค์˜ ๋ณด์ปฌ ์ƒ๋Œ€"๊ฐ€ ๋ฐ˜๋Œ€์˜ ๋Œ€๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ๋ช…๋ฐฑํžˆ ๋ถˆ๊ณต์ •ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ๋ช…์˜ ์‚ฌ๋žŒ๋“ค์ด ์—ฌ๊ธฐ์™€ #32825์— ๋Œ“๊ธ€์„ ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ 6์›” 12์ผ์— "์‘๋‹ต์ž์˜ ์•ฝ 2/3๊ฐ€ ์ œ์•ˆ์— ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค."๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„๋กœ 2,000๋ช…์ด ๋„˜๋Š” ์‚ฌ๋žŒ๋“ค์ด " err != nil ํ˜ผ์ž ๋‘๊ธฐ"์— 90%์˜ ์—„์ง€์†๊ฐ€๋ฝ์„ ์น˜์ผœ์„ธ์›Œ ํˆฌํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค.

@gdey _stats ๋ฐ non-try ํ›„๋ณด์ž_๋งŒ ํฌํ•จํ•˜๋„๋ก ๊ฒŒ์‹œ๋ฌผ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@robfig , @gdey ์ด ๋ฐ์ดํ„ฐ, ํŠนํžˆ ์ „ํ›„ ๋น„๊ต๋ฅผ ์ œ๊ณตํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

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

@networkimprov ์ถฉ๋ถ„ํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ์  ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ•œ ๋ง ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์— ๋Œ€ํ•ด 2๋ช…, 34๋ช… ์ •๋„์˜ ๊ฐ•๋ ฅํ•œ ๋ฐ˜๋Œ€์ž๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์ด ๋ˆ„๊ตฌ์ธ์ง€ ์••๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ข…์ข… ํ•˜๋ฃจ์— ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฒŒ์‹œ๋ฌผ์„ ์˜ฌ๋ฆฌ๋ฉด์„œ ์ด ํ† ๋ก ์„ ์ง€๋ฐฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋ชจํ‹ฐ์ฝ˜์ด ์•„๋‹Œ ์‹ค์ œ ๋Œ“๊ธ€("์ž์ฃผ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒŒ์‹œ๋ฌผ"์—์„œ์™€ ๊ฐ™์ด)์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— _๋ฐ˜๋ณต์ ์œผ๋กœ_ ๊ฒŒ์‹œํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋น„๊ต์  ์†Œ์ˆ˜์— ๋ถˆ๊ณผํ•˜๋ฉฐ, ์—ฌ์ „ํžˆ ์ •ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ #32825์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š์•˜๋‹ค. ์ด ์ œ์•ˆ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ชจํ‹ฐ์ฝ˜์„ ๋ณด๋ฉด ํ•œ ๋‹ฌ ์ „๊ณผ ๊ฑฐ์˜ ๋ณ€ํ™”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ชจํ‹ฐ์ฝ˜์˜ 1/3์€ ๊ธ์ •์ ์ธ ์˜๊ฒฌ์ด๊ณ  2/3๋Š” ๋ถ€์ •์ ์ธ ์˜๊ฒฌ์ž…๋‹ˆ๋‹ค.

@griesemer

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

switch x {
case rand.Int():
  a()
case 5, try(strconv.Atoi(y)):
  b()
}

switch ์˜ ํ‰๊ฐ€ ์ˆœ์„œ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์˜๋„ํ•œ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ strconv.Atoi(y) ๋ฅผ case ์ ˆ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์†Œํ•˜๊ฒŒ ๋“ค์–ด ์˜ฌ๋ฆฌ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์€ switch ๋ฅผ if / else ๋ช…๋ น๋ฌธ์˜ ๋™์ผํ•œ ์ฒด์ธ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

if x == rand.Int() {
  a()
} else if x == 5 {
  b()
} else if _v, _err := strconv.Atoi(y); _err != nil {
  return _err
} else if x == _v {
  b()
}

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

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

https://github.com/rhysd/trygo๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. README์— ๋”ฐ๋ฅด๋ฉด try ํ‘œํ˜„์‹์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ณธ์งˆ์ ์œผ๋กœ ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œ ์ œ๊ธฐํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์šฐ๋ ค๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž๊ฐ€ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ์ด์œ ๊ฐ€ ์•„๋‹๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

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

@dpinela ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ฏธ ๊ท€ํ•˜์™€ ๊ฐ™์€ switch ๋ช…๋ น๋ฌธ์„ if-else-if ์˜ ์‹œํ€€์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” "๊ตฌ๋ฌธ ํŠธ๋ฆฌ"๋Š” "go/ast" ๊ตฌ๋ฌธ ํŠธ๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋‚ด๋ถ€ ํ‘œํ˜„์€ Go๋กœ ๋‹ค์‹œ ๋ฒˆ์—ญ๋  ํ•„์š”๊ฐ€ ์—†๋Š” ํ›จ์”ฌ ๋” ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

ps ์‹œ๊ฐ„ ๋‚ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ํŒ€๊ณผ ์–ธ์–ด๋Š” ๋‚ด ์กด๊ฒฝ๊ณผ ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชฉ์†Œ๋ฆฌ๋ฅผ ๋‚ด๋Š” ์‚ฌ๋žŒ์˜ ์Šฌํ””์„ ๋ฐ”๋ผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‚˜์˜/์šฐ๋ฆฌ์˜ ๊ด€์‹ฌ์‚ฌ์˜ ๋ณธ์งˆ์„ ๋“ฃ๊ณ  ์šฐ๋ฆฌ์˜ "์ผ์„ " ๊ด€์ ์—์„œ ์‚ฌ๋ฌผ์„ ๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚ด downvote์— ๋ช‡ ๊ฐ€์ง€ ์˜๊ฒฌ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํŠน์ • ์ œ์•ˆ:

1) ์ œ์–ด ํ๋ฆ„ ๋ฐ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์— ๋Œ€ํ•ด ์ด์ „์— ๋ช…ํ™•ํžˆ ์„ค๋ช…๋œ ์ด์œ ๋กœ ํ‚ค์›Œ๋“œ ๋Œ€ ๋‚ด์žฅ ํ•จ์ˆ˜๋กœ ์ด๊ฒƒ์„ ํฌ๊ฒŒ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

2) ์˜๋ฏธ์ƒ "์‹œ๋„"๋Š” ํ”ผ๋ขฐ์นจ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ํ•œ "try"๋Š” guard ๋˜๋Š” ensure ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

3) ์ด ๋‘ ๊ฐ€์ง€ ์  ์™ธ์—, ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ฒƒ์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ๋ณธ ์ตœ๊ณ ์˜ ์ œ์•ˆ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

try/guard/ensure ๊ฐœ๋…์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ $# if err != nil ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋‚ด ๋ฐ˜๋Œ€ ์˜๊ฒฌ์„ ๋ช‡ ๊ฐ€์ง€ ๋” ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

1) ์ด๊ฒƒ์€ golang์˜ ์›๋ž˜ ๋ช…๋ น ์ค‘ ํ•˜๋‚˜(์ตœ์†Œํ•œ ๋‚ด๊ฐ€ ์ธ์‹ํ•œ ๋Œ€๋กœ)์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค. '๋งˆ๋ฒ•'์ด ๊ฑฐ์˜ ์—†์ด ๋ช…ํ™•ํ•˜๊ณ  ์ฝ๊ธฐ/์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

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

๋‹ค์Œ์€ ์›์‹œ tryhard ํ†ต๊ณ„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€๋ณ๊ฒŒ ๊ฒ€์ฆ๋œ ๊ฒƒ์ด๋ฏ€๋กœ ์ž์œ ๋กญ๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ์ง€์ ํ•ด ์ฃผ์‹ญ์‹œ์˜ค. ;-)

godoc.org์˜ ์ฒซ 20๊ฐœ์˜ "์ธ๊ธฐ ํŒจํ‚ค์ง€"

๋‹ค์Œ์€ ์‹œ๋„ ํ›„๋ณด ๋ฐฑ๋ถ„์œจ๋กœ ์ •๋ ฌ๋œ https://godoc.org ์˜ ์ฒ˜์Œ 20๊ฐœ์˜ ์ธ๊ธฐ ํŒจํ‚ค์ง€์— ํ•ด๋‹นํ•˜๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ก ์ƒ vendor ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ œ์™ธํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋ณธ tryhard ์„ค์ •์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด 20๊ฐœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์‹œ๋„ ํ›„๋ณด์˜ ์ค‘์•™๊ฐ’์€ 58%์ž…๋‹ˆ๋‹ค.

| ํ”„๋กœ์ ํŠธ | ์œ„์น˜ | ๋งŒ์•ฝ stmts | if != nil(๋งŒ์ผ์˜ %) | ํ›„๋ณด ์‹œ๋„(if != nil์˜ %) |
|---------|-----|---------------|------ -----|---------------
| github.com/google/uuid | 1714 | 12 | 16.7% | 0.0% |
| github.com/pkg/errors | 1886 | 10 | 0.0% | 0.0% |
| github.com/aws/aws-sdk-go | 1911309 | 32015 | 9.4% | 8.9% |
| github.com/jinzhu/gorm | 15246 | 44 | 11.4% | 20.0% |
| github.com/robfig/cron | 1911๋…„ | 20 | 35.0% | 28.6% |
| github.com/gorilla/websocket | 6959 | 212 | 32.5% | 39.1% |
| github.com/dgrijalva/jwt-go | 3270 | 118 | 29.7% | 40.0% |
| github.com/gomodule/redigo | 7119 | 187 | 34.8% | 41.5% |
| github.com/unixpickle/kahoot-hack | 1743 | 52 | 75.0% | 43.6% |
| github.com/lib/pq | 13396 | 239 | 30.1% | 55.6% |
| github.com/sirupsen/logrus | 5063 | 29 | 17.2% | 60.0% |
| github.com/prometheus/client_golang | 17791 | 194 | 49.0% | 62.1% |
| github.com/go-redis/redis | 21182 | 326 | 42.6% | 73.4% |
| github.com/mongodb/mongo-go-driver | 86605 | 2097 | 37.8% | 73.9% |
| github.com/uber-go/zap | 15363 | 84 | 36.9% | 74.2% |
| github.com/golang/protobuf | 42959 | 685 | 22.9% | 77.1% |
| github.com/gin-gonic/gin | 14574 | 96 | 53.1% | 86.3% |
| github.com/go-pg/pg | 26369 | 831 | 37.7% | 86.9% |
| github.com/Shopify/sarama | 36427 | 1369 | 68.2% | 91.0% |
| github.com/stretchr/testify | 13496 | 32 | 43.8% | 92.9% |

" if stmts " ์—ด์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์˜ if ๋ฌธ๋งŒ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด tryhard ๊ฐ€ ๋ณด๊ณ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฉฐ gorm ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์™œ ๊ทธ๋ ‡๊ฒŒ ๋‚ฎ์€์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

10 ๊ธฐํƒ€ "๋Œ€ํ˜•" Go ํ”„๋กœ์ ํŠธ

godoc.org์—์„œ ์ธ๊ธฐ ์žˆ๋Š” ํŒจํ‚ค์ง€๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€ ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฏ€๋กœ ์ผ๋ถ€ ๋” ํฐ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ†ต๊ณ„๋„ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ๋“ค์€ ๊ธฐํƒ€์ž…๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ค๋ฅธ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ(์ฆ‰, ์ด 10๊ฐœ ๋’ค์— ์‹ค์ œ ๋…ผ๋ฆฌ๊ฐ€ ์—†์Œ). ์ด๊ฒƒ์€ ๋‹ค์‹œ ์‹œ๋„ ํ›„๋ณด ๋ฐฑ๋ถ„์œจ๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

์ด 10๊ฐœ ์ €์žฅ์†Œ์—์„œ ์‹œ๋„ ํ›„๋ณด์˜ ์ค‘์•™๊ฐ’์€ 59%์ž…๋‹ˆ๋‹ค.

| ํ”„๋กœ์ ํŠธ | ์œ„์น˜ | ๋งŒ์•ฝ stmts | if != nil(๋งŒ์ผ์˜ %) | ํ›„๋ณด ์‹œ๋„(if != nil์˜ %) |
|---------|-----|---------------|------ ---|---------------------------------|
| github.com/juju/juju | 1026473 | 26904 | 51.9% | 17.5% |
| github.com/go-kit/kit | 38949 | 467 | 57.0% | 51.9% |
| github.com/boltdb/bolt | 12426 | 228 | 46.1% | 53.3% |
| github.com/hashicorp/consul | 249369 | 5477 | 47.6% | 54.5% |
| github.com/docker/docker | 251152 | 8690 | 48.7% | 56.8% |
| github.com/istio/istio | 429636 | 7564 | 40.4% | 61.9% |
| github.com/gohugoio/hugo | 94875 | 1853 | 42.4% | 64.8% |
| github.com/etcd-io/etcd | 209603 | 4657 | 38.3% | 65.5% |
| github.com/kubernetes/kubernetes | 1789172 | 40289 | 43.3% | 66.5% |
| github.com/cockroachdb/cockroach | 1038529 | 22018 | 39.9% | 74.0% |


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

@thepudds , "๋น„ ์‹œ๋„ ํ›„๋ณด"๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์˜ _tryhard_์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@networkimprov ์ ์–ด๋„ gorm ์— ๋Œ€ํ•ด์„œ๋Š” ์ด๊ฒƒ์ด ์ตœ๊ทผ tryhard ์˜ ๊ฒฐ๊ณผ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "๋น„์‹œ๋„ ํ›„๋ณด"๋Š” ๋‹จ์ˆœํžˆ ์œ„์˜ ํ‘œ์— ๋ณด๊ณ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@daved ๋จผ์ €, ๋‚˜๋Š”/์šฐ๋ฆฌ๊ฐ€ ๋‹น์‹ ์˜ ๋ชฉ์†Œ๋ฆฌ๋ฅผ ํฌ๊ณ  ๋˜๋ ทํ•˜๊ฒŒ ๋“ฃ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•„์ง ์ดˆ๊ธฐ ๋‹จ๊ณ„์ด๊ณ  ๋งŽ์€ ๊ฒƒ์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์„ ์ ํ”„ํ•˜์ง€ ๋ง™์‹œ๋‹ค.

๋ฐ”๋‘‘์„ ๊ฐ€๋ฅด์น  ๋•Œ ์ข€ ๋” ๋ณด์ˆ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ ํƒํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•˜๊ณ  ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

@griesemer ์ฐธ๊ณ ๋กœ ์ œ๊ฐ€ ์ฐธ์—ฌํ•œ 233k ๋ผ์ธ์˜ ์ฝ”๋“œ์—์„œ ์ตœ์‹  ๋ฒ„์ „์˜ tryhard๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ์˜คํ”ˆ ์†Œ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

--- stats ---
   8760 (100.0% of    8760) functions (function literals are ignored)
   2942 ( 33.6% of    8760) functions returning an error
  22991 (100.0% of   22991) statements in functions returning an error
   5548 ( 24.1% of   22991) if statements
   2929 ( 52.8% of    5548) if <err> != nil statements
    163 (  5.6% of    2929) try candidates
      0 (  0.0% of    2929) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
   2213 ( 75.6% of    2929) { return ... zero values ..., expr }
    167 (  5.7% of    2929) single statement then branch
    253 (  8.6% of    2929) complex then branch; cannot use try
     14 (  0.5% of    2929) non-empty else branch; cannot use try

๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๊ด€์šฉ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 if err != nil {
     return ... zero values ..., errors.Wrap(err)
 }

tryhard ๊ฐ€ ํ•จ์ˆ˜์˜ ๋ชจ๋“  ํ‘œํ˜„์‹์ด ๋™์ผํ•œ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋•Œ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹จ์ผ ๊ณตํ†ต defer ์ฒ˜๋ฆฌ๊ธฐ๋กœ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์‚ฌ์šฉ์ž ๋ฐ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ์„ ์ž๋™ํ™”ํ•˜๋Š” ์ž‘์€ GCP ๋„์šฐ๋ฏธ ๋„๊ตฌ์— ๋Œ€ํ•œ ํ†ต๊ณ„์ž…๋‹ˆ๋‹ค.

$ tryhard -r .
--- stats ---
    129 (100.0% of     129) functions (function literals are ignored)
     75 ( 58.1% of     129) functions returning an error
    725 (100.0% of     725) statements in functions returning an error
    164 ( 22.6% of     725) if statements
     93 ( 56.7% of     164) if <err> != nil statements
     64 ( 68.8% of      93) try candidates
      0 (  0.0% of      93) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
     17 ( 18.3% of      93) { return ... zero values ..., expr }
      7 (  7.5% of      93) single statement then branch
      1 (  1.1% of      93) complex then branch; cannot use try
      0 (  0.0% of      93) non-empty else branch; cannot use try

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ณ„์†ํ•ด์„œ err ๋ณ€์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ์˜ ๋ชจ๋“  ์œ„์น˜๋ฅผ ํ™•์ธํ•˜์—ฌ ์˜๋ฏธ ์žˆ๋Š” ํŒจํ„ด์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

err ์ˆ˜์ง‘

๋ช‡ ๊ณณ์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ์˜ค๋ฅ˜์—์„œ ์‹คํ–‰์„ ์ค‘์ง€ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ์‹คํ–‰์ด ๋๋‚  ๋•Œ ํ•œ ๋ฒˆ ๋ฐœ์ƒํ•œ ๋ชจ๋“  ์˜ค๋ฅ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. try ์™€ ์ž˜ ํ†ตํ•ฉ๋˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๊ฑฐ๋‚˜ Go ์ž์ฒด์— ๋‹ค์ค‘ ์˜ค๋ฅ˜ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var errs []error
for _, p := range toDelete {
    fmt.Println("delete:", p.ProjectID)
    if err := s.DeleteProject(ctx, p.ProjectID); err != nil {
        errs = append(errs, err)
    }
}

์˜ค๋ฅ˜ ์žฅ์‹ ์ฑ…์ž„

์ด ๋Œ“๊ธ€ ์„ ๋‹ค์‹œ ์ฝ์€ ํ›„ ๊ฐ‘์ž๊ธฐ ๋งŽ์€ ์ž ์žฌ์ ์ธ try ์ผ€์ด์Šค๊ฐ€ ์ œ ์ฃผ์˜๋ฅผ ๋Œ์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์ด๋ฏธ ์˜ค๋ฅ˜์— ์ถ”๊ฐ€ํ–ˆ์„ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋กœ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ์˜ค๋ฅ˜๋ฅผ ์žฅ์‹ํ•œ๋‹ค๋Š” ์ ์—์„œ ๋ชจ๋‘ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

func run() error {
    key := "MY_ENV_VAR"
    client, err := ClientFromEnvironment(key)
    if err != nil {
        // "github.com/pkg/errors"
        return errors.Wrap(err, key)
    }
    // do something with `client`
}

func ClientFromEnvironment(key string) (*http.Client, error) {
    filename, ok := os.LookupEnv(key)
    if !ok {
        return nil, errors.New("environment variable not set")
    }
    return ClientFromFile(filename)
}

๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ์—ฌ๊ธฐ์—์„œ Go ๋ธ”๋กœ๊ทธ ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ๋‹ค์‹œ ์ธ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ๋ฅผ ์š”์•ฝํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜ ๊ตฌํ˜„์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค. os.Open์—์„œ ๋ฐ˜ํ™˜ํ•œ ์˜ค๋ฅ˜๋Š” "permission denied"๊ฐ€ ์•„๋‹ˆ๋ผ "open /etc/passwd: ๊ถŒํ•œ ๊ฑฐ๋ถ€๋จ" ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Sqrt์—์„œ ๋ฐ˜ํ™˜ํ•œ ์˜ค๋ฅ˜์—๋Š” ์ž˜๋ชป๋œ ์ธ์ˆ˜์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ์œ„์˜ ์ฝ”๋“œ๋Š” ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func run() error {
    key := "MY_ENV_VAR"
    client := try(ClientFromEnvironment(key))
    // do something with `client`
}

func ClientFromEnvironment(key string) (*http.Client, error) {
    filename, ok := os.LookupEnv(key)
    if !ok {
        return nil, fmt.Errorf("environment variable not set: %s", key)
    }
    return ClientFromFile(filename)
}

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

์ตœ์ข… ๋ฉ”๋ชจ

์ „๋ฐ˜์ ์œผ๋กœ try ๊ฐ€ ์žฅ๊ธฐ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฐ€์น˜๋Š” ํ˜„์žฌ ๋‚ด๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ณด๋‹ค ๋” ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. try ๊ฐ€ ์ œ์–ด ํ๋ฆ„์„ ๋ณ€๊ฒฝํ•จ์— ๋”ฐ๋ผ ํ‚ค์›Œ๋“œ๊ฐ€ "๋Š๋‚Œ"์ด ๋” ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. try ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ด์ƒ return err ์ผ€์ด์Šค์— ๋””๋ฒ„๊ทธ ์Šคํ† ํผ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

์—…๋ฐ์ดํŠธ

์ด์ „์— error ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋˜ ํ•จ์ˆ˜ ์„œ๋ช…์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. @magical ์ฐพ์•„์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

func main() {
    key := "MY_ENV_VAR"
    client := try(ClientFromEnvironment(key))
    // do something with `client`
}

@mrkanister Nitpicking , ํ•˜์ง€๋งŒ main ๊ฐ€ error ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ์˜ˆ์ œ์—์„œ๋Š” ์‹ค์ œ๋กœ try ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ๋Œ“๊ธ€์ž…๋‹ˆ๋‹ค.
์ •์› ๊ฐ€๊พธ๊ธฐ์™€ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด @griesemer ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค„์ด ๋งŽ์€ ๊ฒฝ์šฐ(https://github.com/golang/go/issues/32437#issuecomment-509974901):

if !ok {
    return nil, fmt.Errorf("environment variable not set: %s", key)
}

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

try(condErrorf(!ok, "environment variable not set: %s", key))

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

์ปดํŒฉํŠธ ํ•œ ์ค„์˜ ๊ฒฝ์šฐ

@zeebo ์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ํ•œ ์ค„ if ์ œ์•ˆ์— ์ถ”๊ฐ€ํ•˜์—ฌ if ๋ฌธ์€ != nil ๋ฐ ์ค‘๊ด„ํ˜ธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฐ„๊ฒฐํ•œ ํ˜•์‹์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

if err return err
if err return errors.Wrap(err, "foo: failed to boo")
if err return fmt.Errorf("foo: failed to boo: %v", err)

๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ€๋ณ๊ณ  ์ฝ๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. if ๋ฌธ์ด ์•”์‹œ์ ์œผ๋กœ nil(๋˜๋Š” ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค)์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๊ฐ’์„ ํ™•์ธํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. IMHO ์ด๊ฒƒ์€ ๋ฐ€๋„๋ฅผ ์ค„์—ฌ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋ฉฐ ๋™์ž‘์€ ๋งค์šฐ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  2. if variable return ... ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. return ๊ฐ€ ์™ผ์ชฝ์— ๋„ˆ๋ฌด ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ํ›‘์–ด๋ณด๊ธฐ๊ฐ€ ์—ฌ์ „ํžˆ ๋งค์šฐ ์‰ฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ํ•œ ์ค„ ifs(?) Go๋Š” ๋˜ํ•œ if ๋ฌธ์—์„œ ๊ด„ํ˜ธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๊ตฌ๋ฌธ์„ ๋‹จ์ˆœํ™”ํ•œ ์„ ๋ก€๋ฅผ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์Šคํƒ€์ผ:

a, err := BusinessLogic(state)
if err != nil {
   return nil, err
}

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ํ•œ ์ค„๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

a, err := BusinessLogic(state)
if err != nil { return nil, err }

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ํ•œ ์ค„ ์••์ถ•:

a, err := BusinessLogic(state)
if err return nil, err
a, err := BusinessLogic(state)
if err return nil, errors.Wrap(err, "some context")
func (c *Config) Build() error {
    pkgPath, err := c.load()
    if err return nil, errors.WithMessage(err, "load config dir")

    b := bytes.NewBuffer(nil)
    err = templates.ExecuteTemplate(b, "main", c)
    if err return nil, errors.WithMessage(err, "execute main template")

    buf, err := format.Source(b.Bytes())
    if err return nil, errors.WithMessage(err, "format main template")

    target := fmt.Sprintf("%s.go", filename(pkgPath))
    err = ioutil.WriteFile(target, buf, 0644)
    if err return nil, errors.WithMessagef(err, "write file %s", target)

    // ...
}

@eug48 #32611 ์ฐธ์กฐ

๋‹ค์Œ์€ monorepo์— ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ํ†ต๊ณ„์ž…๋‹ˆ๋‹ค(๊ณต๊ธ‰์—…์ฒด ์ฝ”๋“œ๋ฅผ ์ œ์™ธํ•œ go ์ฝ”๋“œ ์ค„: 2,282,731):

--- stats ---
 117551 (100.0% of  117551) functions (function literals are ignored)
  35726 ( 30.4% of  117551) functions returning an error
 263725 (100.0% of  263725) statements in functions returning an error
  50690 ( 19.2% of  263725) if statements
  25042 ( 49.4% of   50690) if <err> != nil statements
  12091 ( 48.3% of   25042) try candidates
     36 (  0.1% of   25042) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
   3561 ( 14.2% of   25042) { return ... zero values ..., expr }
   3304 ( 13.2% of   25042) single statement then branch
   4966 ( 19.8% of   25042) complex then branch; cannot use try
    296 (  1.2% of   25042) non-empty else branch; cannot use try

์‚ฌ๋žŒ๋“ค์ด ์—ฌ์ „ํžˆ ๋Œ€์•ˆ์„ ์ œ์•ˆํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋” ๊ด‘๋ฒ”์œ„ํ•œ Go ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ œ์•ˆ๋œ ์ƒˆ๋กœ์šด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์—์„œ ์‹ค์ œ๋กœ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋ฌด์—‡์ธ์ง€ ๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

์‚ฌ๋žŒ๋“ค์ด ์ฐธ์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ์ค„์ธ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

https://forms.gle/gaCBgxKRE4RMCz7c7

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

if err := os.Setenv("GO111MODULE", "on"); err != nil {
    return err
}

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

์•„, ๊ทธ๋ฆฌ๊ณ  try ์†Œ๊ฐœํ•ด์ฃผ์„ธ์š”. ์—ฌ๊ธฐ์—์„œ๋„ ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

--- stats ---
    929 (100.0% of     929) functions (function literals are ignored)
    230 ( 24.8% of     929) functions returning an error
   1480 (100.0% of    1480) statements in functions returning an error
    320 ( 21.6% of    1480) if statements
    206 ( 64.4% of     320) if <err> != nil statements
    109 ( 52.9% of     206) try candidates
      2 (  1.0% of     206) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
     53 ( 25.7% of     206) { return ... zero values ..., expr }
     18 (  8.7% of     206) single statement then branch
     17 (  8.3% of     206) complex then branch; cannot use try
      2 (  1.0% of     206) non-empty else branch; cannot use try

@lpar ๋Œ€์•ˆ ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ๋ฌธ์ œ์—์„œ๋Š” ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. try ์ œ์•ˆ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ์žฅ์†Œ๋Š” ์‹ค์ œ๋กœ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ(์˜ˆ: go-nuts) ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ ์ถ”์ ๊ธฐ๋Š” ์ผ๋ฐ˜์ ์ธ ํ† ๋ก ๋ณด๋‹ค ํŠน์ • ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ•˜๊ณ  ํ† ๋ก ํ•˜๋Š” ๋ฐ ์ •๋ง ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

@fabstu defer ํ•ธ๋“ค๋Ÿฌ๋Š” try ์œ ๋ฌด์— ๊ด€๊ณ„์—†์ด ๊ท€ํ•˜์˜ ์˜ˆ์ œ์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‘˜๋Ÿฌ์‹ธ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์ฝ”๋“œ ํ™•์žฅ:

func f() (err error) {
    defer func() {
       if err != nil {
          err = decorate(err, "msg") // here you can modify the result error as you please
       }
    }()
    ...
    if err := os.Setenv("GO111MODULE", "on"); err != nil {
        return err
    }
    ...
}

(๊ฒฐ๊ณผ err ๋Š” return err ์— ์˜ํ•ด ์„ค์ •๋˜๊ณ  return err #$๋Š” if - ์ด๊ฒƒ์€ ์ž‘๋™ ์ค‘์ธ ์ผ๋ฐ˜์ ์ธ ๋ฒ”์œ„ ์ง€์ • ๊ทœ์น™์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋˜๋Š” try ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ์ปฌ err ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

func f() (err error) {
    defer func() {
       if err != nil {
          err = decorate(err, "msg") // here you can modify the result error as you please
       }
    }()
    ...
    try(os.Setenv("GO111MODULE", "on"))
    ...
}

๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ์ œ์•ˆ๋œ errors/errd ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

func f() (err error) {
    defer errd.Wrap(&err, ... )
    ...
    try(os.Setenv("GO111MODULE", "on"))
    ...
}

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

func f() error {
    ...
    try(os.Setenv("GO111MODULE", "on"))
    ...
}

@fastu ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ try errors/errd ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func f() (err error) {
    defer errd.Wrap(&err, ... )
    ...
    if err := os.Setenv("GO111MODULE", "on"); err != nil {
        return err
    }
    ...
}

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

์–ด์จŒ๋“ , ๋‚ด ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ๊ทธ๋ ‡๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

func f() error {
  var err error
  defer errd.Wrap(&err,...)
  try(...)
}

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

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

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

์ฝ”๋“œ ์˜ˆ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ: try _always_๊ฐ€ _result error_(์ด ๊ฒฝ์šฐ ์ด๋ฆ„ ์—†์Œ)๋ฅผ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์ง€์—ญ ๋ณ€์ˆ˜ err ๋ฅผ ์„ ์–ธํ•˜๊ณ  ์žˆ๊ณ  errd.Wrap ๋Š” ๊ทธ ๋ณ€์ˆ˜์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. try ๋กœ ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ ๊ฒฝํ—˜ ๋ณด๊ณ ์„œ: ๋‹ค์Œ๊ณผ ๊ฐ™์€ HTTP ์š”์ฒญ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค.

func Handler(w http.ResponseWriter, r *http.Request) {
        ctx := r.Context()
        id := chi.URLParam(r, "id")

        var err error
        // starts as bad request, then it's an internal server error after we parse inputs
        var statusCode = http.StatusBadRequest

        defer func() {
            if err != nil {
                wrap := xerrors.Errorf("handler fail: %w", err)
                logger.With(zap.Error(wrap)).Error("error")
                http.Error(w, wrap.Error(), statusCode)
            }
        }()
        var c Thingie
        err = unmarshalBody(r, &c)
        if err != nil {
            return
        }
        statusCode = http.StatusInternalServerError
        s, err := DoThing(ctx, c)
        if err != nil {
            return
        }
        d, err := DoThingWithResult(ctx, id, s)
        if err != nil {
            return
        }
        data, err := json.Marshal(detail)
        if err != nil {
            return
        }
        w.Header().Set("Content-Type", "application/json")
        w.WriteHeader(http.StatusCreated)
        _, err = w.Write(data)
        if err != nil {
            return
        }
}

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

@jonbodner

์ด๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(https://play.golang.org/p/NaBZe-QShpu):

package main

import (
    "errors"
    "fmt"

    "golang.org/x/xerrors"
)

func main() {
    var err error
    defer func() {
        filterCheck(recover())
        if err != nil {
            wrap := xerrors.Errorf("app fail (at count %d): %w", ct, err)
            fmt.Println(wrap)
        }
    }()

    check(retNoErr())

    n, err := intNoErr()
    check(err)

    n, err = intErr()
    check(err)

    check(retNoErr())

    check(retErr())

    fmt.Println(n)
}

func check(err error) {
    if err != nil {
        panic(struct{}{})
    }
}

func filterCheck(r interface{}) {
    if r != nil {
        if _, ok := r.(struct{}); !ok {
            panic(r)
        }
    }
}

var ct int

func intNoErr() (int, error) {
    ct++
    return 0, nil
}

func retNoErr() error {
    ct++
    return nil
}

func intErr() (int, error) {
    ct++
    return 0, errors.New("oops")
}

func retErr() error {
    ct++
    return errors.New("oops")
}

์•„, ์ฒซ ๋ฒˆ์งธ ๋ฐ˜๋Œ€ ํˆฌํ‘œ! ์ข‹์€. ์‹ค์šฉ์ฃผ์˜๊ฐ€ ๋‹น์‹ ์„ ํ†ตํ•ด ํ๋ฅด๊ฒŒํ•˜์‹ญ์‹œ์˜ค.

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

์˜ˆ๋ฅผ ๋“ค์–ด ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func (a *App) GetFriendsOfUser(userId model.Id) ([]*model.User, SanitizedError) {
    if user, err := a.GetUserById(userId); err != nil {
        // (*App).GetUserById returns (*model.User, SanitizedError)
        // This could be a try() candidate.
        return err
    } else if user == nil {
        return NewUserError("The specified user doesn't exist.")
    }

    friends, err := a.Store.GetFriendsOfUser(userId)
    // (*Store).GetFriendsOfUser returns ([]*model.User, error)
    // This could be a SQL error or a network error or who knows what.
    return friends, NewInternalError(err)
}

๋‘˜๋Ÿฌ์‹ธ๋Š” ํ•จ์ˆ˜์™€ try ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ๋งˆ์ง€๋ง‰ ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋ชจ๋‘ ์˜ค๋ฅ˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋™์ผํ•œ ์œ ํ˜•์ธ ํ•œ ํ˜„์žฌ ์ œ์•ˆ์„ ์™„ํ™”ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ตฌ์ฒด์ ์ธ nil -> ์ธํ„ฐํŽ˜์ด์Šค ํ˜ผ๋™์„ ํ”ผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋Š” try๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jonbodner๋‹˜ , ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค(๋ฒˆ์—ญ ์˜ค๋ฅ˜์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ).

func Handler(w http.ResponseWriter, r *http.Request) {
    statusCode, err := internalHandler(w, r)
    if err != nil {
        wrap := xerrors.Errorf("handler fail: %w", err)
        logger.With(zap.Error(wrap)).Error("error")
        http.Error(w, wrap.Error(), statusCode)
    }
}

func internalHandler(w http.ResponseWriter, r *http.Request) (statusCode int, err error) {
    ctx := r.Context()
    id := chi.URLParam(r, "id")

    // starts as bad request, then it's an internal server error after we parse inputs
    statusCode = http.StatusBadRequest
    var c Thingie
    try(unmarshalBody(r, &c))

    statusCode = http.StatusInternalServerError
    s := try(DoThing(ctx, c))
    d := try(DoThingWithResult(ctx, id, s))
    data := try(json.Marshal(detail))

    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusCreated)
    try(w.Write(data))

    return
}

๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ํ›จ์”ฌ ๋” ์งง์Šต๋‹ˆ๋‹ค(29์ค„ ๋Œ€ 40์ค„). ๊ทธ๋ฆฌ๊ณ  ์ข‹์€ ๊ฐ„๊ฒฉ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ์—๋Š” defer ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ defer ๋Š” ๋‚ด๋ ค๊ฐ€๋ฉด์„œ defer ์—์„œ ์‚ฌ์šฉ๋˜๋Š” statusCode์™€ ํ•จ๊ป˜ ์›๋ณธ ์ฝ”๋“œ๋ฅผ ํ•„์š” ์ด์ƒ์œผ๋กœ ๋”ฐ๋ผ๊ฐ€๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ƒˆ ์ฝ”๋“œ๋Š” ๋ช…๋ช…๋œ ๊ฒฐ๊ณผ์™€ ๊ธฐ๋ณธ ๋ฐ˜ํ™˜์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ(์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ return statusCode, nil ๋กœ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ) "๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง"์—์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฌธ์ œ์— ๋‚ด ์˜๊ฒฌ์„ ๋‹ค์‹œ ๊ฒŒ์‹œํ•˜์‹ญ์‹œ์˜ค. https://github.com/golang/go/issues/32853#issuecomment -510340544

๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜ funcname ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์—ฌ์ „ํžˆ ์–ด๋–ค ํ•จ์ˆ˜์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

func foo() error {
    handler := func(err error, funcname string) error {
        return fmt.Errorf("%s: %v", funcname, err) // wrap something
        //return nil // or dismiss
    }

    a, b := try(bar1(), handler) 
    c, d := try(bar2(), handler) 
}

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

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

๊ทธ ๋ผ์ธ์„ ๋”ฐ๋ผ, ์šฐ๋ฆฌ๋Š” ์ดˆ๊ธฐ์— try ๊ฐ€ ์ผ๋ฐ˜ํ™”๋˜์–ด error ์œ ํ˜•๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์œ ํ˜•์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ–ˆ๊ณ  err != nil ํ…Œ์ŠคํŠธ๋Š” ๊ทธ๋Ÿฌ๋ฉด x != zero ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ x ๋Š” err (๋งˆ์ง€๋ง‰ ๊ฒฐ๊ณผ)์— ํ•ด๋‹นํ•˜๊ณ  zero ๋Š” x ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฐ๊ฐ์˜ 0 ๊ฐ’์ž…๋‹ˆ๋‹ค. bool ์˜ 0 ๊ฐ’์ด false ์ด๊ณ  ok != false ๊ฐ€ ์ •ํ™•ํžˆ ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.

@lunny ์ œ์•ˆ๋œ try ๋ฒ„์ „์€ ํ•ธ๋“ค๋Ÿฌ ๊ธฐ๋Šฅ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@griesemer ์˜ค. ์•ˆํƒ€๊นŒ์›Œ ๋ผ! ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด github.com/pkg/errors ๋ฐ ๋ชจ๋“  errors.Wrap ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@griesemer ๋Œ€์‹  error ๋ฅผ ๋‘˜๋Ÿฌ์‹ธ๋Š” ํ•จ์ˆ˜์— ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ฐ ์˜ค๋ฅ˜๋ฅผ ๋‚ด๋ถ€ ์˜ค๋ฅ˜, ์‚ฌ์šฉ์ž ์˜ค๋ฅ˜, ๊ถŒํ•œ ๋ถ€์—ฌ ์˜ค๋ฅ˜ ๋“ฑ์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ฅผ ํฌ์ฐฉํ•˜๊ณ  try ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

try ์˜ ๋””์ž์ธ์ด ๋งˆ์Œ์— ๋“ ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์ง€๋งŒ try ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ defer ํ•ธ๋“ค๋Ÿฌ์— if ๋ฌธ์ด ์—ฌ์ „ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค. try ๋ฐ defer ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์—†๋Š” $ if ๋ช…๋ น๋ฌธ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ try ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ccbrown ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ์ด์ผœ๋ณด๋ฉด, ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ํœด์‹์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ ํ…Œ์ŠคํŠธ๊ฐ€ x != nil ๋กœ ์œ ์ง€๋˜๋Š” ํ•œ error ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•(๋ฐ ์ผ์น˜ํ•˜๋Š” ๊ฒฐ๊ณผ ์œ ํ˜•)๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก try ๋ฅผ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. . ์ƒ๊ฐํ•ด ๋ณผ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋ฏฟ๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ณ€๊ฒฝ์ด ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ธฐ์— ๋˜๋Š” ์†Œ๊ธ‰ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jonbodner ์˜ˆ์ œ ์™€ @griesemer ๊ฐ€ ๋‹ค์‹œ ์ž‘์„ฑํ•œ ๋ฐฉ์‹์€ ์ •ํ™•ํžˆ ์ œ๊ฐ€ try ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค.

์•„๋ฌด๋„ ์ด๋Ÿฐ ์œ ํ˜•์˜ ์‹œ๋„๋ฅผ ๊ท€์ฐฎ๊ฒŒ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

๋ฐ์ดํ„ฐ := try(json.Marshal(detail))

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

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

@trende-jp ์ €๋Š” ์ด ์ฝ”๋“œ ๋ผ์ธ์˜ ์ปจํ…์ŠคํŠธ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๋กœ๋Š” ์˜๋ฏธ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด json.Marshal ์— ๋Œ€ํ•œ ์œ ์ผํ•œ ํ˜ธ์ถœ์ด๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋Š˜๋ฆฌ๋ ค๋ฉด if ๋ฌธ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. json.Marshal ํ˜ธ์ถœ์ด ๋งŽ์€ ๊ฒฝ์šฐ $#$3 defer #$ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋กœ์ปฌ ํด๋กœ์ € ๋‚ด๋ถ€์— ์ด๋Ÿฌํ•œ ๋ชจ๋“  ํ˜ธ์ถœ์„ ๋ž˜ํ•‘ํ•จ์œผ๋กœ์จ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ(์ฆ‰, ๋™์ผํ•œ ํ•จ์ˆ˜์— ์ด๋Ÿฌํ•œ ํ˜ธ์ถœ์ด ๋งŽ์€ ๊ฒฝ์šฐ) ์ด๋ฅผ ์ธ์ˆ˜๋ถ„ํ•ดํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. "์˜ค๋ฅ˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค"๋Š” ์—ฌ๊ธฐ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.

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

@trende-jp

defer ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‚˜์š”?

defer fmt.HandleErrorf(&err, "decoding %q", path)

๋‚ด ๋ธ”๋กœ๊ทธ: How to use 'try' ์— ๋‚˜์™€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ์ค„ ๋ฒˆํ˜ธ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@trende-jp @faiface ์ค„ ๋ฒˆํ˜ธ ์™ธ์—๋„ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋ฌธ์ž์—ด์„ ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‹คํŒจํ•œ ํŠน์ • ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๊ฒฉ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

panic() ๋ฐ recover() ๋„ ์ œ์–ด ํ๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ช‡ ๋ฒˆ ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์ถ”๊ฐ€ํ•˜์ง€ ๋ง™์‹œ๋‹ค.

@networkimprov ๋Š” https://github.com/golang/go/issues/32437#issuecomment -498960081์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ Go์ฒ˜๋Ÿผ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋” ๋™์˜ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

์–ด๋–ค ๊ฒƒ์ด๋“  ๊ทผ๋ณธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ). ํ‚ค์›Œ๋“œ(๋˜๋Š” ํ‚ค ๊ธฐํ˜ธ ?)์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

go func() ๊ฐ€ go(func()) ์ด๋ฉด ์–ด๋–ค ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๊นŒ ?

try ํ•จ์ˆ˜ ๋Œ€์‹  bang(!)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๊ธฐ๋Šฅ ์ฒด์ธ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

func foo() {
    f := os.Open!("")
    defer f.Close()
    // etc
}

func bar() {
    count := mustErr!().Read!()
}

@sylr

go func() ๊ฐ€ go(func()) ๊ฐ€ ๋œ๋‹ค๋ฉด ์–ด๋–จ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

์ž, ๊ทธ๊ฒƒ์€ ๊ฝค ๋ฐ›์•„ ๋“ค์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@sylr ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋Œ€์ฒด ์ œ์•ˆ์„ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง‘์ค‘ ์œ ์ง€์— ๋Œ€ํ•ด์„œ๋„ ์ฐธ์กฐ ํ•˜์‹ญ์‹œ์˜ค.

๊ท€ํ•˜์˜ ์˜๊ฒฌ ์— ๊ด€ํ•˜์—ฌ : Go๋Š” ์‹ค์šฉ์ ์ธ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋‚ด์žฅ๋œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‹ค์šฉ์ ์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ๋””์ž์ธ ๋ฌธ์„œ ์—์„œ ๊ธธ๊ฒŒ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ช‡ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. try ๋Š” $#$2 append #$์™€ ๊ฐ™์ด Go์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ๋‹ค๋ฅธ Go ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋Š” go ์™€ ๋Œ€์กฐ์ ์œผ๋กœ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์— ๋Œ€ํ•œ ๋‹จ์ˆœํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์ž…๋‹ˆ๋‹ค. , copy ๋“ฑ. ๋‚ด์žฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

(ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ „์— ๋งํ–ˆ๋“ฏ์ด _that_์ด try ๊ฐ€ ํ—ˆ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ์œ ์ผํ•œ ๊ฒƒ์ด๋ผ๋ฉด, ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ํ‚ค์›Œ๋“œ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

๋‚˜๋Š” ๋‚ด ์ž์‹ ์˜ ์ฝ”๋“œ ์กฐ๊ฐ๊ณผ try ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€ ๊ณฐ๊ณฐ์ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

slurp, err := ioutil.ReadFile(path)
if err != nil {
    return err
}
return ioutil.WriteFile(path, append(copyrightText, slurp...), 0666)

๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

return ioutil.WriteFile(path, append(copyrightText, try(ioutil.ReadFile(path))...), 0666)

์ด๊ฒƒ์ด ๋” ๋‚˜์€์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๊ทธ๊ฒƒ์— ์ต์ˆ™ํ•ด์ง€๋Š” ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@gbbr ์—ฌ๊ธฐ์—์„œ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

slurp := try(ioutil.ReadFile(path))
return ioutil.WriteFile(path, append(copyrightText, slurp...), 0666)

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

@griesemer ์ด ์˜ˆ์ œ๋Š” ์‹œ๋„ํ•˜๋Š” _is_ ๊ณ ์œ ํ•œ ๊ฒƒ์œผ๋กœ, ์˜ค๋Š˜ ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ค‘์ฒฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ œ์–ด ํ๋ฆ„์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. https://github.com/golang/go/issues/32825#issuecomment -507099786 / https://github.com/golang/go/issues/32825#issuecomment -507136111์—์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹ต๋ณ€ https://github.com/golang/go/issues/32825#issuecomment -507358397. ๋‚˜์ค‘์— ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ https://github.com/golang/go/issues/32825#issuecomment -508813236 ๋ฐ https://github.com/golang/go/issues/32825#issuecomment -508937177์—์„œ ๋‹ค์‹œ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ง„์ˆ ํ•˜๋Š” ๊ฒƒ :

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๊ฐ€ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์—"๊ฐ€ ์••๋„์ ์ธ ์ด์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋ฅผ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

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

package main
import "fmt"
func dopanic(b bool) int { if b { panic("panic") }; return 1 }
type bar struct { a, b, d int; b *bar }
func main() {
    fmt.Println(&bar{
        a: 1,
        c: 1,
        d: 1,
        b: &bar{
            a: 1,
            c: 1,
            d: dopanic(true) + dopanic(false),
        },
    })
}

์ฒซ ๋ฒˆ์งธ ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ๋Š” ์™ผ์ชฝ ๋„ํŒŒ๋‹‰์—์„œ ์‹คํŒจํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ๋Š” ์˜ค๋ฅธ์ชฝ์—์„œ ์‹คํŒจํ•˜์ง€๋งŒ ๋‘˜ ๋‹ค ๋™์ผํ•œ ์Šคํƒ ์ถ”์ ์„ ์ธ์‡„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์ฃผ๋ชฉํ•˜์„ธ์š”.
https://play.golang.org/p/SYS1r4hBS7O
https://play.golang.org/p/YMKkflcQuav

panic: panic

goroutine 1 [running]:
main.dopanic(...)
    /tmp/sandbox709874298/prog.go:7
main.main()
    /tmp/sandbox709874298/prog.go:27 +0x40

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

1) ์œ„์˜ ์ •๋ณด๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ์Šคํƒ ์ถ”์ ์— ์–ด๋–ค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•  ๊ณ„ํš์ž…๋‹ˆ๊นŒ(์žˆ๋Š” ๊ฒฝ์šฐ) ๋‚ด ์ฝ”๋“œ๊ฐ€ ์–ด๋””์—์„œ ์‹คํŒจํ–ˆ๋Š”์ง€ ์—ฌ์ „ํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

2) ์‹œ๋„ ์ค‘์ฒฉ์ด ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ—ˆ์šฉ๋ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ค‘์ฒฉ ์‹œ๋„์˜ ์ด์ ์€ ๋ฌด์—‡์ด๋ฉฐ ๋‚จ์šฉ์„ ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ์ตœ์ƒ์˜/๊ฐ€์žฅ ์—„๊ฒฉํ•œ ์‚ฌ์šฉ ์˜ˆ๋งŒ ์–ป๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋“ค์ด ์ฝ”๋“œ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ •๋ณด์— ์ž…๊ฐํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ์ค‘์ฒฉ๋œ ์‹œ๋„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก tryhard๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์–ด๋–ค ์œ ํ˜•์˜ vet ์ œํ•œ์ด ๋ถ€๊ณผ๋  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ˆ˜์˜์‚ฌ๊ฐ€ ๋ถˆํ•ฉ๋ฆฌํ•œ ์‹œ๋„์— ๋Œ€ํ•œ ๋ฐฉ์–ด๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์‹คํ˜„๋ ๊นŒ์š”?

3) ๊ตฌํ˜„์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์ฒฉ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์€ Go๊ฐ€ ์ถœ์‹œ๋œ ์ดํ›„ ๊ฐ€์žฅ ๋ˆˆ์— ๋„๋Š” ์–ธ์–ด ๋ณ€ํ™”์— ๋Œ€ํ•œ ๋งค์šฐ ์•ฝํ•œ ์ฃผ์žฅ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ด ๋ณ€๊ฒฝ์€ ์ค‘์ฒฉ ์‹œ๋„์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ๊ณ ๋ ค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ๋•Œ๋งˆ๋‹ค ์–ด๋”˜๊ฐ€์—์„œ ์ƒˆ๋กœ์šด ๊ณ ํ†ต์ ์ด ๋‚˜ํƒ€๋‚  ๋•Œ๋งˆ๋‹ค ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์•ผ์ƒ์—์„œ ๋ฐํ˜€์งˆ ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ์ž ์žฌ์ ์ธ ๋ถ€์ •์ ์ธ ์ ์ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งค์šฐ ๊ฑฑ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ค‘์ฒฉ์€ https://github.com/golang/go/issues/32825#issuecomment -506882164์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์˜ค๋Š˜๋‚ ์—๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‰ฝ๊ฒŒ ๋ˆ„์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. "์ˆ˜์˜์‚ฌ" ์ด์•ผ๊ธฐ๊ฐ€ ์—ฌ๊ธฐ์— ์ œ๊ณต๋œ ์œ ํ•ดํ•œ try() ์˜ˆ์ œ์— ๋Œ€ํ•œ ๋ฐฉ์–ด๋กœ ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ๊ตฌํ˜„์—์„œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์˜ค๋ฅ˜๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ํ›จ์”ฌ ๋” ๊ตฌ์ฒด์ ์ธ ๊ณ„ํš์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์ธ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ์ด์™ธ์˜ ์‚ฌ์šฉ์„ ์œ„ํ•ด.

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

์•„๋‡จ, ์ด '๋งˆ๋ฒ•'์„ ์–ธ์–ด์— ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ์„ธ์š”.
์ด๊ฒƒ๋“ค์€ ๋‚˜๋จธ์ง€ ์–ธ์–ด์™€ ๊ฐ™์€ ๋ชจ์–‘๊ณผ ๋Š๋‚Œ์ด ์•„๋‹™๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๋ฏธ ์ด์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์–ด๋””์—์„œ๋‚˜ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

a, b := try( f() )
if a != 0 && b != "" {
...
}
...

๋Œ€์‹ ์—

a,b,err := f()
if err != nil {
...
}
...

๋˜๋Š”

a,b,_:= f()

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

๋‚˜๋Š” ์‹ฌ์ง€์–ด vbscript์—์„œ ๋‚ด ์Šต๊ด€์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

on error resume next
a = f()
if er.number <> 0 then
    ...
end if
...

๋‚˜๋Š” ์ด ์ œ์•ˆ์„ ์ข‹์•„ํ•œ๋‹ค

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

100% ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ a) ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  b) ๋งŽ์€ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ๋ฐ ๊ธฐํƒ€ ๋ฌธ์ œ๋ฅผ ๊ณ ๋ คํ•˜๋ฉด์„œ ํ•ด๊ฒฐํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์•ฝ๊ฐ„์˜ '๋งˆ๋ฒ•'์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ defer ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ํ‚ค์›Œ๋“œ ๋Œ€ ๋‚ด์žฅ์ด๋ฉฐ ์—ฌ๊ธฐ์—์„œ ํ‚ค์›Œ๋“œ๋ฅผ ํ”ผํ•˜๋Š” ์„ ํƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

try() ์ œ์•ˆ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ค‘์š”ํ•œ ํ”ผ๋“œ๋ฐฑ์ด ์ด๋ฏธ ํ‘œ๋ช…๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์š”์•ฝํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1) try()๋Š” ์ˆ˜์ง ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ์ˆ˜ํ‰์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
2) ์ค‘์ฒฉ๋œ try() ํ˜ธ์ถœ์€ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ๋งŒํผ ์ฝ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
3) ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ๋ณ„๋˜์ง€ ์•Š๋Š” ๋ณด์ด์ง€ ์•Š๋Š” '๋ฆฌํ„ด' ์ œ์–ด ํ๋ฆ„ ๋„์ž…( return ํ‚ค์›Œ๋“œ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋“ค์—ฌ์“ฐ๊ธฐ ๋ธ”๋ก๊ณผ ๋น„๊ต)
4) ์˜ค๋ฅ˜ ๋ž˜ํ•‘ ๊ด€ํ–‰์„ ์•…ํ™”์‹œํ‚ต๋‹ˆ๋‹ค(ํŠน์ • ์ž‘์—… ๋Œ€์‹  ๊ธฐ๋Šฅ ์ปจํ…์ŠคํŠธ).
5) #golang ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฐ ์ฝ”๋“œ ์Šคํƒ€์ผ ๋ถ„ํ• (anti-gofmt)
6) ๊ฐœ๋ฐœ์ž๊ฐ€ try()๋ฅผ if-err-nil๋กœ ๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€๋กœ ์ž์ฃผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค(tryhard ๋Œ€ ์ •๋ฆฌ ๋…ผ๋ฆฌ ์ถ”๊ฐ€/์ถ”๊ฐ€ ๋กœ๊ทธ/๋” ๋‚˜์€ ์˜ค๋ฅ˜ ์ปจํ…์ŠคํŠธ)

@VojtechVitek ๋‚˜๋Š” ๋‹น์‹ ์ด ๋งŒ๋“  ์š”์ ์ด ์ฃผ๊ด€์ ์ด๋ฉฐ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์ง„์ง€ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ํ›„์—๋งŒ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์ด ๋…ผ์˜๋˜์ง€ ์•Š์€ ํ•œ ๊ฐ€์ง€ ๊ธฐ์ˆ ์  ์š”์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. defer ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ธ๋ผ์ธํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜ ๋ž˜ํ•‘/์žฅ์‹์— defer ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์€ defer ์ž์ฒด์˜ ๋‹จ์ˆœํ•œ ๋น„์šฉ์„ ๋„˜์–ด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

์ฆ‰, ์˜ค๋ฅ˜ ๋ž˜ํ•‘๊ณผ ํ•จ๊ป˜ try ๋ฅผ ์ฑ„ํƒํ•˜๋ฉด err != nil ๊ฒ€์‚ฌ ์งํ›„ ๋ž˜ํ•‘๋œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ ๋‘ ๊ฐ€์ง€ ์ž ์žฌ์ ์ธ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  1. ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ๋ชจ๋“  ๊ฒฝ๋กœ(์„ฑ๊ณต์ ์ธ ๊ฒฝ๋กœ ํฌํ•จ)์— ๋Œ€ํ•ด ์—ฐ๊ธฐ
  2. ์ธ๋ผ์ธ ์†์‹ค

defer ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ธ์ƒ์ ์ธ ํ–ฅํ›„ ์„ฑ๋Šฅ ๊ฐœ์„  ์‚ฌํ•ญ์ด ์žˆ์ง€๋งŒ ๋น„์šฉ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹0์ด ์•„๋‹™๋‹ˆ๋‹ค.

try ๋Š” ๋งŽ์€ ์ž ์žฌ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ Go ํŒ€์ด defer ๋ฅผ ํ†ตํ•ด ์„ ์ œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์‹คํŒจ ์ง€์ ์—์„œ ์ผ์ข…์˜ ๋ž˜ํ•‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋””์ž์ธ์„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

์ˆ˜์˜์‚ฌ" ์ด์•ผ๊ธฐ๋Š” ํ›จ์”ฌ ๋” ๊ตฌ์ฒด์ ์ธ ๊ณ„ํš์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

์ˆ˜์˜์‚ฌ ์ด์•ผ๊ธฐ๋Š” ๋™ํ™”์ž…๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ์œ ํ˜•์—์„œ๋งŒ ์ž‘๋™ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์—์„œ๋Š” ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

์ด์™€ ๊ฐ™์€ ์ œ์•ˆ์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ์˜๋ฏธ, ์ ˆ์ถฉ์•ˆ ๋ฐ ์ง„ํ–‰ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ปค๋ฎค๋‹ˆํ‹ฐ ์ „์ฒด์— ํ† ๋ก ์„ ํ•˜๊ณ , ๊ทธ ํ† ๋ก ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ž์œผ๋กœ์˜ ๊ธธ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์••๋„์ ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฐ˜์‘๊ณผ ์—ฌ๊ธฐ์—์„œ์˜ ๊ด‘๋ฒ”์œ„ํ•œ ํ† ๋ก ์„ ๋ฐ”ํƒ•์œผ๋กœ, ์šฐ๋ฆฌ๋Š” ์ด ์ œ์•ˆ์ด ์˜ˆ์ •๋ณด๋‹ค ๋นจ๋ฆฌ ๊ฑฐ์ ˆ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ํ”ผ๋“œ๋ฐฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด ํ† ๋ก ์—์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋†“์นœ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ, ํŠนํžˆ ๋””๋ฒ„๊น… ์ธ์‡„ ์ถ”๊ฐ€ ๋ฐ ์ฝ”๋“œ ์ ์šฉ ๋ฒ”์œ„ ๋ถ„์„์— ๋Œ€ํ•œ ์˜๋ฏธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋” ์ค‘์š”ํ•œ ๊ฒƒ์€, ์šฐ๋ฆฌ๋Š” ์ด ์ œ์•ˆ์ด ๊ฐ€์น˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒจ๋ƒฅํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์„ ๋ถ„๋ช…ํžˆ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ Go์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฒฝํ•˜์ง€ ์•Š๊ณ  ์˜๋ฏธ ์žˆ๊ฒŒ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์ปค๋ฎค๋‹ˆํ‹ฐ๋กœ์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ํŠน์ • ์ธก๋ฉด์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์ด์•ผ๊ธฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ๋งŒํผ ์ง€๋‚œ 8์›” " Go 2 ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฌธ์ œ ๊ฐœ์š” "์—์„œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋น„์ „์„ ์ œ์‹œํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ๋Œ์ด์ผœ๋ณด๋ฉด ๊ทธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ๊ด€์‹ฌ์„ ๊ธฐ์šธ์ด์ง€ ์•Š์•˜๊ณ  ์ถฉ๋ถ„ํžˆ ์žฅ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํŠน์ • ๋ฌธ์ œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋ฌธ์ œ์ธ์ง€์— ๋Œ€ํ•œ ํ† ๋ก . try ์ œ์•ˆ์€ ๊ฑฐ๊ธฐ์— ์„ค๋ช…๋œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ํ•ด๊ฒฐ์ฑ…์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋‹จ์ˆœํžˆ ํ•ด๊ฒฐํ•  ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์ดˆ๊ธฐ ๋ฌธ์ œ ์ง„์ˆ ์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๊ณ  ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ๋™์˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์—…์„ ๋” ์ž˜ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(๊ฐ™์€ ๋‚  ์ œ๋„ค๋ฆญ ๋””์ž์ธ ๋“œ๋ž˜ํ”„ํŠธ๋ฅผ ๊ณต๊ฐœํ•˜์—ฌ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฌธ์ œ ์„ค๋ช…์„ ์™„์ „ํžˆ ์—…์Šคํ…Œ์ด์ง•ํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.)

Go ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ๊ฐœ์„ ํ•ด์•ผ ํ•  ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ์ฃผ์ œ์—์„œ Go์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ธก๋ฉด์ด ๊ท€ํ•˜์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฐ ์ž‘์—… ํ™˜๊ฒฝ์—์„œ ๊ฐ€์žฅ ๋ฌธ์ œ๊ฐ€ ๋˜๊ณ  ์ข‹์€ ์†”๋ฃจ์…˜์ด ์–ผ๋งˆ๋‚˜ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒฝํ—˜ ๋ณด๊ณ ์„œ๋ฅผ ๋ณด๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์ž์‹ ์˜ ๋ฐœ์ „์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ Go2ErrorHandlingFeedback ํŽ˜์ด์ง€ ์— ๋งํฌ๋ฅผ ๊ฒŒ์‹œํ•˜์‹ญ์‹œ์˜ค.

์—ฌ๊ธฐ์™€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ด ํ† ๋ก ์— ์ฐธ์—ฌํ•ด ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. Russ Cox๊ฐ€ ์ด์ „์— ์ง€์ ํ–ˆ๋“ฏ์ด ์ด์™€ ๊ฐ™์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ „์ฒด ํ† ๋ก ์€ ์ตœ๊ณ ์˜ ์˜คํ”ˆ ์†Œ์Šค ์ž…๋‹ˆ๋‹ค. ์ด ํŠน์ • ์ œ์•ˆ์„ ๊ฒ€ํ† ํ•˜๊ณ  ๋” ์ผ๋ฐ˜์ ์œผ๋กœ Go์—์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ƒํƒœ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์„ ๋…ผ์˜ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ œ์•ˆ ๊ฒ€ํ†  ์œ„์›ํšŒ์˜ ๋กœ๋ฒ„ํŠธ ๊ทธ๋ฆฌ์ฆˆ๋จธ(Robert Griesemer).

์‹œ๋„ ์ œ์•ˆ์— ๋“ค์–ด๊ฐ„ ์ž‘์—…์— ๋Œ€ํ•ด Go Team์—๊ฒŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ์œ„ํ•ด ๊ณ ๊ตฐ๋ถ„ํˆฌํ•˜๊ณ  ๋Œ€์•ˆ์„ ์ œ์•ˆํ•œ ๋…ผํ‰์ž์—๊ฒŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์€ ์Šค์Šค๋กœ ๋ชฉ์ˆจ์„ ์•—์•„๊ฐ‘๋‹ˆ๋‹ค. ๊ฒฝ์ฒญํ•ด์ฃผ์‹œ๊ณ  ์ ์ ˆํ•˜๊ฒŒ ๋Œ€์‘ํ•ด์ฃผ์‹  Go Team์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์•ผ!

์ตœ์„ ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

Go์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋ฌธ์ œ ๋ฐ ๋ถ€์ •์ ์ธ ๊ฒฝํ—˜์˜ ๋ชฉ๋ก์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ,
๋‚˜์™€ ํŒ€์€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ xerrors.As, xerrors.Is ๋ฐ xerrors.Errorf์— ๋งค์šฐ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์™„์ „ํžˆ ์ˆ˜์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋†€๋ผ์šด ๋ฐฉ์‹์œผ๋กœ ์™„์ „ํžˆ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ฌธ์ œ๋‚˜ ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@griesemer ๋‹น์‹ ์˜ ์ธ๋‚ด์™€ ๋…ธ๋ ฅ์— ๋Œ€ํ•ด (๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๋‹น์‹ ๊ณผ ํ•จ๊ป˜ ์ผํ•œ ๋งŽ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ) ๊ฐ์‚ฌํ•˜๋‹ค๋Š” ๋ง์„ ์ „ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€!

@griesemer ๋ชจ๋“  ํ”ผ๋“œ๋ฐฑ์„ ๋Š์ž„์—†์ด ๊ฒฝ์ฒญํ•˜๊ณ  ์šฐ๋ฆฌ์˜ ๋‹ค์–‘ํ•œ ์˜๊ฒฌ์„ ์ฐธ์•„์ฃผ์‹  Go ํŒ€์˜ ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ง€๊ธˆ์ด ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ๋ฏธ๋ž˜์˜ ์ผ๋“ค๋กœ ๋„˜์–ด๊ฐ€๊ธฐ์— ์ข‹์€ ์‹œ๊ฐ„์ด ์•„๋‹๊นŒ์š”?

@griesemer @rsc ๋ฐ @all , ๋ฉ‹์ง€๋„ค์š”. ๋ชจ๋‘ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ํ›Œ๋ฅญํ•œ ํ† ๋ก /์‹๋ณ„/๋ช…๋ฃŒํ™”์ž…๋‹ˆ๋‹ค. go์˜ '์˜ค๋ฅ˜' ๋ฌธ์ œ์™€ ๊ฐ™์€ ์ผ๋ถ€ ๋ถ€๋ถ„์˜ ๊ฐœ์„ ์€ ๋จผ์ € ํ•ต์‹ฌ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„/๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋” ์—ด๋ฆฐ ํ† ๋ก (์ œ์•ˆ ๋ฐ ์˜๊ฒฌ์—์„œ ...)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ps. ํ˜„์žฌ๋กœ์„œ๋Š” x/xerrors๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค.

(์ด ์Šค๋ ˆ๋“œ๋„ ์ž ๊ทธ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค...)

์ด์— ์ฐธ์—ฌํ•ด ์ฃผ์‹  ํŒ€๊ณผ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Go์— ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ฒ˜์Œ์— ์‹œ๋„ ์ œ์•ˆ์— ๋“ค์–ด๊ฐ„ ๋…ธ๋ ฅ๊ณผ ๊ธฐ์ˆ ์„ ๋จผ์ € ๋ณด๊ณ  ์ด ๊ฒฐ์ •์— ๋„๋‹ฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ ์ฐธ์—ฌ ์ •์‹ ์„ ๋ณด์•˜์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ํŠนํžˆ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๊ธ์ •์ ์ธ ํƒœ๋„๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฐ”๋‘‘์˜ ๋ฏธ๋ž˜๋Š” ๋งค์šฐ ๋ฐ์Šต๋‹ˆ๋‹ค.

func M() (๋ฐ์ดํ„ฐ, ์˜ค๋ฅ˜){
a, err1 := A()
b, err2 := B()
๋ฐ˜ํ™˜ b, nil
} => (err1 != nil์ธ ๊ฒฝ์šฐ){ return a, err1}.
(err2 != nil์ธ ๊ฒฝ์šฐ){ b๋ฅผ ๋ฐ˜ํ™˜, err2}

์ข‹์•„์š”... ์ด ์ œ์•ˆ์ด ๋งˆ์Œ์— ๋“ค์—ˆ์ง€๋งŒ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ Go ํŒ€์ด ๋ฐ˜์‘ํ•˜๊ณ  ๊ฑด์„ค์ ์ธ ํ† ๋ก ์— ์ฐธ์—ฌํ•˜๋Š” ๋ฐฉ์‹์ด ๋งˆ์Œ์— ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๋‹ค์†Œ ๊ฑฐ์น ์—ˆ์ง€๋งŒ.

์ด ๊ฒฐ๊ณผ์™€ ๊ด€๋ จํ•˜์—ฌ 2๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
1/ "์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ"๋Š” ์—ฌ์ „ํžˆ ์—ฐ๊ตฌ ์˜์—ญ์ž…๋‹ˆ๊นŒ?
2/ ๊ฐœ์„  ์—ฐ๊ธฐ์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‹ค์‹œ ์ง€์ •๋ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ Go ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ์–ธ์–ด ๋ณ€๊ฒฝ ์ œ์•ˆ์„ ๋“ฃ๊ณ  ํ† ๋ก ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ฆ๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด๋กœ ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๊ฐœ์„  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์— ๋Œ€ํ•œ ๋…ธ๊ณ ์™€ ๋ฌธ๋ช…ํ™”๋œ ํ† ๋ก ์— ๋Œ€ํ•ด Go ํŒ€๊ณผ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

ํ›Œ๋ฅญํ•œ!

๊ต‰์žฅํ•˜๋‹ค, ๊ฝค ๋„์›€์ด ๋œ๋‹ค

์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ๋ฐ”๋‘‘์— ๋„ˆ๋ฌด ์ง‘์ฐฉํ–ˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ์š”์ ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
Russ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋‹จ์ˆœํžˆ
๋จธ๋ฆฌ ์—†๋Š” ๋‹ญ, ๊ทธ๊ฒƒ์€ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•  ํž˜์ž…๋‹ˆ๋‹ค.
์ž์‹ ์˜ ์ด์ต์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Go ํŒ€์ด ์ œ๊ณตํ•˜๋Š” ์กฐ์ • ๋•๋ถ„์— ์šฐ๋ฆฌ๋Š”
์šฐ๋ฆฌ๊ฐ€ ํ•จ๊ป˜ ์‚ด ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ•œ ๊ฒƒ์„ ๋ชจ๋‘ ์ž๋ž‘์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์กฐ๊ฑด์ด ๋” ๋ฌด๋ฅด์ต์œผ๋ฉด ์˜์‹ฌํ•  ์—ฌ์ง€ ์—†์ด ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋Š๋ผ๋Š” ๊ณ ํ†ต์ด ๋ฏธ๋ž˜์— ์šฐ๋ฆฌ์—๊ฒŒ ์ž˜ ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
(๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์Šฌํ”„์ง€ ์•Š์„๊นŒ์š”?).

๋ฃจ์‹œ์˜ค.

๋‚˜๋Š” ๊ทธ ๊ฒฐ์ •์— ๋™์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๋ฐ”๋‘‘ ํŒ€์ด ์ทจํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ ˆ๋Œ€์ ์œผ๋กœ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ ์ „์ฒด์—์„œ ํ† ๋ก ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž์˜ ํ”ผ๋“œ๋ฐฑ์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์˜คํ”ˆ ์†Œ์Šค์˜ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

์ตœ์ ํ™” ์—ฐ๊ธฐ๋„ ๋‚˜์˜ฌ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜ค๋ฅ˜์™€ xerrors๋ฅผ ํ•จ๊ป˜ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š”๋ฐ ์ง€๊ธˆ ๋‹น์žฅ์€ ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค.

@pierrec ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ์–ด๋–ค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์œ ์šฉํ• ์ง€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๊ฐ’ ๋ณ€๊ฒฝ ์ค‘ ์ผ๋ถ€๋Š” ํ–ฅํ›„ 1.13 ๋ฆด๋ฆฌ์Šค(https://tip.golang.org/doc/go1.13#errors)์— ํฌํ•จ๋  ์˜ˆ์ •์ด๋ฉฐ ์ด์— ๋Œ€ํ•œ ๊ฒฝํ—˜์„ ์–ป์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ† ๋ก  ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ๋Š” ๋งŽ์€ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ œ์•ˆ์„ ๋ณด์•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ํŠนํžˆ ์œ ์šฉํ•ด ๋ณด์ด๋Š” ๊ฒƒ์— ํˆฌํ‘œํ•˜๊ณ  ์˜๊ฒฌ์„ ๋งํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ผ๋ฐ˜์ ์œผ๋กœ @griesemer ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๊ฒฝํ—˜ ๋ณด๊ณ ์„œ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ตฌ๋ฌธ์ด ์–ธ์–ด๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์–ด๋Š ์ •๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ๋” ์ž˜ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://golang.org/cl/183677 ์—์„œ defer ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์ด ํ™œ๋ฐœํžˆ ์ง„ํ–‰ ์ค‘์ด๋ฉฐ ์ฃผ์š” ์žฅ์• ๋ฌผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ํ•œ 1.14 ๋ฆด๋ฆฌ์Šค์— ํฌํ•จ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

@griesemer @ianlancetaylor @rsc ์—ฌ๊ธฐ์„œ ์ œ๊ธฐ๋œ ๋ฌธ์ œ์˜ ์ผ๋ถ€ ๋˜๋Š” ์ „์ฒด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋‹ค๋ฅธ ์ œ์•ˆ์œผ๋กœ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์žฅํ™ฉํ•จ์„ ๊ณ„์† ํ•ด๊ฒฐํ•  ๊ณ„ํš์ž…๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ ํŒŒํ‹ฐ์— ๋Šฆ์—ˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์ด๋ฏธ ๊ฑฐ๋ถ€๋˜์—ˆ์ง€๋งŒ ์ฃผ์ œ์— ๋Œ€ํ•œ ํ–ฅํ›„ ํ† ๋ก ์„ ์œ„ํ•ด ์‚ผํ•ญ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด๋ถ€ ๋ฐ˜ํ™˜ ๊ตฌ๋ฌธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? (๋‚˜๋Š” ์ฃผ์ œ๋ฅผ ์Šค์บ”ํ•˜๊ฑฐ๋‚˜ Russ Cox๊ฐ€ Twitter์— ๊ฒŒ์‹œํ•œ ๋‚ด์šฉ์„ ์‚ดํŽด๋ณด์•˜์„ ๋•Œ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.) ์˜ˆ:

f, err := Foo()
return err != nil ? nil, err

err์ด nil์ด ์•„๋‹ˆ๋ฉด nil, err ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  err์ด nil์ด๋ฉด ์‹คํ–‰์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ์ง„์ˆ  ์–‘์‹์€

return <boolean expression> ? <return values>

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ์ƒ์˜ ์„คํƒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

if <boolean expression> {
    return <return values>
}

์ฃผ์š” ์ด์ ์€ ์ด๊ฒƒ์ด check ํ‚ค์›Œ๋“œ ๋˜๋Š” try return err != nil || f == nil ? nil, fmt.Errorf("failed to get Foo") ํ•จ์ˆ˜๋ณด๋‹ค ๋” ์œ ์—ฐํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ nil์ด ์•„๋‹Œ ๊ฒƒ(์˜ˆ: return err != nil && err != io.EOF ? nil, err ) ๋“ฑ์ด์ง€๋งŒ ์ฝ์„ ๋•Œ ์ดํ•ดํ•˜๊ธฐ์—๋Š” ์—ฌ์ „ํžˆ ์ƒ๋‹นํžˆ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค(ํŠนํžˆ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์ฝ๋Š” ๋ฐ ์ต์ˆ™ํ•œ ๊ฒฝ์šฐ).

๋˜ํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ผ๋ถ€ ์ง€์—ฐ ๋ฌธ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  _์—ฌ์ „ํžˆ ํ˜ธ์ถœ ์œ„์น˜_์—์„œ ๋ฐœ์ƒํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›๋ž˜ ์ œ์•ˆ์— ๋Œ€ํ•ด ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋˜ ๊ฐ€์žฅ ํฐ ๋ถˆ๋งŒ ์ค‘ ํ•˜๋‚˜๋Š” ์–ด๋–ค ๋ฉด์—์„œ ์˜ค๋ฅ˜์˜ ์‹ค์ œ _์ฒ˜๋ฆฌ_๋ฅผ ์•”์‹œ์  ํ”„๋กœ์„ธ์Šค๋กœ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ 0์ด ์•„๋‹ ๋•Œ ์ž๋™์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด nil์ด ์•„๋‹Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ๋Œ€์‹  ๋ช…์‹œ์  ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์„ ์‚ฌ์šฉํ•˜๋Š” Go์˜ ์ „์ฒด _point_๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋ก ์ ์œผ๋กœ ๋” ๋†’์€ ์ง€์ ์—์„œ ์ฒ˜๋ฆฌ๋˜๋„๋ก ์Šคํƒ์„ ์ „ํŒŒํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ช…์‹œ์ ์ด๊ณ  ์˜๋„์ ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„๋กœ. ์กฐ๊ฑด๋ถ€๋ผ๋ฉด ์ตœ์†Œํ•œ ๋ช…์‹œ์ ์ธ return ๋ฌธ์€ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

@ngrilly @griesemer ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด Go ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๊ฐ€์žฅ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ธก๋ฉด์„ ๋” ์ž˜ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋งํ•ด์„œ, ์•ฝ๊ฐ„์˜ ์žฅํ™ฉํ•จ์„ ์ œ๊ฑฐํ•˜๋Š” ์ œ์•ˆ์€ ํ•  ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ์–ธ์–ด๋Š” ์˜ค๋Š˜๋‚  ์ถฉ๋ถ„ํžˆ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณ€๊ฒฝ์—๋Š” ๋น„์šฉ์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ƒ๋‹นํ•œ ์ด์ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ์ œ์•ˆ์ด ์žฅํ™ฉํ•จ์„ ์ค„์ด๋Š” ๋ฐ ์ƒ๋‹นํ•œ ์ด์ ์„ ์ œ๊ณตํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋ถ€๊ณผ๋œ ์ถ”๊ฐ€ ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋†’๋‹ค๊ณ  ๋Š๋ผ๋Š” Go ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ƒ๋‹นํ•œ ๋ถ€๋ถ„์ด ๋ถ„๋ช…ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ค‘๊ฐ„ ์ง€์ ์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๊ทธ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

@kaedys ์ด ํ์‡„์ ์ด๊ณ  ๋งค์šฐ ์žฅํ™ฉํ•œ ๋ฌธ์ œ๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํŠน์ • ๋Œ€์ฒด ๊ตฌ๋ฌธ์„ ๋…ผ์˜ํ•˜๊ธฐ์— ์ ํ•ฉํ•œ ์žฅ์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

@ianlancetaylor

๋‚˜๋Š” ์ด ์ œ์•ˆ์ด ์žฅํ™ฉํ•จ์„ ์ค„์ด๋Š” ๋ฐ ์ƒ๋‹นํ•œ ์ด์ ์„ ์ œ๊ณตํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋ถ€๊ณผ๋œ ์ถ”๊ฐ€ ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋†’๋‹ค๊ณ  ๋Š๋ผ๋Š” Go ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ƒ๋‹นํ•œ ๋ถ€๋ถ„์ด ๋ถ„๋ช…ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๊ธฐ ์„ ํƒ ํŽธํ–ฅ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”. Go๋Š” ์žฅํ™ฉํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ์ œ๋„ค๋ฆญ์ด ์—†๋Š” ๊ฒƒ์œผ๋กœ ์œ ๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ์–ด๋“ค์ž…๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์€ ํ˜„์žฌ ์–ธ์–ด(Java, C++, C#, Python, Ruby ๋“ฑ)๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋” ํ˜„๋Œ€์ ์ธ ์–ธ์–ด(Rust, TypeScript, Kotlin, Swift, Elixir ๋“ฑ)๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. . ๋Œ€๋ถ€๋ถ„ ์ด๋Ÿฐ ์ด์œ ๋กœ Go๋ฅผ ํ”ผํ•˜๋Š” ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ™•์ฆ ํŽธํ–ฅ์ด ์ž‘์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Gophers๋Š” ์‚ฌ๋žŒ๋“ค์ด Go๋ฅผ ๋น„ํŒํ•  ๋•Œ ์žฅํ™ฉํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ถ€์กฑ์„ ๋ฐฉ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ try์™€ ๊ฐ™์€ ์ œ์•ˆ์„ ๊ฐ๊ด€์ ์œผ๋กœ ํ‰๊ฐ€ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Steve Klabnik์€ ๋ฉฐ์น  ์ „์— Reddit์— ํฅ๋ฏธ๋กœ์šด ๋…ผํ‰์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค . ๊ทธ๋Š” Rust์— ? ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด "๊ฐ™์€ ๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•"์ด๊ณ  "๋„ˆ๋ฌด ์•”๋ฌต์ "์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ๋ช‡ ์ค„ ์ด์ƒ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„ ? ๋Š” ๊ทธ๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

@ngrilly ๋‹˜ ์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŽธ๊ฒฌ์€ ํ”ผํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์€ ์žฅํ™ฉํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋กœ ์ธํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Go๋ฅผ ํ”ผํ•˜๋Š”์ง€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒƒ์€ ํ™•์‹คํ•˜์ง€๋งŒ ์ธก์ •ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ฆ‰, try ๊ฐ€ ๋ณด๊ธฐ ์–ด๋ ค์šด ์ œ์–ด ํ๋ฆ„์˜ ์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ์„ ๋„์ž…ํ–ˆ์œผ๋ฉฐ try ๊ฐ€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋•๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด์ง€๋งŒ ์˜ค๋ฅ˜ ์ฃผ์„ ์ฒ˜๋ฆฌ์—๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์€ ๊ฒƒ๋„ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. .

Steve Klabnik์˜ ์ธ์šฉ๋ฌธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๊ฐ์ •์— ๊ฐ์‚ฌํ•˜๊ณ  ๋™์˜ํ•˜์ง€๋งŒ, ์–ธ์–ด๋กœ์„œ Rust๊ฐ€ Go๋ณด๋‹ค ๊ตฌ๋ฌธ์  ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋” ๊ธฐ๊บผ์ด ์˜์กดํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์˜ ์ง€์ง€์ž๋กœ์„œ ๋ฐ”๋‘‘ํŒ€์ด ์ƒํ™ฉ์—์„œ ์˜ณ์€ ์ผ์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์ฒ ํšŒ๋œ ๊ฒƒ์— ๋‹น์—ฐํžˆ ์‹ค๋งํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋งค์šฐ ๋ช…ํ™•ํ•ด ๋ณด์ด๋Š” ํ•œ ๊ฐ€์ง€๋Š” ๋Œ€๋ถ€๋ถ„์˜ Go ์‚ฌ์šฉ์ž๊ฐ€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ์žฅํ™ฉํ•จ์„ ๋ฌธ์ œ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ๊ทธ๊ฒƒ์ด ์ž ์žฌ์ ์ธ ์‹ ๊ทœ ์‚ฌ์šฉ์ž๋ฅผ ์—ฐ๊ธฐํ•˜๋”๋ผ๋„ ๋‚˜๋จธ์ง€ ์šฐ๋ฆฌ๋Š” ์‚ด์•„๊ฐ€์•ผ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. .

๋‚˜๋Š” ๋‚ด๊ฐ€ ์ฝ์€ ๋Œ€์•ˆ ์ œ์•ˆ์˜ ์ˆ˜๋ฅผ ์„ธ์ง€ ๋ชปํ–ˆ๊ณ  ์ผ๋ถ€๋Š” ๊ฝค ์ข‹์•˜์ง€ try ๊ฐ€ ๋จผ์ง€๋ฅผ ๋ฌผ๋ฉด ์ฑ„ํƒํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ์ œ์•ˆ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์ค‘๋„ ์ œ์•ˆ์ด ๋‚˜์˜ฌ ๊ฐ€๋Šฅ์„ฑ์€ ํฌ๋ฐ•ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋” ๊ธ์ •์ ์ธ ์ ์œผ๋กœ, ํ˜„์žฌ ๋…ผ์˜์—์„œ๋Š” ํ•จ์ˆ˜์˜ ๋ชจ๋“  ์ž ์žฌ์  ์˜ค๋ฅ˜๋ฅผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋™์ผํ•œ ์œ„์น˜์—์„œ ์žฅ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค( defer ๋˜๋Š” goto ์‚ฌ์šฉ). ์ด์ „์— ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ Go ํŒ€์ด ์ตœ์†Œํ•œ go fmt ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹จ์ผ ๋ช…๋ น๋ฌธ if ์„ ํ•œ ์ค„์— ์ž‘์„ฑํ•˜์—ฌ ์ ์–ด๋„ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. _look_ ์€ ์‹ค์ œ๋กœ ์ƒ์šฉ๊ตฌ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋” ์ปดํŒฉํŠธํ•ฉ๋‹ˆ๋‹ค.

@ํ”ผ์—๋ ‰

1/ "์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ"๋Š” ์—ฌ์ „ํžˆ ์—ฐ๊ตฌ ์˜์—ญ์ž…๋‹ˆ๊นŒ?

50๋…„์ด ๋„˜์—ˆ์Šต๋‹ˆ๋‹ค! ์ผ๊ด€๋˜๊ณ  ์ฒด๊ณ„์ ์ธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ์ด๋ก ์ด๋‚˜ ์‹ค์šฉ์ ์ธ ์ง€์นจ์€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฐ”๋‘‘๋‚˜๋ผ(๋‹ค๋ฅธ ์–ธ์–ด์˜ ๊ฒฝ์šฐ)์—์„œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ํ˜ผ๋ž€๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, EOF๋Š” ํŒŒ์ผ์„ ์ฝ์œผ๋ ค๊ณ  ํ•  ๋•Œ ์˜ˆ์™ธ์ ์ธ ์กฐ๊ฑด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์˜ค๋ฅ˜์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ์‹ค์ œ ์˜ค๋ฅ˜์ธ์ง€ ์•„๋‹Œ์ง€๋Š” ์‹ค์ œ๋กœ ์ปจํ…์ŠคํŠธ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ๋Š” ์•„๋‹˜).

@griesemer @rsc ์™€ ์ œ์•ˆ์— ๊ด€๋ จ๋œ ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์œ„์—์„œ ๋งํ–ˆ๊ณ , ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ์ œ์•ˆ์„œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์„ฑ์‹คํ•˜๊ฒŒ ํ† ๋ก ํ•˜๋Š” ๊ท€ํ•˜์˜ ๋…ธ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@ianlancetaylor

Steve Klabnik์˜ ์ธ์šฉ๋ฌธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๊ฐ์ •์— ๊ฐ์‚ฌํ•˜๊ณ  ๋™์˜ํ•˜์ง€๋งŒ, ์–ธ์–ด๋กœ์„œ Rust๊ฐ€ Go๋ณด๋‹ค ๊ตฌ๋ฌธ์  ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋” ๊ธฐ๊บผ์ด ์˜์กดํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Rust๊ฐ€ Go๋ณด๋‹ค ๋ฌธ๋ฒ•์  ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋” ์˜์กดํ•œ๋‹ค๋Š” ์ ์— ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์˜ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์žฅํ™ฉํ•จ์— ๋Œ€ํ•œ ์ด ํŠน์ • ํ† ๋ก ์— ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๋Š” Go์—์„œ์™€ ๊ฐ™์ด Rust์—์„œ ๊ฐ’์ž…๋‹ˆ๋‹ค. Go์—์„œ์™€ ๊ฐ™์ด ํ‘œ์ค€ ์ œ์–ด ํ๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Rust์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์—์„œ๋Š” Go์—์„œ์™€ ๊ฐ™์ด ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ try! ๋งคํฌ๋กœ๋ฅผ ๋„์ž…ํ–ˆ๋Š”๋ฐ ์ด๋Š” ๋†€๋ž๊ฒŒ๋„ try ๋‚ด์žฅ ํ•จ์ˆ˜ ์ œ์•ˆ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ฒฐ๊ตญ try! ๋งคํฌ๋กœ์˜ ๊ตฌ๋ฌธ ๋ณ€ํ˜•์ด์ž ์ผ๋ฐ˜ํ™”์ธ ? ์—ฐ์‚ฐ์ž๋ฅผ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ try ์˜ ์œ ์šฉ์„ฑ์„ ์ž…์ฆํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‚ฌ์‹ค Rust ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ๊ทธ๊ฒƒ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์„ ํ›„ํšŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Go์™€ Rust์˜ ์—„์ฒญ๋‚œ ์ฐจ์ด์ ์„ ์ž˜ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์žฅํ™ฉํ•จ์— ๊ด€ํ•ด์„œ๋Š” ๊ทธ๋“ค์˜ ๊ฒฝํ—˜์ด Go๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. try! ๋ฐ ? ์™€ ๊ด€๋ จ๋œ RFC ๋ฐ ํ† ๋ก ์€ ์ •๋ง ์ฝ์„ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ฐฌ์„ฑ๊ณผ ๋ฐ˜๋Œ€์˜ ์Ÿ์ ๊ณผ ์ฃผ์žฅ์ด ์–ผ๋งˆ๋‚˜ ์œ ์‚ฌํ•œ์ง€ ๋ณด๊ณ  ์ •๋ง ๋†€๋ž์Šต๋‹ˆ๋‹ค.

@griesemer๋‹˜ , ํ˜„์žฌ ํ˜•ํƒœ์˜ try ์ œ์•ˆ์„ ๊ฑฐ๋ถ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ • ํ–ˆ๋‹ค๊ณ  ๋ฐœํ‘œ ํ•˜์…จ์ง€๋งŒ Go ํŒ€์ด ๋‹ค์Œ์— ๋ฌด์—‡์„ ํ•  ๊ณ„ํš์ธ์ง€๋Š” ๋ง์”€ํ•˜์ง€ ์•Š์œผ์…จ์Šต๋‹ˆ๋‹ค.

์ด ๋…ผ์˜์—์„œ ์ œ๊ธฐ๋œ ๋ฌธ์ œ(๋””๋ฒ„๊น… ์ธ์‡„, ์ฝ”๋“œ ์ ์šฉ ๋ฒ”์œ„, ๋” ๋‚˜์€ ์˜ค๋ฅ˜ ์žฅ์‹ ๋“ฑ)๋ฅผ ํ•ด๊ฒฐํ•  ๋˜ ๋‹ค๋ฅธ ์ œ์•ˆ์œผ๋กœ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์žฅํ™ฉํ•จ์„ ํ•ด๊ฒฐํ•  ๊ณ„ํš์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” Rust๊ฐ€ Go๋ณด๋‹ค ๋ฌธ๋ฒ•์  ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋” ์˜์กดํ•œ๋‹ค๋Š” ์ ์— ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์˜ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์žฅํ™ฉํ•จ์— ๋Œ€ํ•œ ์ด ํŠน์ • ํ† ๋ก ์— ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹2์„ผํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋„ ๋˜‘๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

1987๋…„๋ถ€ํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด์™”์ง€๋งŒ Go์™€ ํ•จ๊ป˜ ์ผํ•œ์ง€๋Š” 1๋…„ ์ •๋„๋ฐ–์— ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•ฝ 18๊ฐœ์›” ์ „ ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์–ธ์–ด๋ฅผ ์ฐพ๊ณ  ์žˆ์„ ๋•Œ ์ €๋Š” Go์™€ Rust๋ฅผ ๋ชจ๋‘ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. Go ์ฝ”๋“œ๊ฐ€ ๋ฐฐ์šฐ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ํ›จ์”ฌ ์‰ฝ๊ณ  Go๊ฐ€ ๊ฐ„๊ฒฐํ•œ ๊ธฐํ˜ธ ๋Œ€์‹  ์˜๋ฏธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋‹จ์–ด๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ Go ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ์ฝ๊ธฐ ์‰ฝ๋‹ค๊ณ  ๋Š๊ผˆ๊ธฐ ๋•Œ๋ฌธ์— Go๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์˜๋ฏธ๋ฅผ ์•”์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋Š๋‚Œํ‘œ( ! )์™€ ๋ฌผ์Œํ‘œ( ? )๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•˜์—ฌ Go๊ฐ€ ๋” Rust์ฒ˜๋Ÿผ ๋˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋ถˆํ–‰ํ•  ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๋น„์Šทํ•œ ๋งฅ๋ฝ์—์„œ ๋งคํฌ๋กœ์˜ ๋„์ž…์€ ๋ฐ”๋‘‘์˜ ์„ฑ๊ฒฉ์„ ๋ฐ”๊พธ๊ณ  ์‚ฌ์‹ค์ƒ ๋ฃจ๋น„์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฐ”๋‘‘ ๋ฐฉ์–ธ์„ ๋งŒ๋“ค ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งคํฌ๋กœ๊ฐ€ Go์— ์ถ”๊ฐ€๋˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ IMO์—์„œ๋Š” ๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์ด ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

jmtcw

@ianlancetaylor

๋งค์šฐ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์€ ์žฅํ™ฉํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋กœ ์ธํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Go๋ฅผ ํ”ผํ•˜๋Š”์ง€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆซ์ž๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒƒ์€ ํ™•์‹คํ•˜์ง€๋งŒ ์ธก์ •ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๊ทธ ์ž์ฒด๋กœ "์ธก์ •"์€ ์•„๋‹ˆ์ง€๋งŒ ์ด Hacker News ํ† ๋ก ์€ ์žฅํ™ฉํ•จ์œผ๋กœ ์ธํ•ด Go ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ๋ถˆ๋งŒ์„ ํ’ˆ์€ ๊ฐœ๋ฐœ์ž์˜ ์ˆ˜์‹ญ ๊ฐœ์˜ ์˜๊ฒฌ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(์ผ๋ถ€ ์˜๊ฒฌ์€ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•จ): https://news.ycombinator. com/item?id=20454966.

์šฐ์„ , ๊ทธ ๊ฒฐ์ •์ด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ตœ์ข… ๊ฒฐ์ •์— ์ง€์ง€์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง„์ •์œผ๋กœ ํŒ€์˜ ๋…ธ๋ ฅ์ด์—ˆ๊ณ , ์ €๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์ „๋ฐ˜์ ์œผ๋กœ ์˜ˆ์˜ ๋ฐ”๋ฅด๊ณ  ์กด์ค‘ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฒฉ๋ ฌํ•œ ํ† ๋ก ์„ ์ด๊ฒจ๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ์— ๋Œ€ํ•ด ์ •๋ง ๊ธฐ์ฉ๋‹ˆ๋‹ค.

@ngrilly ๋‚˜ ์ž์‹ ์„ ์œ„ํ•ด ๋งํ•ด์„œ, ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์–ด๋Š ์‹œ์ ์—์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์žฅํ™ฉํ•จ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๋Š” ์ง€๋‚œ ๋ฐ˜๋…„, ํŠนํžˆ โ€‹โ€‹์ง€๋‚œ 3๊ฐœ์›” ๋™์•ˆ ์ด์— ๋Œ€ํ•ด ์ƒ๋‹นํ•œ ์‹œ๊ฐ„๊ณผ ์—๋„ˆ์ง€๋ฅผ ํˆฌ์žํ–ˆ์œผ๋ฉฐ ์ œ์•ˆ์— ๋งค์šฐ ๋งŒ์กฑํ–ˆ์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ๊ฐ€๋Šฅํ•œ ๋ฐ˜์‘์„ ๋ถ„๋ช…ํžˆ ๊ณผ์†Œ ํ‰๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ•œ๋ฐœ ๋ฌผ๋Ÿฌ์„œ์„œ ํ”ผ๋“œ๋ฐฑ์„ ์š”์•ฝํ•˜๊ณ  ์ •์ œํ•œ ๋‹ค์Œ ์ตœ์„ ์˜ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ํ˜„์‹ค์ ์œผ๋กœ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฌด์ œํ•œ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์–ธ์–ด ์ง€์›์— ๋Œ€ํ•œ ์ƒ๊ฐ์€ ๋‹ค๋ฅธ ๋ถ„์•ผ, ํŠนํžˆ ์ œ๋„ค๋ฆญ ์ž‘์—…์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ง„์ „์„ ์œ„ํ•ด ์ž ์‹œ ๋’ค๋กœ ๋ฌผ๋Ÿฌ๋‚˜๋Š” ๊ฒƒ์„ ๋ด…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋ช‡ ๊ฐœ์›”. if err != nil ์„ฑ๊ฐ€์‹ค ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธด๊ธ‰ ์กฐ์น˜์˜ ์ด์œ ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

ํ† ๋ก ์„ ๊ณ„์†ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์—ฌ๊ธฐ์—์„œ ๋ฒ—์–ด๋‚˜ ๋‹ค๋ฅธ ๊ณณ, ๋ณ„๋„์˜ ๋ฌธ์ œ(๋ช…ํ™•ํ•œ ์ œ์•ˆ์ด ์žˆ๋Š” ๊ฒฝ์šฐ) ๋˜๋Š” ๊ณต๊ฐœ ํ† ๋ก ์— ๋” ์ ํ•ฉํ•œ ๋‹ค๋ฅธ ํฌ๋Ÿผ์—์„œ ํ† ๋ก ์„ ๊ณ„์†ํ•  ๊ฒƒ์„ ๋ชจ๋‘์—๊ฒŒ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๊ฒฐ๊ตญ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

์ž๊ธฐ ์„ ํƒ ํŽธํ–ฅ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

์ €๋Š” ์ง€๊ธˆ ์—ฌ๊ธฐ์—์„œ "ํฌ๋ฆฌ์—์ดํ„ฐ ํŽธํ–ฅ"์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ์šฉ์–ด๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ธฐ๊บผ์ด ์ผ์„ ํ•œ๋‹ค๋ฉด ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋•…์ฝฉ ๊ฐค๋Ÿฌ๋ฆฌ๊ฐ€ ๊ด€๋ จ ์—†๋Š” ํฌ๋Ÿผ์—์„œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์„ ์–ผ๋งˆ๋‚˜ ์‹ซ์–ดํ•˜๋Š”์ง€ ํฐ์†Œ๋ฆฌ๋กœ ์™ธ์น˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ 3๊ฐœ์˜ ๋‹จ๋ฝ์œผ๋กœ ๋œ ๋ถˆ์™„์ „ํ•œ ์‹œ๋„๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋„ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค(์‹ค์ œ ์ž‘์—…์€ ์ œ์™ธ). ํ˜„์ƒ ์œ ์ง€์— ๋™์˜ํ•˜๋ฉด OK์ž…๋‹ˆ๋‹ค. ๊ณต์ •ํ•œ ์ง€์ ์ž…๋‹ˆ๋‹ค. ์™„์ „ํ•œ ์ œ์•ˆ ์—†์ด ์†”๋ฃจ์…˜์œผ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ ์ œ์‹œํ•˜๋ฉด -10k ํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‹œ๋„๋ฅผ ์ง€์ง€ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ Go Teams์˜ ํŒ๋‹จ์„ ์‹ ๋ขฐํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๊ทธ๋“ค์˜ ํŒ๋‹จ์€ ํ›Œ๋ฅญํ•œ ์–ธ์–ด๋ฅผ ์ œ๊ณตํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋“ค์ด ๊ฒฐ์ •ํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋„ํ•˜๋“  ํ•˜์ง€ ์•Š๋“  ์šฐ๋ฆฌ๋Š” ์™ธ๋ถ€์ธ์œผ๋กœ์„œ ์œ ์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋” ๋„“์€ ๊ฐ€์‹œ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋ฃจ ์ข…์ผ ํ† ๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์˜ ๋…ธ๋ ฅ์— ๋Œ€ํ•ด ํ˜„์žฌ ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ๊ฑฐ๋‚˜ ๊ฐœ์„ ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๊ฐ์‚ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐ์‚ฌํ•˜๊ณ  ๊ณ ๋ ค๋˜๋Š” ๊ฒฝ์šฐ ์–ธ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋Ÿฐํƒ€์ž„์˜ ์ƒˆ๋กœ์šด(์—ญ์ „์ด ์•„๋‹Œ) ๊ฐœ์„  ์‚ฌํ•ญ์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ 3๊ฐœ์˜ ๋‹จ๋ฝ์œผ๋กœ ๋œ ๋ถˆ์™„์ „ํ•œ ์‹œ๋„๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋„ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค(์‹ค์ œ ์ž‘์—…์€ ์ œ์™ธ).

๋‚˜์™€ ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด try ๋ฅผ ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ๋˜ ๊ฒƒ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜ ๋Œ€์‹  ๋ž˜ํ•‘๋œ ๋ฒ„์ „์˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์„ ํƒ์  ์ธ์ˆ˜์˜€์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์–‘์˜ ๋””์ž์ธ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•ˆ ๋ผ.

๋‚ด๊ฐ€ ์ฐธ์กฐ. ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋‹ค๋ฅธ ๊ฒƒ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ์ž ๊ฐ€์•ผ ํ• ๊นŒ์š”? ํ† ๋ก ์€ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋” ์ ํ•ฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ด๋ฏธ ๋„ˆ๋ฌด ๊ธธ์–ด์„œ ์ž ๊ทธ๋Š” ๊ฒƒ์ด ๋ฌด์˜๋ฏธํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, ์ด ๋ฌธ์ œ๋Š” ์ข…๋ฃŒ๋˜์—ˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ์ž‘์„ฑํ•˜๋Š” ์˜๊ฒฌ์€ ๊ฑฐ์˜ ์˜์›ํžˆ ๋ฌด์‹œ๋  ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ๊ดœ์ฐฎ์œผ์‹œ๋‹ค๋ฉด ๋Œ“๊ธ€์„ ๋‹ฌ์•„์ฃผ์„ธ์š”.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Java, C* ์–ธ์–ด๋ฅผ ์ƒ๊ฐํ•˜๊ฒŒ ํ•˜๋Š” try ๋‹จ์–ด๋ฅผ ์‹ซ์–ดํ•œ๋‹ค๋ฉด 'try'๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  'help' ๋˜๋Š” 'must' ๋˜๋Š” 'checkError'์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. (๋ฌด์‹œ)

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Java, C* ์–ธ์–ด๋ฅผ ์ƒ๊ฐํ•˜๊ฒŒ ํ•˜๋Š” try ๋‹จ์–ด๋ฅผ ์‹ซ์–ดํ•œ๋‹ค๋ฉด 'try'๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  'help' ๋˜๋Š” 'must' ๋˜๋Š” 'checkError'์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. (๋ฌด์‹œ)

C ๊ณ„์—ด ์–ธ์–ด์™€ ๊ฐ™์ด ์„œ๋กœ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๊ฐ€๊นŒ์šด ์–ธ์–ด์—์„œ ํฌ๊ฑฐ๋‚˜ ์ž‘์€ ์˜๋ฏธ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒน์น˜๋Š” ํ‚ค์›Œ๋“œ์™€ ๊ฐœ๋…์ด ํ•ญ์ƒ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด ๊ธฐ๋Šฅ์€ ์–ธ์–ด ์ž์ฒด ๋‚ด์—์„œ ํ˜ผ๋™์„ ์ผ์œผํ‚ค์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ ์–ธ์–ด ๊ฐ„์˜ ์ฐจ์ด๋Š” ํ•ญ์ƒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์œ. ์ด๊ฒƒ์€ ์•ˆํ‹ฐ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์ œ์•ˆ์˜ ์ž‘์„ฑ์ž๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

@alersenkevich ์ •์ค‘ํžˆ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. https://golang.org/conduct๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋” ์ด์ƒ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•œ ๊ฒฐ์ •์— ๋Œ€ํ•ด ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ if err != nil ์ด ์—ฌ๋Ÿฌ ์ค„์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋น ๋ฅธ ํ•ดํ‚น์ฒ˜๋Ÿผ ๋Š๊ปด์กŒ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด์™€ ๊ฐ™์€ ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์†Œํ•œ ํ‚ค์›Œ๋“œ๋กœ Go๋ฅผ ๋ถ€ํ’€๋ฆฌ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ์œ„์ƒ์ ์ธ โ€‹โ€‹๋งคํฌ๋กœ https://github.com/golang/go/issues/32620 ์ œ์•ˆ์ด ๋” ์ข‹๊ฒŒ ๋Š๊ปด์ง€๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๊ฒƒ๋“ค์— ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋” ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—์„œ ๊ตฌ๋ฌธ ๋ฐ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์ง„ํ–‰ ์ค‘์ด๋ฏ€๋กœ C/C++ ๋งคํฌ๋กœ๋ผ๊ณ ๋งŒ ์ƒ๊ฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ์„œ ์š”์ ์€ ๋งคํฌ๋กœ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ, ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ์ž์‹ ์˜ ์‹œ๋„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ์ด๊ฒƒ์€ ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ œ์•ˆ ์ค‘์—์„œ ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ œ์ •์‹ ์ธ ์ œ์•ˆ์ž…๋‹ˆ๋‹ค.

@OneOfOne ์ •์ค‘ํ•˜๊ฒŒ, ๋‚˜๋Š” ์ด๊ฒƒ์ด ์žฌ๊ฐœ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๋Š” ๊ตฌ๋ฌธ์— ์‹ค์ œ ์ œํ•œ์ด ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์ด ๊ฐ€์žฅ "์ •๋‹นํ•œ" ์ œ์•ˆ์ด๋ผ๋Š” ๋‹น์‹ ์˜ ์ƒ๊ฐ์ด ์˜ณ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” ํ˜„์ƒ ์œ ์ง€๊ฐ€ ์—ฌ์ „ํžˆ ๋” ์ •์ƒ์ ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

if err != nil ๊ฐ€ Go-์—์„œ ๋„ˆ๋ฌด ์ž์ฃผ ์ž‘์„ฑ๋œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹จ์ผ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋ฅผ ์ค„์ด๋Š” ์ œ์•ˆ์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋น„์šฉ์€ ๊ฐ€๋…์„ฑ IMHO๊ฐ€๋˜์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค .

๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ด๋™ ์ค‘์— "์žฅ๊ธฐ์ ์ธ" ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋ฅผ ํ•œํƒ„ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์†”์งํžˆ ๊ฐ„๊ฒฐํ•จ์€ ์ข…์ข… ๊ฐ€๋…์„ฑ๊ณผ ์ƒ์ถฉ๋ฉ๋‹ˆ๋‹ค. Go๋Š” ํŠน์ • ์ž‘์—… ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•˜๋Š” ์—ฌ๋Ÿฌ ํ™•๋ฆฝ๋œ ํŒจํ„ด์„ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ๊ฒฐ๊ณผ๋Š” ์˜ค๋ž˜ ์ง€์†๋˜๋Š” ์•ˆ์ •์ ์ธ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ฝ”๋“œ๋Š” ํ‰์ƒ ๋™์•ˆ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฝ๊ณ  ์ดํ•ดํ•ด์•ผ ํ•˜์ง€๋งŒ ํ•œ ๋ฒˆ๋งŒ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ธ์ง€ ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ๊ฒฝํ—˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋„ ์‹ค์งˆ์ ์ธ ๋น„์šฉ์ž…๋‹ˆ๋‹ค.

๋Œ€์‹ ์—:

f := try(os.Open(filename))

๋‚˜๋Š” ๊ธฐ๋Œ€ํ•œ๋‹ค:

f := try os.Open(filename)

์—ฌ๋Ÿฌ๋ถ„, ์ด ๋ฌธ์ œ๋Š” ์ข…๋ฃŒ๋˜์—ˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ์ž‘์„ฑํ•˜๋Š” ์˜๊ฒฌ์€ ๊ฑฐ์˜ ์˜์›ํžˆ ๋ฌด์‹œ๋  ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ๊ดœ์ฐฎ์œผ์‹œ๋‹ค๋ฉด ๋Œ“๊ธ€์„ ๋‹ฌ์•„์ฃผ์„ธ์š”.
โ€”@ianlancetaylor

์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ˜„์žฌ ๋ฐฉ๋ฒ•๊ณผ ํ•จ๊ป˜ ์ฝ”๋“œ ๋ธ”๋ก์— ๋Œ€ํ•ด try๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ๊ฐ™์€:

// Generic Error Handler
handler := func(err error) error {
    return fmt.Errorf("We encounter an error: %v", err)  
}
a := "not Integer"
b := "not Integer"

try(handler){
    f := os.Open(filename)
    x := strconv.Atoi(a)
    y, err := strconv.Atoi(b) // <------ If you want a specific error handler
    if err != nil {
        panic("We cannot covert b to int")   
    }
}

์œ„์˜ ์ฝ”๋“œ๋Š” ์ดˆ๊ธฐ ์ฃผ์„๋ณด๋‹ค ๊น”๋”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ƒˆ๋กœ์šด ์ œ์•ˆ์„ ํ–ˆ๋‹ค #35179

val := f()๋ฅผ ์‹œ๋„(์˜ค๋ฅ˜){
ํŒจ๋‹‰(์˜ค๋ฅ˜)
}

๋‚˜๋Š” ํฌ๋งํ•œ๋‹ค:

i, err := strconv.Atoi("1")
if err {
    println("ERROR")
} else {
    println(i)
}

๋˜๋Š”

i, err := strconv.Atoi("1")
if err {
    io.EOF:
        println("EOF")
    io.ErrShortWrite:
        println("ErrShortWrite")
} else {
    println(i)
}

@myroid ๋‘ ๋ฒˆ์งธ ์˜ˆ์ œ๋ฅผ switch-else ๋ฌธ ํ˜•์‹์œผ๋กœ ์กฐ๊ธˆ ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

```๊ฐ€๋‹ค
i, err := strconv.Atoi("1")
์Šค์œ„์น˜ ์˜ค๋ฅ˜ != nil; ์˜ค๋ฅ˜ {
์ผ€์ด์Šค io.EOF:
println("EOF")
์ผ€์ด์Šค io.ErrShortWrite:
println("ErrShortWrite")
} ๋˜ ๋‹ค๋ฅธ {
println(i)
}

@piotrkowalczuk ๊ท€ํ•˜์˜ ์ฝ”๋“œ๋Š” ๋‚ด ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

i, err := strconv.Atoi("1")
switch err {
case io.EOF:
    println("EOF")
case io.ErrShortWrite:
    println("ErrShortWrite")
} else {
    println(i)
}

์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋ˆˆ์ด์žˆ์„ ์˜ต์…˜์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์žˆ์„ ํ•„์š”๊ฐ€์žˆ๋‹ค
์ผ€์ด์Šค ์˜ค๋ฅ˜!=์—†์Œ

๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์บก์ฒ˜ํ•˜์ง€ ์•Š์€ ์˜ค๋ฅ˜์˜ ๊ฒฝ์šฐ

2019๋…„ 11์›” 8์ผ ๊ธˆ์š”์ผ, 12:06 Yang Fan, [email protected] ์ž‘์„ฑ:

@piotrkowalczuk https://github.com/piotrkowalczuk ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ๋ณด์ž…๋‹ˆ๋‹ค.
๋‚˜๋ณด๋‹ค ๋‚ซ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

i, err := strconv.Atoi("1")switch err {์ผ€์ด์Šค io.EOF:
println("EOF") ์ผ€์ด์Šค io.ErrShortWrite:
println("ErrShortWrite")
} ๋˜ ๋‹ค๋ฅธ {
println(i)
}

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/golang/go/issues/32437?email_source=notifications&email_token=ABNEY4VH4KS2OX4M5BVH673QSU24DA5CNFSM4HTGCZ72YY3PNVWWK3TUL52HS4DFVEXG43VMVBW63
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/ABNEY4W4XIIHGUGIW2KXRPTQSU24DANCNFSM4HTGCZ7Q
.

switch ์—๋Š” else ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  default ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Swift์˜ guard ์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์ œ์•ˆํ•˜๋Š” https://github.com/golang/go/issues/39890 ์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์šฐ๋ ค ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ œ์–ด ํ๋ฆ„
  • ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ง€์—ญ
  • ๊ฐ€๋…์„ฑ

๊ทธ๋‹ค์ง€ ์ฃผ๋ชฉ์„ ๋ฐ›์ง€๋Š” ๋ชปํ–ˆ์ง€๋งŒ ์—ฌ๊ธฐ์— ๋Œ“๊ธ€์„ ๋‚จ๊ธด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๊ด€์‹ฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰