python老兵眼中的golang

6002ee051e03f0b762642ee7fafd111f?s=47 Zoom.Quiet
December 04, 2013

 python老兵眼中的golang

珠三角技术沙龙广州11月Golang专场回顾 | TechParty:珠三角技术沙龙 | 打造泛珠三角技术圈线上线下交流的平台
http://techparty.org/2013-12/golang/

6002ee051e03f0b762642ee7fafd111f?s=128

Zoom.Quiet

December 04, 2013
Tweet

Transcript

  1. 一个 Python 老兵眼中的 golang 潘俊勇 易度云办公 everydo.com

  2. 关于我 • 潘俊勇,老潘 • 沙龙潜水组委 • 易度云办公 everydo.com • 微博:

    @panjunyong
  3. 我的语言之路 • VC/C++Builder : 客户端应用时代 • PowerBuilder : 数据库应用时代 •

    Java : web 应用时代 • Python(2002 年起 ) web 2.0 时代 • ? 互联网云计算时代 – 开放 API – 实时 – 全端 – 大访问量
  4. 我爱 Python :简单漂亮强大 • 不需要那么“有经验的”程序员 – 省钱 – 招人不麻烦 –

    对社会:解决就业 • 开发效率高,产品容易重构 • 更多精力到架构、产品 • 全端:脚本、桌面、服务器
  5. Python 的不足 • 性能问题: – 企业级应用, OK – 互联网时代,可能是个问题 •

    大多数情况够用 • 做为一个云平台,可能是一个问题
  6. 寻找新语言 • 和 python 一样的简单好用 • 性能更好 • 支持嵌入 python

    脚本扩展
  7. 新星: golang • 语法类似 C 语言:简单 • 编程哲学基本相同:一件事只有一种方法 • 静态语言:高性能

    • 吸纳动态语言的特性 • 可嵌入 Python 代码扩展
  8. 让我们逐一对比下 Python VS Golang

  9. Hello, world hello.py(Python) “”” 这是一个最小示例 “”” if __name__ == “__main

    __”: str = ‘hello, world’ print str Hello.go(golang) // 这是一个最小示例 package main import "fmt" func main() { str := "Hello, 世界 " fmt.Println(str) }
  10. 运行 • python hello.py • go run hello.go • Or:

    • go build hello.go • hello
  11. 共同点一 • 都不需要头文件,直接 import • 变量定义类似 – GO 可以严谨: var

    str String str = “hello, world” • 都有 docstring 生成文档 • 都是语句可选分号 • 不需要等待编译过程,可直接运行 • go 虽然不强制缩进,但是有代码整理工具
  12. 不同 • Go 的字符串必须双引号 • Go 不是按照文件名来定义包: package 指 令

    • import 指令直接指向源代码库: github.com/panjunyong/testgolang/test • 自动判断依赖:不需要 setup.py ! • 现在还没有类似 pypi 的东西 • 只能 import 首字母大量的变量!
  13. 函数:支持多值返回 Python: def sum(a, b): return a+b def reverse(a, b):

    return b, a Golang: func sum(a, b int) int{ return a+b } func reverse(a, b int) (int, i nt){ return b, a }
  14. 必须定义类型吗? • 编译报错! – sum(1.2, 2.2) – sum(“abc”, “def”) •

    难道我需要为每种类型写一个 reverse? • Golang 能否万能匹配?
  15. 任意类型: interface {} func sum(a, b interface{}) interface{}{ return a

    +b } sum(1, 2) sum(1.1, 2.2) sum(“abc”, “def”) // 动态了!
  16. 基础数据类型

  17. List 类型 : slice a =[1,2,3,4,5] a[2:3] a[:3] a[2:] //

    可动态创建 a.append(3) a.append(4) a := []int{1, 2,3,4,5} a[2:3] a[:3] a[2:] // 按需创建 , 垃圾回收 ! b := make([]int, 5) b := make([]int, 0,5)
  18. For 循环 for aa in range(10): print aa // golang

    的 for 更强大 pow := []int{1, 2, 4, 8, 16, 3 2, 64, 128} for i, v := range pow { fmt.Printf("2**%d = %d \n", i, v) } } // 支持 C 风格的
  19. dict a = {} a[‘asd’]=‘asdfa’ var a =map[string]string {}; a[‘asdf’]=‘asda’

  20. golang 静态类型的红利 • Go :编译阶段可以检查 – 参数个数不匹配 – 参数类型不对 –

    定义的变量没有使用过 • Python – 没有这些,咱也可以过 – 有这些,还真爽
  21. 面向对象: golang 简单! // python class ClassA: a,b = 1.0,2

    def __int__(self, a, b,c): self.a = a self.b = b self.c = c def sum(self): return self.a + self.b ClassA(1, 2).sum() // golang : // 直接使用结构,无构造函数 type ClassA struct{ a, b, c int } // 稍微增强了下函数 func (classa ClassA) sum() int { return classa.a + classa.b } // 没有 self this 之类的东西 ClassA{1, 2,3}.sum()
  22. 神奇的方法定义 func (classa *ClassA) sum() int { // 传引用(指针) return

    classa.a + classa.b } type MyFloat float64 // 可对任何的类型增加方法! func (f MyFloat) Abs() float64 { if f < 0 { return float64(-f) } return float64(f) } func main() { MyFloat(-math.Sqrt2).Abs() }
  23. 继承 // python class ClassB(ClassA): d = ‘asdfas’ def print():

    print self.d // golang type ClassB struct{ ClassA d string } func (classb ClassB)print(){ fmt.Println(classb.d) }
  24. 回到神秘的接口 • Duck typing • Python 没有接口 • 当然 –

    ZCA 扩展了接口 – 比较复杂… // duck typing 的简单接口 type ISum interface { sum() float64 } var a ISum; b := ClassA{1,2} a = b a = &b
  25. 错误 / 异常处理 • 不要抛出异常,返回错误 • 用起来很怪异(不符合 python 习惯)啰嗦 –

    Defer 操作做异常清理( finnally ) • 也支持 panic/recover ,但是不推荐 ?
  26. panic/recover ,不推荐 ? It’s bad style to use these. Go

    doesn’t do exceptions as some languages do. Go uses errors and multiple return values.
  27. 协程:并行计算 Python: • 无语言级支持 • 只能用一个 CPU • Gevent •

    据说各种坑 Golang: • 语言级支持 goroutin e • 比线程轻 • 数据交换靠 channel
  28. channel

  29. 扩展库和包管理 • 庞大的 pypi • Pip • Easy_install • Virtualenv

    • buildout • 发展迅速 • 靠 wiki • https://code.google.c om/p/go-wiki/wiki/Pro jects • 相信这不会是一个问 题
  30. 使用场景 • web 服务端 • 通讯

  31. 内嵌 python 脚本 • 七牛版 https://github.com/qiniu/py • Go-python: https://github.com/sbinet/go-python

  32. pythonist 为什么要关注 golang • Python 的近亲:神像 Python 形似 C •

    相同的编程审美哲学:大道至简 • 有些地方比 Python 更干净 • 只需要多花一点点力气 – 编译阶段查出更多问题 – 性能更好 – 内存管理更可控