go 语言的promise异步函数
go 语言的异步书写方式就不再赘述,相关的资料网上有很多。通过一些简单的学习之后,我一直觉使用方式很别扭,比如我想异步并在函数执行之前不退出程序,就需要用在代码中往管道中写值,并读出来值,否则就会死锁。
后来思考之后,试着实现了一个通用的方法,该方法并未实现绝对的通用,但是至少是一个改善的思路。有幸感兴趣的朋友如果恰巧看到该实现,觉得有趣可以一起探讨。
代码如下
promise.go
package promise
import "sync"
type Promise struct {
wg sync.WaitGroup
}
func (p *Promise) Add(f func()) {
p.wg.Add(1)
go func() {
f()
defer p.wg.Done()
}()
}
func (p *Promise) End() {
p.wg.Wait()
}
main.go
package main
import (
"fmt"
"promise"
)
func t(i int) func() {
return func() {
fmt.Println(i)
}
}
func main() {
var promise promise.Promise
for i := 0; i < 10; i++ {
promise.Add(t(i))
}
promise.End()
}
// print -> 9
// print -> 6
// print -> 7
// print -> 8
// print -> 3
// print -> 2
// print -> 4
// print -> 0
// print -> 1
// print -> 5
返回的结果每次都会不一样,有兴趣可以动手试一试以上代码。