六、Go编程语言中的函数式编程
@Author:Runsen
任何编程语言都是众所周知的面向对象编程,还有日渐流行的函数式编程,当然Go也不例外,这也是本文的重点.。我可以这么说,Go的功力深不深完全就是看函数式编程和面向对象编程。
下面,Runsen先介绍Go编程语言中的函数式编程。
文章目录
- 普通函数
- 匿名函数
- 闭包函数
Go中函数就是一类带特殊的 接收者 参数的函数。函数接收者在它自己的参数列表内,位于 func 关键字和方法名之间。
函数对应操作序列,是程序的基本组成元素。Go语言中的函数有具名和匿名之分。
普通函数:一般对应于包级的函数,是匿名函数的一种特例。(个人理解:指明函数名称、参数、返回值、有具体函数体)
匿名函数:隐藏函数名称(这里我觉得和JavaScript很像)
闭包函数:当匿名函数引用了外部作用域中的变量时就成了闭包函数,闭包函数是函数式编程语言的核心。
下面是函数的具体形式。
func function_name( [parameter list] ) [return_types] {函数体
}
- func:函数由 func 开始声明
- function_name:函数名称,函数名和参数列表一起构成了函数签名。
- parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
- return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
函数体:函数定义的代码集合。
普通函数
函数的函数名首字母的大小写体现函数的可见性,很重要记住这样一个规则:小写字母开头的函数只在本包内可见,大写字母开头函数才能被其他包调用。这里我必须强调这一点。
下面是案例完整代码
package mainimport ("fmt"
)func main() {a,b:=who("Runsen",20)fmt.Println(a,b) // Runsen 20
}func who(name string, age int) (string, int) {return name, age
}
匿名函数
匿名函数是指不需要定义函数名的一种函数实现方式,由一个不带函数名的函数声明和函数体组成
下面我们看一个示例。
package mainimport ("fmt"
)
func main() {// 不带函数名 匿名函数直接赋值给一个变量:who:=func (name string, age int) (string, int) {return name, age}a,b:=who("Runsen",20)fmt.Println(a,b) //Runsen 20
}
下面是一个计算从 1 到 1 百万整数的总和的匿名函数:
func() {sum := 0for i := 1; i <= 1e6; i++ {sum += i}
}()
闭包函数
对于闭包函数,我相信很多都不知道,这里我们先看Python一个闭包函数。
def fun1():sum = 0def fun2(v):nonlocal sumsum += vreturn sumreturn fun2a = fun1()
for i in range(10):print(a(i))0
1
3
6
10
15
21
28
36
45
代码解析:fun1
返回的不是一个值,而是一个函数fun2
, a = fun2
,所以 a(i)
会打印 sum
的值,为什么 sum
一直在加呢,函数里的值为什么可以带到函数体外呢。
其实可以把闭包看做一个类, sum
就是类里的属性, fun2
就是类的方法,所以fun2
可以使用 sum
(自由变量)
nonlocal
声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。嵌套函数fun2
中的sum
受到了影响,显示fun2
中的sum
是fun1
函数中的局部变量。
下面给出Go语言闭包函数的定义:当匿名函数引用了外部作用域中的变量时就成了闭包函数,闭包函数是函数式编程语言的核心。
也就是匿名函数可以会访问其所在的外层函数内的局部变量。当外层函数运行结束后,匿名函数会与其使用的外部函数的局部变量形成闭包。
下面是具体闭包函数示例代码:
func adder() func(int) int {var x intreturn func(y int) int {x += yreturn x}
}
func main() {var f = adder()fmt.Println(f(10)) //10fmt.Println(f(20)) //30fmt.Println(f(30)) //60f1 := adder()fmt.Println(f1(40)) //40fmt.Println(f1(50)) //90
}
将 adder()
函数赋值给变量f,那么f(10)
就相当于执行其内部的匿名函数func(y int)
。
所以f(10)
其实执行的是x = x+y
,此时x
没有给值默认为0
,y为10
,最终返回x
的值是10
。
f(20)
同样执行其内部的匿名函数func(y int)
,所以f(20)
其实执行的是x = x+y
。此时x
已经是10
,y
为20
,最终返回x
的值是30
,依次类推执行。
六、Go编程语言中的函数式编程相关推荐
- javascript函数式_JavaScript中的函数式编程—结合实际示例(第1部分)
javascript函数式 by rajaraodv 通过rajaraodv JavaScript中的函数式编程-结合实际示例(第1部分) (Functional Programming In Jav ...
- C#中面向对象编程中的函数式编程
目录 介绍 面向对象编程中仿真的函数式编程技术 粒度不匹配 面向对象的函数式编程构造 相互关系函数式编程/面向对象程序设计 C#中的函数式编程集成 函数级别的代码抽象 操作组合 函数部分应用和局部套用 ...
- wpf绑定 dictionary 给定关键字不再字典中_为什么要在 JavaScript 中学习函数式编程?...
请忘掉你认为你知道的有关 JavaScript 的任何东西,以初学者心态来接触这份资料. 为帮助你这样做,我们打算从头开始复习 JavaScript 的基础知识, 就好像你以前从来没有看到过 Java ...
- 在 Python 中使用函数式编程的最佳实践!
在函数式编程中,如何使用 Python 编写出优秀的代码? 作者 | Amandine Lee 译者 | 弯月 责编 | 屠敏 出品 | CSDN(ID:CSDNNews) 简介 Python 是一种 ...
- python支持函数式编程吗_利用Fn.py库在Python中进行函数式编程
尽管Python事实上并不是一门纯函数式编程语言,但它本身是一门多范型语言,并给了你足够的自由利用函数式编程的便利.函数式风格有着各种理论与实际上的好处(你可以在Python的文档中找到这个列表): ...
- JavaScript 中的函数式编程实践
为什么80%的码农都做不了架构师?>>> 基础知识 函数式编程简介 说到函数式编程,人们的第一印象往往是其学院派,晦涩难懂,大概只有那些蓬头散发,不修边幅,甚至有些神经质的大学 ...
- Java 中的函数式编程
1. 概述 在本教程中,我们将了解函数式编程范式的核心原则以及如何在 Java 编程语言中使用它们. 我们还将介绍一些高级函数式编程技术.这将帮助我们了解 Java 中的函数式编程的好处. 2. 什么 ...
- less 函数_Python中的函数式编程教程,学会用一行代码搞定所有内容
前言 在本文中,您将了解什么是函数范型,以及如何在Python中使用函数式编程.在Python中,函数式编程中的map和filter可以做与列表相同的事情.这打破了Python的禅宗规则之一,因此函数 ...
- DMN中的函数式编程:感觉就像再次重读我的大学课程一样
在本文中,我想分享有关DMN中的递归支持的有趣见解,并重点介绍FEEL语言的特定属性如何使功能编程结构能够在DMN中建模. 我们将从一个基本的示例开始,以演示FEEL语言和DMN构造的"商业 ...
最新文章
- Linux常用命令--网终设置
- mysql的count报错_mysql的floor()报错注入方法详细分析
- Python -二维数组定义
- Android学习笔记之Fragment的两种使用方法
- 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图
- 使用java将字符串写入到指定的文件中
- 【python】python的环境搭建
- SAP License:SAP精细化的应收付及要素为根设计思想
- how to switch between python3.5 and python3.6
- 操作给定的二叉树,将其变换为源二叉树的镜像。
- C++%f和%lf的区别
- 图片显示不出时显示默认图片
- kubernetes多节点集群搭建过程分析
- iOS从零开始学习socket编程——高并发多线程服务器
- qq 登陆界面怎么测试
- 软件架构C4模型简介
- iOS第三方支付——银联支付
- 1.6 电源树中电流的计算方法(硬件基础系列)
- 数据分析找不到数据?200个源数据网站全给你!
- Android-接入谷歌登录
热门文章
- 提示计算机未安装flash,大师应对安装了flash,但浏览器提示没安装,如何解决...
- 文件系统_Docker文件系统实战
- matlab 二维高斯滤波 傅里叶_光电图像处理 | 傅里叶变换(二)
- 从网页中读取数据 python_数据分析硬核技能:用 Python 爬取网页
- caffe linux 教程,CentOS7安装Caffe的教程详解
- mysql+不锁表添加字段_MySQL5.6在线DDL不锁表(在线添加字段)
- 正则表达式--python的re模块
- 自动瘦脸与眼睛放大美颜算法
- C# Httpclient编程
- 组成原理----存储管理