2. Function
2.1 매개변수
2.1.1 자료형 명시
: 함수는 매개 변수를 가진다. 하지만, C/C++과 Java와는 다르게, 자료형이 매개변수의 이름 뒤에 온다. Go에서는 이것이 코드를 왼쪽에서 오른쪽으로 읽을때 더 자연스럽다고 생각한듯 하다. 그와 동일하게 리턴 자료형 또한 함수명이 끝나면 뒤에 따라 온다.
package main
import "fmt"
func add(x int, y int) int {
return x + y
}
func main() {
fmt.Println( add(42, 13) )
}
: 또한, 같은 자료형이 두개 이상 사용될시에 x int, y int
를 x, y int
로 명시 할수 있다.
2.2 Return
2.2.1 Multiple results
: 하나의 함수로 여러개의 결과를 리턴 할수 있다. (개인적으로 졸라 혁명적인 부분이라고 생각함.)
package main
import "fmt"
func swap(x, y string) (string, string) { return y, x}
func main() { a, b := swap("hello", "world") fmt.Println(a, b)}
2.2.2 Named results
: 반환 값에 이름을 부여하면, 함수 내부에서 변수 처럼 사용할수 있고, 무엇을 반환할지 지정되지 않은 return
에 묵시적으로 해당 값을 반환 할수 있습니다.
package main
import "fmt"
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return //무엇을 반환할지 정해지지 않음.
}
func main() {
fmt.Println(split(17))
}
2.3. 함수 값 (Function values)
: 함수도 값이다.
package main
import (
"fmt"
"math"
)
func main() {
hypot := func(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
} // JavaScript처럼 함수를 생성하여 변수에 refer한다.
fmt.Println(hypot(3, 4)) //해당 함수를 println의 인자로 전달한다.
}
2.4. 함수 클로져 (Function closures)
: 코드에서 adder함수는 클로져를 반환한다. 각각의 클로져는 자신만의 sum변수를 가진다.
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
pos, neg := adder(), adder() //adder function은 각각의 sum을 가지는 어떤 처리가 있는 함수를 return 한다.
for i := 0; i < 10; i++ {
fmt.Println( pos(i), neg(-2*i), )
}
}