익명함수는 단어 뜻 그대로 이름을 적지 않고 정의한 함수를 의미함.
일회성으로 사용하거나 특정 로직을 변수에 담아두고 싶을 때 사용
// 일반적인 함수 선언 (이름 있음)
func sum(x int, y int) int { return x + y }
// 익명 함수 선언 (이름 없음)
func(x int, y int) int { return x + y }
고차함수는 함수 자체를 일반 데이터처럼 주고받는 함수를 의미함.
아래 두가지 조건 중 하나라도 만족하면 고차함수라고 부름.
func calc(f func(int, int) int, a int, b int) int {
result := f(a, b) // 파라미터인 함수 f를 내부에서 실행
return result
}
일급함수는 프로그래밍 언어의 특성이나 규칙을 의미함.
일급함수란 어떤 데이터(함수)가 정수나 문자열 같은 기본 데이터 타입과 완벽하게 동일한 대우를 받는 특성을 의미함.(이때 어떤 데이터는 일급객체라고 함)
일급함수 특성을 가진 언어는 함수를 다음과 같이 다룰 수 있음.
즉, 위의 고차함수는 일급함수 특성을 보여줌.
package main
import (
"fmt"
"strings"
)
func changeValue(message *string) {
*message = fmt.Sprintf("your name is %s", *message)
}
func addTen(value int) int {
return value + 10
}
// ... 은 slice 로 값을 받음
func sum(values ...int) int {
result := 0
for _, value := range values {
result = result + value
}
return result
}
func divideStrings(value string) (string, string) {
values := strings.Split(value, "_")
return values[0], values[1]
}
// 고차함수 -> 함수를 파라미터로 받으므로써 일급함수 특성을 보여줌
func calc(f func(int, int) int, a int, b int) int {
result := f(a, b)
return result
}
func main() {
// 함수 호출
fmt.Println(addTen(100))
// slice 변수 호출
fmt.Println(sum(1, 2, 3, 4, 5))
// 다중 변수 반환
prefix, suffix := divideStrings("Your_Name")
fmt.Println(prefix, suffix)
// 포인터 전달
message := "Ronaldo"
changeValue(&message)
fmt.Println(message)
// 익명 함수 -> 함수를 변수에 할당하므로써 일급함수 특성을 보여줌
sum := func(x int, y int) int {
return x + y
}
fmt.Println(sum(5, 10))
add := func(i int, j int) int {
return i + j
}
minus := func(i int, j int) int {
return i - j
}
fmt.Println(calc(add, 10, 5))
fmt.Println(calc(minus, 10, 5))
}
코드 참고: https://wikidocs.net/164464