当前位置:首页 > 技术知识 > 正文内容

golang编程细讲-函数篇2_golang 函数

maynowei8个月前 (10-19)技术知识122

我们继续golang的函数话题。

与数学上的函数 y = f(x)相对应,x对应的定义域,y对应了值域, f是处理逻辑。这个模式,事实上是一种从输入参数到输出参数的一种映射处理。

以前的Pascal语言,甚至是现在的oracle/mysql数据库等,仍保留着procedure(过程)和function(函数)的区分。

其中function(函数)指的是相应纯粹意义上的 y = f(x)的实现,不产生其他的副作用,只是完成从定义域到值域的映射处理。

而procedure(过程),是没有返回值的处理逻辑的表达,是处理过程和步骤的描述,可以有副作用(外部影响),比如读写文件/数据库等。

介于二者之间的,是既有副作用(对外部的影响),也有返回值。

golang编程语言中,统一使用了func(函数),包含了上述3种情况。

比如:

func add(a int, b int) int {
	return a + b
}

这是一个整数加法的简单实现,c = a + b,是纯粹意义上的函数,只依赖于输入参数,对其他外界因素没有需求,也没有影响。

比如:

func main() {
	println("hello world")
}

这个输出hello world的main函数,向控制台输出了字符串(对外界有了影响),这是一个处理过程。

比如:

func add(a int, b int) int {
	c := a + b
	println("c:", c)
	return c
}

这个函数例子就介于上述二者之间。

我们再继续深入一下。

函数本身封装了处理逻辑,不管是直接返回值,还是对外界产生影响(副作用)。这形成了一个我们的期望的黑盒子模型(给定输入,能产生相对明确的功能和作用的一个盒子,很多时候我们省略或者不去关注内部的实现细节)。与数学上的复合函数 y = f(g(x))类似,当我们把g(x)看成一个整体时,我们只需要关注g(x)的值域,对于内部x的定义域怎么变化,已经可以忽略。

总结一下,函数是一种封装概念,我们很多时候是按照一种黑盒子的方式在使用,只有我们给定输入,它会给出一个明确定义的输出。内部的实现,可以被我们有意的忽略。

这是一种非常好的思维模式。这样的函数是一种可复用的模块化的组件,我们只关心组件的功能和如何使用,内部的实现细节可以被忽略。这节省了我们的心智负担,同时也扩展了我们能够解决问题的能力。

相关文章

惊现!iOS 16.5 kfd 漏洞利用,成功隐藏 Dock 栏

最近!kfd漏洞比较活跃,进展也是很顺利,今天就有大神成功使用 kfd 漏洞实现隐藏 Dock 栏,到底怎么回事?请继续往下看。-- kfd 漏洞说明 --kfd漏洞适合在 iOS 16.2 - 16...

Go 语言中的 RWMutex 源码解析、使用场景及应用分析

Go 语言标准库的 sync 包提供了一些非常重要的并发原语来帮助程序开发者处理并发任务。本文将详细解析 sync 包中的 RWMutex,即读写互斥锁(Reader/Writer Mutex),并结...

C++ 原子操作与锁的深度解析:为什么原子操作并非万金油?

大噶好,我是henry,今天来和大家浅浅聊一下为啥C++原子操作并非万能钥匙,原因有三,且听我娓娓道来:一、原子操作的线程安全性C++11 的 std::atomic 确实为单个变量的线程安全操作提供...

聊聊并发编程: Lock(并发锁有哪些)

之前学习了如何使用synchronized关键字来实现同步访问,Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功...

不需安装oracleclient连接oracle数据库方案

在Oracle官方发布ODP.net之前,我们通常使用微软的System.data.OracleClient进行Oracle数据库操作,它的缺点是必须要装Oracle客户端OracleClient,如...

Navicat Premium 连接 Oracle 数据库

Navicat Premium是一个可多重连接的数据库管理工具,它可让你以单一程序同時连接到 MySQL、SQLite、Oracle 及 PostgreSQL 数据库,让管理不同类型的数据库更加方便。...