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

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

maynowei6个月前 (10-19)技术知识89

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

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

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

相关文章

Objective-C的本质(objective-c的特点)

我们平时编写的Objective-C代码,底层实现其实都是C\C++代码,所以Objective-C的面向对象都是基于C\C++的数据结构实现的OC对象的本质Objective-C的对象、类主要是基于...

Win10桌面/手机版最深层次开发功能挖掘

IT之家讯 Win10开发者预览版为我们提供了一个Win10大框架的早期概览,使开发者与热心用户都可以提前感受Win10带来的新特性,尝试新工具,而作为开发者,最关心的莫过于Windows多平台通用应...

大厂 Go 编程规范(二):mutex(编程大厂是什么意思)

mutex 是golang 的互斥锁,可以保障在多协程的情况下,数据访问的安全。1、零值有效我们并不需要mutex指针mu := new(sync.Mutex) mu.Lock()直接可以使用mute...

大量类加载器创建导致诡异FullGC(类的加载器有什么用)

“ 由 GC 问题带你全面了解 JDK8 Metaspace”01—现象最近接手了一个同事的项目,某一天接口的响应耗时突然增加了很多,由几十ms 增加到了几十秒。首先查看机器上的日志,有调用第三方接口...

一个快要被忘记的数据库开发岗位,但应该被尊重

数据库测试,似乎是被人遗忘的数据库职业,但依然是不错的选择。底下是我在某站找的招聘启事,就连蚂蚁金服都在积极寻找数据库测试人:要说我经历的项目,大大小小也有几十个,从 C/S, B/S, 再到 B/C...

Oracle 不是有效的导出文件,标头验证失败 解决方法

第一种:网上搜索到的大多解决方法是说导出文件时使用的Oracle版本不一致问题,需要修改dmp文件的版本号。如果确定版本号确实不一样,请自行搜索一下解决方法。第二种:备份dmp文件时,备份的语句可能使...