Golang基础笔记八之函数
本文首发于公众号:Hunter后端
原文链接:Golang基础笔记八之函数
本篇笔记介绍 Golang 里函数相关的内容,以下是本篇笔记目录:
- 函数的定义语法
- 函数返回值
- 可变参数函数
- 匿名函数
- 闭包
1、函数的定义语法
函数的定义格式如下:
func 函数名(参数列表) (返回值列表) { 函数体 }
比如下面是一个两数相加返回其和的函数:
func add(a, b int) int {
return a + b
}
调用的话,直接传参调用即可:
sum := add(1, 4)
fmt.Println(sum)
传入的参数可以传值,也可以传指针,如果传指针的话,在函数内部修改后,会影响原值。
以下是一个传指针修改的示例:
func test(a *int, b int) {
*a += 2
b += 2
}
func main() {
a := 1
b := 1
fmt.Printf("调用前 a:%d, b:%d\n", a, b)
test(&a, b)
fmt.Printf("调用后 a:%d, b:%d\n", a, b)
}
输出结果为:
调用前 a:1, b:1
调用后 a:3, b:1
2、函数返回值
函数返回值可以返回单个或多个,在函数定义的时候指定返回类型即可:
func add(a, b int) int {
return a + b
}
func swap(a, b int) (int, int) {
return b, a
}
还可以对返回值命名,就是在定义函数的时候,将返回值提前声明定义,然后在函数内部对其赋值,函数末尾可以省去 return 具体变量的操作。
比如下面:
func calc(a, b int) (sum, sub int) {
sum = a + b
sub = a - b
return
}
3、可变参数函数
可变参数函数可以接受任意数量的参数,在函数定义的时候,类型前面加上 ... 即表示该参数是可变参数,而在函数内部,可将其作为切片使用。
下面是一个示例,可以接受任意多个元素,作为求和函数的参数:
func sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
调用的时候,可以直接传入任意数量参数:
sum(1, 2, 3, 4)
也可以传入一个切片:
slice := []int{1, 2, 3}
s2 := sum(slice...)
4、匿名函数
匿名函数通常用于临时需要处理某个功能,或需要将其作为参数传递给其他变量的场景。
比如下面定义并立即调用了匿名函数:
total := func(a, b int) int {
return a + b
}(2, 4)
也可以将其赋值给某个变量,再由该变量来调用:
sumFunc := func(a, b int) int {
return a + b
}
sumFunc(1, 2)
5、闭包
闭包是指能够读取其他函数内部变量的函数,即使该函数已经执行完毕,其作用域内的变量也不会被销毁。
我们可以使用闭包来捕获外部函数的局部变量,并将其生命周期延长至闭包本身,比如实现一个计数器:
func counter() func() int {
count := 0
return func() int {
count += 1
return count
}
}
counterFunc := counter()
fmt.Println(counterFunc())
fmt.Println(counterFunc())
fmt.Println(counterFunc())
fmt.Println(counterFunc())
也可以根据外部传入的参数生成不同的闭包实例,比如实现一个计算器:
func calculate(calculate_type string) func(a, b int) int {
if calculate_type == "add" {
return func(a, b int) int {
return a + b
}
} else if calculate_type == "sub" {
return func(a, b int) int {
return a - b
}
} else {
return func(a, b int) int { return a + b }
}
}
addFunc := calculate("add")
fmt.Println(addFunc(10, 5))
subFunc := calculate("sub")
fmt.Println(subFunc(3, 1))
而闭包也可以维护迭代的状态,因此可以实现迭代器的功能,比如实现一个斐波那契数列生成器:
func fibonacci() func() int {
a, b := 0, 1
return func() int {
f_count := a
a, b = b, a+b
return f_count
}
}
f := fibonacci()
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
fmt.Println(f())
Golang基础笔记八之函数的更多相关文章
- Golang基础笔记
<基础> Go语言中的3个关键字用于标准的错误处理流程: defer,panic,recover. 定义一个名为f 的匿名函数: Go 不支持继承和重载. Go的goroutine概念:使 ...
- TensorFlow基础笔记(11) conv2D函数
#链接:http://www.jianshu.com/p/a70c1d931395 import tensorflow as tf import tensorflow.contrib.slim as ...
- Py修行路 python基础 (八)函数(随时更改)
为何要用函数: 1.解决代码重用的问题 2.提高代码的可维护性,统一维护 3.程序的组织结构清晰,可读性强 定义函数 先定义后使用!!! def funcname(arg1,arg2,.....) ...
- golang 基础 map及工厂函数
Map是一种数据结构,是一个集合,用于存储一系列无序的键值对.它基于键存储的,键就像一个索引一样,这也是Map强大的地方,可以快速快速检索数据,键指向与该键关联的值. 内部实现 Map是基于 散列表 ...
- TensorFlow基础笔记(11) max_pool2D函数
# def max_pool2d(inputs, # kernel_size, # stride=2, # padding='VALID', # data_format=DATA_FORMAT_NHW ...
- Golang基础之函数
golang基础之函数 1.为什么需要函数? 有些相同的代码可能出现多次,如果不进行封装,那么多次写入到程序中,会造成程序冗余,并且可读性降低 2.什么是函数 为完成某些特定功能的程序指令集合称为函数 ...
- 《MFC游戏开发》笔记八 游戏特效的实现(二):粒子系统
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9360993 作者:七十一雾央 新浪微博:http:// ...
- golang学习笔记8 beego参数配置 打包linux命令
golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...
- go微服务框架kratos学习笔记八 (kratos的依赖注入)
目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...
- Golang基础教程
以下使用goland的IDE演示,包含总计的golang基础功能共20个章节 一.go语言结构: 二.go基础语法: 三.变量 四.常量 五.运算符 六.条件语句 七.循环 八.函数 九.变量作用域 ...
随机推荐
- elk收集分析nginx日志,并绘制图形
一.修改nginx配置 把nginx日志修改成json格式,在nginx.conf中添加如下内容,重启nginx. log_format log_json '{"@timestamp&quo ...
- 【服务器】Nodejs在局域网配置https访问
[服务器]Node.js在局域网配置https访问 零.需求: 做一个局域网WebRTC视频聊天系统,需要用到HTTPS.因此,配置Node.js使其支持HTTPS访问. 一.解决 在线生成和证书 访 ...
- 浅谈Ubuntu中的软件包
1. 前言 还记得大学第一次接触Ubuntu和Linux的时候,觉得用apt安装想要的软件非常方便.但是有时候出现了问题,各种报错,自己又不懂原理,就会非常抓狂.现在稍微理解一点了,故以较为容易理解的 ...
- 古老的BAT文件在windows下的编辑
直接上代码 rem echo choice /t 20 /d y /n >nul rem start/d "E:\service\exe" 8091.exe 8091 sta ...
- markdown常用命令行格式
Markdown 主要命令(语法)如下: 标题 使用 # 号表示标题,# 的个数决定标题的级别: 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 段落 & 换行 直接输入文字形成段 ...
- javaWeb基础之Tomcat
一.Tomcat:web服务器软件 1. 下载:http://tomcat.apache.org/ 2. 安装:解压压缩包即可. * 注意:安装目录建议不要有中文和空格 3. 卸载:删除目录就行了 4 ...
- java中使用BigDecimal解决小数计算问题
1.示例 @Test public void test() { System.out.println(0.3 + 0.1); System.out.println(0.3 - 0.1); System ...
- NPOI,给指定的excle创建个下拉框验证
NPOI,给指定的excle创建个下拉框验证 先大致看下效果吧 Nuget 搜索 NPOI,一般出来的第一个就是,安装NPOI基础环境 1 using NPOI.HSSF.UserModel; 2 ...
- dotnet 9 通过 AppHostRelativeDotNet 指定自定义的运行时路径
进行框架依赖发布的时候,应用程序需要有 dotnet runtime 运行时才能跑起来.在 dotnet 9 之前,通常都是需要安装到系统的 Program File 文件夹下的全局 dotnet 运 ...
- C/S客户端渗透_Proxifier+burpsuite代理客户端http协议数据包+reGeorg构建HTTP隧道代理
C/S客户端渗透_Proxifier+burpsuite代理客户端https协议数据包 一个月没发文章了实在太忙了,不过学习还是不能落下的,最近要做几个CS客户端的站,需要在终端装个北信源的煞笔内网安 ...