golang编程细讲-函数篇2_golang 函数
我们继续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的定义域怎么变化,已经可以忽略。
总结一下,函数是一种封装概念,我们很多时候是按照一种黑盒子的方式在使用,只有我们给定输入,它会给出一个明确定义的输出。内部的实现,可以被我们有意的忽略。
这是一种非常好的思维模式。这样的函数是一种可复用的模块化的组件,我们只关心组件的功能和如何使用,内部的实现细节可以被忽略。这节省了我们的心智负担,同时也扩展了我们能够解决问题的能力。