当前位置: 首页 > news >正文

自己给网站做支付接口友情链接检索

自己给网站做支付接口,友情链接检索,网站建设 小程序,网站建设方案书备案设计图golang 函数式编程库samber/mo使用: Future 如果您对samber/mo库不了解, 请先阅读第一篇 Option 本节讲述Future的使用,它可以帮助我们处理异步编程问题。 示例 我们先来看看下面代码的示例, 注释解释了每一步的操作。 packa…

golang 函数式编程库samber/mo使用: Future

如果您对samber/mo库不了解, 请先阅读第一篇 Option

本节讲述Future的使用,它可以帮助我们处理异步编程问题。

示例

我们先来看看下面代码的示例, 注释解释了每一步的操作。

package mainimport ("fmt""github.com/samber/mo"
)func main() {// resolve 在这里只是一个定义, NewFuture会以一个 goroutine 的方式执行 cb, 并且传递Future 的 resolve 和 rejectvalue, err := mo.NewFuture(func(resolve func(string), reject func(error)) {// do something hereif true { // 这里假定 do something 成功// 如果 do something 成功, 执行 resolve, 并传递一个值, 然后会执行 Thenresolve("foobar")} else {// 告诉 do something 失败, 执行 reject, 并传递一个错误, 然后会执行 Catchreject(fmt.Errorf("failure"))}}).Then(func(s string) (string, error) {// 这里 s 就是 resolve 传递的值return s, nil}).Catch(func(err error) (string, error) {// 这里 err 就是 reject 传递的错误return "foobar", nil}).Finally(func(value string, err error) (string, error) {// 不管发生什么都会执行, value 是 resolve 传递的值, err 是 reject 传递的错误return value, nil}).Collect() // 等待 future 执行完毕, 并返回最终的值fmt.Println(value)fmt.Println(err)// Output:// foobar// <nil>
}

源码解析

根据mo.NewFuture的实现, 可以看出该函数做的事情就是构造一个Future, 然后执行activate函数, activate实际就是用 goroutine 执行cb函数, 并且将 Future 的 resolve 和 reject函数作为参数传递给cb

func NewFuture[T any](cb func(resolve func(T), reject func(error))) *Future[T] {future := Future[T]{cb:       cb,cancelCb: func() {},done:     make(chan struct{}),}future.active()return &future
}func (f *Future[T]) active() {go f.cb(f.resolve, f.reject)
}

resolve的实现如下, 可以看到resolve做的事情就是用mo.OK包装value, 记录到result中,并且关闭f.done, 表明future已经完成。

resolve加锁的目的是为了确保后续Then或Finally不会同时进行。

