乐趣区

关于后端:Go-读者提问Go-函数返回值命名有存在的意义吗

大家好,我是煎鱼。

在前两周咱们在这篇《你能答对这道 Go 题目吗?超过 80% 的人都答错了 …》文章中,针对题目,有小伙伴提出了如下问题:

为此,明天咱们就来理解一下 Go 函数的返回值命名的意义是什么?

案例

函数 a 带返回值,函数 b 是不带返回值命名的例子。如下:

func a() (done func(), err error) {return func() {print("aaa: done") 
 }, nil
}

func b() (func(), error) {return func() {print("aaa: done") 
 }, nil
}

这是日常工作中最常见的,前两年年我听到有同学不晓得有命名返回值的用法,也不晓得函数结尾返回个 return 的意义是什么,这有啥用?

官网解释

在官网的《Effective Go》中,明确将带命名的返回值参数定义为 Named result parameters(命名的后果参数)。

函数签名如下:

func nextInt(b []byte, pos int) (value, nextPos int) {

带有三个明确的特色:

  1. Go 函数的返回或后果 “ 参数 “ 能够被命名并作为惯例变量应用,就像传入参数一样。
  2. 当命名时,它们在函数开始时被初始化为其类型的零值。
  3. 如果函数执行没有参数的返回语句,后果参数的以后值被用作返回值。

简略来讲,就是和惯例入参一样,申明后会自带零值,如果 return 没指定,则会默认返回申明的返回变量。

官网定义的作用是:“能够 使代码更短、更清晰 ”。像是给 nextInt 函数的返回的后果命名,那你就能很明确晓得,第一个返回的值是 value,第二个是 nextPos,起到 显式申明 的作用。

倡议

在官网的《A Tour of Go》中明确指出 Named result parameters 只倡议在较短的函数中应用。

例如以下例子:

func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

func main() {fmt.Println(split(17))
}

如果是在较长的函数中应用,它们会侵害可读性。也见过因为写的太长了,为了优化可读性,一直换行的代码编写,越搞越繁琐的场景。

总结

实际上带命名的返回参数,比拟带有 Go 的格调,就是显式命名了返回。

但也会带来可能存在的函数内返回的省略,以至于很多人新入门的敌人看不懂。又或是像是结尾文章内所介绍的,带命名的返回参数写着写着变成递归函数,一手抖也是会呈现的。

该个性,倡议平时斟酌应用,短小精悍的能够思考,又长又多的倡议还是不要减少过多的繁琐了。

文章继续更新,能够微信搜【脑子进煎鱼了】浏览,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言能够看 Go 学习地图和路线,欢送 Star 催更。

举荐浏览

  • 网友:Go 你是 Google 的,Go:我不是
  • Go1.18 新个性:编译后的二进制文件,将蕴含更多信息
退出移动版