2021-05-12 GO 与C#代码行对比

Python022

2021-05-12 GO 与C#代码行对比,第1张

最近在做一个内网穿透工具,是用C# Dotnet Core写的。 总担心性能不行,想参考下别人写的。 结果搜到很多GO语言的例子。 看了下Go语言的介绍,觉得确实是比较简单的语言。并且在并发上比较方便。于是,就开始学习Go语言,并用Go把内网穿透工具重新写了一下。

然后,又想用Go语言重写之前的DotnetCore的WebAPI,现在还在编写中,只是对比下两个语言差异。

然后看下 C#

实际上目前我也没有能力判断GO和C#哪个更好

Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成为现实。Go 团队实施了一个看起来比较稳定的设计草案,并且正以源到源翻译器原型的形式获得关注。本文讲述的是泛型的最新设计,以及如何自己尝试泛型。

例子

FIFO Stack

假设你要创建一个先进先出堆栈。没有泛型,你可能会这样实现:

type Stack []interface{}func (s Stack) Peek() interface{} {

 

return s[len(s)-1]

}

func (s *Stack) Pop() {

 *s = (*s)[:

len(*s)-1]

}

func (s *Stack) Push(value interface{}) {

 *s = 

append(*s, value)

}

但是,这里存在一个问题:每当你 Peek 项时,都必须使用类型断言将其从 interface{} 转换为你需要的类型。如果你的堆栈是 *MyObject 的堆栈,则意味着很多 s.Peek().(*MyObject)这样的代码。这不仅让人眼花缭乱,而且还可能引发错误。比如忘记 * 怎么办?或者如果您输入错误的类型怎么办?s.Push(MyObject{})` 可以顺利编译,而且你可能不会发现到自己的错误,直到它影响到你的整个服务为止。

通常,使用 interface{} 是相对危险的。使用更多受限制的类型总是更安全,因为可以在编译时而不是运行时发现问题。

泛型通过允许类型具有类型参数来解决此问题:

type Stack(type T) []Tfunc (s Stack(T)) Peek() T {

 

return s[len(s)-1]

}

func (s *Stack(T)) Pop() {

 *s = (*s)[:

len(*s)-1]

}

func (s *Stack(T)) Push(value T) {

 *s = 

append(*s, value)

}

这会向 Stack 添加一个类型参数,从而完全不需要 interface{}。现在,当你使用 Peek() 时,返回的值已经是原始类型,并且没有机会返回错误的值类型。这种方式更安全,更容易使用。(译注:就是看起来更丑陋,^-^)

此外,泛型代码通常更易于编译器优化,从而获得更好的性能(以二进制大小为代价)。如果我们对上面的非泛型代码和泛型代码进行基准测试,我们可以看到区别:

type MyObject struct {

    X 

int

}

var sink MyObjectfunc BenchmarkGo1(b *testing.B) {

 

for i := 0 i < b.N i++ {

  

var s Stack

  s.Push(MyObject{})

  s.Push(MyObject{})

  s.Pop()

  sink = s.Peek().(MyObject)

 }

}

func BenchmarkGo2(b *testing.B) {

 

for i := 0 i < b.N i++ {

  

var s Stack(MyObject)

  s.Push(MyObject{})

  s.Push(MyObject{})

  s.Pop()

  sink = s.Peek()

 }

}

结果:

BenchmarkGo1BenchmarkGo1-16     12837528         87.0 ns/op       48 B/op        2 allocs/opBenchmarkGo2BenchmarkGo2-16     28406479         41.9 ns/op       24 B/op        2 allocs/op

在这种情况下,我们分配更少的内存,同时泛型的速度是非泛型的两倍。

合约(Contracts)

上面的堆栈示例适用于任何类型。但是,在许多情况下,你需要编写仅适用于具有某些特征的类型的代码。例如,你可能希望堆栈要求类型实现 String() 函数

Java岗位现在没有饱和,2021年的就业也是持续上涨。主要是因为:

一、Java语言特性强大

软件是电子载体的灵魂,也是游戏开发、网页开发等的核心技术,因此学完Java开发后可以从事的是这些行业的关键性岗位。从过往数据来看,Java有83次荣获TIOBE排行榜第一位。Java语言尤其受大型企业青睐,在一些高并发、高流量的平台中使用Java语言开发优势显著、稳定性好,在服务器端Java更是发挥了它本身高性能、安全稳健的特性,由此Java在程序开发领域地位不容撼动。

二、Java工程师起薪高,缺口大

从第三方平台统计的数据可以看到,Java工程师在2020年平均月薪接近20K,其中20K-30K的薪资占比为30.3%。岗位需求方面,从100offer招聘网发布的2019年各技术类岗位企业面邀数占比可以看出,Java工程师企业需求为第一位,占比60%,同比2018年增长了11%。由此可见,2020年Java岗位需求仍然呈现持续上升趋势,供不应求。

三、Java岗位多、就业好、发展空间大

软件人才不但是核心人才,而且是通用人才,走到哪都不怕,所以哪个行业发展快,就可以去哪个行业,更大限度提高人才的价值而降低职业风险。很多人都说软件工程师的职业生涯短,其实这是一个误解。Java软件工程师是通用性人才,其不受行业发展的限制,而且也不受年龄和体力的影响,和医生、律师一样,年纪越大,经验越丰富,也就越值钱。