函数
在golang中函数是作为一等公民存在的,而这个一等公民,我理解得意思就是可以在任何地方使用到函数,函数中参数可以是函数,返回也可以是函数.
正常定义函数
/**
正常定义函数,(还是准寻golang定义原则变量名在前,变量类型在后,如果多个参数类型一致可以一起定义)
*/
func eval(a, b int, op string) int {
switch op {
case "+":
return a + b
case "-":
return a - b
case "*":
return a * b
case "/":
return a / b
default:
panic("错误的计算符号" + op)
}
}
返回多个参数函数
/**
多个返回值
带余数除法
*/
func div(a, b int) (int, int) {
return a / b, a % b
}
注意在golang中,如果会发现所有定义的变量都要使用到,而有时候我们返回的多个参数,其中又有些参数不需要用到,这时可以使用_ 下划线来占位
//如不需要第二参数,直接使用下划线来占位
i, _ := div(11, 3)
可变参数函数
/**
在写函数得过程中,发现golang是没有函数重载,没有默认参数,可选参数这些东西
只有一个 就是可变参数 既...三个点代表
*/
func addAll(sum ...int) int {
s := 0
for e := range sum {
s += sum[e]
}
return s
}
函数式编程
第一个参数apply 是一个函数定义这个函数又有两个(a, b int)参数,且其返回两个参数,这样上面的eval 函数就可以改成在计算逻辑在apply 的函数里,对于代码的扩展性强.
/**
函数式编程
直接将函数做为一个参数传递
这里就定义了一个func(a,b int) (r,q int)传入两个int值,返回两个int值的函数
注意这里只是做为演示,正常情况下返回多个参数会让人看起来很乱
一般多个参数返回,在有错误的情况下去做返回,返回错误信息
*/
func divFun(apply func(a, b int) (r, q int), a, b int) (r, q int) {
return apply(a, b)
}
指针
golang中的指针与其他C++中的还不一样,C++中的指针之所以难,是因为其指针可以参与运算,而在golang中指针不能参与运算,只能用于赋值.
小插曲-值传递or引用传递
要搞清楚值传递和引用传递得区别,先得搞清楚什么是值传递,什么是引用传递.
- 值传递:将传入得值,拷贝一份到传入得方法中.
- 引用传递:直接将其指针 传入函数中.
由此可见,值传递中传入函数中得参数,其参数是其参数得拷贝份,所以在调用函数内修改 在外部调用传入得参数是不会改变得.而很多语言又有值传递又有引用传递.golang 中只有值传递,既只要是参数,被调用得函数中参数必定是拷贝份.
java中的参数传递
在熟悉得Java中,其实也是全部都为值传递.我们知道在Java中有基本类型与引用类型(引用类型就是包装类),在函数调用时都是将传入的参数做一次拷贝到被调用的函数中.而这里很多同学就迷惑了,自己明明有时候在被调用update更改一个值,调用函数是有显示,这里就需要搞清楚什么是引用类型,引用类型其变量名指向的是一个堆中对象的地址值,所以拷贝到被调用方法中的依旧也是堆中对象的地址值.
golang中的参数传递-经典的交换案例
实验:
func swap(a, b int) {
a, b = b, a
}
func main() {
a,b:= 1,2
swap(a,b)
print(a,b)// 1 2 显然因为上述golang是值传递,所以不能交换
}
修改使用指针:
/**
但是这样看起非常的乱,一般不会这样来使用.交换的方法还有一种跟易懂的写法
*/
func swapByPointer(a, b *int) {//*int就代表传入的是指针类型
*a, *b = *b, *a //*a指针量
}
func main() {
a, b := 1, 2
swapByPointer(&a, &b)//&a表示取a的指针
fmt.Println(a, b)//2 1 交换成功
}
交换最简易方法:
func swapByReturn(a,b int) (c,d int) {//利用golang中可以返回多个值的特性来直接将a b两个值相反返回,然后再让调用函数中的a ,b两个变量接收.
return b,a
}
func main() {
a, b := 1, 2
a, b = swapByReturn(a, b)
fmt.Println(a, b)
}
作者所有的学习源码在 go学习源码github地址,如果觉得有用的话帮小智贡献一个star????
|
请发表评论