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은 데이터의 타입 정보를 기억하고 있음. 때때로 올바르게 비교하기 위해서 대상과 타입을 동일하게 형변환을 한 후 사용해야 하는 경우가 있음.
    func compare(x interface{}) {
    	fmt.Println(x == (*int32)(nil))
    }