百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Go vs Java vs C# 语法对比

liuian 2025-02-26 12:46 27 浏览

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

参考资料

https://go.dev/ref/spec#Identifiers

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

参考资料

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html

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




参考资料

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/

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数组

参考资料:

https://go.dev/tour/basics/11https://go.dev/ref/spec#Numeric_types

2.2.2 Java 基本数据类型

共8个





byte

short

int

long

float

double

boolean

char

说明

string: 底层开始采用的是char数组(java 1.8 及之前版本),后面改为byte数组(java 1.9 及以后版本)

参考资料

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

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数组

参考资料

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/built-in-types

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)

参考资料

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/value-types

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types

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# 对于底层的封装更多(语法更加丰富)

参考资料

https://go.dev/ref/spec#Operatorshttps://docs.oracle.com/javase/tutorial/java/nutsandbolts/opsummary.htmlhttps://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/

2.6 流程控制语句

流程控制有2种:条件判断和循环

一般软件开发语言都会实现这2种流程控制,否则只能执行简单的自上而下(或者自下而上)流程

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

两种流程控制

条件判断
if
if/else
if/else if/else
switch

循环
while
do/while
for
foreach

说明

Go 中switch语句更加强大,可以实现if/else if/else效果。(PS:经 “吉良吉影” 大佬的指出发现从C# 8.0开始,C#也支持类似功能了,请查看资料switch expression和constant pattern

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函数作为程序入口方法

参考资料

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/method-parameters

Go 无类的定义

Java、C# 都实现了基于类的面向对象,都将类作为一等公民,目前C#语法更为丰富和强大。抽象类、接口的灵活使用可以让你的代码非常灵活、业务发生变化时的改动更少

Java、C# 具有匿名类

C# 类构造函数参数支持默认值,Java不支持

Java、C# 的访问修饰符区别比较大(特别是protected),C# 更丰富

Java 中代码是通过包来组织的,C#是通过项目(例如:类库)组织的

参考资料

https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/access-modifiers

说明

Go、Java、C# 函数名称、类名称 都区分大小写,对于命名规范要求也类似

泛型

C# 对于泛型支持较为完善(性能最好,因为是复制一份代码)

Java 是一种伪泛型(实际为Object类型)

Go 不支持泛型,但是可以通过 interface 来支持类似泛型的操作

总结

学习方法:对比的最终目的是为了更加快速的建立知识体系、学习相关语言

硬件限制:任何开发语言都逃不开硬件对于软件的限制

发展的眼光看待问题:Go、Java、C# 都在蓬勃发展,语法内容可能会有所变化,可以先建立一个知识树,有变化时再去更新知识树


作者:暗香残留

相关推荐

delete是什么意思中文(delete是什么意思中文翻译)

删除键(delete)在键盘上为del键或者是delete键,通常位于键盘的右上角区域。功能:1、删除文字每按一次删除键删掉光标右边的一个字符,并且光标右边的字符向左移一格。(与退格键大致相反)2、删...

万能声卡驱动是什么(万能声卡驱动怎么安装)

硬件的正常工作需要软件的支持,声卡驱动是正常使用声卡时所必须的一个软件驱动程序组。其它硬件比如显卡,网卡,USB设备也都是需要驱动程序的支持,才能正常发挥它们的作用。1.在我的电脑鼠标右击打开系统的设...

pe启动盘修复系统(pe启动盘修复系统如何先备份)

用老毛桃PE恢复系统的具体步骤如下:1、首先在主菜单界面用键盘方向键“↓”将光标移至“【03】运行老毛桃Win2003PE增强版(旧电脑)”,回车确定。2、然后鼠标点击开始图标,依次打开“程序→数据恢...

qq关闭qq空间(然后把qq空间关闭)
  • qq关闭qq空间(然后把qq空间关闭)
  • qq关闭qq空间(然后把qq空间关闭)
  • qq关闭qq空间(然后把qq空间关闭)
  • qq关闭qq空间(然后把qq空间关闭)
电脑文件恢复免费软件(电脑文件恢复软件哪个好)

品牌机的初始化相当于还原,也就是重装,会丢失c盘的一些个人文件。如果没重要的资料,那么就重装吧。有资料用u盘到pe去备份出来。win10丢失dll文件恢复出厂设置有用的。非正常关机就容易丢失dll文件...

电脑技术员专用系统(电脑技术员的工作内容)

独具匠心、独辟蹊径、独树一帜、巧夺天工、能工巧匠、鬼斧神工、精工细作、精雕细刻、技术革新、技高一筹、技术精湛、技压群雄独具匠心:指具有与众不同的巧妙的构思。独辟蹊径:比喻独创一种新风格或者新方法。独树...

qualcomm无线网卡驱动(高科无线网卡驱动)

先找个这个,然后卸载驱动程序,然后在装驱动,如果安装不成功,就去官网找驱动,驱动精灵的有时候不行。1、检查网线是否插好首先,我们需要检查下网线是否插好了。如果网线插口没插好,电脑就无法检测到网络信号...

虚拟内存设置多少合适16g(虚拟内存数值设置多少合适)

16g内存虚拟内存要调到24576MB才合适。虚拟内存的设置大小一般是物理内存的1.5倍,16G的内存可以考虑调整为24576MB。如果只用于办公方面,那么运行内存大于或等于4G,不用设置虚拟内存。如...

系统光盘镜像下载(系统光盘镜像文件转换到u盘)

要在虚拟机中使用映像文件,需要先将映像文件下载到本地计算机上,然后将其上传到虚拟机中。以下是下载映像文件的步骤:1.打开虚拟机管理软件,例如VMwareWorkstation或Virtual...

ghost系统盘制作(制作ghost启动盘)

首先,需要准备东西如下:光驱起码要支持DVD刻录吧,您要是Combo刻CD还真不好意思和别人打招呼。。。DVD白盘若干,一张随便什么样的可引导系统盘(里面有ghost的那种),nero软件,Ultra...

cad2008序列号和激活码(cad2008序列号密钥)

2008cad注册码是666-98989898。双击“AutoCAD2008Chs_运行获取激活码.exe”,将注册界面上的申请号粘贴到“AutoCAD2008Chs_运行获取激活码.exe”申请号一...

电脑无线网连不上怎么办(电脑无线网连接不上怎么回事)
电脑无线网连不上怎么办(电脑无线网连接不上怎么回事)

1、打开“控制面板”,点击“网络和Internet”。2、点击“网络和共享中心”。3、点击“更改适配器设置”。4、鼠标右键单击需要连接的网络,在弹出的对话框中,点击“属性”。5、选中“Internet协议版本4(TCP/IPv4)”,...

2025-11-28 23:55 liuian

u盘如何恢复删除的文件(如何恢复u盘中被删除的文件)

如果您在使用WPS时误删了U盘文件,可以使用以下几种方法来恢复文件:1.检查回收站:首先检查一下您的回收站中是否有被误删的文件,如果有,可以将文件恢复回来。2.使用WPS数据恢...

推特官网入口(推特官网入口网页登录网址)

首先在浏览器中打开推特的官网,然后点击页面上的“注册”创建账号。Twitter可以让用户更新不超过140个字符的消息(除中文、日文和韩语外已提高上限至280个字符),这些消息也被称作“推文(Tweet...

windows7如何清理c盘(win7怎么清理c盘)

1.打开桌面计算机,右键点击“C盘”,并选取“属性”。2.待新窗口弹出后,依次点击“工具”、“立即进行碎片整理”。3.最后,选取C盘,在按下“磁盘碎片整理”按钮,系统就会对C盘进行分析,并进行整理。4...