勿在浮沙筑高台
使用这个题目,完全是向《深入浅出MFC》的侯捷致敬。
Go语言优势
- 可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,Go 编译生成的是一个静态可执行文件,部署就是扔一个文件上去就完成了。这让部署变得异常方便,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担。如果你是做php的,你就会知道编译一大堆的依赖是多么的繁琐,经常是你需要增加一个memcached支持,却需要安装一大堆的依赖,还很有可能因为版本的原因,你编译不过去,有的时候你—skip-broken,还有的时候你加上这个语句也过不去。
- 静态类型、编译型语言,静态类型的语言可以在编译的时候检查出来隐藏的大多数问题。
- 跨平台,在大多数平台下,你只要下载与之对应的GO的安装包,并配置好GOPATH、GOROOT,你编写的语言就可以一次编程,处处编译了。在你的程序不包含cgo的情况下,我们在大部分开发中都几乎感觉不到不同平台的差异。
- 内置runtime,支持垃圾回收,无需开发者干预,虽然目前来说GC不算完美,但是足以应付我们所能遇到的大多数情况,特别是Go1.1之后的GC。不过,GO也允许我们进行人工的干预。
- 代码格式强制统一,Go语言里面内置了很多工具,其中gofmt工具,自动化格式化代码,能够让团队review变得如此的简单,代码格式统一,想不一样都很困难。这点我觉着比Python都要优异。
- 内嵌C支持,GO的主导开发人员Thompson,本身就是C语言的发明人之一,所以Go里面也可以直接包含c代码,利用现有的丰富的C库。
- 无继承层次的轻量级面向对象编程范式,GO中的接口与实现之间完全是非侵入式的。在Go中只有类型嵌入而没有类型继承。这避免了很多与继承相关的复杂问题,也使类型层次简化了。
- 标准库丰富,极适合开发服务端程序和Web程序。
Go适合用来做什么
- 服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
- 分布式系统,数据库代理器等
- 网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用
- 内存数据库,前一段时间google开发的groupcache,couchbase的部分组建
- 云平台,目前国外很多云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的apcera云平台。
- Android程序开发,虽然现在才刚刚开始,不过既然GO和Android都属于Google的,那么为什么不让GO去开发Android的程序哪?
本段文章大部分引自
作者:asta谢
链接:http://www.zhihu.com/question/21409296/answer/18184584
来源:知乎
Go语言之父Rob Pike自己整理的2012年6月在旧金山给Go SF的演讲稿,演讲的题目是《Less is exponentially more(大道至简)》,这里面提到的Go语言的特性
- 规范的语法(不需要符号表来解析)、
- 垃圾回收(独有)
- 无头文件
- 明确的依赖
- 无循环依赖
- 常量只能是数字(现在情况已经变了:常量可以是数值类型(包括整型、 浮点型和复数类型)、布尔类型、字符串类型等。)
- int和int32是两种类型
- 字母大小写设置可见性(letter case sets visibility)
- 任何类型(type)都有方法(不是类型)
- 没有子类型继承(不是子类)
- 包级别初始化以及明确的初始化顺序
- 文件被编译到一个包里
- 包package-level globals presented in any order
- 没有数值类型转换(常量起辅助作用)
- 接口隐式实现(没有“implement”声明)
- 嵌入(不会提升到超类)
- 方法按照函数声明(没有特别的位置要求)
- 方法即函数
- 接口只有方法(没有数据)
- 方法通过名字匹配(而非类型)
- 没有构造函数和析构函数
- postincrement(如++i)是状态,不是表达式
- 没有preincrement(i++)和predecrement
- 赋值不是表达式
- 明确赋值和函数调用中的计算顺序(没有“sequence point”)
- 没有指针运算
- 内存一直以零值初始化
- 局部变量取值合法
- 方法中没有“this”
- 分段的堆栈
- 没有静态和其它类型的注释
- 没有模板
- 没有异常
- 内建string、slice和map
- 数组边界检查
原文如下:
- regular syntax (don’t need a symbol table to parse)
- garbage collection (only)
- no header files
- explicit dependencies
- no circular dependencies
- constants are just numbers
- int and int32 are distinct types
- letter case sets visibility
- methods for any type (no classes)
- no subtype inheritance (no subclasses)
- package-level initialization and well-defined order of initialization
- files compiled together in a package
- package-level globals presented in any order
- no arithmetic conversions (constants help)
- interfaces are implicit (no “implements” declaration)
- embedding (no promotion to superclass)
- methods are declared as functions (no special location)
- methods are just functions
- interfaces are just methods (no data)
- methods match by name only (not by type)
- no constructors or destructors
- postincrement and postdecrement are statements, not expressions
- no preincrement or predecrement
- assignment is not an expression
- evaluation order defined in assignment, function call (no “sequence point”)
- no pointer arithmetic
- memory is always zeroed
- legal to take address of local variable
- no “this” in methods
- segmented stacks
- no const or other type annotations
- no templates
- no exceptions
- builtin string, slice, map
- array bounds checking