为什么要做这个对比
最近在做一个内网穿透工具,是用C# Dotnet Core写的。 总担心性能不行,想参考下别人写的。 结果搜到很多GO语言的例子。 看了下Go语言的介绍,觉得确实是比较简单的语言。并且在并发上比较方便。于是,就开始学习Go语言,并用Go把内网穿透工具重新写了一下。
然后,又想用Go语言重写之前的DotnetCore的WebAPI,现在还在编写中,只是对比下两个语言差异。
总体Go语言代码行数多余C#
GO:39行
//登陆禅道系统
func (p *ZenAPI) Login(userName string, password string) (bool, error) {
zenMsg, err := doHttp("GET", "api-getsessionid.json", "")
if err != nil {
return false, err
}
if zenMsg.Status == "success" {
data, ok := toJson(zenMsg.Data)
if ok {
sessionId, ok := data["sessionID"]
if ok {
zenMsg, err := doHttp("GET", fmt.Sprintf("user-login.json?sessionID=%s&account=%s&password=%s", sessionId, userName, password), "")
if err != nil {
return false, err
}
if zenMsg.Status == "success" && zenMsg.Data == "" {
p.userName = userName
return true, nil
} else {
if zenMsg.Reason == "" {
return false, errors.New("用户名或者密码错误")
} else {
return false, errors.New(zenMsg.Reason)
}
}
} else {
return false, errors.New("无法获取sessionId")
}
} else {
return false, errors.New("无法获取Data")
}
}
return false, err
}
然后看下 C#
C# 31行
public bool DoLogin(string username,string password,out string reason)
{
var zendData = DoRequest("api-getsessionid.json", "", HttpMethod.Get);
reason = "";
if (zendData.status == "success")
{
var data = zendData.data;
var o = JObject.Parse(data);
var sessionName = (string)o["sessionName"];
var sessionId = (string)o["sessionID"];
zendData = DoRequest($"user-login.json?{sessionId}={sessionId}&account={username}&password={password}", "", HttpMethod.Get);
if (zendData.status == "success" && zendData.data == null)
{
this.userName = username;
return true;
}
else
{
if (zendData.reason == null)
{
reason = "用户名或者密码错误";
}
else
{
reason = zendData.reason;
}
return false;
}
}
return false;
}
序号 | 语言 | 行数 |
---|---|---|
1 | GO | 35行 |
2 | C# | 31行 |
分析差异
-
Go没有异常捕获,必须判断error,ok等返回值
这点,明显的问题就是造成代码多了3行判断,而C#没有处理错误情况(实际执行会跑异常出去)
但另外一方面,也存在优点:程序对于异常处理场景会更严禁 -
Go强制要求{ 写在一行,虽然多了错误判断,但也减少了代码行数
C#有很多{的行
只是记录,不评判忧略
实际上目前我也没有能力判断GO和C#哪个更好