[go语言]函数

来源:互联网 发布:windows网络抓包工具 编辑:程序博客网 时间:2024/06/08 17:03
1 Go函数介绍
go函数不支持重载,默认参数。支持:
无需声明原型
不定长变参
多返回值
命名返回值参数
匿名函数
闭包


2 函数定义
1)函数定义方式如下
func 函数名(参数名 参数类型))(返回参数名 返回参数类型){
函数语句
return 返回值
}


2)返回多个值
函数返回值可以是多个值,比如:
func sum(x int ,y int ) (s int,err error){
return x+y,nil
}
可省略返回值名称,只保留返回类型。




3)命名返回参数
当返回参数有着变量名,return后面可以不接变量。返回值默认为返回参数变量的值。
例如
func sum(x int, y int) (s int, err error) {
s = x + y
err = nil
return
}


2 可变参数
Go函数支持变参。最后一位参数可以有着不定数量的同类型变量的参数。使用...表示
变参参数实际上传进来一个slice,必须进行range获取单个参数。比如
func sum(arg ...int)(s int,err error){
}
调用可变参数时,传入一个数据结构,可以调用这个数据结构的全部,或者调用这个数据结构的切片。
例如:
全部调用 myfunc2(arg...);
调用片段 myfunc2(arg[:2]...);


3 引用传递与值传递
1)参数为基本数据类型(值传递),此时默认传递的是拷贝。(数组类型默认传递副本)
go语言参数传递的是参数的副本。对于普通类型相当于参数是变量的拷贝。
在函数中的操作等对原来的变量都是没有影响的。如果要在函数中修改影响传进来的值,则必须进行取地址作为参数传递。


2)参数为自定义类型(值传递)
传递方式同上。


3)参数为数据结构(拷贝传递),此时默认传递的是拷贝
Go语言中string,slice,map这三种类型的实现机制类似指针,相当于引用传递。
在函数对变量修改都会影响原来的变量。


4)数组类型默认是值传递
如果数据结构比较大的话,建议传递指针。否则传递数组参数需要复制,占用较多内存和时间。


4 函数作为值
1)函数作为值是指将一个函数名作为变量值一样传递
首先可以声明一个函数类型,根据函数类型可以创建一个值(函数名)。
拥有相同参数和相同返回值的函数属于同一个函数类型,但是不同函数名的函数代表不同的函数值。


2)函数名作为值,函数名可以作为参数变量(参数或者返回参数,也可以放在类型对象中)传递。
声明如下:
函数名可以作为一个值类型,通过参数传递。
代码如下:
 type AddX func(int) int //定义一个func(int)的函数类型的别名


func Add3(x int) int {
return x + 3
}
func Add5(x int) int {
return x + 5
}
func doAll(x int, f1 AddX, f2 AddX) int {
return f2(f1(x))
}
func main() {
sum := doAll(1, Add3, Add5)
fmt.Println("sum:=========", sum)
}
也可以不定义类型,代码如下:
//不定义函数类型别名,直接用func(int)int


func Add3(x int) int {
return x + 3
}
func Add5(x int) int {
return x + 5
}
func doAll(x int, f1 func(int) int, f2 func(int) int) int {
return f2(f1(x))
}
func main() {
sum := doAll(1, Add3, Add5)
fmt.Println("sum:=========", sum)
}


5 匿名函数
定义匿名函数
func(){
执行语句
}
定义匿名函数并执行
func(){
执行语句
}()
例子如下:
func main() {
//直接定义匿名函数调用
func() {
fmt.Println("匿名函数1")
}()
//定义匿名函数,赋值给变量后调用
noname := func() {
fmt.Println("匿名函数2")
}


noname()
}


6 回调函数
1)函数作为值时,可将函数作为一个参数传递到其他的函数里面,其他的函数里面执行这个函数参数。
2)函数回调的原理:
开始时候,定义了一个func(int)类型的函数(类似一个方法指针,指向func(int)函数),
函数值为argsfunc,值作为参数进行传递,然后调用argsfunc(),执行所对应的方法。


当argsfunc()时调用这个函数
例子如下:
func argsfunc(x int) {
fmt.Println("参数函数")
}
func callback(y int, f func(int)) {
f(y)
fmt.Println("argsfunc函数参数传进来,回调回去")
}
func main() {
//argsfunc是一个func(int)类型的函数值
callback(1, argsfunc)
}




5 main函数和init函数
Go里面有两个保留的函数:init函数和main函数,这两个函数在定义时不能有任何的参数和返回值。
1)main函数
main函数只能在main package中使用。是程序的入口函数。


2)init函数
go程序在导入每个package时候,首先会自动执行这个package的init函数。init函数主要用来做一些数据初始化。
原创粉丝点击