Go语言和Java的部分区别
几年前闲着无事,当时想就用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类型“增加”了绝对值方法。
