动态语言go 动态语言沟通( 三 )


buildout的不同适用场合以及兼容性问题】 。官方PyPI源又经常出问题,需要搭建私有镜像 , 而维护这个镜像又要花费不少时间和精力 。
并发性好 。Goroutine和channel使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题 。单个Go应用也能有效的利用多个CPU核 , 并行执行的性能好 。这和Python也是天壤之比 。多线程和多进程的服务端程序编写起来并不简单,而且由于全局锁GIL的原因,多线程的Python程序并不能有效利用多核,只能用多进程的方式部署;如果用标准库里的multiprocessing包又会对监控和管理造成不少的挑战【我们用的supervisor管理进程,对fork支持不好】 。部署Python应用的时候通常是每个CPU核部署一个应用,这会造成不少资源的浪费,比如假设某个Python应用启动后需要占用100MB内存,而服务器有32个CPU核,那么留一个核给系统、运行31个应用副本就要浪费3GB的内存资源 。
良好的语言设计 。从学术的角度讲Go语言其实非常平庸,不支持许多高级的语言特性;但从工程的角度讲 , Go的设计是非常优秀的:规范足够简单灵活,有其他语言基础的程序员都能迅速上手 。更重要的是Go自带完善的工具链,大大提高了团队协作的一致性 。比如gofmt自动排版Go代码,很大程度上杜绝了不同人写的代码排版风格不一致的问题 。把编辑器配置成在编辑存档的时候自动运行gofmt,这样在编写代码的时候可以随意摆放位置,存档的时候自动变成正确排版的代码 。此外还有gofix,
govet等非常有用的工具 。
执行性能好 。虽然不如C和Java,但通常比原生Python应用还是高一个数量级的,适合编写一些瓶颈业务 。内存占用也非常省 。
为什么要使用 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操作 。

推荐阅读