• 【golang】go 返回参数 以及go中 裸返


    一、Go 返回参数命名

    在Golang中,命名返回参数通常称为命名参数。

    • Golang允许在函数签名或定义中为函数的返回或结果参数指定名称。或者可以说这是函数定义中返回变量的显式命名。基本上,它解决了在return语句中提及变量名称的要求。 通过使用命名返回参数或命名参数,只能在函数末尾使用return关键字将结果返回给调用方。

    • 当函数必须返回多个值时,通常使用此概念。 因此,为了使用户感到舒适并增强代码的可读性,Golang提供了此功能。

    1、声明命名的返回参数

    package main
    
    import "fmt"
    
    // Main Method
    func main() {
    
        //在这里调用函数
        //函数返回两个值
        m, d := calculator(105, 7)
    
        fmt.Println("105 x 7 = ", m)
        fmt.Println("105 / 7 = ", d)
    }
    
    // 具有命名参数的函数
    func calculator(a, b int) (mul int, div int) {
    
        //在这里,简单的赋值就可以
        //并初始化它的值
        mul = a * b
        div = a / b
    
        //这里有return关键字
    
        //没有任何结果参数
        return
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    输出:
    105 x 7 = 735
    105 / 7 = 15

    2、重要事项

    2.1、公共命名参数类型的函数

    如果所有命名的返回参数的类型是公共的或相同的,则可以指定公共数据类型。将下面的代码与上面阅读的示例进行比较,以便更好地理解。

    //有命名参数的函数
    func calculator(a, b int) (mul, div int) {
    
    • 1
    • 2

    此处,mul和div变量均为int类型。因此,您还可以声明具有通用数据类型的命名参数,例如函数变量(即a和b)

    2.2、增加可读性

    使用命名返回参数将增强代码的可读性,因为只需读取函数签名就可以知道返回参数。

    2.3、使用“裸返”

    使用命名的返回参数后,return语句通常称为"裸返"。
    如下的return

    func calculator(a, b int) (mul int, div int) {
    
        //在这里,简单的赋值就可以
        //并初始化它的值
        mul = a * b
        div = a / b
    
        //这里有return关键字
    
        //没有任何结果参数
        return
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.4、返回变量默认零值

    默认情况下,Golang用零值定义所有命名变量,函数将能够使用它们。如果函数未修改值,则将自动返回零值

    2.5、不要重复赋值

    如果您将使用短声明运算符(:=)初始化命名的返回参数,则将给出错误,因为它们已被Go编译器初始化。因此,您可以使用简单的赋值方式(=)将值分配给命名的返回参数。

    //具有命名参数的函数
    func calculator(a, b int) (mul int, div int) {
    
        //在这里,它将抛出一个错误
        //因为已经定义了参数
        //在函数签名中
        mul := a * b
        div := a / b
    
        //这里有return关键字
        //没有任何结果参数
        return
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    编译都不通过,goland中直接爆红

    二、裸返 应用场景

    1、与defer使用

    1.1、错误示例

    下面代码返回什么?
    知识点:goland中return不是一个原子操作

    package main
    
    import "fmt"
    
    func test01() (result int) {
    	defer func() {
    		result++
    	}()
    	return 0
    }
    
    func main() {
    	fmt.Println(test01())
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    输出结果:
    1

    1.2、正确示例

    func f() (result int) {
         result = 0  //return语句不是一条原子调用,return xxx其实是赋值+ret指令
         func() { //defer被插入到return之前执行,也就是赋返回值和ret指令之间
             result++
         }()
         return
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出结果:
    1

  • 相关阅读:
    ZigBee 3.0理论教程-通用-1-04:协议架构-媒体访问控制层(MAC)
    Java下打印1-100以内的质数
    Spread.NET 16.0 FOR WPF Crack-EN
    ZooKeeper+Kafka+ELK+Filebeat集群搭建实现大批量日志收集和展示
    嵌入式驱动学习第一周——内核的中断机制
    Linux openssl 搭建CA、签名证书
    开源免费的对象存储Minio
    Android动态获取图片资源
    tiup dm reload
    微擎模块 万能门店7.3.4小程序无限DIY版后台模块+前端小程序源码
  • 原文地址:https://blog.csdn.net/wanglei19891210/article/details/133720748