2021-05-12 GO 與C#代碼行對比

為什么要做這個對比

最近在做一個內(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#哪個更好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容