Go语言学习笔记三--基础语法

函数

在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更改一个值,调用函数是有显示,这里就需要搞清楚什么是引用类型,引用类型其变量名指向的是一个堆中对象的地址值,所以拷贝到被调用方法中的依旧也是堆中对象的地址值.

Java参数传递

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?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值