Golang 함수와 익명함수 - Go series(5)

Date:     Updated:

Categories:

Tags: ,

image

함수

func 키워드를 사용하여 정의한다. 파라미터는 변수 타입 순으로 적게되며 리턴타입은 파라미터 괄호 뒤에 적는다. 호출되는 함수가 호출하는 함수의 반드시 앞에 위치해야 할 필요는 없다.

Go에서 파라미터를 전달하는 방식은 Pass by valuePass By Reference로 나뉜다.

  1. pass by value

    • 파라미터의 값이 함수 내에서 변경되더라도 호출함수에서의 변수와 변함이 없다.
  2. Pass by Reference - C언어의 포인터 사용법과 비슷하게 사용한다.

    • 예시는 다음과 같다.
    package main
    func main(){
        msg:= "Hello!"
        say(&msg)
        println(msg)
    }
    func say(msg *string){
        println(msg)
        *msg = "Change HellO!"
    }
    

    처음 Hello가 say func에서 호출이되고, *msg=로 인해 Change가 된 string이 main println에서 출력된다!

  3. Variadic Function(가변인자함수)

    • 고정된 수의 파라미터가 아닌 다양한 숫자로 전달할 때 가변파라미터를 사용한다.
    • 예시
      package main
      func main(){
          say("This","is","a","book")
          say("Hi")
      }
      func say(msg ...string){
          for _, s := range msg{
              println(s)
          }
      }
      
  4. 함수 리턴값 리턴값이 없을수도, 하나일수도, 복수 개일수도 있다.

    • 리턴값 하나의 경우
      func main(){
          oneplustwo := sum(1,2)
          println(oneplustwo)
      }
      func sum(num ...int) int{
          sum_value := 0
          for _, n := range num{
              sum_value += n
          }
          return sum_value
      }
      
    • 리턴값 복수인 경우
      func main(){
          num_count, oneplustwo := sum(1,2)
          println(oneplustwo)
      }
      func sum(num ...int) (int, int){
          sum_value := 0
          num_count := 0
          for _, n := range num{
              sum_value += n
              num_count++
          }
          return num_count, sum_value
      }
      
    • Named Return Parameter
      • 리턴값이 여러개일 때 코드 가독성을 높인다.
        func sum2(num ...int) (count int, sum int) {
          for _, n := range num {
              sum += n
              count++
          }
          return count, sum
        }
        

익명함수

함수명을 갖지 않는 함수이다. 일반적으로 그 함수 전체를 변수에 할당하거나 혹은 다른 함수의 파라미터에 정의디어 사용된다. 익명함수가 변수에 할당되면 변수명이 함수명으로 취급되어 변수명(파라미터)로 사용될 수 있다.

func main() {
	sum := func(n ...int) (sum_value int) {
		for _, num := range n {
			sum_value += num
		}
		return sum_value
	}
	sum_result := sum(1, 2, 3, 4, 5)
	println(sum_result)
}
  • 일급함수

    • Go에서 함수는 일급함수로서 기본 타입과 동일하게 취급됨. 다른 함수의 파라미터로 전달하거나 다른 함수의 리턴값으로도 사용될 수 있다. 즉 함수의 입력 파라미터나 리턴 파라미터로서 함수 자체가 사용될 수 있다!
    package main
    func main() {
        add : func(i int, j int) int{
            return i+j
        }
    
        r1 := calc(add,10,20)
        println(r1)
        r2 := add(10,20)
        println(r2)
    }
    func calc(f func(int, int) int, a int, b int) int {
        result := f(a,b)
        return result
    }
    
  • type을 사용한 원형 정의

    • type문은 구조체, 인터페이스 등 user defined type을 정의하기 위해 사용된다.
      type calcul func(int, int) int
      func calc(f calcul, a int, b int) int{
        result := a+b
        return result
      }
      

Leave a comment