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

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

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

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

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

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

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

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

func multiply(a,b int,reply *int)  {
*reply = a *b
} func main() {
num := 0
reply := &num
multiply(3,5,reply)
fmt.Println("return num :",*reply,num)
} 输出:
return num : 15 15
  1. 将函数作为参数

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

package main

import "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方法中的某些中间值。

  1. 匿名函数—闭包

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 test()  {
a := 5
b := func()(func()){
c := 10
return 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真实的内存地址中的。

Go中的函数和闭包的更多相关文章

  1. 前端学习 第六弹: javascript中的函数与闭包

    前端学习 第六弹:  javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) {   ...

  2. 13、python中的函数(闭包与装饰器)

    一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函 ...

  3. python中的函数名,闭包,迭代器

    一.函数名 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量,单纯print()出的是一个内存地址. def func(): print('你说你有点难追') print(func ...

  4. JavaScript中的函数:闭包,this,高阶函数

    一.函数基本理论 function compare(val1,val2){ return val1 - val2; }var result = compare(5,10); 1,函数的定义没什么意义, ...

  5. 从匿名函数(闭包特性)到 PHP 设计模式之容器模式

    匿名函数(匿名函数) 匿名函数,也叫闭包函数,它允许临时创建一个没有指定名称的函数,常用作回调函数参数的值,也可以作为变量的值来使用.具体的使用见以下示例代码: /* 示例一:声明一个简单匿名函数,并 ...

  6. php的匿名函数和闭包函数

    php的匿名函数和闭包函数 tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use 引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因 ...

  7. Swift 中的利刃,函数和闭包

    input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...

  8. [转]JavaScript中的匿名函数及函数的闭包

    JavaScript中的匿名函数及函数的闭包  原文地址:http://www.cnblogs.com/wl0000-03/p/6050108.html 1.匿名函数 函数是JavaScript中最灵 ...

  9. JavaScript中的匿名函数及函数的闭包(转)

    JavaScript中的匿名函数及函数的闭包  https://www.cnblogs.com/wl0000-03/p/6050108.html 1.匿名函数 函数是JavaScript中最灵活的一种 ...

随机推荐

  1. 如何查看jsplumb.js的API文档(YUIdoc的基本使用)

    目录 一.问题描述 二. 处理方法 三. YUIdoc工具介绍 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端> ...

  2. JcApiHelper 简单好用的.Net ApiHelper

    一 背景 随着前端技术的不断发展,各种框架逐渐成熟,前端 Angular,React,Vue 三分天下.再加上移动端的崛起,前后端分离开发成为主流,前端后端代码混合开发的方式沦为被淘汰的局面.如今 M ...

  3. 基于C#的机器学习--我应该接受这份工作吗-使用决策树

    决策树 要使决策树完整而有效,它必须包含所有的可能性.事件序列也必须提供,并且是互斥的,这意味着如果一个事件发生,另一个就不能发生. 决策树是监督机器学习的一种形式,因为我们必须解释输入和输出应该是什 ...

  4. [常用命令]OSX命令

    在mac os下,如何通过命令行来下载网络文件?如果你没有安装或wget命令,那么可以使用curl工具来达到我们的目的. curl命令参数: curl ‘url地址’ curl [选项] ‘url地址 ...

  5. 作者联系方式D1

    欢迎大伙投稿,审核通过免费发布. 奥特曼超人 KARL-Dujinyang QQ:  309933706   QQ:  1875125470 工作时间都会在线. 偶尔博客,不过有问题可以加Q来找我讨论 ...

  6. Touch Bar 废物利用系列 | 在触控栏上显示 Dock 应用图标

    都说 Intel 第八代 CPU 对比上代是牙膏不小心挤多了,而配备第八代 CPU 的 MacBook Pro,只有 Touch Bar 版本,虽然贵了一点,但就一个字 -- 买! 收到电脑后,兴冲冲 ...

  7. ~~Python解释器安装教程及环境变量配置~~

    进击のpython Python解释器安装教程以及环境变量配置 对于一个程序员来说,能够自己配置python解释器是最基础的技能 那么问题来了,现在市面上有两种Python版本 Python 2.x ...

  8. C#开发中常用的加密算法总结

    相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天给大家分享我个人总结的一些加密算法: 常见的加密方式分为可逆和不可逆两种方式 可逆:RSA,AES,DES等 不可逆:常见的MD5 ...

  9. sql 数据处理时join字段慎重选择--避免出现double数据!

    前几天做BI Tabular表格模型的时候,数据中心核对数据发现模型展现数据比实际数据要多,经过核查之后,发现原来我是一个不经意,在做数据选取的时候,inner join的字段CITY_NAME_CN ...

  10. Excel催化剂开源第24波-较VBA更强大的.Net环境的正则表达式

    在VBA上可以调用正则表达式库,从而编写正则表达式自定义函数,这个相信不少VBA开发者已经熟知,但VBA的VBScript正则表达式库毕竟是一个过时的产品,不像.Net那样是与时俱进的,所以两者实现出 ...