go语言函数进阶

函数的进阶
1.函数类型
函数不但可以封装代码,分割功能,解耦逻辑,还可以当作普通的值,在其它函数间传递、赋予变量、做类型判断等,和其它数据类型一样。
函数类型是对一组输入、输出进行模块化的重要工具,它比接口类型更加轻巧、灵活。
示例:
package main

import "fmt"

type Printer func(content string) (n int, err error)

func printToStd(content string) (bytesNum int, err error) {
return fmt.Println(content)
}

func main() {
var p Printer
p = printToStd
p("something")

}
注意点,通过func关键字来表明这是一个函数类型,func右边就是函数类型的参数列表和结果列表,参数列表必须由圆括号包围,结果列表中如果只有一个结果声明并且没有命名可以省略圆括号。
函数签名就是函数的参数列表和结果列表的统称,它定义了可以用来鉴别不同函数的特征,也定义了用户与函数的交互方式。但参数和结果参数名不能算作函数签名的一部分,因为它们的名字并不影响函数类型。例子中printToStd的签名和Printer是一致的,所以前者是后者的一个实现,即使他们的名称不一样。

2.高阶函数
高阶函数指的是,能够接受其他函数作为参数传入,或者能够把其他函数作为结果返回的函数。
示例:import (
"errors"
"fmt"
)

type operator func(a int, b int) int
type calcutar func(x int, y int) int

func main() {
x := 20
y := 20
err, op := getCalcutar(operator1)
if err != nil {
fmt.Println(err)
}
fmt.Println(op(x, y))
}

func getCalcutar(op operator) (error, calcutar) {
if op == nil {
return errors.New("there is on operator"), nil
}
return nil, func(x int, y int) int {
return op(x, y)
}
}

func operator1(x int, y int) int {
return x + y
}

在示例中通过闭包来实现了这个高阶函数,在闭包中存在对外来标识符的引用。外来标识符不代表当前函数的任何参数或结果,也不是函数内部声明的,它是直接从外边拿过来的。这种变量又称自由变量,如果是常量就形不成闭包了,因为常量是不可变程序实体,而闭包体现的是由不确定变为确定的一个过程。
示例中的闭包函数,引用了自由变量op,呈现出一种不确定的状态,它的内部逻辑不是完整的,有一部分逻辑需要自由变量参与完成,而自由变量代表着什么在闭包被定义的时候是未知的,由于GO语言是静态语言,所以定义闭包的时候我们最多只能知道自由变量的类型。
例子中的变量op既不代表任何参数也不是自己声明的,所以是个自由变量,这个自由变量代表了什么,只有当这个自由变量被赋值的时候,我们才能够知道。
看到if op == nil {那一行了吗?Go 语言编译器读到这里时会试图去寻找op所代表的东西,它会发现op代表的是genCalculator函数的参数,然后,它会把这两者联系起来。这时可以说,自由变量op被“捕获”了。
当程序运行到这里的时候,op就是那个参数值了。如此一来,这个闭包函数的状态就由“不确定”变为了“确定”,或者说转到了“闭合”状态,至此也就真正地形成了一个闭包。
3.函数对参数值的处理
函数在数值类型传入的时候,会做一次拷贝,所以在函数内部做的修改不会影响到原数值类型。
函数在引用类型传入的时候也会做一次拷贝,例如切片、字典、通道、函数,的时候也会做一次拷贝,但这种拷贝是浅表复制,不是深层复制。以切片为例,复制时只会拷贝指向底层数组的指针,所以这时候做出修改,还是会修改原来的底层数组,对原来的数据造成影响
但是当一个值类型的参数是引用类型的时候,对它的参数做修改时,也会影响到原数据。
函数返回的结果值也是复制的,因为函数执行完,栈空间就回收了。返回值应该是通过寄存器或者是调用者栈空间的地址来存储的。
注意go语言单引号与双引号的区别,一个代表rune一个代表string 


转载于:https://juejin.im/post/5ba38e946fb9a05d185ee954

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值