ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Golang] 함수 (function)
    언어/Golang 2020. 2. 9. 18:10

    call by value일 땐 상관없지만 주소값을 넘길 땐 받는 함수의 파라미터 타입을 정의할 때 조심해야 합니다.

    package main
    func main() {
    	msg := "Hello"
    	say(&msg)
    	println(msg) //변경된 메시지 출력
    }
    
    func say(msg *string) {
    	println(*msg)
    	*msg = "Changed" //메시지 변경
    }


    함수의 파라미터 값을 가변적으로 받고 싶을 때 아래와 같이 ...을 사용합니다. (파이썬에서 *args 와 동일한 기능)

    package main
    func main() {   
        say("One", "Two", "Three", "Four")
        say("Five")
    }
     
    func say(msg ...string) {
        for _, s := range msg {
            println(s)
        }
    }


    Golang에서는 함수에서 리턴할 타입을 전부 선언해야 합니다.

    package main
     
    func main() {
        total := sum(1, 7, 3, 5, 9)
        println(total)
    }
     
    func sum(nums ...int) int {
        s := 0
        for _, n := range nums {
            s += n
        }
        return s
    }


    함수 정의 레벨에서 리턴할 변수를 선언할 수 있습니다. 

    func sum(nums ...int) (count int, total int) {
        for _, n := range nums {
            total += n
        }
        count = len(nums)
        return
    }


    이 때, count는 int 타입이라고 함수 정의 레벨에서 선언이 되어 있으므로 값을 정의할 때, :=가 필요없이 바로 =으로 넣습니다.


    익명함수

    함수를 변수에 할당하거나 다른 함수의 파라미터에 직접 정의 될 수 있습니다.

    package main
    
    func main() {
    	sum := func(n ...int) int { //익명함수 정의
    		s := 0
    		for _, i := range n {
    			s += i
    		}
    		return s
    	}
    
    	result := sum(1, 2, 3, 4, 5) //익명함수 호출
    	println(result)
    }

    일급함수

    package main
    
    func main() {
    	//변수 add 에 익명함수 할당
    	add := func(i int, j int) int {
    		return i + j
    	}
    
    	// add 함수 전달
    	r1 := calc(add, 10, 20)
    	println(r1)
    
    	// 직접 첫번째 파라미터에 익명함수를 정의함
    	r2 := calc(func(x int, y int) int { return x - y }, 10, 20)
    	println(r2)
    	
    	// 익명함수가 아닌 일반 함수도 아래와 같이 가능
    	r3 := calc(test, 10, 20)
    	println(r3)
    
    }
    
    func test (i int, j int) int {
    	return i * j
    }
    
    func calc(f func(int, int) int, a int, b int) int {
    	result := f(a, b)
    	return result
    }


    calc 함수의 첫 번째 파라미터는 아래와 같이 type을 사용하여 보다 직관적으로 정의할 수 있습니다.

    // 원형 정의
    type calculator func(int, int) int
     
    // calculator 원형 사용
    func calc(f calculator, a int, b int) int {
        result := f(a, b)
        return result
    }


    이렇게 함수의 원형을 정의하고 함수를 타 메서드에 전달하고 리턴받는 기능을 델리게이트(Delegate)라 부릅니다.

    댓글