接着上篇的尾部,我们今天说一下go的函数。说到函数这个东西我们会问那么我们什么是函数呢?其实函数通俗来讲就是大任务划分出小人物具有完整逻辑的小的调度单元。那么函数有什么特性呢?go中有哪些函数呢?怎么声明和使用呢?带着这些疑问我们来开始今天的内容…
1 怎么声明一个函数
对于函数往往是个具有完整的逻辑,为了完成大任务中的一小部分功能而存在。因此往往需要呈上启下,那么怎么达到承上启下的作用--接受传入信息和返回处理结果来玩啦。
func funcname(context )returnvalues{
}
上面是我们的函数声明的为代码,下面我们举例说明一下:
func sum(a int, b int) int {
return a + b
}
上栗是一个很简的加法运算例子,a, b 作为从外部传进来的数据,然后返回一个结果:sum(1,2)
2 多返回值
上栗中我们做的加法运算,只是简单的返回一个单一的值?那么假若处理之后有一系列的值需要返回怎么办呢?go还很人性化滴
func fetch(url string) (interface{}, int) {
value := 123
code := 200
return value, code
}
上栗中我们模拟了一个网络请求(省略了过程),然后返回了数据和状态码:value,code := fetch("") 是不是感觉返回多值的函数十分有用,变大能力更加强大。除此之外go还允许对返回的值进行设置变量名称
func fetch(url string) (value interface{}, code int) {
value = 123
code = 200
return value, code
}
自习对比一下上面两个例子,会发下声明了返回值名称的函数,在内部返回可以作为变量来使用……
3 匿名函数
可以提供给外部调用的函数,我们通常是需要提供名称参数等一系列声明的,但是有些时候我们不想提供出去供调用,那么匿名函数就诞生啦。那么它有什么特性呢?特性就是没有名字
//声明
inner := func(a int ) int {
return a
}
//调用
inner(123)
上栗虽然简单但是五脏俱全---声明一个匿名函数(有返回值,有传入参数)
4 可变参数
之前我们的函数参数序列和个数都是写死无法改变的,那么我们有是需要变化的参数怎么办呢?例如给函数传递n个数怎么处理?(当然了使用数组也是可以的)go为我们提供了可变话传参的公共能
func letter(a ...string) {
for index, v := range a {
fmt.Println(index, v)
}
}
看上栗我们可以看出,可变参数是被作为数组来对待的
5 defer函数
函数执行是一个压栈出栈的过程。一旦出栈之后就会被系统慢慢给回收掉。试想一下假如我们在一个函数中动态分配了内存但是我们没有管理它会怎么样,我们打开一个文件没有关闭会怎样,那么我们能否运用函数被回收的过程做一些事情呢?这个想法可定的啦--那就是defer
由于defer会有一个隐藏的问题我们今天就留个尾巴等待下次一块细看,除了defer的运用之外下次我们还会说一说异常和如何进行异常的捕获来是我们的程序更加健壮和任性话