Go 分布式学习利器(8)-- Go的函数
文章目录
- 1. Go语言的函数语法
- 2. Go 函数中的可变长参数
- 3. Go函数中的延迟函数 deffer
1. Go语言的函数语法
先介绍一下Go语言的函数和其他语言 函数之间的差异,其中有一些已经在之前的总结中提到过。
函数在Go语言中是属于一等公民。
- 可以有多个返回值
- 所有参数都是值传递:slice ,map, channel 会有传引用的错觉
- 函数可以作为变量的值
- 函数可以作为参数和返回值
比如如下测试函数:
func returnMultiValue() (int, int) {return rand.Intn(10), rand.Intn(20) // 两个返回值
}func TestFunction(t *testing.T) {a,_ := returnMultiValue() // 可以通过 符号 '_' 来表示不获取第一或第二个返回值t.Log(a)
}
输出如下:
=== RUN TestFunctionTestFunction: function_test.go:16: 1
--- PASS: TestFunction (0.00s)
函数作为变量,参数,以及返回值
编写如下几个测试函数:
/*
通过函数式编程
以下是一个计时函数,统计函数执行耗时的函数
入参:函数
返回值:函数可以统计任意 函数的执行时间,只需要将被统计函数名称作为入参传入该函数即可
*/
func calcTimeSpent(inner func(op int) int) func(op int) int{return func(n int) int{start := time.Now() // 开始计时ret := inner(n) // 执行函数fmt.Println("time spent :", time.Since(start).Seconds()) // 统计计时return ret}
}func slowTest(op int) int {time.Sleep(time.Second * 1) // sleep 1秒return op
}func TestSpentTime(t *testing.T) {sp := calcTimeSpent(slowTest) // 传入耗时函数t.Log(sp(10))
}
输出如下:
=== RUN TestSpentTime
time spent : 1.004237117TestSpentTime: function_test.go:36: 10
--- PASS: TestSpentTime (1.00s)
2. Go 函数中的可变长参数
基本语法如下:
func sum( args ... int) int{s := 0for _,op := range args{s += op}return s
}
相同类型的参数不再需要指定具体的个数,只需要传入’…’ 即可被转化为一个参数数组完成函数内部的逻辑处理需要,减少实际开发过程相同类型函数的重写或者重载的代码量。
测试以上变参 函数如下:
func sum(args ... int) int {s := 0for _,op := range args{ //将传入的参数转换为数组s += op}return s
}func TestChangeArgs(t *testing.T) {t.Log(sum(1,2,3)) // 可以传入3 个,或者 下面的4个参数t.Log(sum(4,16,8,9))
}
最终的输出如下:
=== RUN TestChangeArgsTestChangeArgs: function_test.go:57: 6TestChangeArgs: function_test.go:58: 37
--- PASS: TestChangeArgs (0.00s)
3. Go函数中的延迟函数 deffer
通过defer
关键字声明一个函数,用来表示这个函数属于一个延迟函数。
即使函数在执行过程中异常退出,该函数调用的deffer函数也会正常执行(这个机制的实现还是比较有趣的,有点像C++的智能指针)。
利用延迟执行的机制,能够完成应用的垃圾回收功能。
关于deffer函数的测试代码如下:
func DefferFun() {fmt.Println("defer func run")
}
func TestDeferFun(t *testing.T) {defer DefferFun()t.Log("Started")panic("Failed") // panic 表示不可修复的错误,会让当前程序停止执行,并退出,但这里不影响defer函数的执行。fmt.Println("end")`在这里插入代码片`
}
输出如下:
=== RUN TestDeferFunTestDeferFun: function_test.go:66: Started
defer func run
--- FAIL: TestDeferFun (0.00s)
panic: Failed [recovered]panic: Failed
如果将panic函数去掉,让程序正常执行,可以看到defer函数是在所有函数执行完成之后才会输出。
=== RUN TestDeferFunTestDeferFun: function_test.go:66: Started
end
defer func run #所有函数逻辑执行完成 之后才执行
--- PASS: TestDeferFun (0.00s)
可以看到defer 即使延迟执行,仍然可以在发生panic 异常的时候正常输出。
相关文章:

职称计算机证是继续教育的内容吗,豆腐网教你一分钟弄懂继续教育学时认定表及上传注意事项~...
原标题:豆腐网教你一分钟弄懂继续教育学时认定表及上传注意事项~大家好,我是豆腐网王老师,专注于南京工程师职称评审政策解读,关注我,让您轻松面对职称评审,少走弯路!!!南…

vim中如何按一个键就保存文件
可以用映射来做,把映射写在~/.vimrc里面,比如把map <F3> :w<CR>加入到~/.vim中之后,在每次编辑好后,按下F3就能保存下来。对于编译c程序,你可以加入这个映射:map <F6…

MVC项目下 Telerik Upload 的使用方法
1.右键项目然后选择管理NuGet程序包,点击联机 搜索 TelerikMvcExtensions 安装即可(或者点击程序包管理控制器 输入 Install-Package TelerikMvcExtensions) 2.安装成功后,在Content和Scripts 两个文件夹里面都会增加一个Telerik的…

分享下自己写的一个微信小程序请求远程数据加载到页面的代码
分享下自己写的一个微信小程序请求远程数据加载到页面的代码 1 思路整理 就是页面加载完毕的时候 请求远程接口,然后把数据赋值给页面的变量 ,然后列表循环 2 js相关代码 我是改的 onload函数 /*** 生命周期函数--监听页面加载*/onLoad: function (op…

Go 分布式学习利器(9)-- Go语言 结构体的行为定义和实现
文章目录1. Go语言的结构体 -- 数据成员的封装2. Go (函数成员)行为的定义和实现1. Go语言的结构体 – 数据成员的封装 Go语言官方给的描述是 既是面向对象语言,也不算面向对象语言。 不是面向对象语言 是因为 Go语言并不支持继承操作&#…

Spring学习笔记_IOC
Spring简介 1, 只用IOC spring.jar , jarkata-commons/commons-loggin.jar 2,IOC容器 实例化具体bean 动态装配 3,AOP支持 安全检查 管理transaction Spring配置 1,注入类型 setter(重要) 构造方法(可以忘记) 接口…

长治学院计算机在哪个校区,长治学院有几个校区及校区地址
最近有很多考生和家长咨询小编,长治学院有几个校区,今年新生会被分配到哪个校区?哪个校区好?等相关问题,下面小编统一回复一下考生们的问题。长治学院有2个校区,分别是南校区、北校区。长治学院校区及地址南校区:山西…

as3垃圾回收机制
as3垃圾回收机制 垃圾回收机制详解 能力越大责任越大,这对actionscript3.0来说一点没错。引入这些新控件带来一个副作用:垃圾收集器不再支持自动为你收集 垃圾等假设。也就是说Flash开发者转到actionscript3.0之后需要对关于垃圾收集如何工作以及如何编程…

opensuse安装nginx
opensuse安装nginx 安装步骤如下 1、sudo zypper install curl ca-certificates gpg2 2、sudo zypper addrepo --gpgcheck --type yum --refresh --check \ http://nginx.org/packages/sles/$releasever nginx-stable 3、sudo zypper addrepo --gpgcheck --type yum --refresh …

Go 分布式学习利器(10)-- Go语言的接口
文章目录1. 接口与依赖2. 自定义类型1. 接口与依赖 在上一节中我们讨论Go语言的面向对象特性的时候也说了,Go语言并不支持继承,能够进行对象的封装(包括数据成员和成员函数的封装),那么这里简单说一下Go语言接口之间的…

计算机输入输出有哪几种控制方式,计算机输入/输出的方式有哪几种?
计算机输入/输出的方式有:并行、串行这两种。1、并行并行是指一组程序按独立异步的速度执行,不等于时间上的重叠(同一个时刻发生)。并行也指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制…

LoadRunner中log的使用总结
LoadRunner中log的使用总结 1、log的设置方式。在 runtime setting中可以设置log的生成方式:默认的log方式:Enable logging选中,log option是Send messages only when an error occurs.可以修改日志的方式:Always send messages&a…

JavaScript中变量的相互引用
http://www.jb51.net/article/23387.htm转载于:https://www.cnblogs.com/chris-oil/p/3402072.html

mysql-事物
Mysql之事物详解 一、事务定义 事务:一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成事务只和DML语…

一文入门 Zookeeper
文章目录1. zookeeper 简介1.1 什么是zookeeper1.2 zookeeper 发展历史1.3 zookeeper 典型应用场景1.4 zookeeper 提供的服务1.5 zookeeper的数据模型1.6 znode的分类2. Zookeeper架构2.1 整体架构2.2 session2.3 Quorum 模式2.4 数据一致性3. zookeeper的案例演示3.1 zookeepe…

龙岩学院和三明学院计算机专业,龙岩学院和三明学院哪个比较好?
满意答案lxq051052014.06.27采纳率:51% 等级:7已帮助:459人520的分数算不错了,在择校中可以采取“冲、稳、保、垫”的志愿填报方法,冲的话可以选择漳师、闽江和厦门理工学院,都是不错的选择,…

MySQL 的 find_in_set函数使用方法
很多时候我们在设计数据库时有这种情况,比如: 有个文章表里面有个type字段,他存储的是文章类型,有 1头条,2推荐,3热点,4图文 .....11,12,13等等 现在有篇文章他既是 头条,又是热点,还是图文,type中以 1,3,4的格式存储. 那们我们如何用sql查找所有type中有4图文标准的文章呢,这就…

SCCM符合性设置
符合性设置--可以针对注册表值、脚本、文件系统、补丁更新情况进行符合性检查,除了在报表中查看结果外,还可以在CCM客户端 的 配置 中查看符合性评估结果,适合排错1.配置项目---新建针对 注册表值、脚本、文件系统等的符合性检查规则 …

Java(三):序列化
1、什么是Java对象序列化? Java的对象序列化是将那些实现了Serializable接口的对象转化成一个字节序列,并能够在以后将这些字节序列完全恢复成原来的对象。简单来说序列化就是将对象转化成字节流,反序列化就是将字节流转化成对象。 对象必须在…

Go 分布式学习利器(11)-- Go语言通过单链表 实现队列
一个小实验,将之前学习的Go相关的语法做个总结。 包括: Go语言接口特性Go语言封装特性Go语言 变量,指针,函数 语法GO语言 条件和循环语句 的语法GO语言的测试程序 通过链表实现一个队列,元素在其中 拥有先进先出的特…
最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...
问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X“x0,x1,…,xm-1”,序列Y“…

逆战服务器在哪个文件夹,逆战的背景音乐文件夹放在哪?别说在服务器上面!...
满意答案Dim185629442017.01.11采纳率:58% 等级:13已帮助:7224人你右键逆战图标,有个打开文件位置,点开,找就可以了。。 追问: 如果我把我喜欢的音乐文件放进去,我喜欢的音乐会成…

ruby调用java代码
为什么80%的码农都做不了架构师?>>> ruby使用rjb调用java代码 require rjb#加载jar包 Rjb::load(classpath /home/deployer/DmCodec.jar, jvmargs[]) #new一个对象 DmCodec Rjb::import(com.zapya.DmCodec).new #调用实例方法 tmp DmCodec.encodeB6…

VMware虚拟机安装黑苹果MacOS Mojave系统详细教程
更多资源请百度搜索:前端资源网 欢迎关注我的博客:www.w3h5.com 最近遇到一个H5页面的 iPhone X 刘海兼容问题。查到一个 XCode 编辑器,可以模拟 iPhone X 环境运行。 然后发现,XCode 是专门为苹果的 MacOS 系统设计的一款开发工具…

LSM 优化系列(四) -- Rocksdb和Lethe 对Delete问题的优化
文章目录前言1. 问题背景2. 问题复现3. Rocksdb 的 Delete-Aware 优化3.1 可配置的 Delete-Aware调度3.2 Compaction 逻辑对 delete key的优化4. Lethe: A Tunable Delete-Aware LSM Engine . SIGMOD20前言 本文介绍过程中涉及到的源代码是基于rocksdb 6.4.6 版本的。 同时需…

CodeForces Round #287 Div.2
A. Amr and Music (贪心) 水题,没能秒切,略尴尬。 1 #include <cstdio>2 #include <algorithm>3 using namespace std;4 5 const int maxn 100 10;6 int a[maxn], r[maxn], ans[maxn];7 8 int cmp(int i, int j) { return a[i] < a[j]; …

什么叫安装文件索引服务器,搜出精彩 玩转Windows 2008系统心得
【IT168 专稿】不少朋友已经在不经意间与Windows Server 2008系统进行了亲密接触,在一段时间的接触之后,不知大家对该系统的文件搜索功能会有什么样的体会?其实,Windows Server 2008系统的文件搜索功能与以往相比有了很大进步&…

取eclipse console 打印字符串,判断日志是否有异常
2019独角兽企业重金招聘Python工程师标准>>> 1. 取得当前输入的console /*** 取得控制台的字符串的Docment* param processConsoleName 控制台名称,如在java application 中定义的名字为test ,则这个地方的输入为test即可* return null*/public stati…

PAT乙级1028
1028 人口普查 (20 分)某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。 这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是…

Go 分布式学习利器(12)-- Go语言的扩展和复用
Go语言无法天然支持继承,但是又想要实现面向对象的特性。 即父类对象 使用子类对象初始化,那么该父类对象调用的函数就是子类实现的函数 ,从而满足LSP(子类交换原则)。 案例一: Go语言 支持扩展父类的功能…