가장 빨리 만나는 Go 언어 핵심 정리

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

핵심 정리

이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07

함수의 중괄호

함수의 여는 중괄호를 다음 줄에 작성하면 컴파일 에러가 발생합니다.

func hello()
{ // 컴파일 에러
	fmt.Println("Hello, world!")
}

반드시 함수가 시작되는 줄에서 여는 중괄호를 작성합니다.

func hello() {
	fmt.Println("Hello, world!")
}
함수에서 리턴값 여러 개 사용

Go 언어의 함수는 리턴값을 여러 개 사용할 수 있습니다.

func SumAndDiff(a int, b int) (int, int) { // int형 리턴값이 두 개인 함수 정의
	return a + b, a - b // 리턴할 값 또는 변수를 차례대로 나열. 합과 차를 동시에 리턴
}

func main() {
	sum, diff := SumAndDiff(6, 2) // 변수 두 개에 리턴값 두 개를 대입
	fmt.Println(sum, diff)        // 8 4: 합과 차
}
익명 함수

함수에 이름이 없는 함수를 익명 함수라고 합니다. 익명 함수는 정의한 뒤 바로 호출할 수 있습니다.

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
}
지연 호출

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

func hello() {
	fmt.Println("Hello")
}

func main() {
	// ↓ 함수의 호출이 지연됨.
	defer world() // 현재 함수(main())가 끝나기 직전에 호출
}
recover

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

func f() {
	defer func() {     // recover 함수는 지연 호출로 사용해야 함
		s := recover() // 패닉이 발생해도 프로그램을 종료하지 않음, panic 함수에서 설정한 에러 메시지를 받아옴
		fmt.Println(s)
	}()

	panic("Error !!!") // panic 함수로 에러 메시지 설정, 패닉 발생
}

func main() {
	f()

	fmt.Println("Hello, world!") // 패닉이 발생했지만 계속 실행됨
}

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2015-06-01