首页 > 其他分享 >Golang 命名返回值和普通返回值

Golang 命名返回值和普通返回值

时间:2023-09-26 14:33:06浏览次数:47  
标签:函数 代码 Golang 普通 使用 命名 返回值

1、概述

在Go语言中,函数可以有命名返回值和普通(匿名)返回值。命名返回值会被视为定义在函数顶部的变量,并且在使用 return 语句返回时,不再必须在其后面指定参数名,也就是支持“裸”返回;而使用普通返回值时,使用 return 语句返回时,需要在其后面指定与普通返回值相同类型的参数名。

实际上,命名返回值和普通返回值都有其适用的场景,本文我们介绍 Golang 语言函数或方法使用命名返回值和普通返回值各自的“好处”与“坏处”。

2、命名返回值

使用命名返回值的“好处”是可以提升代码可读性,读者朋友们试想一下,当函数或方法有多个返回值时,尤其是函数体中代码比较长的函数或方法,如果我们使用普通返回值,那么我们想要知道返回值的含义,就需要先阅读函数体中完整代码。
而如果使用具有实际含义的命名返回值,我们只需要阅读函数或方法的签名,就可以知道其含义,甚至可以把它们作为文档使用。
但是,命名返回值也不是没有“坏处”,如果函数体内有变量与命名返回值同名,那么命名返回值会被覆盖,所以我们也需要注意避免“踩坑”。

3、普通返回值

普通(匿名)返回值的“好处”是简洁,当我们写一些简短函数或方法时,使用普通返回值可以使代码更加简洁,在 Golang 语言官方标准库中,有很多使用普通返回值的函数或方法。

func add(a, b int) int {
    return a + b
}

但是如果返回值是指针类型时,使用普通返回值,就会使我们函数体中的代码变得不优雅,比如以下这段示例代码。

func c() *int {
 i := 0
 return &i
}

当然这里列举的代码片段是个极端示例,我们在编写 Golang 代码时,也并不会这么使用。还有就是在编写函数体代码比较长的函数时,使用普通返回值的代码,其可读性比不上使用命名返回值的代码。

4、总结

在Go语言中,推荐使用命名返回值(named return values)而不是普通返回值(unnamed return values),因为使用命名返回值可以提供一些优势:

  1. 可读性和可维护性:命名返回值可以让函数的返回值更加清晰和自文档化,因为你可以为返回值命名,使得在函数签名中可以看到每个返回值的含义,这有助于提高代码的可读性和可维护性。

  2. 默认值:命名返回值在函数开始时会被自动初始化为其类型的零值。这可以减少在函数中显式初始化返回值的需要,提高代码的简洁性。

  3. 减少错误:使用命名返回值可以减少返回值的顺序错误。如果一个函数有多个返回值,并且它们没有命名,那么容易在返回值的顺序上出现错误。而使用命名返回值,你可以直接通过名称引用它们,不容易出错。

尽管使用命名返回值具有上述优势,但在某些情况下,使用普通返回值可能更合适。例如,当函数只有一个返回值,并且返回值的含义非常明确时,使用普通返回值可能更简单和清晰。此外,如果你希望在函数体内的不同位置多次使用相同的返回值变量,普通返回值可能更合适。

总的来说,Go语言鼓励使用命名返回值,因为它可以提高代码的可读性、可维护性,并减少潜在的错误。但在一些简单的情况下,普通返回值也可以使用。选择哪种方式应根据具体的情况和代码的清晰度来决定。

参考:Golang 语言该用命名返回值吗?

标签:函数,代码,Golang,普通,使用,命名,返回值
From: https://www.cnblogs.com/zhangmingcheng/p/17730028.html

相关文章

  • Cobra眼睛蛇-强大的Golang CLI框架,快速上手的脚手架搭建项目工具,详细安装和使用
    Cobra眼睛蛇-强大的GolangCLI框架,快速上手的脚手架搭建项目工具,详细安装和使用。阅读过k8s源码的同学,应该都知道k8sScheduler、kubeadm、kubelet等核心组件的命令行交互全都是通过spf13写的Cobra库来实现。本文就来介绍下Cobra的相关概念及具体用法。关于Cobra是一个用于Go的CLI......
  • Linux_网络基本命名行
    Linux网络基本命令ifconfig#是linux中用于显示或配置网络设备(网络接口卡)的命令,英文全称是networkinterfacesconfiguring ping#指令会使用ICMP(InternetControlMessageProtocol)传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得......
  • golang 多生产者+多消费者模式
    参考https://gist.github.com/vitan/aedb628a40478cf8b6a33dc87a5ff52fhttps://gist.github.com/mochow13/74ee57078d58536929575ab481dd96931packagemainimport( "errors" "fmt" "math" "reflect" "sync")......
  • Golang 的骚操作:go:linkname
    背景在看源码时,一些源码方法没有方法体,难道说明这些方法为空?例如:time.Now调用的now(),time.Sleep,reflect.makechan//Providedbypackageruntime.funcnow()(secint64,nsecint32,monoint64)funcSleep(dDuration)funcmakechan(typ*rtype,sizeint)(ch......
  • golang 1.18 workspace mode
    why?为什么需要workspace历史发展和版本依赖的管理GOPATH最开始的模式开发者需要设置一个环境变量GOPATH,用于指定项目的工作空间。GOPATH是一个目录路径,其中包括了三个重要的子目录:src、bin和pkg通过goget命令,GOPATH/src下的相应目录中缺点:必须指定GOPATH......
  • c# 调用exe 公共方法封装 无窗口 获取返回值
    调用方法如下varexec=newProcessCommandBase("test.exe");exec.AddParameter("listvms");varresult=exec.Exec(true);完整帮助类如下publicclassProcessCommandBase:IDisposable{//程序名publicstring......
  • golang 的循环导入
    内容来自对chatgpt的咨询循环导入概念在Go语言中,循环导入是一个需要避免的问题。它发生在两个或更多的包彼此导入对方,形成一个导入循环,导致编译器无法处理。例如,假设你有两个包,包A和包B。包A导入了包B,然后包B又导入了包A,这就形成了一个循环导入。在这种情况下,编译器将无法......
  • golang 怎么使用接口中声明的方法
    假设你有一个golang的interface,里面声明了1个函数,怎么调用这个函数typeManinterface{ Eat(ctxcontext.Context,foodstring})error}使用方式创建结构体实现这个接口声明的方法,然后创建该结构体对象,调用方法案例首先,我们需要创建一个实现了这个接口的结构体:type......
  • golang 使用redis设置分布式锁 demo
    内容来自对chatgpt的咨询分布式锁是在多个节点上运行的应用程序中协调工作的一种常用方法,而Redis是实现分布式锁的流行选择。以下是使用Go语言和github.com/go-redis/redis库来设置Redis分布式锁的一个简单示例:首先,确保你已经安装了该库:goget-ugithub.com/go-redis/redi......
  • golang 对字符串进行base64编解码、md5 编码
    内容来自对chagpt的咨询一、对字符串进行base64编解码base64编码要在Go语言中对字符串进行base64编码,你可以使用标准库中的encoding/base64包。以下是一个简单的示例:packagemainimport( "encoding/base64" "fmt")funcmain(){ data:="Hello,World!" enc......