精:Go vs Java vs C# 語(yǔ)法對(duì)比
目錄
1. 說(shuō)明
2. 對(duì)比
2.5.1 Go 支持運(yùn)算符
2.5.2 Java 支持運(yùn)算符
2.5.3 C# 支持運(yùn)算符
2.5.4 小結(jié)
2.3.1 Go 值類型和引用類型
2.3.2 Java 值類型和引用類型
2.3.3 C# 值類型和引用類型
2.3.4 小結(jié)
2.2.1 Go 基本數(shù)據(jù)類型
2.2.2 Java 基本數(shù)據(jù)類型
2.2.3 C# 基本數(shù)據(jù)類型
2.2.4 小結(jié)
2.1.1 Go
2.1.2 Java
2.1.3 C#
2.1.4 小結(jié)
2.1 關(guān)鍵字(keywords)
2.2 基本數(shù)據(jù)類型
2.3 值類型和引用類型
2.4 變量
2.5 運(yùn)算
2.6 流程控制語(yǔ)句
2.7 函數(shù)(或方法)和類
總結(jié)
2. 對(duì)比
最近在學(xué)習(xí)Go,在學(xué)習(xí)的過(guò)程中為了加快學(xué)習(xí)速度、將新知識(shí)添加到已有知識(shí)體系架構(gòu)中,總是會(huì)拿Go和其他開(kāi)發(fā)語(yǔ)言進(jìn)行對(duì)比,最終進(jìn)行總結(jié),于是就有了這篇文章。
對(duì)于每一個(gè)知識(shí)點(diǎn)結(jié)束時(shí)會(huì)給出我個(gè)人的一些新的體會(huì)(即小結(jié)),另外我盡量給出引用相關(guān)資料,大家可以從源頭進(jìn)行查看相關(guān)信息
在進(jìn)行開(kāi)發(fā)語(yǔ)言知識(shí)點(diǎn)對(duì)比時(shí)盡量做到客觀
對(duì)比的角度:基礎(chǔ)語(yǔ)法
PS:
??更高層次可以選擇從編程范式方面等進(jìn)行對(duì)比。Go是函數(shù)式編程(或者叫指令式編程,支持面向?qū)ο筇匦裕琂ava、C#是面向?qū)ο缶幊蹋ɑ陬惖拿嫦驅(qū)ο缶幊蹋?/p>
2.1 關(guān)鍵字(keywords)
在開(kāi)發(fā)的過(guò)程中,為了實(shí)現(xiàn)不同的業(yè)務(wù)或者解決問(wèn)題,我們需要采用開(kāi)發(fā)語(yǔ)言的各種關(guān)鍵字,經(jīng)常使用的基本已經(jīng)滿足需求,但是對(duì)于那些少量的最好有所了解,因?yàn)樗麄兛赡軙?huì)提升你的開(kāi)發(fā)效率或者提升性能。共勉!
2.1.1 Go
Go 有以下關(guān)鍵字(共25個(gè))
| 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 有以下關(guān)鍵字(共50個(gè))
| 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 |
說(shuō)明
| * | 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# 有以下關(guān)鍵字(共77個(gè)),額外還有上下文關(guān)鍵字(共42個(gè))
| 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 小結(jié)
從關(guān)鍵字?jǐn)?shù)量上來(lái)說(shuō)
Go最少(25)、Java次之(50)、C#最多(77)
從功能上來(lái)說(shuō)
Go:官方對(duì)于底層封裝最少,看起來(lái)應(yīng)對(duì)的業(yè)務(wù)場(chǎng)景相對(duì)較少,可能各種業(yè)務(wù)場(chǎng)景都需要自行進(jìn)行封裝,當(dāng)然這也和其設(shè)計(jì)初衷有關(guān),但是和其他語(yǔ)言(例如:C)結(jié)合起來(lái)進(jìn)行開(kāi)發(fā)你會(huì)感到整個(gè)世界都是你的
Java:官方對(duì)于底層封裝相對(duì)(Go)較多,但是對(duì)于應(yīng)付各種業(yè)務(wù)場(chǎng)景來(lái)說(shuō)還是顯得不夠(需要自行進(jìn)行類庫(kù)封裝),所以市場(chǎng)上各種輪子比較多(如果能夠深入原理,輕松走向架構(gòu)師)
C#:官方對(duì)于底層封裝比較豐富、多樣化,不需要封裝即可應(yīng)付大多數(shù)業(yè)務(wù)場(chǎng)景(輕松進(jìn)行封裝,可以將面向?qū)ο蟾拍畎l(fā)揮到極致),缺點(diǎn)也比較明顯比較容易造成開(kāi)發(fā)人員懶惰、影響創(chuàng)新
總體說(shuō)明
從關(guān)鍵字?jǐn)?shù)量和功能可以看出該語(yǔ)言對(duì)于底層的封裝程度,但總體來(lái)說(shuō)開(kāi)發(fā)語(yǔ)言沒(méi)有對(duì)錯(cuò)、優(yōu)劣,在不同的場(chǎng)景選擇合適的開(kāi)發(fā)語(yǔ)言即可
2.2 基本數(shù)據(jù)類型
思考一個(gè)問(wèn)題:為什么需要有數(shù)據(jù)類型?
一些答案:
《Java 編程的邏輯》?一書(shū)中對(duì)于其的解釋是?數(shù)據(jù)在計(jì)算機(jī)內(nèi)部都是二進(jìn)制表示的,不方便操作,為了方便操作數(shù)據(jù),高級(jí)語(yǔ)言引入了數(shù)據(jù)類型和變量的概念
我自己的理解(不一定正確):
每一種數(shù)據(jù)類型所占用的byte/bit是不同的(或者代表意義不同),他們的存在或者組合滿足了各種數(shù)據(jù)操作場(chǎng)景,進(jìn)一步滿足了各種業(yè)務(wù)場(chǎng)景的需要(支持《Java 編程的邏輯》所說(shuō)),便于CPU對(duì)內(nèi)存進(jìn)行操作,同時(shí)也便于進(jìn)行數(shù)據(jù)存儲(chǔ)(和數(shù)據(jù)庫(kù)數(shù)據(jù)類型對(duì)應(yīng))。
2.2.1 Go 基本數(shù)據(jù)類型
共19個(gè)
| int | int8 | int16 | int32 | int64 | |
| uint | uint8 | uint16 | uint32 | uint64 | uintptr |
| float32 | float64 | complex64 | complex128 | byte | rune |
| bool | string |
說(shuō)明
byte: alias for uint8 (不可兼容漢字)
rune: alias for int32, represents a Unicode code point (可兼容漢字)
string: 底層采用的是byte數(shù)組
參考資料:
https://go.dev/tour/basics/11
https://go.dev/ref/spec#Numeric_types
2.2.2 Java 基本數(shù)據(jù)類型
共8個(gè)
| byte | short | int | long |
| float | double | boolean | char |
說(shuō)明
string: 底層開(kāi)始采用的是char數(shù)組(java 1.8 及之前版本),后面改為byte數(shù)組(java 1.9 及以后版本)
參考資料
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
2.2.3 C# 基本數(shù)據(jù)類型
共18個(gè)
| byte | sbyte | ||
| short | ushort | ||
| int | unit | nint | nuint |
| long | ulong | ||
| float | double | decimal | |
| bool | char | ||
| object | string | dynamic |
說(shuō)明
除nint、nuint和dynamic之外,都是.NET類型的別名
object、string、dynamic 為引用類型,其他都是值類型
string: 底層采用char數(shù)組
參考資料
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/built-in-types
2.2.4 小結(jié)
無(wú)論哪一種開(kāi)發(fā)語(yǔ)言,string類型變量值都是不可修改的,底層如采用byte數(shù)組實(shí)現(xiàn)將無(wú)法支持中文(中文需要3-4個(gè)字節(jié)進(jìn)行存儲(chǔ)),如需支持中文則需要采用其他類型數(shù)組(例如:char,rune)實(shí)現(xiàn)
2.3 值類型和引用類型
說(shuō)值類型和應(yīng)用類型就不得不講棧和堆
棧:是內(nèi)存的一塊區(qū)域,用于存放值類型的的值
堆:也是內(nèi)存的一塊區(qū)域,用于存放引用類型的值;但變量也會(huì)占用棧上的內(nèi)存(存放的不是具體數(shù)據(jù)類型的值,而是一個(gè)內(nèi)存地址,其指向堆上的一塊內(nèi)存區(qū)域,這片內(nèi)存區(qū)域存儲(chǔ)的是對(duì)應(yīng)變量的值)
2.3.1 Go 值類型和引用類型
值類型:包含所有基本數(shù)據(jù)類型、數(shù)組、結(jié)構(gòu)體
引用類型:其他非值類型(包含:指針、slice切片、管道channel、接口interface、map、函數(shù)等)
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、枚舉、結(jié)構(gòu)體、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 小結(jié)
無(wú)論哪一種開(kāi)發(fā)語(yǔ)言,string類型變量值都是不可修改的,不同的語(yǔ)言可能將其歸類設(shè)置可能不一致(C#是引用類型,其他是值類型)
數(shù)字類型、布爾類型、字符(即char,如果有)在三種語(yǔ)言中都為值類型(思考:為什么?)
2.4 變量
變量 = 變量名 + 數(shù)據(jù)類型 + 變量值
變量:分為全局變量(可以簡(jiǎn)單理解為:方法外部的變量)和局部變量(可以簡(jiǎn)單理解為:方法內(nèi)部的變量)
無(wú)論是Go、Java、C# 對(duì)于變量、方法名稱都區(qū)分大小寫
2.5 運(yùn)算
電腦,也叫作計(jì)算機(jī),誕生的最初目的是為了便于計(jì)算(算術(shù)運(yùn)算)
運(yùn)算:分為算術(shù)運(yùn)算、比較運(yùn)算、邏輯運(yùn)算
現(xiàn)有計(jì)算機(jī)只會(huì)進(jìn)行加法運(yùn)算和邏輯運(yùn)算,所有其他運(yùn)算都將會(huì)被轉(zhuǎn)換為這兩種運(yùn)算
2.5.1 Go 支持運(yùn)算符
| + | & | += | &= | && | == | != | ( | ) |
| - | -= | = | ||||||
| * | ^ | *= | ^= | <- | > | >= | { | } |
| / | << | /= | <<= | ++ | = | := | , | ; |
| % | >> | %= | >>= | -- | ! | ... | . | : |
| &^ | &^= |
說(shuō)明
Go、Java、C# 均支持以上運(yùn)算符
Go不支持左面++和--(只支持右面++和--,例如:number++)
2.5.2 Java 支持運(yùn)算符
| = | ||||||
| + | - | * | / | % | ||
| ++ | -- | ! | ||||
| == | != | > | >= | < | <= | |
| && | || | ?: | ||||
| ~ | << | >> | >>> | & | ^ | | |
2.5.3 C# 支持運(yùn)算符
C# 支持的運(yùn)算符比較多,官方文檔將其分為:算術(shù)運(yùn)算、比較運(yùn)算、布爾邏輯運(yùn)算、位運(yùn)算、移位運(yùn)算、相等運(yùn)算
具體運(yùn)算符請(qǐng)查看相關(guān)?資料
2.5.4 小結(jié)
不同軟件開(kāi)發(fā)語(yǔ)言對(duì)于運(yùn)算符的支持是不同的(也有一些是其定制化的)
三種開(kāi)發(fā)語(yǔ)言中,C# 對(duì)于底層的封裝更多(語(yǔ)法更加豐富)
參考資料
https://go.dev/ref/spec#Operators
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/opsummary.html
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/
2.6 流程控制語(yǔ)句
流程控制有2種:條件判斷和循環(huán)
一般軟件開(kāi)發(fā)語(yǔ)言都會(huì)實(shí)現(xiàn)這2種流程控制,否則只能執(zhí)行簡(jiǎn)單的自上而下(或者自下而上)流程
不同流程控制的組合可以解決各種復(fù)雜疑難問(wèn)題
兩種流程控制
條件判斷
if
if/else
if/else if/else
switch
循環(huán)
while
do/while
for
foreach
說(shuō)明
Go 中switch語(yǔ)句更加強(qiáng)大,可以實(shí)現(xiàn)if/else if/else效果。(PS:經(jīng) “吉良吉影” 大佬的指出發(fā)現(xiàn)從C# 8.0開(kāi)始,C#也支持類似功能了,請(qǐng)查看資料switch expression和constant pattern)
Go 中沒(méi)有while、do/while,但可以使用for實(shí)現(xiàn)類似效果(for循環(huán)體中實(shí)現(xiàn)自增、條件判斷、break效果)
Go 中沒(méi)有foreach,但是可以通過(guò)for range實(shí)現(xiàn)類似效果,并且功能更加強(qiáng)大
2.7 函數(shù)(或方法)和類
函數(shù)
Go 沒(méi)有方法重載,同一包內(nèi)不允許出現(xiàn)相同方法名稱(排除首字母小寫的方法名稱,因?yàn)槭鬃帜感懙姆椒ㄖ辉试S當(dāng)前文件內(nèi)部訪問(wèn))
Go 采用函數(shù)式編程,函數(shù)是一等公民,也是一種數(shù)據(jù)類型,可以直接賦值給變量。
Go 沒(méi)有try catch,但可以使用 defer/recover 來(lái)處理報(bào)錯(cuò)信息
Go 和 C# 均支持同時(shí)返回多個(gè)參數(shù)(PS:Java不支持?也有可能我沒(méi)有發(fā)現(xiàn))
C# 方法參數(shù)可以有默認(rèn)值(非類型默認(rèn)值),Go、Java 則不允許
內(nèi)部拋出錯(cuò)誤:Go、Java、C# 都允許拋出任意錯(cuò)誤,Java 則可以在定義方法時(shí)指定哪些錯(cuò)誤必須要處理
Go、Java、C# 均可以實(shí)現(xiàn)匿名函數(shù)
Go、Java、C# 均使用main函數(shù)作為程序入口方法
參考資料
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/method-parameters
類
Go 無(wú)類的定義
Java、C# 都實(shí)現(xiàn)了基于類的面向?qū)ο螅紝㈩愖鳛橐坏裙?,目前C#語(yǔ)法更為豐富和強(qiáng)大。抽象類、接口的靈活使用可以讓你的代碼非常靈活、業(yè)務(wù)發(fā)生變化時(shí)的改動(dòng)更少
Java、C# 具有匿名類
C# 類構(gòu)造函數(shù)參數(shù)支持默認(rèn)值,Java不支持
Java、C# 的訪問(wèn)修飾符區(qū)別比較大(特別是protected),C# 更豐富
Java 中代碼是通過(guò)包來(lái)組織的,C#是通過(guò)項(xiàng)目(例如:類庫(kù))組織的
參考資料
https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/access-modifiers
說(shuō)明
Go、Java、C# 函數(shù)名稱、類名稱 都區(qū)分大小寫,對(duì)于命名規(guī)范要求也類似
總結(jié)
泛型
C# 對(duì)于泛型支持較為完善(性能最好,因?yàn)槭菑?fù)制一份代碼)
Java 是一種偽泛型(實(shí)際為Object類型)
Go 不支持泛型,但是可以通過(guò) interface 來(lái)支持類似泛型的操作
學(xué)習(xí)方法:對(duì)比的最終目的是為了更加快速的建立知識(shí)體系、學(xué)習(xí)相關(guān)語(yǔ)言
硬件限制:任何開(kāi)發(fā)語(yǔ)言都逃不開(kāi)硬件對(duì)于軟件的限制
發(fā)展的眼光看待問(wèn)題:Go、Java、C# 都在蓬勃發(fā)展,語(yǔ)法內(nèi)容可能會(huì)有所變化,可以先建立一個(gè)知識(shí)樹(shù),有變化時(shí)再去更新知識(shí)樹(shù)
出處:https://www.cnblogs.com/zhizihuakai/p/15890308.html
版權(quán)申明:本文來(lái)源于網(wǎng)友收集或網(wǎng)友投稿,僅供學(xué)習(xí)交流之用,如果有侵權(quán),請(qǐng)轉(zhuǎn)告版主或者留言,本公眾號(hào)立即刪除。
支持小微:
騰訊云 新年活動(dòng)!玩服務(wù)器的可以搞搞,老客戶也可以參加!
輕量服務(wù)器??2核4G8M80G?222元/3年??
爆款1核2G云服務(wù)器首年38元??
鏈接:https://curl.qcloud.com/bR8ycXZa
右下角,您點(diǎn)一下在看圖片
小微工資漲1毛
商務(wù)合作QQ:185601686
