Go 언어

본문 바로가기
사이트 내 전체검색


Go 언어
Go 언어

5. 지연 호출 사용하기

페이지 정보

작성자 관리자 댓글 0건 조회 880회 작성일 21-07-20 12:32

본문

5. 지연 호출 사용하기

지연 호출은 특정 함수를 현재 함수가 끝나기 직전에 실행하는 기능입니다.

다른 언어의 try finally 구문과 비슷하게 동작하지만 문법이 좀 더 간단합니다.


defer 함수명()

defer 함수명(매개변수)



package main


import "fmt"


func hello() {

fmt.Println("Hello")

}


func world() {

fmt.Println("world")

}


func main() {

        //↓ 함수의 호출이 지연됨.

defer world() // 현재 함수(main())가 끝나기 직전에 호출

hello()

hello()

hello()

}


실행 결과

Hello

Hello

Hello

world


여기서 hello 함수보다 world 함수를 먼저 호출했더라도 출력을 해보면 world 함수가 나중에 호출됩니다. 

즉 defer를 사용한 함수는 현재 함수(main())가 끝나기 직전에 호출되므로 다른 함수들 보다 맨 마지막에 호출됩니다.


다음은 함수 안에 익명 함수를 선언 및 정의하고 지연 호출을 합니다.


func HelloWorld() {

//↓ HelloWorld() 함수가 끝나기 직전에 호출

defer func() {

fmt.Println("world")

}()


func() {

fmt.Println("Hello")

}()

}


func main() {

HelloWorld()

}


실행 결과

Hello

world


지연 호출한 함수가 실행되는 순서는 자료구조의 스택(LIFO)과 동일합니다. 

따라서 맨 나중에 지연 호출한 함수가 먼저 실행됩니다.


func main() {

for i := 0; i < 5; i++ {

defer fmt.Printf("%d ", i)

}

}


실행 결과

4 3 2 1 0


지연 호출은 파일을 열고 닫을 때 유용하게 활용할 수 있습니다.


hello.txt

Hello, world!


main.go

package main


import (

"fmt"

"os"

)


func ReadHello() {

file, err := os.Open("hello.txt")

defer file.Close() // 지연 호출한 file.Close()가 맨 마지막에 호출됨


if err != nil {

fmt.Println(err)

return // file.Close() 호출

}


buf := make([]byte, 100)

if _, err = file.Read(buf); err != nil {

fmt.Println(err)

return // file.Close() 호출

}


fmt.Println(string(buf))


// file.Close() 호출

}


func main() {

ReadHello()

}


실행 결과

Hello, world!


os.Open으로 파일을 연 뒤 지연 호출로 file.Close를 호출하면 함수가 끝날 때 무조건 file.Close로 파일을 닫습니다. 

파일 열기는 성공했지만 중간에 file.Read에서 실패하더라도 지연 호출을 사용했으므로 함수가 종료될 때 file.Close로 파일을 닫습니다. 

특히 이런 방식은 프로그램 흐름상 분기가 많아 에러 처리가 복잡해질때 유용합니다.



댓글목록

등록된 댓글이 없습니다.


개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.