前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一道正确率只有15%的命名返回值和闭包的问题

一道正确率只有15%的命名返回值和闭包的问题

作者头像
Golang梦工厂
发布2022-07-11 11:18:08
5280
发布2022-07-11 11:18:08
举报
文章被收录于专栏:跟着asong学Golang

前言

哈喽,大家好,我是asong。今天新注册了twitter,在里面没事瞎逛的时候,发现了一道有意思的题,他是由Redhat的首席工程师、Prometheus开源项目维护者 Bartłomiej Płotka 发出的,经调查显示,这道题的正确率只有15.2%,惨目忍睹,接下来我们就一起来看一下这道题~ 原文地址:https://twitter.com/bwplotka/status/1495002204163678211

题目

下面这段代码输出结果是多少?

代码语言:javascript
复制
func aaa() (done func(), err error) {
 return func() { print("aaa: done") }, nil
}

func bbb() (done func(), _ error) {
 done, err := aaa()
 return func() { print("bbb: surprise!"); done() }, err
}

func main() {
 done, _ := bbb()
 done()
}

来吧,朋友们,选出你的答案吧~

总共四个答案:

题目解析

正确答案是【C】:永远不会结束,你答对了吗?

这道题考查的点就是命名返回值+闭包,把上面的代码换成等效的匿名返回值代码你就明白了:

代码语言:javascript
复制
func aaa() (func(), error) {
 var done func()
 done = func() {
  print("aaa: done")
 }
 return done, nil
}

func bbb() (func(), error) {
 var done func()
 done, err := aaa()
 done = func() {
  print("bbb: surprise!");
  done()
 }
 return done, err
}

func main() {
 done, _ := bbb()
 done()
}

这其实是Go语言设计上一个feature,当Go语言的返回值赋给我们特殊的"返回参数"时,如果它们被命名了,在return之后,我们可以在函数主体完成后的任何执行过程中引用那些带有这些名称的值,在defer或闭包中一样。

我们在说回这道题,在bbb()函数内我们使用了命名返回值done func(), _ error,使用短变量声明done, err := aaa()接收aaa()的返回值,这里变量done并不是一个新变量,这就要说到Go语言的短变量声明的语法糖了,在多变量声明中,如果其中一个变量是新的,可以使用 := 声明,编译器会进行类型推断和赋值,已经声明的变量不会重新声明,直接在原变量上赋值;之后我们return的是一个闭包函数,闭包里的done值并不会被提前解析,在bbb()函数结束后,实际对应的代码就成了这样,变成了递归。

代码语言:javascript
复制
done = func() {
  print("bbb: surprise!");
  done()
}

如果我们把代码在改成这样:

代码语言:javascript
复制
func bbb() (func(), error) {
 var done func()
 done, err := aaa()
 return func() {
  print("bbb: surprise!");
  done()
 }, err
}

答案就是【B】:bbb: surprise!aaa: done

总结

一道看似简单的题,其中蕴涵的知识点确有很多,这就说明了解设计原理是多么的重要,Go语言资深工程师的路上任重道远呀~。

好啦,本文到这里就结束了,我是asong,我们下期见。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang梦工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 题目
  • 题目解析
  • 总结
相关产品与服务
Prometheus 监控服务
Prometheus 监控服务(TencentCloud Managed Service for Prometheus,TMP)是基于开源 Prometheus 构建的高可用、全托管的服务,与腾讯云容器服务(TKE)高度集成,兼容开源生态丰富多样的应用组件,结合腾讯云可观测平台-告警管理和 Prometheus Alertmanager 能力,为您提供免搭建的高效运维能力,减少开发及运维成本。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档