如何看待go语言泛型的最新设计?

Python019

如何看待go语言泛型的最新设计?,第1张

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() 函数

中华人民共和国境内的具有完全民事行为能力的自然人和外籍人士均可在中国银行申请个人一手住房贷款,借款人应具备以下条件:

1、在中国境内具有常住户口或有效居留身份(外籍人士)也可以申请,具体条件参考各地的相关规定;

2、具有稳定的职业和经济收入,信用良好,有偿还贷款本息的能力;

3、已经签署购买住房的合同或协议;

4、必须支付符合相关规定要求的所购住房的首期购房款;

5、提供经贷款人认可的有效担保;

6、贷款人规定的其他条件。

温馨提示:因各地区存在一定差异,需要请您申请贷款时详询当地经办机构。

以上内容供您参考,业务规定请以实际为准。

如有疑问,欢迎咨询中国银行在线客服。

诚邀您下载使用中国银行手机银行APP或中银跨境GO APP办理相关业务。

在日常学习、工作和生活中,大家总免不了要接触或使用作文吧,作文是由文字组成,经过人的思想考虑,通过语言组织来表达一个主题意义的文体。那么你知道一篇好的作文该怎么写吗?以下是我为大家收集的我的游学之旅作文,仅供参考,大家一起来看看吧。

想着,盼着,准备着,期待已久的夏令营活动终于圆满进行啦!20xx年x月xx日~xx日,“游学羊城行走公益”华样青春GO!夏令营第二季顺利结营,来自惠州市华罗庚中学、湖北夷陵中学和云南大理中学共计145名华萌班的华萌学子,与20名广州福彩学子齐聚,在广州及惠州开展暑期游学,共同体验高校风采、感受羊城岭南风情。我是来自惠州市华罗庚中学的巫妙球,我衷心感恩xxx阿姨和xxx叔叔为我们提供了那么好的游学机会,同时也谢谢xxx等众多机构的组织。

光阴似箭,日月如梭。欢乐的时光总是很短暂,一转眼短短七天的夏令营就过去了,虽然有一点疲惫,但在这七天里充满了快乐。这是我第一次参加夏令营,更是一次难得的人生经历。通过这次夏令营,我认识了不少来自远方的新朋友,我们在一起相处得很好。这次夏令营不仅让我收获了友谊,还收获了许多知识。我和来自云南以及湖北的小伙伴们一同体验广州风情文化,一起参观广州的特色建筑,参访高校,欣赏美景,怀着激动与欣喜的`心情登上广州塔等等,这些无不增强了我们的人生阅历,开阔了我们的视野。我们共同努力,携手完成任务,了解到许多广州的特色文化,提高了我们的社会实践能力。一个个团队的合作与力量,激励着我们乐观、积极、向上!

丰富的夏令营活动陶冶了我们的情操,给枯燥的学习生活增添了许多快乐。广东科技中心的参观激发了我探索世界奥秘的欲望,开阔了我的眼界,增长了知识。参观黄埔军校,我了解到很多关于战争的历史,特别是一些忠义人物的伟迹,让我特别感动。我在心里暗暗下了个决定,我一定要好好学习,将来报效祖国!不管远方的路途多么艰险,我定会冲出荆棘丛林,向理想目标奋勇前进!

时间转瞬即逝,七天的夏令营结束了,回首每一天,大家共同学习,一起团队合作完成各种各样的任务,此时此刻,我感到万分的不舍。可是,天下无不散的宴席,我相信,我们还会有相聚的一天。充实的暑期生活,美好的每一分,每一秒,我们始终在追逐着青春的梦想,永不言弃!梦想从这里起航,我们的世界海阔天空!游学体验之旅令我获益匪浅,终身难忘。