网站首页 > 文章中心 > 其它

go语言深缺点

作者:小编 更新时间:2023-09-18 07:48:03 浏览量:15人看过

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

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?{

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

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

这会向 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.Pop()

sink?=?s.Peek().(MyObject)

var?s?Stack(MyObject)

sink?=?s.Peek()

结果:

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

合约(Contracts)

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

为什么 Go 语言的性能还不如java

Go语言自亮相以来并没有展示一个明确的方向,Google员工将Go语言称为一个"试验性语言",称其试图融合Python等动态语言的开发速度和C或C◆◆等编译语言的性能和安全.一位Go语言的支持者概括而言Go语言如下:简单、快速、安全、并发、快乐编程、开源;但Go语言缺乏方向以及其"集大成者"的尝试很容易会导致其学猫不成学狗也不成,沦为四不像.尽管如此,编者仍然觉得Go语言有相当大的潜力:很多开发者对它感兴趣——不仅它的最初设计者阵容强大,而且在参与修改源代码的人群中也不乏大牛级人物.这很有可能帮助Go语言找到适合自己的方向,开拓系统编程的新方向.

Go语言怎么样?

Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性.谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧.

Go Logo

谷歌资深软件工程师罗布-派克(Rob Pike)表示,"Go让我体验到了从未有过的开发效率."派克表示,和今天的C◆◆或C一样,Go是一种系统语言.他解释道,"使用它可以进行快速开发,同时它还是一个真正的编译语言,我们之所以现在将其开源,原因是我们认为它已经非常有用和强大."

派克表示,编译后Go代码的运行速度与C语言非常接近,而且编译速度非常快,就像在使用一个交互式语言.现有编程语言均未专门对多核处理器进行优化.Go就是谷歌工程师为这类程序编写的一种语言.它不是针对编程初学者设计的,但学习使用它也不是非常困难.Go支持面向对象,而且具有真正的闭包(closures)和反射 (reflection)等功能.

在学习曲线方面,派克认为Go与Java类似,对于Java开发者来说,应该能够轻松学会 Go.之所以将Go作为一个开源项目发布,目的是让开源社区有机会创建更好的工具来使用该语言,例如 Eclipse IDE中的插件.

在谷歌公开发布的所有网络应用中,均没有使用Go,但是谷歌已经使用该语言开发了几个内部项目.派克表示,Go是否会对谷歌即将推出的Chrome OS产生影响,还言之尚早,不过Go的确可以和Native Client配合使用.他表示"Go可以让应用完美的运行在浏览器内."例如,使用Go可以更高效的实现Wave,无论是在前端还是后台.

golang做后台开发有什么优势和劣势

golang在近些年被追捧,不管某华,某阿在很多服务器开发上都在使用.

你不用怀疑golang的

优势:部署简单,良好的语言设计,并发性好,性能优良,开发简洁快,标准库强大,编译简单

缺点:还存在一些缺陷(例如垃圾回收),缺少安全检查,性能方面目前比不过java,第三方库不及java

但作为新兴语种,我们不用担心,背后有谷歌支持和java持平也就是时间上的问题.

而且前面还有某华,某阿顶着不怕.

为什么我不喜欢Go语言式的接口

所谓Go语言式的接口,就是不用显示声明类型T实现了接口I,只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方.这种做法的学名叫做Structural Typing,有人也把它看作是一种静态的Duck Typing.除了Go的接口以外,类似的东西也有比如Scala里的Traits等等.有人觉得这个特性很好,但我个人并不喜欢这种做法,所以今天这一节谈谈它的缺点.当然这跟动态语言静态语言的讨论类似,不能简单粗暴的下一个"好"或"不好"的结论.

我的观点:

Go的隐式接口Duck Typing确实不是新技术, 但是在主流静态编程语言中支持Duck Typing应该是很少的(不清楚目前是否只有Go语言支持).

静态类型和动态类型虽然没有绝对的好和不好, 但是每个都是有自己的优势的, 没有哪一个可以包办一切. 而Go是试图结合静态类型和动态类型(interface)各自的优势.

那么就从头谈起:什么是接口.其实通俗的讲,接口就是一个协议,规定了一组成员,例如.NET里的ICollection接口:

public interface ICollection {

int Count { get; }

object SyncRoot { get; }

bool IsSynchronized { get; }

void CopyTo(Array array, int index);

这就是一个协议的全部了吗?事实并非如此,其实接口还规定了每个行为的"特征".打个比方,这个接口的Count除了需要返回集合内元素的数目以外,还隐含了它需要在O(1)时间内返回这个要求.这样一个使用了ICollection接口的方法才能放心地使用Count属性来获取集合大小,才能在知道这些特征的情况下选用正确的算法来编写程序,而不用担心带来性能问题,这才能实现所谓的"面向接口编程".当然这种"特征"并不但指"性能"上的,例如Count还包含了例如"不修改集合内容"这种看似十分自然的隐藏要求,这都是ICollection协议的一部分.

对比 Go 语言,Rust 有什么优势和劣势?

我并没有什么编程的经验,觉得编程实在是太复杂了,不喜欢去研究太多,对这个也不怎么懂,只能说自己是个半吊子,就是所掌握的知识,也是东拼西凑的,朋友和我说点儿,自己去书上看一点儿,只能说根据自己的体验给出一些体会吧.

Rust的优势是:

①.、Rust把安全、精确的内存管理作为一切的中心放在首要的位置.

Rust的劣势是:

①.、 语言相对来说比较复杂,对于新手来说,让新手摸不着头脑.

其实我觉得什么代码啊编程啊这些东西还是比较适合理工的学生去研究,我一看脑袋就大,完全不明白在讲什么.我大概了解的就是这些,语言的话大家可以多方面的去了解,也不是说有缺点就是不好,看配置看个人吧,每个人习惯不一样,也许有的人用不稳定的还觉得挺好呢,有的人就喜欢比较完美的,在我看来编程这个东西真的是很复杂,会有很多的代码,这些代码弄得我自己头都大了,有的时候还得去恶补一下.

以上就是土嘎嘎小编为大家整理的go语言深缺点相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章