-
[Golang] 함수 (function)언어/Golang 2020. 2. 9. 18:10
call by value일 땐 상관없지만 주소값을 넘길 땐 받는 함수의 파라미터 타입을 정의할 때 조심해야 합니다.
package main func main() { msg := "Hello" say(&msg) println(msg) //변경된 메시지 출력 } func say(msg *string) { println(*msg) *msg = "Changed" //메시지 변경 }
함수의 파라미터 값을 가변적으로 받고 싶을 때 아래와 같이 ...을 사용합니다. (파이썬에서 *args 와 동일한 기능)
package main func main() { say("One", "Two", "Three", "Four") say("Five") } func say(msg ...string) { for _, s := range msg { println(s) } }
Golang에서는 함수에서 리턴할 타입을 전부 선언해야 합니다.
package main func main() { total := sum(1, 7, 3, 5, 9) println(total) } func sum(nums ...int) int { s := 0 for _, n := range nums { s += n } return s }
함수 정의 레벨에서 리턴할 변수를 선언할 수 있습니다.
func sum(nums ...int) (count int, total int) { for _, n := range nums { total += n } count = len(nums) return }
이 때, count는 int 타입이라고 함수 정의 레벨에서 선언이 되어 있으므로 값을 정의할 때, :=가 필요없이 바로 =으로 넣습니다.
익명함수
함수를 변수에 할당하거나 다른 함수의 파라미터에 직접 정의 될 수 있습니다.
package main func main() { sum := func(n ...int) int { //익명함수 정의 s := 0 for _, i := range n { s += i } return s } result := sum(1, 2, 3, 4, 5) //익명함수 호출 println(result) }
일급함수
package main func main() { //변수 add 에 익명함수 할당 add := func(i int, j int) int { return i + j } // add 함수 전달 r1 := calc(add, 10, 20) println(r1) // 직접 첫번째 파라미터에 익명함수를 정의함 r2 := calc(func(x int, y int) int { return x - y }, 10, 20) println(r2) // 익명함수가 아닌 일반 함수도 아래와 같이 가능 r3 := calc(test, 10, 20) println(r3) } func test (i int, j int) int { return i * j } func calc(f func(int, int) int, a int, b int) int { result := f(a, b) return result }
calc 함수의 첫 번째 파라미터는 아래와 같이 type을 사용하여 보다 직관적으로 정의할 수 있습니다.
// 원형 정의 type calculator func(int, int) int // calculator 원형 사용 func calc(f calculator, a int, b int) int { result := f(a, b) return result }
이렇게 함수의 원형을 정의하고 함수를 타 메서드에 전달하고 리턴받는 기능을 델리게이트(Delegate)라 부릅니다.