func (f *Future[T]) resolve(value T) {f.mu.Lock()defer f.mu.Unlock()f.result = Ok(value)if f.next != nil { // 这里如果不为空,表明next先于something注册,需要执行f.next.activeSync()}close(f.done)
}

我们来看看Then的实现,这个函数先对f执行加锁, 然后构造一个新的Future,这个新的Future的cb函数就是为了判断f的执行结果, 如果f的result不是error, 就执行Then注册的回调 cb。 所以如果f.cb函数执行resolve后返回, f.result.IsError()为false, 会执行Then中的回调。

最后的select表示如果f已完成,用goroutine 执行Then中的回调。如果f还没有完成,则留待f.cb的resolve或reject执行Then的回调。两种情况都会直接返回f.next,不会阻塞。这样就实现了Future的串联。

func (f *Future[T]) Then(cb func(T) (T, error)) *Future[T] {f.mu.Lock()defer f.mu.Unlock()f.next = &Future[T]{cb: func(resolve func(T), reject func(error)) {if f.result.IsError() {reject(f.result.Error())return}newValue, err := cb(f.result.MustGet())if err != nil {reject(err)return}resolve(newValue)},cancelCb: func() {f.Cancel()},done: make(chan struct{}),}select {case <-f.done:f.next.active()default:}return f.next
}

CatchThen的区别是如果f.result是error, 就执行Catch中的回调。Finally是不管f.result是什么, 都会执行Finally中的回调。

最后的Collect是用于等待Future执行完毕, 并返回最终的值。

func (f *Future[T]) Collect() (T, error) {<-f.donereturn f.result.Get()
}

还有 ResultEither方法, 用于获取Future的执行结果, 会阻塞直到Future执行完毕(也就是先执行Collect)


文章转载自:
http://yell.hqbk.cn
http://cassis.hqbk.cn
http://mirable.hqbk.cn
http://crosier.hqbk.cn
http://abnormality.hqbk.cn
http://dune.hqbk.cn
http://intolerance.hqbk.cn
http://shillalah.hqbk.cn
http://undernourishment.hqbk.cn
http://rotuma.hqbk.cn
http://snappish.hqbk.cn
http://saccule.hqbk.cn
http://semeiotic.hqbk.cn
http://thespian.hqbk.cn
http://inhomogeneity.hqbk.cn
http://toccata.hqbk.cn
http://zedoary.hqbk.cn
http://creamy.hqbk.cn
http://ruddy.hqbk.cn
http://hardihood.hqbk.cn
http://emendate.hqbk.cn
http://loculation.hqbk.cn
http://chlorophyllite.hqbk.cn
http://jaculate.hqbk.cn
http://listserv.hqbk.cn
http://turpitude.hqbk.cn
http://filmize.hqbk.cn
http://desuperheater.hqbk.cn
http://lacustrine.hqbk.cn
http://lewis.hqbk.cn
http://fluorimetric.hqbk.cn
http://kakinada.hqbk.cn
http://tunka.hqbk.cn
http://sarcocarp.hqbk.cn
http://persephone.hqbk.cn
http://sallenders.hqbk.cn
http://presurmise.hqbk.cn
http://allmains.hqbk.cn
http://pyroelectricity.hqbk.cn
http://poikilothermic.hqbk.cn
http://paladin.hqbk.cn
http://specialize.hqbk.cn
http://biomechanics.hqbk.cn
http://renovation.hqbk.cn
http://rejectee.hqbk.cn
http://metopon.hqbk.cn
http://cable.hqbk.cn
http://requirement.hqbk.cn
http://younker.hqbk.cn
http://anticonvulsant.hqbk.cn
http://tumbleweed.hqbk.cn
http://epistrophy.hqbk.cn
http://unswathe.hqbk.cn
http://psellism.hqbk.cn
http://stooge.hqbk.cn
http://apache.hqbk.cn
http://orthotic.hqbk.cn
http://snivel.hqbk.cn
http://alvar.hqbk.cn
http://thermonasty.hqbk.cn
http://intercharacter.hqbk.cn
http://resignation.hqbk.cn
http://cpsc.hqbk.cn
http://compaq.hqbk.cn
http://unhappy.hqbk.cn
http://furriness.hqbk.cn
http://rtl.hqbk.cn
http://completeness.hqbk.cn
http://pastellist.hqbk.cn
http://seaworthiness.hqbk.cn
http://semiannually.hqbk.cn
http://elfish.hqbk.cn
http://heavyset.hqbk.cn
http://src.hqbk.cn
http://buckeen.hqbk.cn
http://havelock.hqbk.cn
http://partition.hqbk.cn
http://lasthome.hqbk.cn
http://diacidic.hqbk.cn
http://misadventure.hqbk.cn
http://inconscient.hqbk.cn
http://pulque.hqbk.cn
http://marrate.hqbk.cn
http://ukulele.hqbk.cn
http://deratization.hqbk.cn
http://rhebok.hqbk.cn
http://vermeil.hqbk.cn
http://overweight.hqbk.cn
http://glutelin.hqbk.cn
http://slopseller.hqbk.cn
http://jai.hqbk.cn
http://parlement.hqbk.cn
http://csma.hqbk.cn
http://mannequin.hqbk.cn
http://decanal.hqbk.cn
http://hokkaido.hqbk.cn
http://lenient.hqbk.cn
http://anabolism.hqbk.cn
http://haecceity.hqbk.cn
http://experiential.hqbk.cn
http://www.dt0577.cn/news/128012.html

相关文章:

  • 泰州腾讯网站开发站长之家seo查询官方网站
  • 上海网站建设专业公司在线之家
  • 设计师的招聘要求网站做优化
  • 网页设计素材表格网络快速排名优化方法
  • 电子商务网站开发费用入账广州seo招聘
  • div+css网站模版下载今日疫情最新消息
  • 黄村网站建设报价网上销售
  • 凡客整装登封搜索引擎优化
  • 把自己的网站卖给别人后对方做违法吗百度指数功能
  • 邢台市教育局搜狗搜索引擎优化论文
  • web网站开发框架怎么做网页宣传
  • 怎么样做网站才能适应手机屏幕seo是付费还是免费推广
  • wordpress 面包插件免费seo免费培训
  • 不要域名能建网站么网址搜索
  • 在什么网站上做外贸网站seo外链
  • 网站开发价格优就业seo课程学多久
  • 深圳腾网站建设制作网站的软件叫什么
  • 医院网站建设方案计划西安seo优化系统
  • 网页游戏传奇世界网页版seo门户网站
  • 网站做专题主题该怎么选东莞网络营销网站建设
  • 游戏娱乐网站建设佛山网络营销推广
  • 网站动画广告条怎么做的项目网
  • 网站开发设计价格百度搜索推广方法
  • 益阳市住房和建设局 网站新闻头条今日要闻10条
  • 做网站所需要的公司细责及条款怎么免费制作网页
  • 如何做简单的网站秦皇岛seo排名
  • hostinger建站wordpress360摄像头海澳門地区限制解除
  • 怎么做点击文字进入的网站搜索引擎营销特点是什么
  • 微信开放平台介绍优化建议
  • 中学生网站作品焊工培训班