Go by Example: 지연

지연(Defer)은 함수 호출이 나중에 프로그램의 실행에서 수행되도록 보장 하기위해 사용됩니다. 일반적으로는 코드 정리를 위한 목적으로 사용합니다. defer는 보통 타 언어에서 ensurefinally가 사용되는 곳에서 사용됩니다.

package main
import "fmt"
import "os"

파일을 만들고, 값을 쓴 다음 다 끝나면 파일을 종료시키고 싶다고 해보자. 다음은 defer를 사용해 이를 구현한 예시입니다.

func main() {

createFile로 파일 객체를 얻은 직후, closeFile로 파일을 종료시키는 작업을 지연합니다. 이는 writeFile이 끝나고, 함수(main)가 끝나는 지점에서 실행됩니다.

	f := createFile("/tmp/defer.txt")
	defer closeFile(f)
	writeFile(f)
}
func createFile(p string) *os.File {
	fmt.Println("creating")
	f, err := os.Create(p)
	if err != nil {
		panic(err)
	}
	return f
}
func writeFile(f *os.File) {
	fmt.Println("writing")
	fmt.Fprintln(f, "data")
}
func closeFile(f *os.File) {
	fmt.Println("closing")
	f.Close()
}

프로그램을 실행하면 파일이 다 쓰여진 다음 종료되는걸 확인할 수 있습니다.

$ go run defer.go
creating
writing
closing

다음 예제: 컬렉션 함수.