朱家宁 發表於 2022-2-13 20:44:00

Go vs Java vs C# 语法对比

<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>1. 说明</li><li>2. 对比<ul><li>2.1 关键字(keywords)<ul><li>2.1.1 Go</li><li>2.1.2 Java</li><li>2.1.3 C#</li><li>2.1.4 小结</li></ul></li><li>2.2 基本数据类型<ul><li>2.2.1 Go 基本数据类型</li><li>2.2.2 Java 基本数据类型</li><li>2.2.3C# 基本数据类型</li><li>2.2.4 小结</li></ul></li><li>2.3 值类型和引用类型<ul><li>2.3.1 Go 值类型和引用类型</li><li>2.3.2 Java 值类型和引用类型</li><li>2.3.3 C# 值类型和引用类型</li><li>2.3.4 小结</li></ul></li><li>2.4 变量</li><li>2.5 运算<ul><li>2.5.1 Go 支持运算符</li><li>2.5.2 Java 支持运算符</li><li>2.5.3 C# 支持运算符</li><li>2.5.4 小结</li></ul></li><li>2.6 流程控制语句</li><li>2.7 函数(或方法)和类</li></ul></li><li>总结</li></ul></div><p></p>
<h1 id="1-说明">1. 说明</h1>
<blockquote>
<ul>
<li>
<p>最近在学习Go,在学习的过程中为了加快学习速度、将新知识添加到已有知识体系架构中,总是会拿Go和其他开发语言进行对比,最终进行总结,于是就有了这篇文章。</p>
</li>
<li>
<p>对于每一个知识点结束时会给出我个人的一些新的体会(即小结),另外我尽量给出引用相关资料,大家可以从源头进行查看相关信息</p>
</li>
</ul>
</blockquote>
<h1 id="2-对比">2. 对比</h1>
<blockquote>
<ul>
<li>
<p>在进行开发语言知识点对比时尽量做到客观</p>
</li>
<li>
<p>对比的角度:<strong><span style="color: rgba(255, 0, 0, 1)">基础语法</span></strong></p>
</li>
<li>
<p>PS:<br>
  更高层次可以选择从编程范式方面等进行对比。Go是函数式编程(或者叫指令式编程,支持面向对象特性),Java、C#是面向对象编程(基于类的面向对象编程)</p>
