반응형
이번에는 고루틴과 채널을 이용하여 피보나치 수열을 생성하는 함수를 만들어보자.
소스 코드는 다음과 같다.
// Go Fib
package main
import "fmt"
func Fib(max uint64) <-chan uint64 {
ch := make(chan uint64)
go func() {
defer close(ch)
var a, b uint64
a, b = 0, 1
for a <= max {
ch <- a
a, b = b, a+b
}
}()
return ch
}
func FibGenerator(max uint64) func() uint64 {
var next, a, b uint64
next, a, b = 0, 0, 1
return func() uint64 {
next, a, b = a, b, a+b
if next > max {
return 0
}
return next
}
}
func main() {
for fib := range Fib(9999999999999999999) {
fmt.Print(fib, ", ")
}
fmt.Println("END!")
}
소스 코드는 매우 간단하며 동시에 매우 강력하다.
고루틴과 채널의 강점을 잘 활용하는 예제라 볼 수 있다.
실행 결과는 다음과 같다.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987,
1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393,
196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887,
9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141,
267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073,
4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173,
86267571272, 139583862445, 225851433717, 365435296162, 591286729879,
956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842,
10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141,
117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393,
1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464,
14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591,
99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673,
679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120,
4660046610375530309, 7540113804746346429, END!
Process exiting with code: 0
실행 속도는 0.817 sec 정도이다. (VS Code 기준)
고루틴의 위엄이 얼마나 대단한지 알 수 있다.
반응형
'IT > Go 언어 (Golang)' 카테고리의 다른 글
[Golang] 자체 MQTT 브로커 서버 구현 - 2 (0) | 2020.02.26 |
---|---|
[Golang] 자체 MQTT 브로커 서버 구현 - 1 (2) | 2020.02.26 |
[Golang] Go Routine (고 루틴) - Golang의 꽃 [기본] (0) | 2020.01.12 |
[Golang] Go Routine (고 루틴) - Golang의 꽃 [심화] (0) | 2020.01.12 |
[Golang] 문자열과 문자열의 종류 (0) | 2019.12.22 |