主要讲解Go语言中 func 的定义和使用
主要知识点:
- func 函数的几种定义形式
- 多返回值定义函数的用法主要用于放回错误,防止程序中断
- 函数式编程中将函数作为参数传递给函数
- 匿名函数的写法
- Go语言中可变参数列表的使用
- Go语言中没有函数重载,可选参数 等概念
- Go语言中没有引用传递的概念,默认情况下所有的参数传递都是值传递,但是可以手动设置指针传递,类似于引用传递的效果。
以下通过代码进行示例:
package main
import (
"fmt"
"reflect"
"runtime"
)
//写法1,普通写法(推荐)
func div1(a,b int) (int ,int) {
return a/b,a%b // 返回多个值,此处返回两个数的商和余数
}
//写法2,为返回值定义名称,此种方式 仅用于逻辑非常简单的函数
// 多返回值,不能随意使用,一般用法是 第一个为业务返回值,第二个为 错误信息
func div2(a,b int) (q,r int) {
q = a/b
r = a%b
return
}
//写法3,函数式编程,可以将函数的输入参数定义为函数
func apply(op func(int,int) int,a,b int) int {
//获取函数对应的指针
p:=reflect.ValueOf(op).Pointer()
opName:=runtime.FuncForPC(p).Name()
fmt.Printf("Calling function %s with args (%d,%d)",opName,a,b)
fmt.Println()
return op(a,b)
}
//写法4,可变参数列表
func sum(numbers ...int) int {
s:=0
for i:= range numbers{
s += numbers[i]
}
return s
}
//写法5,值传递与 指针传递
//Go 中所有的 参数传递 都是 值传递,但是添加一些操作可以修改为指针传递
// * 代表指针传递
func swap(a,b *int) {
*a,*b=*b,*a
}
func main() {
fmt.Println(div1(13,3)) //4 1
q,_:=div2(13,3) // r 的值 不想用到,则可以使用 _ 代替
fmt.Println(q) // 4
//使用匿名函数 作为函数的参数
fmt.Println(apply(func(i int, i2 int) int {
return i+i2
},1,2)) //3
fmt.Println(sum(1,2,3,4,5)) //15
/ 传入参数是需要添加 & 符号,表示传递指针
a,b:=3,4
swap(&a,&b)
fmt.Println(a,b) //4 3
}