golang 中的 channel,它可以保存函数上下文,于是我基于此做了个 函数式的简单版协程
源码如下:
```go
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
// 使用一个核
runtime.GOMAXPROCS(1)
var coroutine = func(cbs func(func(int) int)) func(int) int {
var sign chan func(int) int = make(chan func(int) int)
var run func(int) int
go func(cb func(func(int) int)) {
var gen chan int = make(chan int)
var state int = 0
var next = func(j int) int {
gen <- j
return state
}
var yield = func(ta int) int {
// 设置 state 的值
state = ta
i := <-gen
fmt.Printf("get%v\n", i)
return i
}
sign <- next
cb(yield)
}(cbs)
run = <-sign
return run
}
// 协程生成器
start :=coroutine(func(Next func(int) int) {
// Next 能传出去数据,能传进来数据
fmt.Printf("a\n")
v := Next(3)
fmt.Printf("b%v\n", v)
v = Next(4)
fmt.Printf("e%v\n", v)
})
v1 := start(1)
fmt.Println("next", v1)
time.Sleep(1 * time.Second)
v2 := start(2)
fmt.Println("next", v2)
time.Sleep(2 * time.Second)
fmt.Printf("end")
}
```
结语:
在形式上,完成了 协程的系列操作,但还不够完善,小弟才刚学 golang不久,技术不够娴熟 ,还请各位前辈多多指教
有疑问加站长微信联系(非本文作者)