go์์๋ ํจ๋์ ๊ฑธ๋ฆฌ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ฃฝ์ด๋ฒ๋ฆฌ๋๋ฐ ์ด๋ฅผ ์ด๋ ค์ฃผ๊ธฐ ์ํด recover๋ฅผ ์ฌ์ฉํจ๐ซ
-
๋ฐํ์ ์ค ๋ฐ์ํ๋ ์น๋ช ์ ์ธ ์๋ฌ๋ฅผ ๋ปํจ
ex) ๋ฐฐ์ด์์ ํ ๋น๋์ง์์ ์ธ๋ฑ์ค์ ์ ๊ทผํ ๋ ๋ฐ์ํ๋ ๊ฒฝ์ฐ
-
ํ๋ก๊ทธ๋จ์ด ๋ ์ด์ ์คํ๋ ์ ์๋ ์์ค์ ์๋ฌ๋ก, ํจ๋์ด ๋ฐ์ํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ค๋ ์ข ๋ฃ๋์ด๋ฒ๋ฆผ
- ์ผ๋ฐ์ ์ธ ์๋ฌ๋ ๋ฐ์ํ๋๋ผ๋ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋์ง ์์
- ํจ๋์ด ๋ฐ์ํ ์์ ์์ ํ๋ก๊ทธ๋จ์ด ์ฆ์ ๋ฉ์ถ๊ธฐ ๋๋ฌธ์, ๊ทธ ์ดํ์ ์๋ ๊ตฌ๋ฌธ์ ์คํ๋์ง ์์
- ํจ๋์ด ๋ฐ์ํ๋ฉด ์คํ์ค์ธ ๊ณ ๋ฃจํด์ ๋ฉ์ถ๋, defer๋ฅผ ํตํด ์์ฝํด๋ ํจ์๋ ํธ์ถ์ด ๋ณด์ฅ๋จ
-
๊ฐ๋ฐ์๊ฐ ํจ๋์ด ํ์ํ๋ค๊ณ ๋๋ผ๋ ๋ถ๋ถ์ ๋ํด go ๋นํธ์ธ ํจ์
panic()
ํจ์๋ฅผ ์ฌ์ฉํด์ ํจ๋์ฒ๋ฆฌ ๊ฐ๋ฅํจ
- ํจ๋์ด ๋ฐ์ํด๋
recover()
ํจ์๋ฅผ ํตํด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ ๊ฒ์ ๋ง๊ณ ๋ณต๊ตฌ์ด ์ํฌ ์ ์์-
ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๊ธฐ ์ , defer() ํจ์๋ฅผ ํตํด ์์ฝํด๋๋ฉด ํจ๋์ด ๋ฐ์ํด๋ ํ๋ณต์์ผ์ค
-
recover() ํจ์๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ฐํํด์ฃผ๋ฏ๋ก, ์ด๋๋ถ๋ถ์ ๋ํด ํจ๋์ด ๊ฑธ๋ ธ๋๋ฐ ์๋ฌ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํด์ ํ์ธ ๊ฐ๋ฅํจ
func main() { arr:= []int{} //๋ฐฐ์ด arr ์ ์ธ defer func() { r:=recover() //panic๋ฐ์์ ๋ณต๊ตฌ์ฒ๋ฆฌ fmt.Println(recover()) //ํจ๋์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ๋ฆฌํด๊ฐ์ nil, ๋ฐ์ํ ๊ฒฝ์ฐ ์๋ฌ๋ฉ์์ง ์ ๋ฌํด์ค }() x:=arr[4] //๋ฐฐ์ด arr์ ํ ๋น๋์ง ์์ ์ธ๋ฑ์ค์ ๋ํด ๊ฐ ํธ์ถ }
-
- defer๋ฅผ ํตํด ํน์ ๊ตฌ๋ฌธ์ ํจ์ ๋ด ๋ง์ง๋ง์์ ์คํ ๊ฐ๋ฅํจ
- defer๋ฅผ ์ฌ์ฉํ๋ฉด list ์ ํจ์ ํธ์ถ์ ๊ธฐ๋กํด์, ์ฃผ๋ณํจ์๊ฐ ๋ฆฌํด๋ ์ดํ์ ์คํ๋จ
- defer ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ๋์ 3๊ฐ์ง ๊ท์น
- defer์ ๋ฃ๋ ํจ์ ์ธ์๋ defer๊ฐ ์ฌ์ฉ๋ ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๊ฐํจ
func main() { i:=10 defer fmt.Println(i) //i=0์ผ ๋ ํธ์ถ๋์์ผ๋ฏ๋ก, ์ฌ์ฉ๋ ๋๋ฅผ ๊ธฐ์ค์ผ๋ก i๋ฅผ ํ๊ฐํด๋ฒ๋ฆผ i-- return }
- defer๋ก ๋ฃ๋ ํจ์ ํธ์ถ์ LIFO(Last-Input First-Output) , ์ฆ ์คํ์ ๋ค์ด๊ฐ ์คํ๋จ
func main() { for i:=0; i<10; i++ { defer fmt.Print(i)//์คํ์ ์ฑ์ง ๋๋ฌธ์, ์ถ๋ ฅ์ "9876543210" } }
- defer๋ก ๋ฃ์ ํจ์๋ค์ ๋ฐํํ๋ ํจ์์ named return value๋ฅผ ์ฝ๊ณ ํ ๋น ๊ฐ๋ฅํจ
func UpValue() (i int) { defer func() { i++ // UpValue ํจ์์ ๋ฆฌํด ๊ฐ i๋ฅผ ์ฆ๊ฐ์ํด }() // ๋ฐ๋ผ์ 1์ ๋ฆฌํด์ ๋จผ์ ํ๊ณ , ๊ทธ๋ค์ defer์์ ์ํ๋ 2๋ฅผ ๋ฆฌํดํจ return 1 }
- defer์ ๋ฃ๋ ํจ์ ์ธ์๋ defer๊ฐ ์ฌ์ฉ๋ ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๊ฐํจ