【Go】Go基础(五):函数
1、简述
Go 里面有三种类型的函数:
* 普通的带有名字的函数
* 匿名函数或者lambda函数
* 方法(Methods)
两个特殊函数:main()和init(),它们没有参数和返回值;
Go语言里面没有函数重载;
2、函数参数与返回值
* 函数可以返回多值
* 返回值可以和参数一样有个名字:命名的返回值,eg:func Fun(in int) (out1 int, out2 int)
* 空白符:下划线_
3、变长参数
格式:
func myFunc(a, b, arg ...int) {}
slice 类型的变量可以通过 slice… 的形式来传递参数
slice := []int{7,9,3,5,1}
x = min(slice...)
4、defer 和代码追踪
defer:收尾工作,
* 关闭文件流file, error := os.Open("fineName") defer file.Close()
* 解锁一个加锁的资源mu.Lock() defer mu.Unlock()
* 关闭数据库链接// open a database connection defer disconnectFromDB()
代码追踪:利用defer在离开函数时,执行打印操作。
5、内置函数
内置函数:不需要进行导入操作就可以使用的函数
* close 用于管道通信
* len 用于返回某个类型的长度或数量(字符串、数组、切片、map 和管道)
* cap 是容量的意思,用于返回某个类型的最大容量(只能用于切片和 map)
* new、make new 和 make 均是用于分配内存:new 用于值类型和用户定义的类型,如自定义结构,make 用于内置引用类型(切片、map 和管道)
* copy、append 用于复制和连接切片
* panic、recover 两者均用于错误处理机制
* print、println 底层打印函数,建议使用 fmt 包
* complex、real imag 用于创建和操作复数
6、递归函数
递归函数:当一个函数在其函数体内调用自身,则称之为递归.
最经典的例子便是计算斐波那契数列,即前两个数为1,从第三个数开始每个数均为前两个数之和。
数列如下所示:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …
计算斐波那契数列的Go源码:
package mainimport "fmt"func main() {result := 0for i := 0; i <= 5; i++ {result = fibonacci(i)fmt.Printf("fibonacci(%d) is: %d\n", i, result)}
}func fibonacci(n int) (res int) {if n <= 1 {res = 1} else {res = fibonacci(n-1) + fibonacci(n-2)}return
}
输出:
fibonacci(0) is: 1
fibonacci(1) is: 1
fibonacci(2) is: 2
fibonacci(3) is: 3
fibonacci(4) is: 5
fibonacci(5) is: 8
7、回调
回调:函数可以作为其它函数的参数进行传递,然后在其它函数内调用执行,一般称之为回调
8、闭包
匿名函数可以被赋值给变量并作为值使用;
闭包是匿名函数与匿名函数所引用环境的组合。
没有闭包的时候,函数就是一次性买卖,函数执行完毕后就无法再更改函数中变量的值(应该是内存释放了);有了闭包后函数就成为了一个变量的值,只要变量没被释放,函数就会一直处于存活并独享的状态,因此可以后期更改函数中变量的值(因为这样就不会被go给回收内存了,会一直缓存在那里)
关于闭包的解释,参考下面的博客:
https://blog.csdn.net/qq_35976351/article/details/81986496
https://www.cnblogs.com/cxying93/p/6103375.html
https://blog.csdn.net/jason_cuijiahui/article/details/84720411
利用闭包实现斐波拉契数列
package mainimport ("fmt"
)func fibonacci() func() int {b0 := 0 //因为b0和b1被返回的匿名函数使用,因此一直在内存中,类似于全局变量,但只能通过myFibonacci函数访问b1 := 1return func() int {tmp := b0 + b1b0 = b1b1 = tmpreturn b1}}func main() {myFibonacci := fibonacci()for i := 1; i <= 5; i++ {fmt.Println(myFibonacci())}
}
9、打印行号等信息
第一种方法:使用闭包函数where()来实现
where := func() {_, file, line, _ := runtime.Caller(1)log.Printf("%s:%d", file, line)
}
where()
// some code
where()
// some more code
where()
第二种方法:使用log包来实现:
log.SetFlags(log.Llongfile)
log.Print("")
第三种方法:使用一个更加简短版本的 where 函数:
var where = log.Print
func func1() {
where()
... some code
where()
... some code
where()
}
10、计算函数执行时间
start := time.Now()
longCalculation()
end := time.Now()
delta := end.Sub(start)
fmt.Printf("longCalculation took this amount of time: %s\n", delta)
相关文章:

