Go和Java的异同(流程控制和函数)

本文介绍了Go语言的流程控制,包括if、switch、for等语句的特性和使用,强调了Go的break和continue的灵活性。此外,详细阐述了函数的三种类型:普通函数、匿名函数(闭包)和高阶函数,并提及了如何通过内存缓存和尾递归优化递归函数性能,以提高代码效率。
摘要由CSDN通过智能技术生成

一、流程控制

1.Go的if条件语句不用加括号,但函数体就算只有一句语句括号也不可省略。Go语句后的{必须与if条件语句在同一行。
2.Go的switch case不需要显式通过 break 语句退出某个分支,上一个分支语句代码会在下一个 case 语句出现之前自动退出,不会像Java中出现击穿现象。如果想要继续执行后续分支代码,可以通过一个 fallthrough 语句来声明。可以不设定 switch 之后的条件表达式,在这种情况下,整个 switch 结构与多个 if…else… 的逻辑作用等同。
3.Go的循环语句只支持for关键字,不支持while和do-while。for循环条件中也支持多重赋值。
4.对于可迭代的集合(数组、切片、字典),Go 语言还支持通过 for-range 结构对其进行循环遍历。
在这里插入图片描述
该循环结构的便利之处在于可以同时取出索引/键及对应的值。
5.Go 语言的 for 循环同样支持 continue 和 break 来控制循环,但是它提供了一个更高级的 break,可以选择中断哪一个循环。
6.Go 语言的 break 和 contine 与其他语言的不同之处在于支持与标签结合跳转到指定的标签语句,从而改变这两个语句的默认跳转逻辑,标签语句通过标签 + :进行声明。
在这里插入图片描述
7.Go支持goto关键字,表示跳转到本函数内的某个标签。

二、函数

在 Go 语言中,函数主要有三种类型:

  • 普通函数
  • 匿名函数(闭包)
  • 类方法

1.普通函数

(1)Go 普通函数的基本组成包括:关键字 func、函数名、参数列表、返回值、函数体和返回语句。与Java类似。
在这里插入图片描述
(2)函数调用,如果是同一个包内的函数,直接调用即可。如果是不同包,需先导入该函数所在的包,然后才能调用该函数。

调用mymath包中的Add()方法
在调用其他包定义的函数时,只有函数名首字母大写的函数才可以被访问。

(3)函数的参数传递除了与Java类似的按值传参和引用传参之外,还有变长传参。
所谓变长参数指的是函数参数的数量不确定,可以按照需要传递任意数量的参数到指定函数,如fmt.Pringf()函数。
只需要在参数类型前加上 … 前缀,就可以将该参数声明为变长参数:
这段代码的意思是,函数 myfunc() 接受任意数量的参数,这些参数的类型全部是 int
Go 语言标准库中 fmt.Printf() 的函数原型
指定变长参数类型为 interface{},就可以支持传递任意类型的值作为变长参数。
Go 语言并没有在语法层面提供对泛型的支持,所以只能通过反射和 interface{} 类型实现。
Go函数的一大特点就是支持多返回值。此外,在设置多返回值时,还可以对返回值进行变量命名。

2.匿名函数

(1)匿名函数是一种没有指定函数名的函数声明方式。
Go 匿名函数也可以赋值给一个变量或者直接执行:
匿名函数不能独立存在,会报编译错误,它必须赋值给一个变量,即把函数的地址赋值给一个变量,然后通过这个变量来调用这个匿名函数
在这里插入图片描述
(2)闭包:指的是引用了自由变量(未绑定到特定对象的变量,通常在函数外定义)的函数,被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的上下文环境也不会被释放(比如传递到其他函数或对象中)。
显然,闭包只能通过匿名函数实现,我们可以把闭包看作是有状态的匿名函数,反过来,如果匿名函数引用了外部变量,就形成了一个闭包(Closure)。
(3)匿名函数除了可以赋值给普通变量外,还可以作为参数传递到函数中进行调用,就像普通数据类型一样.
(4)还可以将匿名函数作为函数返回值。

3.高阶函数

(1)所谓高阶函数,就是接收其他函数作为参数传入,或者把其他函数作为结果返回的函数。
(2)装饰器模式(Decorator)是一种软件设计模式,其应用场景是为某个已经存在的功能模块(类或者函数)添加一些「装饰」功能,而又不会侵入和修改原有的功能模块。
(3)在Go语言中通过高阶函数实现装饰器模式:
例:乘法运算函数
在这里插入图片描述
引入装饰器模式实现计算乘法运算的执行时间
在这里插入图片描述

4.优化递归函数性能

递归函数耗时大的原因:a.递归函数调用过程中存在大量重复计算。b.递归函数本身的特点,调用过程中方法压栈造成的指数级消耗。
(1)通过内存缓存技术优化递归函数性能
通过缓存中间计算结果来避免重复计算——动态规划。
(2)通过尾递归优化递归函数性能
尾调用是指一个函数的最后一个动作是调用一个函数(只能是一个函数调用,不能有其他操作,比如函数相加、乘以常量等)。若这个函数在尾位置调用自身,则称这种情况为尾递归。
它是尾调用的一种特殊情形。尾调用的一个重要特性是它不是在函数调用栈上添加一个新的堆栈帧 —— 而是更新它,尾递归自然也继承了这一特性,这就使得原来层层递进的调用栈变成了线性结构,因而可以极大优化内存占用,提升程序性能,这就是尾递归优化技术。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值