大家好,我是炸鱼。在前两周的这篇《你能答对这道 Go 题目吗?超过 80% 的人都答错了...》文章中,有小伙伴针对题目提出了以下问题:为此,今天我们就来学习一下Go函数的返回值的名字是什么意思?case函数a有返回值,函数b是无返回值命名的例子。如下:funca()(donefunc(),errerror){returnfunc(){print("aaa:done")},nil}funcb()(func(),error){returnfunc(){print("aaa:done")},nil}这个在日常工作中最常见。前两年听说有些同学不知道命名返回值的用法,也不知道在函数末尾返回一个return是什么意思,有什么用?官方解释在官方《Effective Go》中,明确定义了namedreturnvalueparameters为Namedresultparameters(命名结果参数)。函数签名如下:funcnextInt(b[]byte,posint)(value,nextPosint){具有三个明显的特点:Go函数的返回或结果“参数”可以命名并用作常规变量,就像传递输入参数一样。命名时,它们在函数开始时被初始化为其类型的零值。如果函数执行不带参数的return语句,则结果参数的当前值用作返回值。简单来说,就是和普通的输入参数一样。声明后,它将具有零值。如果不指定return,则默认返回声明的返回变量。官方定义的作用是:“它可以让代码更短更清晰”。比如你给nextInt函数返回的结果命名,那么你就可以清楚的知道第一个返回值是value,第二个是nextPos,作为显式声明。建议在官网的《A Tour of Go》中明确指出Namedresultparametersonlyrecommendedforusinginshorterfunctions。例如下面的例子:funcsplit(sumint)(x,yint){x=sum*4/9y=sum-xreturn}funcmain(){fmt.Println(split(17))}如果它是在长函数中使用的比较,它们会损害可读性。我也看到过因为写的太长,为了优化可读性,代码写成常量换行的场景,越复杂的场景。总结其实带名字的返回参数更符合Go风格,即返回是显式命名的。但是也会带来函数中省略return的可能,让很多新手看不懂。或者像开篇说的,带名字的返回参数说成递归函数,握手的时候也会出现。这个功能建议平时使用。短小精悍的可以考虑,但是长长的建议不要增加太多的累赘。文章持续更新中。可以微信搜索【脑补炸鱼】阅读。本文已收录在GitHubgithub.com/eddycjy/blog中。学习Go语言可以看Go学习地图和路线。欢迎星星提醒。推荐阅读网友:Go你是谷歌,Go:我不是Go1.18新特性:编译后的二进制文件,将包含更多信息
