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种流程控制,否则只能执行简单的自上而下(或者自下而上)流程

  • 不同流程控制的组合可以解决各种复杂疑难问题

  • 两种流程控制

    1. 条件判断

      if

      if/else

      if/else if/else

      switch
    1. 循环

      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# 语法对比的更多相关文章

  1. Java, C#, Swift语法对比速查表

    原文:Java, C#, Swift语法对比速查表   Java 8 C# 6 Swift 变量 类型 变量名; 类型 变量名; var 变量名 : 类型; 变量(类型推断) N/A var 变量名= ...

  2. Java和C#语法对比(转)

        Java C# 访问修饰符 public 修饰类.接口.变量.方法. 对所有类可见. 修饰类.接口.变量.方法. 对所有类可见.   internal 无. 修饰类.接口.变量.方法. 类,接 ...

  3. Java和C#语法对比

    Java 有静态导入,既可以导入静态方法和字段. .NET没有 Java里package和文件夹对应关系是强制的,要改都改.而C#中namespace和文件夹可以不对应,C# 更喜欢在一个projec ...

  4. 十分钟让你明白Objective-C的语法(和Java、C++的对比)

    很多想开发iOS,或者正在开发iOS的程序员以前都做过Java或者C++,当第一次看到Objective-C的代码时都会头 疼,Objective-C的代码在语法上和Java, C++有着很大的区别, ...

  5. 十分钟让你明白Objective-C的语法(和Java、C++的对比)

    很多想开发iOS,或者正在开发iOS的程序员以前都做过Java或者C++,当第一次看到Objective-C的代码时都会头疼,Objective-C的代码在语法上和Java, C++有着很大的区别,有 ...

  6. 在Web开发方面Java跟PHp八大对比

    在Web开发方面Java跟PHp八大对比 <本文摘自百度经验,用来简单对比一下这两种语言> 一. 语言比较 PHP是解释执行的服务器脚本语言,首先php有简单容易上手的特点.语法和c语言比 ...

  7. OJ题目JAVA与C运行效率对比

    [JAVA]深深跪了,OJ题目JAVA与C运行效率对比(附带清华北大OJ内存计算的对比) 看了园友的评论之后,我也好奇清橙OJ是怎么计算内存占用的.重新测试的情况附在原文后边. ----------- ...

  8. 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时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不 ...

  9. 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.单继 ...

随机推荐

  1. CSS基础 BFC的使用方法

    BFC的作用和创建1.html标签是BFC盒子2.浮动元素是BFC盒子3.行内块元素是BFC盒子4.overflow属性值不为visible,如:auto.hidden...作用:1.清除浮动: 2. ...

  2. linux7,一台物理机上使用VM装多个虚拟机,始终只有一个虚拟机网络正常,其他虚拟机报错Error: Connection activation failed: No suitable device found for this connection.

    今天在VM新装了一个虚拟机,结果发现原来的虚拟机连不上了,重启网络服务后报错 Error: Connection activation failed: No suitable device found ...

  3. 禁止yum update 自动更新系统内核

    使用yum update更新系统软件时,禁止升级内核,可以防止产生因不兼容导致的未知错误. 设置前请先备份原设置文件yum.conf cp /etc/yum.conf    /etc/yum.conf ...

  4. phpAdmin写webshell的方法

    一.常规导入shell的操作    创建数据表导出shell    CREATE TABLE `mysql`.`shadow9` (`content` TEXT NOT NULL );    INSE ...

  5. 【Java常用类】SimpleDateFormat

    文章目录 SimpleDateFormat 默认构造器实例化对象 默认构造器的格式化 带参构造器实例化对象 带参构造器的格式化 自定义格式 解析 SimpleDateFormat 默认构造器实例化对象 ...

  6. 【Java】方法

    文章目录 何谓方法 方法的定义 方法调用 方法重载 命令行传参 可变参数 递归 何谓方法 System.out.println(),是什么 Java方法是语句的集合,它们在一起执行一个功能 方法是解决 ...

  7. JUC之线程池基础

    线程池 定义和方法 线程池的工作时控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等待其他线程执行完成,再从队列中取出任 ...

  8. access偏移注入原理

    前言:近段时间在学习access偏移注入时,在网上查询了大量的资料,感觉很多资料讲解的十分模糊并且我个人认为有很多不够严谨的地方,于是我便在线下经过大量测试,写出以下文章,如有错误,望指出. 如要转载 ...

  9. 【刷题-LeetCode】198 House Robber

    House Robber You are a professional robber planning to rob houses along a street. Each house has a c ...

  10. 使用VS Code的MySQL扩展管理数据库

    我将在本文告诉你如何用VS Code的扩展程序管理MySQL数据库,包括连接到MySQL.新建数据库和表.修改字段定义.简单的查询方法以及导入导出. 在许多情况下,我们需要随时查看数据库的记录来确保程 ...