package main


import "fmt"


func fn() {

    defer func() {

        fmt.Println(recover())        // 출력됨

    }()


    panic("error")

}


func main() {

    fn()


    fmt.Println("hello, world")        // 출력됨

}


go에서 panic-defer-recover 설명할 때 자주 나오는 형태입니다

main에서 fn 호출 - 익명함수는 지연호출 - 패닉 - 지연됐던 익명함수 호출 - 익명함수 내부의 recover()에서 패닉 해결하고 리턴값 출력 - 익명함수 반환되고 main의 나머지 부분 실행

recover() 덕분에 마지막의 hello, world가 정상적으로 출력되겠죠.


그런데 fn()을 따로 정의하지 않고 main에 풀어써봅니다.


package main


import "fmt"


func main() {

    defer func() {

        fmt.Println(recover())        // 출력됨

    }()


    panic("error")


    fmt.Println("hello, world")        // 출력안됨

}


위와 같이 패닉 일어나고 recover가 이를 받아서 리턴값까지 출력되었는데 마지막의 hello, world가 출력이 안 됩니다.


두 예시의 차이점은 fn()으로 따로 빼서 정의했느냐 아니냐뿐인데 왜 이런 차이가 발생하는 거죠..