搬箱轮滑再炫技!一个被波士顿动力耽误的机器人
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后3天,请扫码咨询 ↑↑↑整理 | 琥珀出品 | AI科技大本营(ID:rgznai100)据 TheVerge 等多家外媒报道,波士顿动力公司 (Boston Dynamics) 又推出了一款新的机器人&…

我是如何在天猫、蚂蚁金服、百度等大厂面试中被拒的 | 掘金技术征文
本人16年毕业于普通二本院校网络相关专业,工作经验两年半,目前就职业于一家普通民营企业。 由于非985、211学历硬伤,校招进大厂的门槛远高于同届985、211的毕业生。于是乎,从毕业到现在经历了三家创业公司,创业公司的痛…

solaris上的pkg管理
原文写于2010-05-18 19:43:40 网易博客,已删. 在solaris上安装程序,很多时候多离不开package管理.上的编译好的软件都是已package的形式压缩好然后提供给大家下载的. 关键是3个命令:pkgadd/pkginfo/pkgrm pkgadd -d pkgname用来添加安装包 pkginfo 用来打印系统…

【Go】Go基础(六):数组、切片slice、映射map
1、数组 1.1 数组定义 数组:数组是具有相同 唯一类型 的一组已编号且长度固定的数据项序列。 数组长度必须是一个常量表达式,并且必须是一个非负整数。数组长度也是数组类型的一部分,所以[5]int和[10]int是属于不同类型的。数组长度最大为 …

语义表征的无监督对比学习:一个新理论框架
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后3天,请扫码咨询 ↑↑↑译者 | Linstancy责编 | 琥珀出品 | AI科技大本营(ID:rgznai100)诸如图像、文本、视频等复杂数据类型的语义表征 (也称为语义嵌入) 已成为机器学习的核心…

YEX黄建:脱离比特币谈区块链,要么真傻,要么装疯卖傻丨区块链十人谈
如果说2017年是属于虚拟货币的一年,那么2018年的区块链将是生态和应用的一年,随之而来的也将是新的玩法、新的赚钱姿势。为此,雷锋网推出“区块链十人谈”(十人者,取是知众人博所长之意,非实指)…

70佳精美的PSD素材免费下载(上篇)
设计师经常会去网上搜罗各种各样的素材,这些免费素材不仅能帮助他们节省大量的时间,而且能有很好的效果。今天,本文与大家分享70佳精美的PSD素材,非常感谢那些很有才华的设计师分享它们的劳动成果,让更多的人可以使用他…

漫画讲述人工智能简史
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后3天,请扫码咨询 ↑↑↑作者 | 武博士、宋知达、袁雪瑶、聂文韬来源 | 大鱼AI(id:DayuAI-Founder)本文我们会以生动有趣的漫画来介绍关于人工智能(AI)相…

【Go】Go基础(七):包
一、标准库概述 1、官方手册 内置包在 Go 语言中有 150 个以上,它们被称为标准库,完整列表可以在Go Walker中查看 https://gowalker.org/search?qgorepos 2、常用包简介 unsafe: 包含了一些打破 Go 语言“类型安全”的命令,一般的程序中不会…

Mysql是时候学习一个存储过程了
create procedure 存储过程名() DECLARE uid INT; #注意声明的变量名不能跟表的字段名一致,否则会报错。如user的主键是id,那么这里声明用来存id值的变量名就不能为id,可以改为uid等 DECLARE done INT DEFAULT 0; #repeat结束标识 DECLARE us…

ASP.NET的Cookie跨域问题
将Cookie的有效范围限制到域。 默认情况下,Cookie 与特定的域相关联。例如,如果您的站点是 www.contoso.com,那么当用户向该站点请求页面时,您编写的Cookie就被发送到服务器。(有特定路径值的Cookie除外)…

详解物联网的中间件:为何说它是不可或缺的?
互联网的大规模普及,拉近了人与人之间的交流,而不同国家人与人之间的交往也变得密切起来。由于彼此使用的语言不通,为了能够互相交流,我们需要将不同种的交流语言转换成对方可识别的信息,这就是翻译存在的理由了。同样…

Decoders对于语义分割的重要性 | CVPR 2019
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后3天,请扫码咨询 ↑↑↑作者 | Lin-Zhuo Chen转载自博客链接:https://linzhuo.xyz/posts/DUpsample/今天为大家推荐一篇 CVPR2019 关于语义分割的文章 Decoders Matter for Semantic Segme…