</li>
</ul>
</blockquote>
<h2 id="21-关键字keywords">2.1 关键字(keywords)</h2>
<blockquote>
<p>在开发的过程中,为了实现不同的业务或者解决问题,我们需要采用开发语言的各种关键字,经常使用的基本已经满足需求,但是对于那些少量的最好有所了解,因为他们可能会提升你的开发效率或者提升性能。共勉!</p>
</blockquote>
<h3 id="211-go">2.1.1 Go</h3>
<blockquote>
<p>Go 有以下关键字(共25个)</p>
</blockquote>
<table>
<thead>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>break</td>
<td>default</td>
<td>func</td>
<td>interface</td>
<td>select</td>
</tr>
<tr>
<td>case</td>
<td>defer</td>
<td>go</td>
<td>map</td>
<td>struct</td>
</tr>
<tr>
<td>chan</td>
<td>else</td>
<td>goto</td>
<td>package</td>
<td>switch</td>
</tr>
<tr>
<td>const</td>
<td>fallthrough</td>
<td>if</td>
<td>range</td>
<td>type</td>
</tr>
<tr>
<td>continue</td>
<td>for</td>
<td>import</td>
<td>return</td>
<td>var</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>参考资料</strong></p>
<ul>
<li>https://go.dev/ref/spec#Identifiers</li>
</ul>
</blockquote>
<h3 id="212-java">2.1.2 Java</h3>
<blockquote>
<p>Java 有以下关键字(共50个)</p>
</blockquote>
<table>
<thead>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>abstract</td>
<td>continue</td>
<td>for</td>
<td>new</td>
<td>switch</td>
</tr>
<tr>
<td>assert***</td>
<td>default</td>
<td>goto*</td>
<td>package</td>
<td>synchronized</td>
</tr>
<tr>
<td>boolean</td>
<td>do</td>
<td>if</td>
<td>private</td>
<td>this</td>
</tr>
<tr>
<td>break</td>
<td>double</td>
<td>implements</td>
<td>protected</td>
<td>throw</td>
</tr>
<tr>
<td>byte</td>
<td>else</td>
<td>import</td>
<td>public</td>
<td>throws</td>
</tr>
<tr>
<td>case</td>
<td>enum****</td>
<td>instanceof</td>
<td>return</td>
<td>transient</td>
</tr>
<tr>
<td>catch</td>
<td>extends</td>
<td>int</td>
<td>short</td>
<td>try</td>
</tr>
<tr>
<td>char</td>
<td>final</td>
<td>interface</td>
<td>static</td>
<td>void</td>
</tr>
<tr>
<td>class</td>
<td>finally</td>
<td>long</td>
<td>strictfp**</td>
<td>volatile</td>
</tr>
<tr>
<td>const*</td>
<td>float</td>
<td>native</td>
<td>super</td>
<td>while</td>
</tr>
</tbody>
</table>
<p><strong>说明</strong></p>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>*</td>
<td>not used</td>
</tr>
<tr>
<td>**</td>
<td>added in 1.2</td>
</tr>
<tr>
<td>***</td>
<td>added in 1.4</td>
</tr>
<tr>
<td>****</td>
<td>added in 5.0</td>
</tr>
</tbody>
</table>
<p><strong>参考资料</strong></p>
<blockquote>
<ul>
<li>https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html</li>
</ul>
</blockquote>
<h3 id="213-c">2.1.3 C#</h3>
<blockquote>
<p>C# 有以下关键字(共77个),额外还有上下文关键字(共42个)</p>
</blockquote>
<table>
<thead>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>abstract</td>
<td>event</td>
<td>namespace</td>
<td>static</td>
</tr>
<tr>
<td>as</td>
<td>explicit</td>
<td>new</td>
<td>string</td>
</tr>
<tr>
<td>base</td>
<td>extern</td>
<td>null</td>
<td>struct</td>
</tr>
<tr>
<td>bool</td>
<td>false</td>
<td>object</td>
<td>switch</td>
</tr>
<tr>
<td>break</td>
<td>finally</td>
<td>operator</td>
<td>this</td>
</tr>
<tr>
<td>byte</td>
<td>fixed</td>
<td>out</td>
<td>throw</td>
</tr>
<tr>
<td>case</td>
<td>float</td>
<td>override</td>
<td>TRUE</td>
</tr>
<tr>
<td>catch</td>
<td>for</td>
<td>params</td>
<td>try</td>
</tr>
<tr>
<td>char</td>
<td>foreach</td>
<td>private</td>
<td>typeof</td>
</tr>
<tr>
<td>checked</td>
<td>goto</td>
<td>protected</td>
<td>uint</td>
</tr>
<tr>
<td>class</td>
<td>if</td>
<td>public</td>
<td>ulong</td>
</tr>
<tr>
<td>const</td>
<td>implicit</td>
<td>readonly</td>
<td>unchecked</td>
</tr>
<tr>
<td>continue</td>
<td>in</td>
<td>ref</td>
<td>unsafe</td>
</tr>
<tr>
<td>decimal</td>
<td>int</td>
<td>return</td>
<td>ushort</td>
</tr>
<tr>
<td>default</td>
<td>interface</td>
<td>sbyte</td>
<td>using</td>
</tr>
<tr>
<td>delegate</td>
<td>internal</td>
<td>sealed</td>
<td>virtual</td>
</tr>
<tr>
<td>do</td>
<td>is</td>
<td>short</td>
<td>void</td>
</tr>
<tr>
<td>double</td>
<td>lock</td>
<td>sizeof</td>
<td>volatile</td>
</tr>
<tr>
<td>else</td>
<td>long</td>
<td>stackalloc</td>
<td>while</td>
</tr>
<tr>
<td>enum</td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<blockquote>
<p>参考资料</p>
<ul>
<li>https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/</li>
</ul>
</blockquote>
<h3 id="214-小结">2.1.4 小结</h3>
<p>从关键字数量上来说</p>
<blockquote>
<p>Go最少(25)、Java次之(50)、C#最多(77)</p>
</blockquote>
<p>从功能上来说</p>
<blockquote>
<p>Go:官方对于底层封装最少,看起来应对的业务场景相对较少,可能各种业务场景都需要自行进行封装,当然这也和其设计初衷有关,但是和其他语言(例如:C)结合起来进行开发你会感到整个世界都是你的</p>
<p>Java:官方对于底层封装相对(Go)较多,但是对于应付各种业务场景来说还是显得不够(需要自行进行类库封装),所以市场上各种轮子比较多(如果能够深入原理,轻松走向架构师)</p>
<p>C#:官方对于底层封装比较丰富、多样化,不需要封装即可应付大多数业务场景(轻松进行封装,可以将面向对象概念发挥到极致),缺点也比较明显比较容易造成开发人员懒惰、影响创新</p>
</blockquote>
<p>总体说明</p>
<blockquote>
<p>从关键字数量和功能可以看出该语言对于底层的封装程度,但总体来说开发语言没有对错、优劣,在不同的场景选择合适的开发语言即可</p>
</blockquote>
<h2 id="22-基本数据类型">2.2 基本数据类型</h2>
<p>思考一个问题:<strong>为什么需要有数据类型?</strong></p>
<blockquote>
<ul>
<li>一些答案:</li>
<li>《Java 编程的逻辑》 一书中对于其的解释是 <strong><span style="color: rgba(255, 0, 0, 1)">数据在计算机内部都是二进制表示的,不方便操作,为了方便操作数据,高级语言引入了数据类型和变量的概念</span></strong></li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>
<p>我自己的理解(<span style="color: rgba(255, 0, 0, 1)">不一定正确</span>):</p>
</li>
<li>
<p>每一种数据类型所占用的byte/bit是不同的(或者代表意义不同),他们的存在或者组合满足了各种数据操作场景,进一步满足了各种业务场景的需要(支持《Java 编程的逻辑》所说),便于CPU对内存进行操作,同时也便于进行数据存储(和数据库数据类型对应)。</p>
</li>
</ul>
</blockquote>
<h3 id="221-go-基本数据类型">2.2.1 Go 基本数据类型</h3>
<blockquote>
<p>共19个</p>
</blockquote>
<table>
<thead>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>int</td>
<td>int8</td>
<td>int16</td>
<td>int32</td>
<td>int64</td>
<td></td>
</tr>
<tr>
<td>uint</td>
<td>uint8</td>
<td>uint16</td>
<td>uint32</td>
<td>uint64</td>
<td>uintptr</td>
</tr>
<tr>
<td>float32</td>
<td>float64</td>
<td>complex64</td>
<td>complex128</td>
<td>byte</td>
<td>rune</td>
</tr>
<tr>
<td>bool</td>
<td>string</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>说明</strong></p>
<ul>
<li>
<p>byte: alias for uint8 (不可兼容汉字)</p>
</li>
<li>
<p>rune: alias for int32, represents a Unicode code point (可兼容汉字)</p>
</li>
<li>
<p>string: 底层采用的是byte数组</p>
</li>
</ul>
</blockquote>
<blockquote>
<p>参考资料:</p>
<ul>
<li>https://go.dev/tour/basics/11</li>
<li>https://go.dev/ref/spec#Numeric_types</li>
</ul>
</blockquote>
<h3 id="222-java-基本数据类型">2.2.2 Java 基本数据类型</h3>
<blockquote>
<p>共8个</p>
</blockquote>
<table>
<thead>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>byte</td>
<td>short</td>
<td>int</td>
<td>long</td>
</tr>
<tr>
<td>float</td>
<td>double</td>
<td>boolean</td>
<td>char</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>说明</strong></p>
<ul>
<li>string: 底层开始采用的是char数组(java 1.8 及之前版本),后面改为byte数组(java 1.9 及以后版本)</li>
</ul>
</blockquote>
<blockquote>
<p><strong>参考资料</strong></p>
<ul>
<li>https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html</li>
</ul>
</blockquote>
<h3 id="223--c-基本数据类型">2.2.3C# 基本数据类型</h3>
<blockquote>
<p>共18个</p>
</blockquote>
<table>
<thead>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>byte</td>
<td>sbyte</td>
<td></td>
<td></td>
</tr>
<tr>
<td>short</td>
<td>ushort</td>
<td></td>
<td></td>
</tr>
<tr>
<td>int</td>
<td>unit</td>
<td>nint</td>
<td>nuint</td>
</tr>
<tr>
<td>long</td>
<td>ulong</td>
<td></td>
<td></td>
</tr>
<tr>
<td>float</td>
<td>double</td>
<td>decimal</td>
<td></td>
</tr>
<tr>
<td>bool</td>
<td>char</td>
<td></td>
<td></td>
</tr>
<tr>
<td>object</td>
<td>string</td>
<td>dynamic</td>
<td></td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>说明</strong></p>
<ul>
<li>
<p>除nint、nuint和dynamic之外,都是.NET类型的别名</p>
</li>
<li>
<p>object、string、dynamic 为引用类型,其他都是值类型</p>
</li>
<li>
<p>string: 底层采用char数组</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>参考资料</strong></p>
<ul>
<li>https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/built-in-types</li>
</ul>
</blockquote>
<h3 id="224-小结">2.2.4 小结</h3>
<blockquote>
<ul>
<li>无论哪一种开发语言,string类型变量值都是不可修改的,底层如采用byte数组实现将无法支持中文(中文需要3-4个字节进行存储),如需支持中文则需要采用其他类型数组(例如:char,rune)实现</li>
</ul>
</blockquote>
<h2 id="23-值类型和引用类型">2.3 值类型和引用类型</h2>
<blockquote>
<p>说值类型和应用类型就不得不讲栈和堆</p>
<p>栈:是内存的一块区域,用于存放值类型的的值</p>
<p>堆:也是内存的一块区域,用于存放引用类型的值;但变量也会占用栈上的内存(存放的不是具体数据类型的值,而是一个内存地址,其指向堆上的一块内存区域,这片内存区域存储的是对应变量的值)</p>
</blockquote>
<h3 id="231-go-值类型和引用类型">2.3.1 Go 值类型和引用类型</h3>
<blockquote>
<ul>
<li>
<p>值类型:包含所有基本数据类型、数组、结构体</p>
</li>
<li>
<p>引用类型:其他非值类型(包含:指针、slice切片、管道channel、接口interface、map、函数等)</p>
</li>
</ul>
</blockquote>
<h3 id="232-java-值类型和引用类型">2.3.2 Java 值类型和引用类型</h3>
<blockquote>
<ul>
<li>
<p>值类型:byte、short、int、long、float、double、boolean、char</p>
</li>
<li>
<p>引用类型:其他非值类型</p>
</li>
</ul>
</blockquote>
<h3 id="233-c-值类型和引用类型">2.3.3 C# 值类型和引用类型</h3>
<blockquote>
<ul>
<li>
<p>值类型:sbyte、byte、short、ushort、int、uint、long、ulong、uint、nuint、float、double、decimal、bool、char、枚举、结构体、Tuple</p>
</li>
<li>
<p>引用类型:其他非值类型(class、interface、delegate、record、dynamic、object、string)</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>参考资料</strong></p>
<ul>
<li>
<p>https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/value-types</p>
</li>
<li>
<p>https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types</p>
</li>
</ul>
</blockquote>
<h3 id="234-小结">2.3.4 小结</h3>
<blockquote>
<ul>
<li>
<p>无论哪一种开发语言,string类型变量值都是不可修改的,不同的语言可能将其归类设置可能不一致(C#是引用类型,其他是值类型)</p>
</li>
<li>
<p>数字类型、布尔类型、字符(即char,如果有)在三种语言中都为值类型(思考:为什么?)</p>
</li>
</ul>
</blockquote>
<h2 id="24-变量">2.4 变量</h2>
<blockquote>
<ul>
<li>
<p>变量 = 变量名 + 数据类型 + 变量值</p>
</li>
<li>
<p>变量:分为全局变量(可以简单理解为:方法外部的变量)和局部变量(可以简单理解为:方法内部的变量)</p>
</li>
<li>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>无论是Go、Java、C# 对于变量、方法名称都区分大小写</strong></span></p>
</li>
</ul>
</blockquote>
<h2 id="25-运算">2.5 运算</h2>
<blockquote>
<ul>
<li>
<p>电脑,也叫作计算机,诞生的最初目的是为了便于计算(算术运算)</p>
</li>
<li>
<p>运算:分为算术运算、比较运算、逻辑运算</p>
</li>
<li>
<p>现有计算机只会进行加法运算和逻辑运算,所有其他运算都将会被转换为这两种运算</p>
</li>
</ul>
</blockquote>
<h3 id="251-go-支持运算符">2.5.1 Go 支持运算符</h3>
<table>
<thead>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>+</td>
<td>&amp;</td>
<td>+=</td>
<td>&amp;=</td>
<td>&amp;&amp;</td>
<td>==</td>
<td>!=</td>
<td>(</td>
<td>)</td>
</tr>
<tr>
<td>-</td>
<td></td>
<td></td>
<td>-=</td>
<td></td>
<td>=</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>*</td>
<td>^</td>
<td>*=</td>
<td>^=</td>
<td>&lt;-</td>
<td>&gt;</td>
<td>&gt;=</td>
<td>{</td>
<td>}</td>
</tr>
<tr>
<td>/</td>
<td>&lt;&lt;</td>
<td>/=</td>
<td>&lt;&lt;=</td>
<td>++</td>
<td>=</td>
<td>:=</td>
<td>,</td>
<td>;</td>
</tr>
<tr>
<td>%</td>
<td>&gt;&gt;</td>
<td>%=</td>
<td>&gt;&gt;=</td>
<td>--</td>
<td>!</td>
<td>...</td>
<td>.</td>
<td>:</td>
</tr>
<tr>
<td></td>
<td>&amp;^</td>
<td></td>
<td>&amp;^=</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>说明</strong></p>
<ul>
<li>
<p>Go、Java、C# 均支持以上运算符</p>
</li>
<li>
<p>Go不支持左面++和--(只支持右面++和--,例如:number++)</p>
</li>
</ul>
</blockquote>
<h3 id="252-java-支持运算符">2.5.2 Java 支持运算符</h3>
<table>
<thead>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>=</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>+</td>
<td>-</td>
<td>*</td>
<td>/</td>
<td>%</td>
<td></td>
<td></td>
</tr>
<tr>
<td>++</td>
<td>--</td>
<td>!</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>==</td>
<td>!=</td>
<td>&gt;</td>
<td>&gt;=</td>
<td>&lt;</td>
<td>&lt;=</td>
<td></td>
</tr>
<tr>
<td>&amp;&amp;</td>
<td>||</td>
<td>?:</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>~</td>
<td>&lt;&lt;</td>
<td>&gt;&gt;</td>
<td>&gt;&gt;&gt;</td>
<td>&amp;</td>
<td>^</td>
<td>|</td>
</tr>
</tbody>
</table>
<h3 id="253-c-支持运算符">2.5.3 C# 支持运算符</h3>
<blockquote>
<ul>
<li>
<p>C# 支持的运算符比较多,官方文档将其分为:算术运算、比较运算、布尔逻辑运算、位运算、移位运算、相等运算</p>
</li>
<li>
<p>具体运算符请查看相关 资料</p>
</li>
</ul>
</blockquote>
<h3 id="254-小结">2.5.4 小结</h3>
<blockquote>
<ul>
<li>
<p>不同软件开发语言对于运算符的支持是不同的(也有一些是其定制化的)</p>
</li>
<li>
<p>三种开发语言中,C# 对于底层的封装更多(语法更加丰富)</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>参考资料</strong></p>
<ul>
<li>https://go.dev/ref/spec#Operators</li>
<li>https://docs.oracle.com/javase/tutorial/java/nutsandbolts/opsummary.html</li>
<li>https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/</li>
</ul>
</blockquote>
<h2 id="26-流程控制语句">2.6 流程控制语句</h2>
<blockquote>
<ul>
<li>
<p>流程控制有2种:条件判断和循环</p>
</li>
<li>
<p>一般软件开发语言都会实现这2种流程控制,否则只能执行简单的自上而下(或者自下而上)流程</p>
</li>
<li>
<p>不同流程控制的组合可以解决各种复杂疑难问题</p>
</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>
<p><strong>两种流程控制</strong></p>
</li>
<li>
<ol>
<li>条件判断<br>
if<br>
if/else<br>
if/else if/else<br>
switch</li>
</ol>
</li>
<li>
<ol start="2">
<li>循环<br>
while<br>
do/while<br>
for<br>
foreach</li>
</ol>
</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>
<p><strong>说明</strong></p>
</li>
<li>
<p>Go 中switch语句更加强大,可以实现if/else if/else效果。(<strong>PS:经 “吉良吉影” 大佬的指出发现从C# 8.0开始,C#也支持类似功能了,请查看资料switch expression和constant pattern</strong>)</p>
</li>
<li>
<p>Go 中没有while、do/while,但可以使用<strong>for</strong>实现类似效果(for循环体中实现自增、条件判断、break效果)</p>
</li>
<li>
<p>Go 中没有foreach,但是可以通过<strong>for range</strong>实现类似效果,并且功能更加强大</p>
</li>
</ul>
</blockquote>
<h2 id="27-函数或方法和类">2.7 函数(或方法)和类</h2>
<blockquote>
<ul>
<li>
<p><strong>函数</strong></p>
</li>
<li>
<p>Go 没有方法重载,同一包内不允许出现相同方法名称(排除首字母小写的方法名称,因为首字母小写的方法只允许当前文件内部访问)</p>
</li>
<li>
<p>Go 采用函数式编程,函数是一等公民,也是一种数据类型,可以直接赋值给变量。</p>
</li>
<li>
<p><strong><span style="color: rgba(255, 0, 0, 1)">Go 没有try catch,但可以使用 defer/recover 来处理报错信息</span></strong></p>
</li>
<li>
<p>Go 和 C# 均支持同时返回多个参数(PS:Java不支持 <strong><span style="color: rgba(255, 0, 0, 1)">也有可能我没有发现</span></strong>)</p>
</li>
<li>
<p>C# 方法参数可以有默认值(非类型默认值),Go、Java 则不允许</p>
</li>
<li>
<p>内部抛出错误:Go、Java、C# 都允许抛出任意错误,Java 则可以在定义方法时指定哪些错误必须要处理</p>
</li>
<li>
<p>Go、Java、C# 均可以实现匿名函数</p>
</li>
<li>
<p>Go、Java、C# 均使用main函数作为程序入口方法</p>
</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>
<p><strong>参考资料</strong></p>
</li>
<li>
<p>https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/method-parameters</p>
</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>
<p><strong>类</strong></p>
</li>
<li>
<p>Go 无类的定义</p>
</li>
<li>
<p>Java、C# 都实现了基于类的面向对象,都将类作为一等公民,目前C#语法更为丰富和强大。抽象类、接口的灵活使用可以让你的代码非常灵活、业务发生变化时的改动更少</p>
</li>
<li>
<p>Java、C# 具有匿名类</p>
</li>
<li>
<p>C# 类构造函数参数支持默认值,Java不支持</p>
</li>
<li>
<p>Java、C# 的访问修饰符区别比较大(特别是protected),C# 更丰富</p>
</li>
<li>
<p>Java 中代码是通过包来组织的,C#是通过项目(例如:类库)组织的</p>
</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>
<p><strong>参考资料</strong></p>
</li>
<li>
<p>https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html</p>
</li>
<li>
<p>https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/access-modifiers</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>说明</strong></p>
<ul>
<li>Go、Java、C# 函数名称、类名称 都区分大小写,对于命名规范要求也类似</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>
<p><strong>泛型</strong></p>
</li>
<li>
<p>C# 对于泛型支持较为完善(性能最好,因为是复制一份代码)</p>
</li>
<li>
<p>Java 是一种伪泛型(实际为Object类型)</p>
</li>
<li>
<p>Go 不支持泛型,但是可以通过 interface 来支持类似泛型的操作</p>
</li>
</ul>
</blockquote>
<h1 id="总结">总结</h1>
<blockquote>
<ul>
<li>
<p>学习方法:对比的最终目的是为了更加快速的建立知识体系、学习相关语言</p>
</li>
<li>
<p>硬件限制:任何开发语言都逃不开硬件对于软件的限制</p>
</li>
<li>
<p>发展的眼光看待问题:Go、Java、C# 都在蓬勃发展,语法内容可能会有所变化,可以先建立一个知识树,有变化时再去更新知识树</p>
</li>
</ul>
</blockquote><br><br>
来源:https://www.cnblogs.com/zhizihuakai/p/15890308.html
頁: [1]
查看完整版本: Go vs Java vs C# 语法对比