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)

【Go】Go基础(五):函数相关推荐

  1. python123编写函数求和_Python基础之函数

    Python基础之函数 一.函数基础 1.函数概念: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 2.函数的作用 (1)减少重复代码 (2)使程序变 ...

  2. python average函数详解_python基础之函数详解

    Python基础之函数详解 一.函数的定义 到现在为止,我们已经掌握了Python的基本语法和数据类型等相关基础知识了,以进行一个项目的编写了,这个时候,就会发现,很多代码需要我们进行复制粘贴,这简直 ...

  3. Python编程基础:函数的使用

    Python编程基础:函数的使用 文章目录 Python编程基础:函数的使用 一.前言 二.我的环境 三.函数的定义与调用 四.传递实参 1.位置实参 2.关键字实参 3.默认值 4.可变长度参数 5 ...

  4. [基础] AHK函数对象初窥 ① _实例2_实际可用版

    [基础] AHK函数对象初窥 ① _实例2_实际可用版 ;# 母文章 https://zhuanlan.zhihu.com/p/48977298;;;;;;;;;;;;;;;;;;;;;;;;;;;; ...

  5. Django基础五之Django模型层(二)多表操作

    Django基础五之Django模型层(二)多表操作 一 创建模型 表和表之间的关系 一对一.多对一.多对多 # 作者表 比较常用的信息放在这个表中 class Author(models.Model ...

  6. MATLAB三维绘图基础meshgrid函数的用法解析

    MATLAB三维绘图基础meshgrid函数的用法解析   MATLAB中meshgrid函数是用来生成网格的,函数用法是:   [X,Y] = meshgrid(x,y);这种是最常用的一种用法.x ...

  7. [GO语言基础] 五.顺序控制语句和条件控制语句(if、else、switch)

    作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了Golang的 ...

  8. python基础 python函数 函数概念 函数的多种参数 多种调用参数 装包 解包 函数代码块 函数的返回值

    python基础 python函数 函数概念 函数的多种参数 多种调用参数 装包 解包 函数代码块 函数的返回值 一 .函数概念 函数是根据需要,将代码打包为代码块, 每一个代码块就可以封装为一个函数 ...

  9. fig r函数_R语言基础绘图函数散点图~跟着Nature Communications学画图~Figure1

    今天继续 跟着Nature Communications学画图系列第二篇.学习R语言基础绘图函数画散点图. 对应的 Nature Communications 的论文是 Fecal pollution ...

  10. PostgreSQL学习手册(五) 函数和操作符

    PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符:     常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符:     下面是Po ...

最新文章

  1. springboot整合swagger2之最佳实践
  2. 【C++】多态(早期绑定、后期绑定)、抽象类(纯虚函数)、虚析构函数
  3. 《Python数据科学指南》——1.8 使用迭代器
  4. 什么是微服务架构,该从哪些方面深入理解?
  5. Synchronized和Lock有什么区别
  6. jQuery.validate.js API
  7. Linux编程 20 shell编程(shell脚本创建,echo显示信息)
  8. HDU-不容易系列之(3)—— LELE的RPG难题
  9. 《Microsoft Sql server 2008 Internals》读书笔记--第五章Table(6)
  10. xbox微软服务器崩溃了,微软的Xbox游戏条因0x803F8001错误而崩溃
  11. R 回归 虚拟变量na_【R语言进阶】Logistic回归及哑变量设置
  12. Obsidian 插件安装
  13. mate7 android 6 root权限管理,华为Mate7 Root权限怎么获取 华为Mate7 Root权限获取教程【详解】...
  14. 2020年5月面试精心整理java面试题,覆盖了大部分面试题(附答案)
  15. ubuntu 20.04.3 安装教程(本人一步一步安装记录...)
  16. SpringBoot整合Graylog做日志收集
  17. 密码学入门(3):分组密码的模式
  18. 关于《奇点临近》读后的总结与感想
  19. AutoCAD导出wmf文件,并转成wpf xaml
  20. 安装Solidworks出现报错:可执行文件VCRedist10\vcredist_x64.exe未成功安装/ 找不到vc_red.msi文件路径/ Windows不允许更新经过管理的播发产品

热门文章

  1. deepsort原理快速弄懂——时效比最高的
  2. android单线字体,Android自定义字体
  3. 高可用MySQL_Mysql高可用架构
  4. Mat矩阵基本操作与示例 OpenCV
  5. hive性能调优实战pdf_Nginx 性能调优实战
  6. 基于相交线的立体平面SLAM
  7. 【点云论文速读】最佳点云分割分析
  8. push代码到github时,每次都要输入用户名和密码的问题
  9. 二分法:二分查找(递归+非递归)实现
  10. Cachegrind--缓存命中检查工具及其可视化