GO语言与C#代码行数对比

为什么要做这个对比

最近在做一个内网穿透工具,是用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#哪个更好
posted @ 2021-05-12 22:51  dcll  阅读(603)  评论(0编辑  收藏  举报