백엔드, 기타/Golang

Golang 2. 함수 2)클로저(closure), 지연호출(defer), 패닉과 복구(panic and recover)

데브힐러 2020. 8. 15. 08:20
반응형

1. 클로저(closure)

 

 

  • 클로저(익명함수) 안에서 바깥에 있는 변수에 접근하기

        예시 y=ax-b함수

func main() {
	a, b := 4, 9

	f := func(x int) int{
		return a*x - b
	}
	y := f(5)
	fmt.Println(y) // 11출력
}

 

 

  • 클로저를 리턴하는 함수

     형태 - func 함수명() func(파라미터명 자료형) 리턴값_자료형   

     예시 y=ax-b

func calc() func(x int) int{
	a,b := 4,7
	return a*x-b
}

func main() {
	f := calc() 
    /* calc함수를 실행하여 리턴값으로 나온 클로저를 변수에 저장
     * 만약 일반 함수를 변수 f에 대입시킬 경우 f := calc형태가 된다.
     */
	fmt.Println(f(3)) // 5 출력
}

 

 

2. 지연 호출(defer)

 

     지연 호출은 특정 함수를 현재 함수가 끝나기 직전에 실행하는 기능이다. try finally구문과 유사하게 동작한다. defer가 복수일 경우 스택형식으로 실행(LIFO)

     기본 예시

func hello(){
	defer func() {
    	//이 클로저는 hello함수의 호출이 끝나기 전에 호출된다.
		fmt.Println("closure")
	}()
	func() {
		fmt.Println("hello")
	}()
}

func main() {
	hello() 
    //hello
    //closure 출력
}

 

 

  파일 열기

package main

import (
	"fmt"
	"os"
)

func ReadText(){
	file, err := os.Open("resist.txt")
	defer file.Close() 
    /*file.Read 에 성공해도, 실패해도
    * defer는 ReadText함수 종료시 반드시 파일을 닫아주는 역할을 한다.
	*/
    
	if err != nil {
		fmt.Println(err)
		return
	}

	buf := make([]byte, 100)
	if _, err = file.Read(buf); err != nil{
		fmt.Println(err)
		return
	}
	fmt.Println(string(buf))
}

func main() {
	ReadText()
}

 

 

3. 패닉과 복구(panic and recover)

 

 런타임 에러(패닉)이 발생할 경우 프로그램이 종료된다. recover함수는 패닉 발생시에도 프로그램을 종료하지 않고 계속 실행한다. 지연호출 구문 안에 작성한다.

 

 

 

 

반응형