1. 函数参数和返回值的写法

如果有多个参数是同一个类型,可以简略写:

func testReturnFunc(v1,v2 int)(int,int)  {x1 := 2 * v1x2 := 3 * v2return x1,x2
}

Go 还支持命名返回值的方式。命名返回值作为结果形参(result parameters)被初始化为相应类型的零值,当需要返回的时候,我们只需要一条简单的不带参数的 return 语句 :

func testReturnFunc1(v int)(x1,x2 int)  {x1 = 2 * vx2 = 3 * vreturn
}

函数返回的是 x1 和 x2 这两个值,如果 x1,x2 没有在函数中被赋值,那么会返回这两个参数的默认值。

2. 如何改变函数外部的变量

使用我们前面讲到的指针,得到一个外部参数的指针,将该指针作为参数传入函数中,这样对该指针赋值操作就相当于修改了该指针指向内存地址对应变量的值:

func multiply(a,b int,reply *int)  {*reply = a *b
}func main() {num := 0reply := &nummultiply(3,5,reply)fmt.Println("return num :",*reply,num)
}输出:
return num : 15 15

3. 将函数作为参数

函数可以作为其它函数的参数进行传递,然后在其它函数内调用执行,一般称之为回调 。

package mainimport "fmt"func main() {callback(4,add)
}func add(a,b int)  {fmt.Print(a+b)
}func callback(c int, f func(int, int))  {f(c,c)
}输出:
8

我理解这种回调的方式,使用场景在于多个方法之间形成调用链,下一个方法依赖上一个方法的某些值的时候,相当于 callback 是第一个方法,add 是第二个方法,add 方法需要依赖 callback 方法中的某些中间值。

4. 匿名函数---闭包

Go 语言支持匿名函数,即函数可以像普通变量一样被传递或使用。

i2 := func(x, y int) int { return x + y }(1,2)

如上,定义了一个匿名函数,包含两个参数 x,y。返回 x+y 的结果。后面的 () 表示参数,参数是 x=1,y=2。

当然你也可以先定义匿名函数,不适用,等你需要使用的时候,像调用函数一样传参数就可以:

i2 := func(x, y int) int { return x + y }
i3 := i2(x, y)

两种方式的区别就在于 (x,y) 参数放在哪里。

在 Go 语言中匿名函数和闭包是一个概念:

 闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者 任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含 在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环 境(作用域)。
闭包的价值 闭包的价值在于可以作为函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示 数据还要表示代码。支持闭包的多数语言都将函数作为第一级对象,就是说这些函数可以存储到 变量中作为参数传递给其他函数,最重要的是能够被函数动态创建和返回。

Go 语言中的闭包同样也会引用到函数外的变量。闭包的实现确保只要闭包还被使用,那么被闭包引用的变量会一直存在。

我们再看一个复杂一点的例子:

func aa()  {a := 5b := func()(func()){c := 10return func() {fmt.Printf("a,c: %d,%d n",a,c)a *= 3}}()b()println(a)
}
输出:
a,c: 5,10
15

解释一下:

匿名函数的返回值是一个匿名函数,return 返回的是一个匿名函数,注意没有加(),所以是用 return 接收。

然后在最外层是加了() 的。所以将匿名函数的值给了 b。注意了此时的 b 其实是一个函数。所以下面在使用的时候是b()。你可以尝试将匿名函数的最外层的 () 去掉,然后看一下b() 打印的值是什么,在试一下b()()打印的值是什么。

另外,a 在匿名函数内是可以引用的,但是你如果在匿名函数外引用 c,你会发现找不到。并且在闭包内改变了 a 的值也是会作用到 a 真实的内存地址中的。

