본문 바로가기
프로그래밍/Go언어

Golang 함수, 익명함수 사용법.

by Hwan2 2021. 5. 16.
728x90
반응형

Golang의 함수, 익명함수 사용법입니다.

 

Golang은 Lambda라는 표현을 사용하지 않습니다. 

 

뭐.... 익명함수나 Lambda나 결국 같은 놈이니깐요.....

 

 

1. 함수

package main

import (
	"fmt"
)

func add(a int, b int) int {
	return a + b
}

func main() {
	var a int = 10
	var b int = 20

	fmt.Println(add(a, b))	//output : 30
}

이런식으로 함수를 정의할 수 있습니다.

 

Golang의 함수는 이런식으로 구성되어 있습니다.

별거 없죠.....

 

하지만 Golang의 특징중 하나는 return 값을 여러게 줄 수 있다는 것입니다.

 

2. 함수 리턴 여러개

package main

import (
	"fmt"
)

func add(a int, b int) (int, string) {
	return a + b, "hi"
}

func main() {
	var a int = 10
	var b int = 20

	sum, s1 := add(a, b)
	_, s2 := add(a, b)

	fmt.Println(sum, s1)	//output : 30 hi
	fmt.Println(s2)		//output : hi
    	fmt.Println(add(a, b))	//output : 30 hi
}

Golang은 이렇게 return을 여러게 줄 수 있습니다.

또한 return 값을 받을 때 _, 처리로 해당 값을 안받을 수도 있죠.

 

 

3. 익명함수

package main

import "fmt"

func main() {

	calc := func(a int, b int) int {
		return a + b
	}
    
	fmt.Println(calc)	//output : 0x467fa0
	fmt.Println(calc(1, 2))	//output : 3
}

익명함수 같은 경우, 함수의 이름이 없습니다.

 

위 코등 같이 함수를 이름없이 생성한 후 변수에 함수를 넣고 있습니다.

 

이는 함수의 주소값을 calc이라는 변수에 넣는 것으로, calc에는 주소 값이 들어있습니다.

출력결과를 보시면 확인할 수 있습니다.

 

이는 C++의 함수 객체와 동작방식이 같습니다. 

해당 글을 참고하면 이해하기 더 쉬울 것입니다.

https://hwan-shell.tistory.com/86

 

c++ 함수 객채란??

C++에서는 객체를(클래스) 함수처럼 사용이 가능합니다. 설명하기에 앞서 연산자 오버라이딩 개념을 알아야 합니다. 연산자 오버라이딩1(클릭) 연산자 오버라이딩2(클릭) 이 함수 객체를 왜!!!! 사

hwan-shell.tistory.com

 

4. 익명함수를 Lambda처럼 사용하기 (일급 함수)

package main

import "fmt"

func sort(arr []int, len int, cmp func(int, int) bool) {
	for i := 0; i < len; i++ {
		for j := i + 1; j < len; j++ {
			if cmp(arr[i], arr[j]) {
				temp := arr[i]
				arr[i] = arr[j]
				arr[j] = temp
			}
		}
	}
}

func main() {

	var arr = []int{5, 10, 2, 69, 122}

	sort(arr, 5, func(a int, b int) bool {
		return a > b
	})

	fmt.Println(arr)	//output : [2 5 10 69 122]
}

 

이런식으로 Golang의 익명함수는 Lambda처럼 사용이 가능합니다.

 

물론 함수를 정의해서 넣어주는 방법도 있지만, 익명 함수의 목적에 맞게 만들어 봤습니다.

 

5. 익명 함수 리턴

package main

import "fmt"

func add(a int, b int) func() {
	sum := a + b
	return func() {
		fmt.Println(sum)
	}
}

func main() {
	add(10, 20)() //output : 30

	print_add := add(10, 20)
	print_add()	//output : 30
}

 

이런식으로 함수 자체를 return할 수 있습니다.  또한 저렇게 됐을 경우 sum 변수를 클로저 상태가 되어 

해당 변수는 heap으로 가게 됩니다. 따라서 결과 값인 30을 계속 출력해 줄 수 있는 것이죠.

 

C++의 Lambda함수 관련해서는 아래 링크를 참고하시기 바랍니다.

https://hwan-shell.tistory.com/84

 

C++ Lambda 사용 이유와 사용 방법

C++에는 lambda라는 문법이 존제합니다. 원래 이 lambda는 boost라는 라이브러리에서 제공하는 함수였지만 지금은 modern c++로 넘어가면서 이 기능을 기본적으로 지원하게 되었습니다. (현재 modern c++은

hwan-shell.tistory.com

 

확실히 C++과 유사한 점들이 많은 것 같습니다. 포인터도 그렇고....

 

이상입니다.!!!

반응형

댓글


스킨편집 -> html 편집에서