- 1. 说明
- 2. 对比
- 2.1 关键字(keywords)
- 2.1.1 Go
- 2.1.2 Java
- 2.1.3 C#
- 2.1.4 小结
- 2.2 基本数据类型
- 2.2.1 Go 基本数据类型
- 2.2.2 Java 基本数据类型
- 2.2.3 C# 基本数据类型
- 2.2.4 小结
- 2.3 值类型和引用类型
- 2.3.1 Go 值类型和引用类型
- 2.3.2 Java 值类型和引用类型
- 2.3.3 C# 值类型和引用类型
- 2.3.4 小结
- 2.4 变量
- 2.5 运算
- 2.5.1 Go 支持运算符
- 2.5.2 Java 支持运算符
- 2.5.3 C# 支持运算符
- 2.5.4 小结
- 2.6 流程控制语句
- 2.7 函数(或方法)和类
- 总结
1. 说明
2. 对比
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 编程的逻辑》 一书中对于其的解释是 数据在计算机内部都是二进制表示的,不方便操作,为了方便操作数据,高级语言引入了数据类型和变量的概念
2.2.1 Go 基本数据类型
共19个
|
|
|
|
|
|
| int |
int8 |
int16 |
int32 |
int64 |
|
| uint |
uint8 |
uint16 |
uint32 |
uint64 |
uintptr |
| float32 |
float64 |
complex64 |
complex128 |
byte |
rune |
| bool |
string |
|
|
|
|
说明
参考资料:
- https://go.dev/tour/basics/11
- https://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 |
|
说明
参考资料
- 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 值类型和引用类型
2.3.2 Java 值类型和引用类型
2.3.3 C# 值类型和引用类型
参考资料
2.3.4 小结
2.4 变量
2.5 运算
2.5.1 Go 支持运算符
|
|
|
|
|
|
|
|
|
| + |
& |
+= |
&= |
&& |
== |
!= |
( |
) |
| - |
|
|
-= |
|
= |
|
|
|
| * |
^ |
*= |
^= |
<- |
> |
>= |
{ |
} |
| / |
<< |
/= |
<<= |
++ |
= |
:= |
, |
; |
| % |
>> |
%= |
>>= |
-- |
! |
... |
. |
: |
|
&^ |
|
&^= |
|
|
|
|
|
说明
2.5.2 Java 支持运算符
|
|
|
|
|
|
|
| = |
|
|
|
|
|
|
| + |
- |
* |
/ |
% |
|
|
| ++ |
-- |
! |
|
|
|
|
| == |
!= |
> |
>= |
< |
<= |
|
| && |
|| |
?: |
|
|
|
|
| ~ |
<< |
>> |
>>> |
& |
^ |
| |
2.5.3 C# 支持运算符
2.5.4 小结
参考资料
- 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 流程控制语句
-
两种流程控制
-
- 条件判断
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函数作为程序入口方法
-
类
-
Go 无类的定义
-
Java、C# 都实现了基于类的面向对象,都将类作为一等公民,目前C#语法更为丰富和强大。抽象类、接口的灵活使用可以让你的代码非常灵活、业务发生变化时的改动更少
-
Java、C# 具有匿名类
-
C# 类构造函数参数支持默认值,Java不支持
-
Java、C# 的访问修饰符区别比较大(特别是protected),C# 更丰富
-
Java 中代码是通过包来组织的,C#是通过项目(例如:类库)组织的
说明
- Go、Java、C# 函数名称、类名称 都区分大小写,对于命名规范要求也类似
总结
来源:https://www.cnblogs.com/zhizihuakai/p/15890308.html |