golang

[golang] 함수.클로져 예제

'김용환' 2017. 9. 6. 18:01


go의 함수는 호출하는 함수 위, 아래에 존재할 수 있다.  { 위치에 따라 에러가 날 수 있다...

package main

import "fmt"


func main() {
helloWorld()
helloWorldGivenString("Samuel")
}

func helloWorld() {
fmt.Println("HelloWorld")
}

func helloWorldGivenString(str string) {
fmt.Println("HelloWorld " + str)
}








리턴 값이 여러 개가 될 수 있고, 매개 변수에 가변 변수를 사용할 수 있다. 


package main

import "fmt"


func main() {
fmt.Println(getTwoInteger())

_, _, last := getThree()
fmt.Println(last)


total1 := sum(1,2,3)
fmt.Println(total1)


total2 := add(3)
fmt.Println(total2)
}

func getTwoInteger() (int, int){
return 1, 1
}

func getThree() (int, string, string){
return 1, "a", "b"
}

func sum(n...int) int {
var total = 0
for _, value := range n {
total += value
}

return total
}

func add(n int) int {
if n > 4 {
return 0
}
return n+add(n+1)
}


결과는 다음과 같다.


1 1

b

6

7



파서가 좋아서 그런지 대충 써도 가변 변수는 잘 동작한다.

n ...int

n...int

n ... int



다음은 함수를 변수에 할당할 수 있음을 보여주는 예제이다. 

package main

import "fmt"


func getTwoInteger() (int, int){
return 1, 1
}

func main() {
var function1 func() (int, int) = getTwoInteger
function2 := getTwoInteger

fmt.Println(function1())
fmt.Println(function2())
}

결과는 다음과 같다.


1 1

1 1




익명 함수를 사용하는 예제이다. 


package main

import "fmt"

func main() {
func() {
fmt.Println("Hello, World")
}()

f := func() {
fmt.Println("Hello, World")
}
f()
}

결과는 다음과 같다.


Hello, World

Hello, World




함수를 클로저(closure)로 사용할 수 있다. 클로저는 함수 바깥의 값을 참조하는 함수 값을 의미한다.


package main

import "fmt"


func minusValue(n int) func() int {
i := n
return func() int {
i--
return i
}
}

func main() {
next := minusValue(10)
fmt.Println(next())
fmt.Println(next())
fmt.Println(next())
fmt.Println(next())
}

결과는 다음과 같다.


9

8

7

6