什么是go
Go是 google 2009 年推出的一门新的系统编程语言
了解一下 Go 的作者和主要核心开发者们,图中是Go的三个作者从左到右分别是:Robert Griesemer, Rob Pike 和 Ken Thompson。
- Robert Griesemer 在开发Go之前是Google V8、Chubby和HotSpot JVM的主要贡献者;
- Rob Pike 主要是Unix、UTF-8、plan9的作者;
- Ken Thompson 主要是B语言、C语言的作者、Unix之父。
GO语言特点
- 静态编译
- 垃圾回收
- 简洁的符号和语法
- 平坦的类型系统
- 基于CSP的并发模型
- 高效简单的工具链
- 丰富的标准库
历史
- 2007年开始设计
- 2008年作为Google的20%项目开始实现
- 2009年作为开源项目面向大众
- 最新的是1.8版本
GO的思维方式
- 最小心智负担原则
- 最小特性
- 最少惊异
- 最小犯错机会
GO Next Java No,Next C
- 少就是指数级的多
- 最少特性原则:如果一个功能不对解决任何问题有显著价值,那么就不提供
- 显示表达:所写即所得的语言
- 极度简化但完备的OOP
- 功能内聚:例如,强大的组合能力
- 最友善的C语言的支持
以软件工程为目的的语言设计
- 快速编译
- 严格的依赖管理
- 代码风格的强一致性
- 偏向组合而不是继承
几个优秀的设计
- if for switch 之类的语句不需要用括号了,但保留了大括号,方便定位语句块
- 可以使用
:=
进行自动类型推导。再也不用写诸如list <int> :: iterator it =l.begin()
之类的语法了。 - 使用字母大小写设置可见性(letter case sets visibility)。省云了成员前面一堆的 public和private,直接看名字就可以辨认了。
- 保留了指针操作,但去掉了指针算术,指针更安全了,同时留给了程序员使用值语义和引用语义的便利。
- defer关键字。妈妈再也不担心句柄没有关闭了。
对OOP的支持
- 返pu归真,没有继承,只有组合
- 明确区分复用和抽象,复用使用组合,抽象使用
- 所见即所得,明确的内存模型,没有vtable之类的东西
- 鸭子类型,抽象更方便。
OOP的例子
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p Person) String() string {
return fmt.Sprintf("%s %d", p.Name, p.Age)
}
type Stringer interface {
String() string
}
func main() {
var p = Person{"icexin", 20}
var s Stringer = p
fmt.Println(s.String())
}
Go内置的并发
GO 的并发
基于协程(goroutine)和管道(channel)
- goroutine:轻量的线程
- channel:带类型的,协程安全的管道,类似unix里面pipe
并发的例子:
# 斐波那契数列产生器
# python
def fib(n):
a, b =0, 1
for i n range(n):
a, b = b, a+b
yield a
for x in fib(10):
print(x)
GO的版本
func fib(c chan int, n int) {
a, b := 0, 1
for i :=0; i < n; i++ {
a, b = b, a+b
c <- a
}
close(c)
}
func main() {
c := make(chan int)
go fib(c, 10)
for x :=range c {
fmt.Println(x)
}
}
GO解决c10k问题
func handle(con net.Conn) {
fmt.Fprintf(conn, "%s", time.Now().String())
conn.Close()
}
func main() {
l, err := net.Listen("tcp", ":8000")
if err != nil {
log.Fatal(err)
}
for {
conn, err := l.Accept()
if err != nil {
log.Fatal(err)
}
go handler(conn)
}
}
GO在工程上的设计
静态编译
- 没有依赖地狱,甚至是glibc
- 编译一次,随处copy,部署极为方便
- 对比gitlab和gogs
gitlab-ce
丰富的工具
- 一键编译 go build
- 一键测试 go test
- 一键下载更新依赖并编译 go get
- 自动文档工具 godoc
go和python对比
Go跟Python相似的地方:
- 语法简单
- 功能强大
- 易于学习
不一样的地方:
- 运行速度快
- 并发支持
- 静态类型