当前位置: 首页 > 编程日记 > 正文

【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天&#xff0c;请扫码咨询 ↑↑↑整理 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;据 TheVerge 等多家外媒报道&#xff0c;波士顿动力公司 (Boston Dynamics) 又推出了一款新的机器人&…

我是如何在天猫、蚂蚁金服、百度等大厂面试中被拒的 | 掘金技术征文

本人16年毕业于普通二本院校网络相关专业&#xff0c;工作经验两年半&#xff0c;目前就职业于一家普通民营企业。 由于非985、211学历硬伤&#xff0c;校招进大厂的门槛远高于同届985、211的毕业生。于是乎&#xff0c;从毕业到现在经历了三家创业公司&#xff0c;创业公司的痛…

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 数组定义 数组&#xff1a;数组是具有相同 唯一类型 的一组已编号且长度固定的数据项序列。 数组长度必须是一个常量表达式&#xff0c;并且必须是一个非负整数。数组长度也是数组类型的一部分&#xff0c;所以[5]int和[10]int是属于不同类型的。数组长度最大为 …

语义表征的无监督对比学习:一个新理论框架

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

YEX黄建:脱离比特币谈区块链,要么真傻,要么装疯卖傻丨区块链十人谈

如果说2017年是属于虚拟货币的一年&#xff0c;那么2018年的区块链将是生态和应用的一年&#xff0c;随之而来的也将是新的玩法、新的赚钱姿势。为此&#xff0c;雷锋网推出“区块链十人谈”&#xff08;十人者&#xff0c;取是知众人博所长之意&#xff0c;非实指&#xff09;…

70佳精美的PSD素材免费下载(上篇)

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

漫画讲述人工智能简史

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

【Go】Go基础(七):包

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

Mysql是时候学习一个存储过程了

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

ASP.NET的Cookie跨域问题

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

详解物联网的中间件:为何说它是不可或缺的?

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

Decoders对于语义分割的重要性 | CVPR 2019

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

【Go】Go基础(八):结构体和方法

一、 结构体&#xff08;struct&#xff09; 1、结构体定义 type identifier struct {field1 type1field2 type2... }声明&#xff1a;new(Type) 和 &Type{}是等价的 2、初始化结构体 type Interval struct {start intend int }初始化方式&#xff1a; intr : Inter…

Windows 2008 R2 SP1部署Lync2010企业版(四)

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

【Go】Go基础(九):接口(Interfaces)与反射(reflection)

一、接口&#xff08;interfaces&#xff09; 1、概述 接口定义了一组方法&#xff08;方法集&#xff09;&#xff0c;但是这些方法不包含&#xff08;实现&#xff09;代码&#xff1a;它们没有被实现&#xff08;它们是抽象的&#xff09;。接口里也不能包含变量。 通过如…

用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用原型链和EventTrigger

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

教育部发文35所高校新增AI本科专业!想回去重新高考

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

莱芜市公安局交警支队智能交通项目集成及容灾公开招标公告

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

【Go】Go基础(十):文件读写

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

怎样能拿到第一份编程工作?这里告诉你答案 | 码书

“写代码时&#xff0c;每次都要告诉自己&#xff1a;最后负责维护代码的&#xff0c;会是一个知道你住在哪的变态暴力狂。” ——约翰伍德&#xff08;John Woods&#xff09;拿下第一份编程工作需要付出更多努力&#xff0c;但是如果采纳下面的建议&#xff0c;应该不会有太大…

JSON知识点

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

asp常用函数(备忘)

1.数组长度&#xff1a; <% 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&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 示例: 给定 nums [2, 7,…

轻松练:如何从900万张图片中对600类照片进行分类|技术头条

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后2天&#xff0c;请扫码咨询 ↑↑↑作者 | Aleksey Bilogur译者 | 风车云马责编 | Jane出品 | AI科技大本营&#xff08;公众号id:rgznai100&#xff09;【导语】完成一个简单的端到端的机器学习模型需要几步&…

介绍两个好玩的和Github相关的Chrome扩展

1. Octotree 默认的github网页里的代码显示没有我们在IDE里看到的直观&#xff0c;即代码文件所在的文件夹无法以树形层级结构显示在屏幕左边。 安装Octotree之后&#xff1a; 方便多了。 2. Isometric Contributions github commit的统计页面比较平淡&#xff1a; 安装了Isome…

Schema约束模式实例

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

【leetcode】力扣刷题(2):两数相加(go语言)

一、问题描述 给出两个 非空 的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照 逆序 的方式存储的&#xff0c;并且它们的每个节点只能存储 一位 数字。 如果&#xff0c;我们将这两个数相加起来&#xff0c;则会返回一个新的链表来表示它们的和。 您可…

“GANs之父”Ian Goodfellow被爆已从Google离职

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」7折优惠最后2天&#xff0c;请扫码咨询 ↑↑↑整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;3 月 28 日&#xff0c;深度学习大牛李沐在知乎爆料称&#xff0c;他从某机器学习大佬处获悉&#xff0c…

Gulp快速入门教程

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