go语言的抽象能力很差 go语言发展前景 知乎

如何评价Go在百度BFE的应用?

首先BFE(baidu front end)这个项目是一个功能类似于nginx的项目,并不是大家传统意义上理解的前端(html+css+js)。之所以称作“frontend”是因为它相对于整个应用是处于最前面直接处理用户的http请求的。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:主机域名虚拟主机、营销软件、网站建设、临翔网站维护、网站推广。

一开始这个项目是使用c语言写的,因为业界大多数http服务器也都是使用c来开发的(如apache、nginx)这段时期称作c-BFE时期。

但是到后期,这个项目遇到了一些问题:

c语言的开发效率太低了

c语言应对需求变更比较吃力

c语言抽象能力不足

c语言需要手动管理内存(有些不很优秀的组员会写出导致内存泄漏的代码)

bug越改越多,稳定性和功能是一对矛盾

c语言程序员不好招

所以问题基本上是出在c语言不适应了现在互联网的快速变更的需求。之后百度决定重写这个项目。

那么在开发效率上,golang基本上是满足了百度的需求。首先BFE组有很多优秀的c/c++的程序员了,他们转go几乎没有什么压力。对于一些不那么优秀的c程序员(比如经常漏内存的),用golang之后也不会导致一些低级错误了。所以在学习成本上,更换golang对百度影响不大。

另外,golang本身的并发模型、语言的描述能力、和内存管理等功能,也超过了c语言。所以整体上,开发效率得到了很大的提升。

使用golang遇到的最大的一个问题就是gc带来的问题。李炳毅老师也重点是讲解了baidu如何解决gc带来的延迟问题。

在golang的1.3版本,百度的实际测试下,10k个对象大概会带来1ms的延迟。而BFE一般会维持50万左右的连接数,如果不对golang的gc做任何优化的情况下,100万链接大概会带来400ms的延迟。相当于一个http请求还没有打到应用上,单单在nginx上就耗费了400ms。这肯定不能接受。

我正在学习Go语言网络编程部分,太抽象了有点看不懂啊,哪位大神能够通俗易懂给我解释下这个代码的意思啊

本质上,是作为文件处理的,发送是“write,print”,接受是“read”。

连接相当于打开文件。

为什么要使用 Go 语言?Go 语言的优势在哪里

1. 保留但大幅度简化指针

Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。

2. 多参数返回

还记得在C里面为了回馈多个参数,不得不开辟几段指针传到目标函数中让其操作么?在Go里面这是完全不必要的。而且多参数的支持让Go无需使用繁琐的exceptions体系,一个函数可以返回期待的返回值加上error,调用函数后立刻处理错误信息,清晰明了。

3. Array,slice,map等内置基本数据结构

如果你习惯了Python中简洁的list和dict操作,在Go语言中,你不会感到孤单。一切都是那么熟悉,而且更加高效。如果你是C++程序员,你会发现你又找到了STL的vector 和 map这对朋友。

4. Interface

Go语言最让人赞叹不易的特性,就是interface的设计。任何数据结构,只要实现了interface所定义的函数,自动就implement了这个interface,没有像Java那样冗长的class申明,提供了灵活太多的设计度和OO抽象度,让你的代码也非常干净。千万不要以为你习惯了Java那种一条一条加implements的方式,感觉还行,等接口的设计越来越复杂的时候,无数Bug正在后面等着你。

同时,正因为如此,Go语言的interface可以用来表示任何generic的东西,比如一个空的interface,可以是string可以是int,可以是任何数据类型,因为这些数据类型都不需要实现任何函数,自然就满足空interface的定义了。加上Go语言的type assertion,可以提供一般动态语言才有的duck typing特性, 而仍然能在compile中捕捉明显的错误。

5. OO

Go语言本质上不是面向对象语言,它还是过程化的。但是,在Go语言中, 你可以很轻易的做大部分你在别的OO语言中能做的事,用更简单清晰的逻辑。是的,在这里,不需要class,仍然可以继承,仍然可以多态,但是速度却快得多。因为本质上,OO在Go语言中,就是普通的struct操作。

6. Goroutine

这个几乎算是Go语言的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,这玩意是超级轻量级的类似线程的东西,但通过它,你不需要复杂的线程操作锁操作,不需要care调度,就能玩转基本的并行程序。在Go语言里,触发一个routine和erlang spawn一样简单。基本上要掌握Go语言,以Goroutine和channel为核心的内存模型是必须要懂的。不过请放心,真的非常简单。

7. 更多现代的特性

和C比较,Go语言完全就是一门现代化语言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language类似), function是first class object,等等等等。

看到这里,你可能会发现,我用了很多轻易,简单,快速之类的形容词来形容Go语言的特点。我想说的是,一点都不夸张,连Go语言的入门学习到提高,都比别的语言门槛低太多太多。在大部分人都有C的背景的时代,对于Go语言,从入门到能够上手做项目,最多不过半个月。Go语言给人的感觉就是太直接了,什么都直接,读源代码直接,写自己的代码也直接。


新闻标题:go语言的抽象能力很差 go语言发展前景 知乎
文章转载:http://pwwzsj.com/article/dodesgg.html