Go语言和Java的部分区别

发表于2020-07-13,长度1508, 356个单词, 4分钟读完
Flag Counter

几年前闲着无事,当时想就用GO语言试一下,看能写一个爬虫程序吗。按照教程照猫画虎,做了个简单的爬图片程序。记得当时没花太多时间,不过后来再没拿起来过。最近听说GO又要在中国火了(貌似之前就是在中国火,据说国外不火),就又抽空看了两眼。再次学习发现,完全没有一点之前Go的学习记忆。

这篇文章简单记录一下在浏览教程过程中感觉到的和Java语言的差异。由于是后起之秀,不少地方的确更加好用。毕竟是不同语言,差异实际是非常多的,比如Java和C语言也有不少差异。这里主要记录连语言设计思想都不一样的差异。

包的申明

现在我还不是太了解Go中包的作用,只有一点是可以明确的:go文件不用像Java那样放在包指明的目录中,而且main方法所在的包名必须也是main

package main

如果包名不是main会报错:

go run: cannot run non-main package

函数多返回值

这个对于Java老油条估计很吸引,Java不能返回多值,只能封装在一个对象里,简直是懒婆娘的裹脚布 —— 又臭又长。

for循环

go中的for循环实际和Java、C等都一样,比较大的一个差异是go没有while循环,它的while循环也是for引导的:

for i < 100 {
    i++
}

switch语言

和老的Java一样,go中的switch也不是表达式。不过似乎比Java好用的一点是默认不用写bread就可以跳出语句,如果想和Java一样命中一个case可以继续执行后续case,需要在命中的case末尾写fallthrough:

today := time.Now().Weekday()
switch time.Tuesday {
case today + 0:
    fmt.Println("Today.")
case today + 1:
    fmt.Println("Tomorrow.")
    fallthrough
case today + 2:
    fmt.Println("In two days.")
default:
    fmt.Println("Too far away.")
}

从上面代码可以看出,go的switch和Java还有一个大区别是不需要是常量比较。

go语言还有一个特别的流程控制语法叫defer,比较简单,这里不说了也

go语言保留了C语言的指针,这一点可能让Java程序员有点难受

闭包

这个功能不少语言都有,但是Java没有。闭包就是一个函数,它的返回结果是另一个函数,返回的函数可以使用外层的变量。比如经典的斐波那契数列:

// 返回一个“返回int的函数”
func fibonacci() func() int {
	a, b := 1, 0
	return func() int {
		a, b = b, a+b
		return a
	}
		
}

func main() {
	f := fibonacci()
	for i := 0; i < 10; i++ {
		fmt.Println(f())
	}
}

“原型方法”

go可以给已有的类型增加方法,有点像JavaScript中的原型方法:

type MyFloat float64

func (f MyFloat) Abs() float64 {
	if f < 0 {
		return float64(-f)
	}
	return float64(f)
}

func main() {
	f := MyFloat(-math.Sqrt2)
	fmt.Println(f.Abs())
}

上面这个很容易看懂,给float类型“增加”了绝对值方法。

Written on July 13, 2020
分类: dev, 标签: go java
如果你喜欢,请赞赏! davelet