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
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++과 유사한 점들이 많은 것 같습니다. 포인터도 그렇고....
이상입니다.!!!
'프로그래밍 > Go언어' 카테고리의 다른 글
Golang의 fmt.Print는 heap으로 간다? (0) | 2021.05.23 |
---|---|
Golang Closure(클로저)란? (인라인과 메모리 할당 설명) (0) | 2021.05.23 |
Golang for문 사용법!! (0) | 2021.05.16 |
Golang 구조체 설명 (0) | 2021.05.02 |
Go "fmt" 패키지의 사용법과 Print, 내장함수 println 차이 (0) | 2021.04.18 |
댓글