<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          精:Go vs Java vs C# 語(yǔ)法對(duì)比

          共 6580字,需瀏覽 14分鐘

           ·

          2022-02-15 08:29

          目錄

          • 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é)


          1. 說(shuō)明
          • 最近在學(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)信息

          2. 對(duì)比
          • 在進(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è))






          breakdefaultfuncinterfaceselect
          casedefergomapstruct
          chanelsegotopackageswitch
          constfallthroughifrangetype
          continueforimportreturnvar

          參考資料

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

          2.1.2 Java

          Java 有以下關(guān)鍵字(共50個(gè))






          abstractcontinuefornewswitch
          assert***defaultgoto*packagesynchronized
          booleandoifprivatethis
          breakdoubleimplementsprotectedthrow
          byteelseimportpublicthrows
          caseenum****instanceofreturntransient
          catchextendsintshorttry
          charfinalinterfacestaticvoid
          classfinallylongstrictfp**volatile
          const*floatnativesuperwhile

          說(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è))





          abstracteventnamespacestatic
          asexplicitnewstring
          baseexternnullstruct
          boolfalseobjectswitch
          breakfinallyoperatorthis
          bytefixedoutthrow
          casefloatoverrideTRUE
          catchforparamstry
          charforeachprivatetypeof
          checkedgotoprotecteduint
          classifpubliculong
          constimplicitreadonlyunchecked
          continueinrefunsafe
          decimalintreturnushort
          defaultinterfacesbyteusing
          delegateinternalsealedvirtual
          doisshortvoid
          doublelocksizeofvolatile
          elselongstackallocwhile
          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è)







          intint8int16int32int64
          uintuint8uint16uint32uint64uintptr
          float32float64complex64complex128byterune
          boolstring



          說(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è)





          byteshortintlong
          floatdoublebooleanchar

          說(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è)





          bytesbyte

          shortushort

          intunitnintnuint
          longulong

          floatdoubledecimal
          boolchar

          objectstringdynamic

          說(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)題

          • 兩種流程控制


          1. 條件判斷
            if
            if/else
            if/else if/else
            switch


          1. 循環(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ī)范要求也類似

          • 泛型

          • C# 對(duì)于泛型支持較為完善(性能最好,因?yàn)槭菑?fù)制一份代碼)

          • Java 是一種偽泛型(實(shí)際為Object類型)

          • Go 不支持泛型,但是可以通過(guò) interface 來(lái)支持類似泛型的操作

          總結(jié)
          • 學(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)一下在看圖片7dedf031581a553bd087770cbbaa7f89.webp

          小微工資漲1毛

          商務(wù)合作QQ:185601686


          瀏覽 79
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美成人精品三级在线网站 | 天天干一干 | 亚洲精品中文字幕成人片 | 日韩淫淫网 | 日韩黄网站 |