Go vs Java vs C# 语法对比
1. 说明
最近在学习Go,在学习的过程中为了加快学习速度、将新知识添加到已有知识体系架构中,总是会拿Go和其他开发语言进行对比,最终进行总结,于是就有了这篇文章。
对于每一个知识点结束时会给出我个人的一些新的体会(即小结),另外我尽量给出引用相关资料,大家可以从源头进行查看相关信息
2. 对比
在进行开发语言知识点对比时尽量做到客观
对比的角度:基础语法
PS:
更高层次可以选择从编程范式方面等进行对比。Go是函数式编程(或者叫指令式编程,支持面向对象特性),Java、C#是面向对象编程(基于类的面向对象编程)
2.1 关键字(keywords)
在开发的过程中,为了实现不同的业务或者解决问题,我们需要采用开发语言的各种关键字,经常使用的基本已经满足需求,但是对于那些少量的最好有所了解,因为他们可能会提升你的开发效率或者提升性能。共勉!
2.1.1 Go
Go 有以下关键字(共25个)
| break | default | func | interface | select |
| case | defer | go | map | struct |
| chan | else | goto | package | switch |
| const | fallthrough | if | range | type |
| continue | for | import | return | var |
参考资料
2.1.2 Java
Java 有以下关键字(共50个)
| abstract | continue | for | new | switch |
| assert*** | default | goto* | package | synchronized |
| boolean | do | if | private | this |
| break | double | implements | protected | throw |
| byte | else | import | public | throws |
| case | enum**** | instanceof | return | transient |
| catch | extends | int | short | try |
| char | final | interface | static | void |
| class | finally | long | strictfp** | volatile |
| const* | float | native | super | while |
说明
| * | not used |
| ** | added in 1.2 |
| *** | added in 1.4 |
| **** | added in 5.0 |
参考资料
2.1.3 C#
C# 有以下关键字(共77个),额外还有上下文关键字(共42个)
| abstract | event | namespace | static |
| as | explicit | new | string |
| base | extern | null | struct |
| bool | false | object | switch |
| break | finally | operator | this |
| byte | fixed | out | throw |
| case | float | override | TRUE |
| catch | for | params | try |
| char | foreach | private | typeof |
| checked | goto | protected | uint |
| class | if | public | ulong |
| const | implicit | readonly | unchecked |
| continue | in | ref | unsafe |
| decimal | int | return | ushort |
| default | interface | sbyte | using |
| delegate | internal | sealed | virtual |
| do | is | short | void |
| double | lock | sizeof | volatile |
| else | long | stackalloc | while |
| enum |
参考资料
2.1.4 小结
从关键字数量上来说
Go最少(25)、Java次之(50)、C#最多(77)
从功能上来说
Go:官方对于底层封装最少,看起来应对的业务场景相对较少,可能各种业务场景都需要自行进行封装,当然这也和其设计初衷有关,但是和其他语言(例如:C)结合起来进行开发你会感到整个世界都是你的
Java:官方对于底层封装相对(Go)较多,但是对于应付各种业务场景来说还是显得不够(需要自行进行类库封装),所以市场上各种轮子比较多(如果能够深入原理,轻松走向架构师)
C#:官方对于底层封装比较丰富、多样化,不需要封装即可应付大多数业务场景(轻松进行封装,可以将面向对象概念发挥到极致),缺点也比较明显比较容易造成开发人员懒惰、影响创新
总体说明
从关键字数量和功能可以看出该语言对于底层的封装程度,但总体来说开发语言没有对错、优劣,在不同的场景选择合适的开发语言即可
2.2 基本数据类型
思考一个问题:为什么需要有数据类型?
- 一些答案:
- 《Java 编程的逻辑》 一书中对于其的解释是 数据在计算机内部都是二进制表示的,不方便操作,为了方便操作数据,高级语言引入了数据类型和变量的概念
我自己的理解(不一定正确):
每一种数据类型所占用的byte/bit是不同的(或者代表意义不同),他们的存在或者组合满足了各种数据操作场景,进一步满足了各种业务场景的需要(支持《Java 编程的逻辑》所说),便于CPU对内存进行操作,同时也便于进行数据存储(和数据库数据类型对应)。
2.2.1 Go 基本数据类型
共19个
| int | int8 | int16 | int32 | int64 | |
| uint | uint8 | uint16 | uint32 | uint64 | uintptr |
| float32 | float64 | complex64 | complex128 | byte | rune |
| bool | string |
说明
byte: alias for uint8 (不可兼容汉字)
rune: alias for int32, represents a Unicode code point (可兼容汉字)
string: 底层采用的是byte数组
参考资料:
2.2.2 Java 基本数据类型
共8个
| byte | short | int | long |
| float | double | boolean | char |
说明
- string: 底层开始采用的是char数组(java 1.8 及之前版本),后面改为byte数组(java 1.9 及以后版本)
参考资料
2.2.3 C# 基本数据类型
共18个
| byte | sbyte | ||
| short | ushort | ||
| int | unit | nint | nuint |
| long | ulong | ||
| float | double | decimal | |
| bool | char | ||
| object | string | dynamic |
说明
除nint、nuint和dynamic之外,都是.NET类型的别名
object、string、dynamic 为引用类型,其他都是值类型
string: 底层采用char数组
参考资料
2.2.4 小结
- 无论哪一种开发语言,string类型变量值都是不可修改的,底层如采用byte数组实现将无法支持中文(中文需要3-4个字节进行存储),如需支持中文则需要采用其他类型数组(例如:char,rune)实现
2.3 值类型和引用类型
说值类型和应用类型就不得不讲栈和堆
栈:是内存的一块区域,用于存放值类型的的值
堆:也是内存的一块区域,用于存放引用类型的值;但变量也会占用栈上的内存(存放的不是具体数据类型的值,而是一个内存地址,其指向堆上的一块内存区域,这片内存区域存储的是对应变量的值)
2.3.1 Go 值类型和引用类型
值类型:包含所有基本数据类型、数组、结构体
引用类型:其他非值类型(包含:指针、slice切片、管道channel、接口interface、map、函数等)
2.3.2 Java 值类型和引用类型
值类型:byte、short、int、long、float、double、boolean、char
引用类型:其他非值类型
2.3.3 C# 值类型和引用类型
值类型:sbyte、byte、short、ushort、int、uint、long、ulong、uint、nuint、float、double、decimal、bool、char、枚举、结构体、Tuple
引用类型:其他非值类型(class、interface、delegate、record、dynamic、object、string)
参考资料
2.3.4 小结
无论哪一种开发语言,string类型变量值都是不可修改的,不同的语言可能将其归类设置可能不一致(C#是引用类型,其他是值类型)
数字类型、布尔类型、字符(即char,如果有)在三种语言中都为值类型(思考:为什么?)
2.4 变量
变量 = 变量名 + 数据类型 + 变量值
变量:分为全局变量(可以简单理解为:方法外部的变量)和局部变量(可以简单理解为:方法内部的变量)
无论是Go、Java、C# 对于变量、方法名称都区分大小写
2.5 运算
电脑,也叫作计算机,诞生的最初目的是为了便于计算(算术运算)
运算:分为算术运算、比较运算、逻辑运算
现有计算机只会进行加法运算和逻辑运算,所有其他运算都将会被转换为这两种运算
2.5.1 Go 支持运算符
| + | & | += | &= | && | == | != | ( | ) |
| - | -= | = | ||||||
| * | ^ | *= | ^= | <- | > | >= | { | } |
| / | << | /= | <<= | ++ | = | := | , | ; |
| % | >> | %= | >>= | -- | ! | ... | . | : |
| &^ | &^= |
说明
Go、Java、C# 均支持以上运算符
Go不支持左面++和--(只支持右面++和--,例如:number++)
2.5.2 Java 支持运算符
| = | ||||||
| + | - | * | / | % | ||
| ++ | -- | ! | ||||
| == | != | > | >= | < | <= | |
| && | || | ?: | ||||
| ~ | << | >> | >>> | & | ^ | | |
2.5.3 C# 支持运算符
C# 支持的运算符比较多,官方文档将其分为:算术运算、比较运算、布尔逻辑运算、位运算、移位运算、相等运算
具体运算符请查看相关 资料
2.5.4 小结
不同软件开发语言对于运算符的支持是不同的(也有一些是其定制化的)
三种开发语言中,C# 对于底层的封装更多(语法更加丰富)
参考资料
2.6 流程控制语句
流程控制有2种:条件判断和循环
一般软件开发语言都会实现这2种流程控制,否则只能执行简单的自上而下(或者自下而上)流程
不同流程控制的组合可以解决各种复杂疑难问题
两种流程控制
- 条件判断
if
if/else
if/else if/else
switch
- 循环
while
do/while
for
foreach
说明
Go 中switch语句更加强大,可以实现if/else if/else效果
Go 中没有while、do/while,但可以使用for实现类似效果(for循环体中实现自增、条件判断、break效果)
Go 中没有foreach,但是可以通过for range实现类似效果,并且功能更加强大
2.7 函数(或方法)和类
函数
Go 没有方法重载,同一包内不允许出现相同方法名称(排除首字母小写的方法名称,因为首字母小写的方法只允许当前文件内部访问)
Go 采用函数式编程,函数是一等公民,也是一种数据类型,可以直接赋值给变量。
Go 没有try catch,但可以使用 defer/recover 来处理报错信息
Go 和 C# 均支持同时返回多个参数(PS:Java不支持 也有可能我没有发现)
C# 方法参数可以有默认值(非类型默认值),Go、Java 则不允许
内部抛出错误:Go、Java、C# 都允许抛出任意错误,Java 则可以在定义方法时指定哪些错误必须要处理
Go、Java、C# 均可以实现匿名函数
Go、Java、C# 均使用main函数作为程序入口方法
类
Go 无类的定义
Java、C# 都实现了基于类的面向对象,都将类作为一等公民,目前C#语法更为丰富和强大。抽象类、接口的灵活使用可以让你的代码非常灵活、业务发生变化时的改动更少
Java、C# 具有匿名类
C# 类构造函数参数支持默认值,Java不支持
Java、C# 的访问修饰符区别比较大(特别是protected),C# 更丰富
Java 中代码是通过包来组织的,C#是通过项目(例如:类库)组织的
说明
- Go、Java、C# 函数名称、类名称 都区分大小写,对于命名规范要求也类似
泛型
C# 对于泛型支持较为完善(性能最好,因为是复制一份代码)
Java 是一种伪泛型(实际为Object类型)
Go 不支持泛型,但是可以通过 interface 来支持类似泛型的操作
总结
学习方法:对比的最终目的是为了更加快速的建立知识体系、学习相关语言
硬件限制:任何开发语言都逃不开硬件对于软件的限制
发展的眼光看待问题:Go、Java、C# 都在蓬勃发展,语法内容可能会有所变化,可以先建立一个知识树,有变化时再去更新知识树
Go vs Java vs C# 语法对比的更多相关文章
- Java, C#, Swift语法对比速查表
原文:Java, C#, Swift语法对比速查表 Java 8 C# 6 Swift 变量 类型 变量名; 类型 变量名; var 变量名 : 类型; 变量(类型推断) N/A var 变量名= ...
- Java和C#语法对比(转)
Java C# 访问修饰符 public 修饰类.接口.变量.方法. 对所有类可见. 修饰类.接口.变量.方法. 对所有类可见. internal 无. 修饰类.接口.变量.方法. 类,接 ...
- Java和C#语法对比
Java 有静态导入,既可以导入静态方法和字段. .NET没有 Java里package和文件夹对应关系是强制的,要改都改.而C#中namespace和文件夹可以不对应,C# 更喜欢在一个projec ...
- 十分钟让你明白Objective-C的语法(和Java、C++的对比)
很多想开发iOS,或者正在开发iOS的程序员以前都做过Java或者C++,当第一次看到Objective-C的代码时都会头 疼,Objective-C的代码在语法上和Java, C++有着很大的区别, ...
- 十分钟让你明白Objective-C的语法(和Java、C++的对比)
很多想开发iOS,或者正在开发iOS的程序员以前都做过Java或者C++,当第一次看到Objective-C的代码时都会头疼,Objective-C的代码在语法上和Java, C++有着很大的区别,有 ...
- 在Web开发方面Java跟PHp八大对比
在Web开发方面Java跟PHp八大对比 <本文摘自百度经验,用来简单对比一下这两种语言> 一. 语言比较 PHP是解释执行的服务器脚本语言,首先php有简单容易上手的特点.语法和c语言比 ...
- OJ题目JAVA与C运行效率对比
[JAVA]深深跪了,OJ题目JAVA与C运行效率对比(附带清华北大OJ内存计算的对比) 看了园友的评论之后,我也好奇清橙OJ是怎么计算内存占用的.重新测试的情况附在原文后边. ----------- ...
- 2017年的golang、python、php、c++、c、java、Nodejs性能对比(golang python php c++ java Nodejs Performance)
2017年的golang.python.php.c++.c.java.Nodejs性能对比 本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不 ...
- Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。
Python3 与 C# 面向对象之-继承与多态 文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...
随机推荐
- c# - 实体类和有参无参构造函数的具体写法
1.前言 与Java基本一模一样,但是rider貌似没有意见生成get和set方法的指令 2.操作 (1)目录 实体源码 namespace ConsoleApp1.entity { public c ...
- RabbitMQ 消息中间件 的下载与安装【window10】
1.前言 弄了好久,才终于把 rabbitmq装好 ,本来是很简单的,但是,安装有个要求就是路径不能有中文字符, 虽然可以安装,但是无法运行,需要修改路径名为非中文字符后重装rabbitmq才可以运行 ...
- 新增访客数量MR统计之数据库准备
关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...
- java 8 - java 17 升级指北
2014年发布的java SE 8和2017年发布的java EE 8,至今还是使用最广泛的java版本,大部分java开发者对于java 8之后的升级总是敬而远之,这跟java 9以后的破坏性升级和 ...
- C语言字幕从外向中间汇聚
演示数据中多个字符,从两端向中间移动,向中间汇聚 简单,粗暴,先上代码: Sleep()函数属于<windows.h>头文件中. sizeof()函数求右下标:数组内是数字时,求右下标要- ...
- 如何使用Github搭建自己的博客
1.前期准备 sudo apt-get install npm sudo npm install hexo -g 首先使用如下命令创建项目,name是你要创建的博客的名字: hexo init {na ...
- 【刷题-LeetCode】153 Find Minimum in Rotated Sorted Array
Find Minimum in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some p ...
- 从零开始, 开发一个 Web Office 套件 (1): 富文本编辑器
这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等. 富文本编辑器 万里长征 ...
- 《手把手教你》系列技巧篇(六十)-java+ selenium自动化测试 - 截图三剑客 -中篇(详细教程)
1.简介 前面我们介绍了Selenium中TakeScreenshot类来截图,得到的图片是浏览器窗口内的截图.有时候,只截浏览器窗口内的图是不够的,而且TakeScreenshot截图只针对浏览器的 ...
- CSS基本语法(二)
目录 CSS基本语法(二) 八.CSS复合选择器 1.后代选择器** 2.子选择器 3.并集选择器** 4.伪类选择器 链接伪类选择器 :focus伪类选择器 总结 九.CSS的元素显示样式 1.概念 ...