golang 实现 类似lua中的coroutine

NewProJ · · 932 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

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不久,技术不够娴熟 ,还请各位前辈多多指教

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

932 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传