c 打印 callback 函数名_Go 中的函数相关推荐

  1. C++之指针探究(十一):函数名的本质和函数指针

    相关博文:C++之指针探究(十三):函数指针数组 相关博文:C++之指针探究(十二):指针.下标.数组及其作函数参数探究 相关博文:C++之指针探究(十一):函数名的本质和函数指针 相关博文:C++之 ...

  2. 函数名地址、函数名取地址、函数名解引用问题

    以下,转载自http://blog.sina.com.cn/s/blog_6aafe9c90100xg2y.html 对一个函数进行 如下操作: 1.函数名地址 2.函数名取地址 3.函数名解引用 它 ...

  3. matlab stem函数坐标轴_MATLAB中stem函数用法

    stem(Y) 将数据序列Y从x轴到数据值按照茎状形式画出,以圆圈终止.如果Y是一个矩阵,则将其每一列按照分隔方式画出. stem(X,Y)在X的指定点处画出数据序列Y.  stem(...,'fil ...

  4. 吐槽程序员的变量名和函数名(给变量和函数取名字时遇到的坑)

    变量和函数在取名字的时候,一定要见名知意,不要用太宽泛的词! 能一看到函数名就知道这个函数是干嘛的,比写个注释看着舒服! 不要怕名字太长,宁愿名字长一点也比名字简短但又看不懂的名字要好! 名字清晰冗长 ...

  5. findmid函数c语言,excel find函数用法_excel中mid函数的用法教程详解

    [www.gpsvo.com--管理学] Excel中经常需要使用到mid函数进行截取数据,mid函数具体该如何使用操作呢?下面是由小编分享的excel中mid函数的用法,以供大家阅读和学习. exc ...

  6. python中def函数字典_python中的函数def和函数的参数

    ''' 函数: 1.减少代码重用性 2.易维护 3.可扩展性强 4.类型function 定义函数: def 函数变量名(): 函数的调用: 1.函数名加括号 2.函数如果没被调用,不会去执行函数内部 ...

  7. java调用js匿名函数参数,js中匿名函数和回调函数

    匿名函数: 通过这种方式定义的函数:(没有名字的函数) 作用:当它不被赋值给变量单独使用的时候 1.将匿名函数作为参数传递给其他函数 2.定义某个匿名函数来执行某些一次性任务 var f = func ...

  8. php中的eval,php eval函数用法—-PHP中eval()函数小技巧 | 学步园

    eval 将值代入字符串之中. 语法: void eval(string code_str); 传回值: 无 函式种类: 数据处理 内容说明 本函式可将字符串之中的变量值代入,通常用在处理数据库的数据 ...

  9. JavaScript如何声明对象、函数以及对象中的函数(即方法)

    目录 声明对象的2种最常见方法 声明函数的2种最常见方法 在对象中声明函数 声明对象的2种最常见方法 1) var Zhihuijun = {name:'彭志辉',age:28,upName:'稚晖君 ...

最新文章

  1. 【C++】C++11 STL算法(三):分隔操作(Partitioning operations)、排序操作(Sorting operations)
  2. PHP中 的全局变量$_SERVER
  3. 嵌入式linux系统架构
  4. collection包下Counter类统计list中各个元素出现的次数
  5. mapreduce的shuffle机制(来自学习笔记)
  6. FFmpeg在Ubuntu的安装以及教程~~~
  7. 如何学好前端,这5点你一定要知道!
  8. tile布局的ButtonBar
  9. C++ 字节序测试代码
  10. WebSocket websockets
  11. C语言 ASCII码字符表
  12. 分类(四)—— 支持向量机
  13. 网宿CDN中标工商银行 服务金融客户布局政企市场
  14. [解决方法] 连接深信服Easyconnect之后无法代理抓包
  15. Webview--如何让加载进来的页面自适应手机屏幕分辨率
  16. java web excel导入数据库
  17. WEB_BASIC---01 Web概述、HTML概述、文本处理、图像和超链接、表格、菜单
  18. LiveData的简介
  19. python笔记7 for循环
  20. 2022中国连锁企业人才管理报告

热门文章

  1. 解决- SecureCRT上运行 linux vim 命令中文出现乱码
  2. Asp.Net MVC 页面代码压缩筛选器-自定义删除无效内容
  3. 【Luogu】P3343地震后的幻想乡(对积分概率进行DP)
  4. #个人博客作业week2——结对编程伙伴代码复审
  5. poj2516Minimum Cost
  6. Unix环境高级编程学习笔记(五)
  7. 第 3 章 镜像 - 018 - 镜像命名的最佳实践
  8. 添加自定义菜单,报错40155
  9. 《工业控制网络安全技术与实践》一一第3章 工业控制网络安全威胁
  10. 高通被欧盟指控垄断 或将面临高达25亿美元罚款