Golang
[Go] The Go Programming Language #5-5: 함수 값
leejiwonn
2021. 12. 1. 04:30
이 시리즈는 "The Go Programming Language" 책을 바탕으로 작성되었습니다.
5.5 함수 값
- Go의 함수는 일급 함수 (퍼스트 클래스 값) 임. 즉, 함수 값이 다른 값과 마찬가지로 타입이 있고 이 값을 변수에 할당하거나 함수로 전달하거나 함수에서 반환할 수 있다는 의미임.
func square(n int) int { return n * n } func negative(n int) int { return -n } func product(m, n int) int { return m * n } f := square fmt.Println(f(3)) // "9" f = negative fmt.Println(f(3)) // "-3" fmt.Printf("%T\n", f) // "func(int) int" f = product // 컴파일 오루: func(int, int) int를 func(int) int에 할당할 수 없음. - 함수 값을 이용해 값뿐만 아니라 동작도 전달할 수 있음.
// strings.Map : 문자열의 각 글자들에 함수를 적용하고 그 결과를 결합해 새 문자열을 생성함. func add1(r rune) rune { return r + 1 } fmt.Println(strings.Map(add1, "VMS")) // "WNT" fmt.Println(strings.Map(add1, "Admix")) // "Benjy" - 함수 타입의 제로 값은 nil임.
- nil 함수 값을 호출하면 패닉이 발생함.
var f func(int) int f(3) // 패닉: nil 함수 호출 - 함수 값은 nil과 비교할 수 있음. 단, nil끼리는 비교할 수 없으므로 서로 간에 비교하거나 맵의 키로 쓸 수는 없음.
var f func(int) int if f != nil { f(3) }
- nil 함수 값을 호출하면 패닉이 발생함.
+) 더 알아가기
- nil은 데이터의 타입 정보를 기억하고 있음. 때때로 올바르게 비교하기 위해서 대상과 타입을 동일하게 형변환을 한 후 사용해야 하는 경우가 있음.
func compare(x interface{}) { fmt.Println(x == (*int32)(nil)) }