【Go】Go基础(八):结构体和方法
一、 结构体(struct) 1、结构体定义 type identifier struct {field1 type1field2 type2... }声明:new(Type) 和 &Type{}是等价的 2、初始化结构体 type Interval struct {start intend int }初始化方式: intr : Inter…

Windows 2008 R2 SP1部署Lync2010企业版(四)
9 部署存档和监控服务器 1) 以域管理身份登录SQL01服务器。 2) 单击“开始”,依次指向“程序”、“管理工具”,然后单击“服务器管理器”显示服务器管理器。 3) 单击“添加功能”启动“添加功能向导”,选择“消息队列”,下一步。 …

【Go】Go基础(九):接口(Interfaces)与反射(reflection)
一、接口(interfaces) 1、概述 接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。 通过如…

用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用原型链和EventTrigger
原型链是JS的必备,作为ECMAScript4,原型链也是支持的。 特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用。 本文旨在介绍如何使用原型链。 任意对象类型都有一个prototype属性,包括导入的Unity的A…

教育部发文35所高校新增AI本科专业!想回去重新高考
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后3天,请扫码咨询 ↑↑↑作者 | 琥珀出品 | AI科技大本营(ID:rgznai100)2019 年 3 月 28 日,教育部公布了 2018 年度普通高等学校本科专业备案和审批结果。消息一出&…

莱芜市公安局交警支队智能交通项目集成及容灾公开招标公告
莱芜市公安局交警支队智能交通建设项目公开招标公告 时间:2011-7-5 点击:249莱芜市公安局交警支队智能交通建设项目公开招标公告一、招标人名称:莱芜市公安局交警支队 联系方式:0634-5667998(吕老师)二、招标代理机构名称&#x…

【Go】Go基础(十):文件读写
一、读写数据 1、读取用户的输入 使用fmt 包提供的 Scan 和 Sscan 开头的函数; * Scanln 扫描来自标准输入的文本,将空格分隔的值依次存放到后续的参数内,直到碰到换行。 * Scanf 与其类似,除了 Scanf 的第一个参数用作格式字符…

怎样能拿到第一份编程工作?这里告诉你答案 | 码书
“写代码时,每次都要告诉自己:最后负责维护代码的,会是一个知道你住在哪的变态暴力狂。” ——约翰伍德(John Woods)拿下第一份编程工作需要付出更多努力,但是如果采纳下面的建议,应该不会有太大…

JSON知识点
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读…

asp常用函数(备忘)
1.数组长度: <% Dim grade,i gradesplit("1,2,5,10,20,50,100,200,500,1000",",") for i0 to ubound(grade) response.write grade(i)&"\n" next %> 2.获得插入的id set rs server.createobject(&q…

【leetcode】力扣刷题(1):两数之和(Go、Python)
一、问题描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums [2, 7,…

轻松练:如何从900万张图片中对600类照片进行分类|技术头条
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后2天,请扫码咨询 ↑↑↑作者 | Aleksey Bilogur译者 | 风车云马责编 | Jane出品 | AI科技大本营(公众号id:rgznai100)【导语】完成一个简单的端到端的机器学习模型需要几步&…

介绍两个好玩的和Github相关的Chrome扩展
1. Octotree 默认的github网页里的代码显示没有我们在IDE里看到的直观,即代码文件所在的文件夹无法以树形层级结构显示在屏幕左边。 安装Octotree之后: 方便多了。 2. Isometric Contributions github commit的统计页面比较平淡: 安装了Isome…

Schema约束模式实例
book.xsd <?xml version"1.0" encoding"UTF-8"?> <!-- xmlns:默认命名空间 xmlns:xs:当前的文档的标记来自http://www.w3.org/2001/XMLSchema命名空间 前缀:xs elementFormDefault:当前文档使用的标记必须是使用http://www.w3.…

【leetcode】力扣刷题(2):两数相加(go语言)
一、问题描述 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可…

“GANs之父”Ian Goodfellow被爆已从Google离职
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后2天,请扫码咨询 ↑↑↑整理 | 一一出品 | AI科技大本营(ID:rgznai100)3 月 28 日,深度学习大牛李沐在知乎爆料称,他从某机器学习大佬处获悉,…

Gulp快速入门教程
Gulp是基于流的前端自动化的构建工具,虽说如今是webpack盛行的时代,但是gulp和webpack整合效果更美味的,鱼与熊掌都可兼得哦!本文只介绍下Gulp的基本使用和一些常用的Gulp插件,废话不多说,一起来看看吧。 g…