mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 03:34:15 +08:00
61 lines
1.0 KiB
Go
Executable File
61 lines
1.0 KiB
Go
Executable File
package main
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
type Any interface{}
|
|
type EvalFunc func(Any) (Any, Any)
|
|
|
|
func main() {
|
|
fibFunc := func(state Any) (Any, Any) {
|
|
os := state.([]uint64)
|
|
v1 := os[0]
|
|
v2 := os[1]
|
|
ns := []uint64{v2, v1 + v2}
|
|
return v1, ns
|
|
}
|
|
fib := BuildLazyUInt64Evaluator(fibFunc, []uint64{0, 1})
|
|
|
|
for i := 0; i < 10; i++ {
|
|
fmt.Printf("Fib nr %v: %v\n", i, fib())
|
|
}
|
|
}
|
|
|
|
func BuildLazyEvaluator(evalFunc EvalFunc, initState Any) func() Any {
|
|
retValChan := make(chan Any)
|
|
loopFunc := func() {
|
|
var actState Any = initState
|
|
var retVal Any
|
|
for {
|
|
retVal, actState = evalFunc(actState)
|
|
retValChan <- retVal
|
|
}
|
|
}
|
|
retFunc := func() Any {
|
|
return <-retValChan
|
|
}
|
|
go loopFunc()
|
|
return retFunc
|
|
}
|
|
|
|
func BuildLazyUInt64Evaluator(evalFunc EvalFunc, initState Any) func() uint64 {
|
|
ef := BuildLazyEvaluator(evalFunc, initState)
|
|
return func() uint64 {
|
|
return ef().(uint64)
|
|
}
|
|
}
|
|
|
|
/* Output:
|
|
Fib nr 0: 0
|
|
Fib nr 1: 1
|
|
Fib nr 2: 1
|
|
Fib nr 3: 2
|
|
Fib nr 4: 3
|
|
Fib nr 5: 5
|
|
Fib nr 6: 8
|
|
Fib nr 7: 13
|
|
Fib nr 8: 21
|
|
Fib nr 9: 34
|
|
*/
|