函数

在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
}
_
//如不需要第二参数,直接使用下划线来占位
i, _ := div(11, 3)

可变参数函数

/**
在写函数得过程中,发现golang是没有函数重载,没有默认参数,可选参数这些东西
只有一个 就是可变参数 既...三个点代表
*/

func addAll(sum ...int) int {

    s := 0
    for e := range sum {
        s += sum[e]
    }

    return s
}

函数式编程

applyevalapply
/**
函数式编程
    直接将函数做为一个参数传递
    这里就定义了一个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