@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返回的不是一个值,而是一个函数fun2a = fun2,所以 a(i)会打印 sum的值,为什么 sum 一直在加呢,函数里的值为什么可以带到函数体外呢。

其实可以把闭包看做一个类, sum 就是类里的属性, fun2就是类的方法,所以fun2可以使用 sum(自由变量)

nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。嵌套函数fun2中的sum受到了影响,显示fun2中的sumfun1函数中的局部变量。

下面给出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已经是10y20,最终返回x的值是30,依次类推执行。

六、Go编程语言中的函数式编程相关推荐

  1. javascript函数式_JavaScript中的函数式编程—结合实际示例(第1部分)

    javascript函数式 by rajaraodv 通过rajaraodv JavaScript中的函数式编程-结合实际示例(第1部分) (Functional Programming In Jav ...

  2. C#中面向对象编程中的函数式编程

    目录 介绍 面向对象编程中仿真的函数式编程技术 粒度不匹配 面向对象的函数式编程构造 相互关系函数式编程/面向对象程序设计 C#中的函数式编程集成 函数级别的代码抽象 操作组合 函数部分应用和局部套用 ...

  3. wpf绑定 dictionary 给定关键字不再字典中_为什么要在 JavaScript 中学习函数式编程?...

    请忘掉你认为你知道的有关 JavaScript 的任何东西,以初学者心态来接触这份资料. 为帮助你这样做,我们打算从头开始复习 JavaScript 的基础知识, 就好像你以前从来没有看到过 Java ...

  4. 在 Python 中使用函数式编程的最佳实践!

    在函数式编程中,如何使用 Python 编写出优秀的代码? 作者 | Amandine Lee 译者 | 弯月 责编 | 屠敏 出品 | CSDN(ID:CSDNNews) 简介 Python 是一种 ...

  5. python支持函数式编程吗_利用Fn.py库在Python中进行函数式编程

    尽管Python事实上并不是一门纯函数式编程语言,但它本身是一门多范型语言,并给了你足够的自由利用函数式编程的便利.函数式风格有着各种理论与实际上的好处(你可以在Python的文档中找到这个列表): ...

  6. JavaScript 中的函数式编程实践

    为什么80%的码农都做不了架构师?>>>    基础知识 函数式编程简介 说到函数式编程,人们的第一印象往往是其学院派,晦涩难懂,大概只有那些蓬头散发,不修边幅,甚至有些神经质的大学 ...

  7. Java 中的函数式编程

    1. 概述 在本教程中,我们将了解函数式编程范式的核心原则以及如何在 Java 编程语言中使用它们. 我们还将介绍一些高级函数式编程技术.这将帮助我们了解 Java 中的函数式编程的好处. 2. 什么 ...

  8. less 函数_Python中的函数式编程教程,学会用一行代码搞定所有内容

    前言 在本文中,您将了解什么是函数范型,以及如何在Python中使用函数式编程.在Python中,函数式编程中的map和filter可以做与列表相同的事情.这打破了Python的禅宗规则之一,因此函数 ...

  9. DMN中的函数式编程:感觉就像再次重读我的大学课程一样

    在本文中,我想分享有关DMN中的递归支持的有趣见解,并重点介绍FEEL语言的特定属性如何使功能编程结构能够在DMN中建模. 我们将从一个基本的示例开始,以演示FEEL语言和DMN构造的"商业 ...

最新文章

  1. Linux常用命令--网终设置
  2. mysql的count报错_mysql的floor()报错注入方法详细分析
  3. Python -二维数组定义
  4. Android学习笔记之Fragment的两种使用方法
  5. 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图
  6. 使用java将字符串写入到指定的文件中
  7. 【python】python的环境搭建
  8. SAP License:SAP精细化的应收付及要素为根设计思想
  9. how to switch between python3.5 and python3.6
  10. 操作给定的二叉树,将其变换为源二叉树的镜像。
  11. C++%f和%lf的区别
  12. 图片显示不出时显示默认图片
  13. kubernetes多节点集群搭建过程分析
  14. iOS从零开始学习socket编程——高并发多线程服务器
  15. qq 登陆界面怎么测试
  16. 软件架构C4模型简介
  17. iOS第三方支付——银联支付
  18. 1.6 电源树中电流的计算方法(硬件基础系列)
  19. 数据分析找不到数据?200个源数据网站全给你!
  20. Android-接入谷歌登录

热门文章

  1. 提示计算机未安装flash,大师应对安装了flash,但浏览器提示没安装,如何解决...
  2. 文件系统_Docker文件系统实战
  3. matlab 二维高斯滤波 傅里叶_光电图像处理 | 傅里叶变换(二)
  4. 从网页中读取数据 python_数据分析硬核技能:用 Python 爬取网页
  5. caffe linux 教程,CentOS7安装Caffe的教程详解
  6. mysql+不锁表添加字段_MySQL5.6在线DDL不锁表(在线添加字段)
  7. 正则表达式--python的re模块
  8. 自动瘦脸与眼睛放大美颜算法
  9. C# Httpclient编程
  10. 组成原理----存储管理