• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

函数

在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????


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go语言开发工具发布时间:2022-07-10
下一篇:
Go语言如何判断是否是零值发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap