相信很多从其他语言转向go语言的人,或者是几乎所有初学go语言的人(我相信目前还没有学校将go作为教学语言,所以未来的IT工程师的第一语言都不会是go),都会在学习的过程中将go与自己的第一语言、第二语言作比较,带着第一、第二语言的思维方式去学习go。同时会对go语言的一些看似“奇葩”的语法不解,这里我尝试向大家介绍go没有什么或者为什么没有。
语法篇
语法 |
示例(java) |
说明 |
三元操作符 |
boolean a = 2 > 1 ? true : false |
这个有太多的讨论, 我也始终未能认同官方的观点。或许未来会在go2.0中加入新的语法来实现 |
自增、自减 |
i++, i-- |
go认为自增、自减是一个语句而不是一个表达式, 所以a := i++ 不合法。作为语句,单独使用i++则合法, 但 ++i 不合法。语句与表达式的区别在于表达式可以求值,而语句不行。 |
逻辑右移 |
2>>>1 |
即无符号右移 |
泛型 |
Set s = new HashSet<>(8)
|
go2.0计划加入泛型支持 |
union |
- |
c语言的联合 |
class |
public class A |
类, go使用struct实现面向对象 |
extend |
class A extends B |
继承, go采用鸭子类型的方式实现继承 |
多线程 |
new Thread() |
go使用协程 |
函数重载 |
同名方法,参数不同(方法签名不同) |
即overload,但go不支持,go2.0中有新的提案提及,但我不看好,重载虽然可以提高生产力,但确实会带来复杂性 |
函数重写 |
父子类继承时,重写父类方法 |
即overide,go使用的是组合继承,任何方法的调用方都是明确的。 |
数据结构篇
数据结构 |
示例(java) |
说明 |
集合 |
Set s = new HashSet<>(8) |
需要自行实现,反倒go提供了list、heap、ring的实现 |
除了上述go没有的语言特性之外,go拥有的语言特性包括切片(又叫元组或切片)、多返回值、复数、协程、通道等。
欢迎关注个人公众号
|
请发表评论