為什么要做這個對比
最近在做一個內(nèi)網(wǎng)穿透工具,是用C# Dotnet Core寫的。 總擔(dān)心性能不行,想?yún)⒖枷聞e人寫的。 結(jié)果搜到很多GO語言的例子。 看了下Go語言的介紹,覺得確實(shí)是比較簡單的語言。并且在并發(fā)上比較方便。于是,就開始學(xué)習(xí)Go語言,并用Go把內(nèi)網(wǎng)穿透工具重新寫了一下。
然后,又想用Go語言重寫之前的DotnetCore的WebAPI,現(xiàn)在還在編寫中,只是對比下兩個語言差異。
總體Go語言代碼行數(shù)多余C#
GO:39行
//登陸禪道系統(tǒng)
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;
}
| 序號 | 語言 | 行數(shù) |
|---|---|---|
| 1 | GO | 35行 |
| 2 | C# | 31行 |
分析差異
-
Go沒有異常捕獲,必須判斷error,ok等返回值
這點(diǎn),明顯的問題就是造成代碼多了3行判斷,而C#沒有處理錯誤情況(實(shí)際執(zhí)行會跑異常出去)
但另外一方面,也存在優(yōu)點(diǎn):程序?qū)τ诋惓L幚韴鼍皶鼑?yán)禁 Go強(qiáng)制要求{ 寫在一行,雖然多了錯誤判斷,但也減少了代碼行數(shù)
C#有很多{的行
只是記錄,不評判憂略
實(shí)際上目前我也沒有能力判斷GO和C#哪個更好