개발/Go

[Go] 기초 - defer&panic

devhooney 2022. 8. 1. 19:05
728x90

1. defer

- defer는 특정 문장이나 함수를 나중에 (defer를 호출하는 함수가 리턴하기 직전에) 실행하게 한다.

- Java 같은 언어에서의 finally 블럭처럼 마지막에 작업을 위해 사용

package main
 
import "os"
 
func main() {
    f, err := os.Open("1.txt")
    if err != nil {
        panic(err)
    }
 
    // main 마지막에 파일 close 실행
    defer f.Close()
 
    // 파일 읽기
    bytes := make([]byte, 1024)
    f.Read(bytes)
    println(len(bytes))
}

- 나는 주로 DB 커넥션을 끊을 때 사용했다.

 

2. panic

panic은 현재 함수를 즉시 멈추고 현재 함수에 defer 함수들을 모두 실행한 후 즉시 리턴한다.

- panic은 다시 상위함수에도 똑같이 적용되고, 계속 콜스택을 타고 올라가며 적용된다.(마지막에는 에러와 함께 종료)

package main
 
import "os"
 
func main() {
    // 잘못된 파일명을 넣음
    openFile("Invalid.txt")
     
    // openFile() 안에서 panic이 실행되면
    // 아래 println 문장은 실행 안됨
    println("Done") 
}
 
func openFile(fn string) {
    f, err := os.Open(fn)
    if err != nil {
        panic(err)
    }
 
    defer f.Close()
}

- 예전 회사 프로젝트에서는 panic에러가 발생하면 프로그램이 종료가 되서 사용을 안했었다.

- panic 활용법을 찾아봐야겠다.

 

728x90

 

3. recover

- recover는 panic 함수에 의한 패닉상태를 다시 정상상태로 되돌리는 함수

package main
 
import (
    "fmt"
    "os"
)
 
func main() {
    // 잘못된 파일명을 넣음
    openFile("Invalid.txt")
 
    // recover에 의해
    // 이 문장 실행됨
    println("Done") 
}
 
func openFile(fn string) {
    // defer 함수. panic 호출시 실행됨
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("OPEN ERROR", r)
        }
    }()
 
    f, err := os.Open(fn)
    if err != nil {
        panic(err)
    }
 
    defer f.Close()
}

- 사용방법이 너무 이상해서 사용을 안했었다.

 

728x90

'개발 > Go' 카테고리의 다른 글

[Go] 기초 - 채널  (0) 2022.08.04
[Go] 기초 - 루틴(goroutine)  (0) 2022.08.02
[Go] 기초 - Error  (0) 2022.07.31
[Go] 기초 - 인터페이스  (0) 2022.07.30
[Go] 기초 - 메소드  (1) 2022.07.27