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)라 부릅니다.

'언어 > Golang' 카테고리의 다른 글

[Golang] http 모듈 사용하기  (0) 2020.02.16
[Golang] map  (0) 2020.02.09
[Golang] 배열 (array) & 슬라이스 (slice)  (0) 2020.02.09
[Golang] 함수 (function)  (0) 2020.02.09
[GO] 데이터 타입 & 연산자  (0) 2020.02.09
[Golang] 조건문 (if) & Switch문  (0) 2020.02.09
[Golang] 변수  (0) 2020.02.09