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

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中如何按一个键就保存文件

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

MVC项目下 Telerik Upload 的使用方法

1.右键项目然后选择管理NuGet程序包&#xff0c;点击联机 搜索 TelerikMvcExtensions 安装即可&#xff08;或者点击程序包管理控制器 输入 Install-Package TelerikMvcExtensions&#xff09; 2.安装成功后&#xff0c;在Content和Scripts 两个文件夹里面都会增加一个Telerik的…

分享下自己写的一个微信小程序请求远程数据加载到页面的代码

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

Go 分布式学习利器(9)-- Go语言 结构体的行为定义和实现

文章目录1. Go语言的结构体 -- 数据成员的封装2. Go &#xff08;函数成员&#xff09;行为的定义和实现1. Go语言的结构体 – 数据成员的封装 Go语言官方给的描述是 既是面向对象语言&#xff0c;也不算面向对象语言。 不是面向对象语言 是因为 Go语言并不支持继承操作&#…

Spring学习笔记_IOC

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

长治学院计算机在哪个校区,长治学院有几个校区及校区地址

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

as3垃圾回收机制

as3垃圾回收机制 垃圾回收机制详解 能力越大责任越大&#xff0c;这对actionscript3.0来说一点没错。引入这些新控件带来一个副作用&#xff1a;垃圾收集器不再支持自动为你收集 垃圾等假设。也就是说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语言的面向对象特性的时候也说了&#xff0c;Go语言并不支持继承&#xff0c;能够进行对象的封装&#xff08;包括数据成员和成员函数的封装&#xff09;&#xff0c;那么这里简单说一下Go语言接口之间的…

计算机输入输出有哪几种控制方式,计算机输入/输出的方式有哪几种?

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

LoadRunner中log的使用总结

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

JavaScript中变量的相互引用

http://www.jb51.net/article/23387.htm转载于:https://www.cnblogs.com/chris-oil/p/3402072.html

mysql-事物

Mysql之事物详解 一、事务定义 事务&#xff1a;一个最小的不可再分的工作单元&#xff1b;通常一个事务对应一个完整的业务(例如银行账户转账业务&#xff0c;该业务就是一个最小的工作单元)一个完整的业务需要批量的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采纳率&#xff1a;51% 等级&#xff1a;7已帮助&#xff1a;459人520的分数算不错了&#xff0c;在择校中可以采取“冲、稳、保、垫”的志愿填报方法&#xff0c;冲的话可以选择漳师、闽江和厦门理工学院&#xff0c;都是不错的选择&#xff0c;…

MySQL 的 find_in_set函数使用方法

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

SCCM符合性设置

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

Java(三):序列化

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

Go 分布式学习利器(11)-- Go语言通过单链表 实现队列

一个小实验&#xff0c;将之前学习的Go相关的语法做个总结。 包括&#xff1a; Go语言接口特性Go语言封装特性Go语言 变量&#xff0c;指针&#xff0c;函数 语法GO语言 条件和循环语句 的语法GO语言的测试程序 通过链表实现一个队列&#xff0c;元素在其中 拥有先进先出的特…

最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...

问题描述&#xff1a;字符序列的子序列是指从给定字符序列中随意地&#xff08;不一定连续&#xff09;去掉若干个字符&#xff08;可能一个也不去掉&#xff09;后所形成的字符序列。令给定的字符序列X“x0&#xff0c;x1&#xff0c;…&#xff0c;xm-1”&#xff0c;序列Y“…

逆战服务器在哪个文件夹,逆战的背景音乐文件夹放在哪?别说在服务器上面!...

满意答案Dim185629442017.01.11采纳率&#xff1a;58% 等级&#xff1a;13已帮助&#xff1a;7224人你右键逆战图标&#xff0c;有个打开文件位置&#xff0c;点开&#xff0c;找就可以了。。 追问&#xff1a; 如果我把我喜欢的音乐文件放进去&#xff0c;我喜欢的音乐会成…

ruby调用java代码

为什么80%的码农都做不了架构师&#xff1f;>>> 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系统详细教程

更多资源请百度搜索&#xff1a;前端资源网 欢迎关注我的博客&#xff1a;www.w3h5.com 最近遇到一个H5页面的 iPhone X 刘海兼容问题。查到一个 XCode 编辑器&#xff0c;可以模拟 iPhone X 环境运行。 然后发现&#xff0c;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 (贪心) 水题&#xff0c;没能秒切&#xff0c;略尴尬。 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系统进行了亲密接触&#xff0c;在一段时间的接触之后&#xff0c;不知大家对该系统的文件搜索功能会有什么样的体会&#xff1f;其实&#xff0c;Windows Server 2008系统的文件搜索功能与以往相比有了很大进步&…

取eclipse console 打印字符串,判断日志是否有异常

2019独角兽企业重金招聘Python工程师标准>>> 1. 取得当前输入的console /*** 取得控制台的字符串的Docment* param processConsoleName 控制台名称&#xff0c;如在java application 中定义的名字为test ,则这个地方的输入为test即可* return null*/public stati…

PAT乙级1028

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

Go 分布式学习利器(12)-- Go语言的扩展和复用

Go语言无法天然支持继承&#xff0c;但是又想要实现面向对象的特性。 即父类对象 使用子类对象初始化&#xff0c;那么该父类对象调用的函数就是子类实现的函数 &#xff0c;从而满足LSP&#xff08;子类交换原则&#xff09;。 案例一&#xff1a; Go语言 支持扩展父类的功能…