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

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

maynowei5个月前 (10-19)技术知识60

我们继续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的定义域怎么变化,已经可以忽略。

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

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

相关文章

如何快速将axure生成的原型放到手机上演示

人人都是产品经理旗下【起点学院】推出产品经理“365天”成长计划,BAT大牛带你学产品! 之前Axure官方有一个原型在线分享演示的平台,用户可以直接生成原型到Axure官方平台,方便用户提供演示:h...

Axure8.0教程:“百度一下,你就知道”搜索首页原型设计

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品百度作为最大的中文搜索引擎,在某种程度上,有点学习google的简约至上的原则,但是给人的感觉还是不够彻底。今天,使用...

分享我的产品策划流程,希望对你也有用

本文笔者梳理拆解了自己的产品策划流程,并给出了自己对各流程的思考,希望能够给你带来一定的启发。记得刚开始做产品出需求方案的时候,上来就开始画原型写文档,在写的过程中发现某个交互没想明白或者漏了一部分逻...

C语言进阶教程:线程同步:互斥锁、条件变量与信号量

在多线程编程中,线程同步是确保数据一致性和程序正确性的关键。当多个线程需要访问共享资源时,如果缺乏适当的同步机制,就可能导致竞态条件(Race Condition)、死锁(Deadlock)等问题。本...

C++11 同步机制:互斥锁和条件变量

前段时间,我研究了 ROS2(Jazzy)机器人开发系统,并将官网中比较重要的教程和概念,按照自己的学习顺序翻译成了中文,进行了整理和记录。到目前为止,已经整理了20多篇文章。如果你想回顾之前的内容,...

Linux系统编程:条件变量为什么要用锁

条件变量可以解决线程同步和共享资源访问的问题,条件变量是对互斥锁的补充,它允许一个线程阻塞并等待另一个线程发送的信号,当收到信号时,阻塞的线程被唤醒并试图锁定与之相关的互斥锁。具体定义如下:等待:in...