大家好,我叫polarisxu。Go语言的设计站在巨人的肩膀上。它吸收了其他语言的优秀设计,同时舍弃了一些“不被认可”的设计。此外,为了简单起见,Go的功能少于许多其他语言。所以,Java有一些Go没有的特性。但是,不,并不意味着它不好。本文将具体看一下。(当然也有Go有的特性,而Java没有)1.多重赋值Java可以在一条语句中为多个变量赋同一个值(很多C族语言都支持)。例如:intx,y,z;x=y=z=10;Go不支持上述语法。相反,Go采用另一种形式,有时更方便。varx,y,zint=10,10,10并且,可以是不同的类型:varx,y,z=10,12.0,"polarisxu"因为这种语法,在Go中交换两个变量的值非常方便,无需引入中间变量:varx,y=1,2x,y=y,x2,语句和运算符Go和Java运算符有不同的优先级。Go的优先级较低,这在我看来更自然。如果不确定,请明确使用括号来指定优先级。一般来说,你不需要刻意记住这些优先级,有一个大概的印象即可。但是要记住一个关键的区别,在Go中,i++和i--是语句,而不是表达式。这是什么意思?声明说明不能出现这种恶心的写法(常见的恶心面试题)://Illegalx=i+++yinGo而且Go中没有--i或者++i。并且支持Java。Go尚不支持三元表达式。需要改用if/else语句。这一点被很多人吐槽过,毕竟大多数语言都支持。//Go中编译不通过z:=x>y?x:y//必须改成这样:varz=yifx>y{z=x}3.Assert语句Go没有assert(assertion)陈述。不过Go的单元测试还是很不错的,一般都是用测试来做类似的事情,也有一些不错的测试框架支持assert。在写Demo的时候,当err!=nil时,我倾向于使用panic打断程序,但是官方代码中建议少用panic。4.while和Do语句while、do、for是大多数语言提供的三大循环关键字。不过Go认为没必要用那么多关键字,直接用一个for就可以了。(虽然没有直接替代do语句,但是肯定可以用for完成)/??/equivalenttowhile(true){}for{}//equivalenttowhile(x<1){}forx<1{}//...注意Go中的条件,包括if语句,括号是可以省略的,也没有纠结放在哪里的问题{,规定只能放在最后。5.throw语句Go没有try/catch,所以也就没有throw。如果硬要找一个相似的,那就是恐慌,只是思路不一样。6.Go在Java中没有一堆修饰符,strictfp,transient,volatile,synchronized,abstract,static,这些关键字,Go没有,也没有类似的。大多数都不需要,因为在Java中需要它们的问题在Go中的解决方式不同。例如,通过将变量声明为包级别来实现与静态值类似的效果。7、对象、类、内部类、构造函数、this、super等。Go不像Java那样完全支持面向对象编程(OOP)。因此,它不支持这些Java构造。不过Go的很多函数都可以像大多数OOP函数一样使用,后续文章会详细说明。因此,最好将Go描述为一种基于对象的语言。Go允许实现OOP的一些关键目标,但与严格的OOP语言通常采用的方式不同。最重要的是Go不支持继承(虽然可以模拟类似继承的功能),强调使用组合,因为继承有点乱。Go不支持类,也没有构造函数(一般通过实现一个普通的New函数来充当构造函数),但是它有类似的功能,比如支持为类型定义方法,支持实现接口等等。Go的类型嵌套是组合的,与Java的内部类几乎没有相似之处。Go不需要显式声明实现哪个接口,而是隐式实现,通常称为duck类型。Go没有this、super等关键字。8.函数式编程虽然Go从一开始就将函数定义为一等公民,但支持的与函数相关的函数并不多,例如典型的效用函数(map、reduce,select,exclude,forEach,find等),这是Go这是有意为之的,考虑到简单性。由于Go引入了泛型,因此考虑包含相关的实用函数。在这方面,后来加入了Java。注:Java5开始支持泛型,Go在1.18开始支持泛型。9、原始类型包装器的Java集合(数组除外)不能包含原始值(primitivevalues,如int、long等),只能包含对象。因此,Java为每个原始类型提供了包装器类型。为了使集合更易于使用,Java自动执行了以下过程:在将值插入集合时包装(装箱)值,在从集合中移除值时取消装箱(拆箱)值。Go没有这样的限制。请注意,需要使用装箱(装箱/拆箱)是Java在内存使用方面不如Go高效的原因之一。10.Annotation(注释)Go没有注释。GoStruct字段可以具有提供类似但更有限角色的标签。注解、函数流和lambda使Java(至少部分)成为一种声明性语言。Go几乎完全是一种命令式语言。这有时会使Go代码更加冗长。此外,Go中的构建约束在某些方面与注解具有相似的效果。11、可见性Java支持四种可见性:privatedefaultprotectedpublicGo没有上面的关键字,Go只有export和non-export。exports类似于public,通过首字母大写指定。不导出小写首字母。12.重载/覆盖在Java中,可以在同一范围内定义具有相同名称但具有不同签名(不同数量和/或类型的参数)的函数。这称为(通过参数多态性的一种形式)重载函数。Go不允许重载。在Java中,可以在继承层次结构的较低级别重新定义具有相同名称和签名的函数。这种重新定义的函数被调用(通过继承多态性)被覆盖。由于Go不支持继承,因此不允许以这种方式覆盖。但是,Go中的嵌入类型具有类似重写的功能。肯定还有其他Java有而Go没有的,欢迎交流!参考本系列主要参考以下资料:GoforJavaProgrammersJavatoGo深入教程GoforJavaProgrammers:ebook
