不一样的go语言-go缺少的语言特性
相信很多从其他语言转向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 |
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拥有的语言特性包括切片(又叫元组或切片)、多返回值、复数、协程、通道等。