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