Go 언어

본문 바로가기
사이트 내 전체검색


Go 언어
Go 언어

2. 함수 사용하기 2

페이지 정보

작성자 관리자 댓글 0건 조회 2,383회 작성일 19-03-12 21:47

본문

2. 함수 사용하기 2

1. 재귀호출 사용하기


함수에서 자기 자신을 다시 호출하는 함수를 재귀함수라고 한다.


다음은 팩ㅌ리얼을 재귀함수로 구현한 예제이다.


package main

import "fmt"

func factorial(n uint64) uint64 {

 if n == 0 {

  return 1

 }

 return n * factorial(n-1)

}

func main() {

 fmt.Println(factorial(5)) // 120

} 

처음에 값 n을 받은 뒤 계속 n-1을 하여 자기 자신을 호출한다.

 그리고 n이 0이 되면 1을 리턴한 뒤 재귀호출을 중단하고, 함수가 리턴되면서 곱셈 결과를 누적하는 방식이다.





2. 함수를 변수에 저장하기


var 변수명 func(매개변수 자료형) 리턴값_자료형 = 함수명


​package main

import "fmt"

func sum(a int, b int) int {

 return a + b

}

func main() {

 var hello func(a int, b int) int = sum // 함수를 저장하는 변수를 선언하고 함수 대입
 world := sum                           // 변수 선언과 동시에 함수를 바로 대입

 fmt.Println(hello(1, 2)) // 3: hello 변수에 저장된 sum 함수 호출
 fmt.Println(world(1, 2)) // 3: world 변수에 저장된 sum 함수 호출

}

함수를 정의한 뒤 미리 선언한 변수에 대입하기만 하면 함수를 변수에 저장할 수 있다.

Go 언어는 변수를 선언하고 대입할 때 자동으로 자료형을 추론할 수 있으므로 :=를 사용하면 간단하게 변수에 함수를 저장할 수 있다.

변수 뿐만 아니라 슬라이스(배열)에도 함수를 저장할 수 있다.

슬아이스 = []func(매개변수명 자료형) 리턴값_자료형 {함수명1, 함수명2}

​package main

import "fmt"

func sum(a int, b int) int {

 return a + b

}

func diff(a int, b int) int {

 return a - b

}

func main() {

 f := []func(int, int) int{sum, diff} // 함수를 저장할 수 있는 슬라이스를 생성한 뒤 함수로 초기화

 fmt.Println(f[0](1, 2)) // 3: 배열의 첫 번째 요소로 함수 호출
 fmt.Println(f[1](1, 2)) // -1: 배열의 두 번째 요소로 함수 호출

} 

맵에도 함수를 저장할 수 있다.

맵 := map[키_자료형]func(매개변수명 자료형) 리턴값_자료형{ "키":함수명 }

package main

import "fmt"

func sum(a int, b int) int {

 return a + b

}

func diff(a int, b int) int {

 return a - b

}

func main() {

 f := map[string]func(int, int) int{ // 함수를 저장할 수 있는 맵을 생성한 뒤 함수로 초기화

  "sum":  sum,
  "diff": diff,

 }

 fmt.Println(f["sum"](1, 2))  // 3: 맵에 sum 키를 지정하여 함수 호출
 fmt.Println(f["diff"](1, 2)) // -1: 맵에 diff 키를 지정하여 함수 호출

}
 

3. 익명함수 사용하기


함수 안에서 이름이 없는 익명 함수를정의한 뒤 바로호출할 수 있다.


func(매개변수명 자료형) 리턴값_자료형 {}()


package main

import "fmt"

func main() {

 func() { // 함수에 이름이 없음

  fmt.Println("Hello, world!")

 }()

 func(s string) {   // 익명 함수를 정의한 뒤

  fmt.Println(s)

 }("Hello, world!") // 바로 호출

 r := func(a int, b int) int { // 익명 함수를 정의한 뒤

  return a + b

 }(1, 2)                       // 바로 호출하여 리턴값을 변수 r에 저장

 fmt.Println(r) // 3

}


익명함수는 함수를 정의한 뒤 ()(괄호)를 사용하여 바로 함수를호출한다.



댓글목록

등록된 댓글이 없습니다.


개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.