2015년 7월 20일 월요일

GO 언어 기본 문법 - 3

------------함수---------------
함수의 중괄호
함수의 여는 중괄호를 다음 줄에 작성하면 에러
func hello()   //에러
{
   //어쩌구
}

익명함수
함수에는 이름이 없는 함수를 익명 함수라고 한다. 익명함수는 정의한 뒤 바로 호출 가능

func() {            //함수에 이름이 없음
   fmt.Println("Hello, world!")
}()

func(s string) {  //익명 함수를 정의한 후
    fmt.Println(s)
}("Hello, world!")  //바로 호출

r:= func(a int, b int) int { //익명 함수를 정의한 뒤
   return a + b
}(1,2)  //바로 호출하여 리턴값을 변수 r에 저장

클로저
클로저는 함수 안에서 함수를 선언 및 정의할 수 있고,
바깥쪽 함수에 선언된 변수에도 접근할 수 있는 함수를 말한다.
또한 클로저를 사용하면 지역변수가 소멸되지 않고,
나중에 함수를 호출할 때마다 계속 가져다 쓸수 있다.
즉, 클로저는 함수가 선언될 때의 환경을 계속 유지하여 함수의 변수에 저장할 수 있다

func calc() func(x int) int {
   a,b := 3,5   //지역 변수는 함수가 끝나면 소멸되지만
   return func(x int) int {
       return a*x + b //클로저이므로 함수를 호출 할 때마다 변수 a,b의 값을 사용
   }
}
func main() {
   f := calc() //calc 함수를 실행하여 리턴 값으로 나온 클로저를 변수에 저장
   fmt.Println(f(1))  //8
   fmt.Println(f(2))  //11
   fmt.Println(f(3))  //14
   fmt.Println(f(4))  //17
   fmt.Println(f(5))  //20
}

recover
recover 함수를 사용하면 패닉이 발생했을 때 프로그램이 바로 종료되지 않고 예외 처리를 할 수 있음

func f() {
   defer func() {               //recover 함수는 지연 호출로 사용해야 함
      s := recover()           //패닉이 발생해도 프로그램을 종료하지 않음
      fmt.Println(s)            //panic 함수에서 설정한 에러 메세지를 받아옴
   }()
   panic("Error!!!")
}
func main() {
    f()
    fmt.Println("Hello, world!")  //패닉이 발생했지만 계속 실행됨
}

댓글 없음:

댓글 쓰기