[Tucker의 Go 언어 프로그래밍] 21장 함수 고급편

Coen·2023년 11월 8일
1

tucker-go

목록 보기
16/18
post-thumbnail

이 글은 골든래빗 《Tucker의 Go 언어 프로그래밍》의 21장 써머리입니다.

21 함수 고급편

21.1 가변 인수 함수

  • 인수의 개수가 고정적이지 않은 함수를 말한다.

21.1.1 ...키워드 사용

  • ...키워드를 사용하면 가변 인수를 처리할 수 있다.
func VariadicTest(arr ...int) {
	fmt.Printf("%T %v", arr, arr) //[]int [1]
}

func Test_variadic(t *testing.T) {
	VariadicTest(1)
}
  • 위와 같이 가변인수는 slice로 받게 된다.

21.2 defer 지연 실행

  • 함수 종료 직전에 실행해야 하는 코드를 작성.

  • 사용방법: defer 명령어

21.3 함수 타입 변수

  • 함수를 값으로 갖는 변수를 의미한다.

  • 함수 포인터라고 부른다.

func add(a, b int) int {
	return a + b
}
func mul(a, b int) int {
	return a * b
}
func getOperator(op string) func(int, int) int {
	if op == "+" {
		return add
	} else if op == "*" {
		return mul
	} else {
		return nil
	}
}
func Test_FunctionVariable(t *testing.T) {
	operator := getOperator("+")
	t.Log(operator(1, 2))
	operator = getOperator("*")
	t.Log(operator(1, 2))
}

21.4 함수 리터럴

  • 함수 리터럴은 이름 없는 함수로 함수명을 적지 않고 함수 타입 변수값으로 대입되는 함숫값을 의미

  • 함수명이 없기에 함수 타입 변수로만 호출 가능하다.

func getOperator(op string) func(int, int) int {
	if op == "+" {
		return func(a int, b int) int {
			return a + b
		}
	} else if op == "*" {
		return func(a int, b int) int {
			return a * b
		}
	} else {
		return nil
	}
}
func Test_FunctionVariable(t *testing.T) {
	operator := getOperator("+")
	t.Log(operator(1, 2))
	operator = getOperator("*")
	t.Log(operator(1, 2))
}
  • 함수 리터럴이 정의되는 시점이 아닌 호출되는 시점의 값을 사용하기에 주의가 필요함.
profile
백엔드 프로그래머

0개의 댓글