Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Go 语言 :  互联网时代的 C Googol Lee <googollee@gmail.com>  @googollee   2010.04.25   Beta 技术沙龙 http://club.blogbeta.com 官方 twitte...
Ken Thompson
Summery <ul><li>系统级开发现状 </li></ul><ul><li>新需求需要新模型 </li></ul><ul><li>Go 对并发的支持 </li></ul><ul><li>Go 的语法特点 </li></ul>
系统测开发现状 <ul><li>要求高并发 </li></ul><ul><li>要求开发速度 </li></ul><ul><li>要求性能好 </li></ul><ul><li>要求可分布 </li></ul>
系统测开发现状 <ul><li>C/C++ </li></ul><ul><ul><li>写的好的话 </li></ul></ul><ul><ul><ul><li>速度快,内存利用率高 </li></ul></ul></ul><ul><ul><l...
系统测开发现状 <ul><li>Java </li></ul><ul><ul><li>速度快,语言不灵活 </li></ul></ul><ul><ul><li>语言层面有一定的并发支持,基于 os 并发机制 </li></ul></ul><ul...
能否开发快,性能高? 新模型
新的编程模型( CSP ) <ul><li>在语言层面加入对并发支持 </li></ul><ul><ul><li>而不是以库形式提供 </li></ul></ul><ul><li>更高层次的并发抽象 </li></ul><ul><ul><li>...
GO 并发模型 <ul><li>Goroutine </li></ul><ul><li>Channel </li></ul><ul><li>Rpc </li></ul><ul><li>内存模型 </li></ul>
并发模型  - goroutine <ul><li>轻量 </li></ul><ul><li>Goroutine 间是并行的 </li></ul><ul><li>底层混合使用非阻塞 IO 和线程 </li></ul><ul><li>关键字: g...
并发模型  - channel <ul><li>通过通信来共享 </li></ul><ul><ul><li>而不是通过共享来通信 </li></ul></ul><ul><li>对 channel 的读写是阻塞的 </li></ul><ul><u...
例子  -  筛法求素数
  例子 func generate(ch  chan int ) { for i := 2; ; i++ { ch  <-  i  // Send 'i' to channel 'ch'. } } func filter(in, out  c...
  例子  -  续 <ul><li>Strace 结果: </li></ul><ul><ul><li>并发手段: </li></ul></ul><ul><ul><ul><li>有 Println :有一次 clone ,占用一个 core <...
select <ul><li>同时监听多个 channel </li></ul><ul><li>for { // loop forever </li></ul><ul><li>select  { </li></ul><ul><li>case r...
RPC <ul><li>远程调用 </li></ul><ul><li>使用 golang 库 gob 作序列化 </li></ul><ul><li>目前只能用 http 做 server </li></ul><ul><ul><li>http 使...
例子 type Class struct {} func (p *Class) Function (a *Args, r *Reply) os.Error  // server func main() { a := new(module.Cla...
内存模型 <ul><li>简化并发编程必须有 GC 参与 </li></ul><ul><ul><li>单件如何释放 </li></ul></ul><ul><li>初始化 </li></ul><ul><ul><li>Import package ...
内存模型 <ul><li>原子 IO </li></ul><ul><ul><li>对变量的读写都是原子的 </li></ul></ul><ul><ul><ul><li>c/c++ 的变量读写都不是原子的 </li></ul></ul></ul>...
语法细节  -  原则 <ul><li>简化语法 </li></ul><ul><ul><li>混合了 C 和 Python </li></ul></ul><ul><li>便于解析 </li></ul><ul><ul><li>加快编译速度 </l...
语法细节 – 值  vs  引用 <ul><li>值类型创建 </li></ul><ul><ul><li>基本类型 </li></ul></ul><ul><ul><ul><li>字面量: 0 , 1.1 , 'c' ,” string” , [...
语法细节  - slice <ul><li>定义方法 </li></ul><ul><ul><li>数组: var array  [100]int </li></ul></ul><ul><ul><li>slice : var slice  []i...
语法细节 – 类 <ul><li>定义方式类似 C </li></ul><ul><li>type SomeClass struct { … } </li></ul><ul><li>func (self *SomeClass) method(.....
语法细节 – 非继承 <ul><li>动态绑定 interface </li></ul><ul><li>type PrintInterface interface { print(); } </li></ul><ul><li>type Prin...
语法细节  - type <ul><li>True typedef </li></ul><ul><ul><li>让错误的代码 显而易见 直接报错 </li></ul></ul><ul><li>—— 《软件随想录》 P189 </li></ul>...
语法细节 –  const <ul><li>常量不用定义类型 </li></ul><ul><li>const MAX_NUMBER = 100; </li></ul><ul><li>const DEFAULT_STRING = “string”...
语法细节  -  实现 C++0x <ul><li>Auto </li></ul><ul><li>x := 6; y := make(chan int); </li></ul><ul><li>Concept </li></ul><ul><ul>...
包管理 <ul><li>首字母大写是 public ,小写是 private </li></ul><ul><li>需要预先编译才能 import </li></ul><ul><li>已有库 </li></ul><ul><ul><li>*nix/...
Q&A http://golang.org
Upcoming SlideShare
Loading in …5
×

52

Share

Download to read offline

Go语言: 互联网时代的C

Download to read offline

Go是Google内部开发的一个实验性质的语言,目的是代替C成为网络开发的系统语言。这个语言与C/C++相比有什么优点?对比Python/Erlang这种服务器系统语言又有什么优点?本次演讲将与你一起探讨。

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Go语言: 互联网时代的C

  1. 1. Go 语言 : 互联网时代的 C Googol Lee <googollee@gmail.com> @googollee 2010.04.25 Beta 技术沙龙 http://club.blogbeta.com 官方 twitter : @betasalon Groups : http://groups.google.com/group/betasalon
  2. 2. Ken Thompson
  3. 3. Summery <ul><li>系统级开发现状 </li></ul><ul><li>新需求需要新模型 </li></ul><ul><li>Go 对并发的支持 </li></ul><ul><li>Go 的语法特点 </li></ul>
  4. 4. 系统测开发现状 <ul><li>要求高并发 </li></ul><ul><li>要求开发速度 </li></ul><ul><li>要求性能好 </li></ul><ul><li>要求可分布 </li></ul>
  5. 5. 系统测开发现状 <ul><li>C/C++ </li></ul><ul><ul><li>写的好的话 </li></ul></ul><ul><ul><ul><li>速度快,内存利用率高 </li></ul></ul></ul><ul><ul><li>写不好的话 </li></ul></ul><ul><ul><ul><li>内存泄露 </li></ul></ul></ul><ul><ul><ul><li>Core dump </li></ul></ul></ul><ul><ul><li>语言层面完全没有对并发有支持 </li></ul></ul><ul><ul><li>裸用 os 的并发机制:线程 / 进程 </li></ul></ul>
  6. 6. 系统测开发现状 <ul><li>Java </li></ul><ul><ul><li>速度快,语言不灵活 </li></ul></ul><ul><ul><li>语言层面有一定的并发支持,基于 os 并发机制 </li></ul></ul><ul><li>PHP/Python/Ruby </li></ul><ul><ul><li>开发速度快,灵活 </li></ul></ul><ul><ul><li>速度慢 </li></ul></ul><ul><ul><li>语言层面依旧裸用 os 的并发机制,甚至不提供或者有限制( GIL ) </li></ul></ul><ul><ul><li>Twisted/asyncore/Multiprocess </li></ul></ul>
  7. 7. 能否开发快,性能高? 新模型
  8. 8. 新的编程模型( CSP ) <ul><li>在语言层面加入对并发支持 </li></ul><ul><ul><li>而不是以库形式提供 </li></ul></ul><ul><li>更高层次的并发抽象 </li></ul><ul><ul><li>而不是直接暴露 os 的并发机制 </li></ul></ul><ul><li>应用 </li></ul><ul><ul><li>Erlang </li></ul></ul><ul><ul><li>Ocaml </li></ul></ul>
  9. 9. GO 并发模型 <ul><li>Goroutine </li></ul><ul><li>Channel </li></ul><ul><li>Rpc </li></ul><ul><li>内存模型 </li></ul>
  10. 10. 并发模型 - goroutine <ul><li>轻量 </li></ul><ul><li>Goroutine 间是并行的 </li></ul><ul><li>底层混合使用非阻塞 IO 和线程 </li></ul><ul><li>关键字: go </li></ul>
  11. 11. 并发模型 - channel <ul><li>通过通信来共享 </li></ul><ul><ul><li>而不是通过共享来通信 </li></ul></ul><ul><li>对 channel 的读写是阻塞的 </li></ul><ul><ul><li>读阻塞到读出内容 </li></ul></ul><ul><ul><li>写阻塞到内容写入 buffer </li></ul></ul><ul><li>channel 的两个功能 </li></ul><ul><ul><li>传值 </li></ul></ul><ul><ul><li>同步 </li></ul></ul>
  12. 12. 例子 - 筛法求素数
  13. 13.   例子 func generate(ch chan int ) { for i := 2; ; i++ { ch <- i // Send 'i' to channel 'ch'. } } func filter(in, out chan int , prime int) { for { I := <- in // Receive value of new variable 'i' from 'in'. if i % prime != 0 { out <- i // Send 'i' to channel 'out'. } } } func main() { runtime.GOMAXPROCS(1); ch := make(chan int) // Create a new channel. go generate(ch) // Start generate() as a goroutine. for { prime := <-ch fmt.Println(prime) ch1 := make(chan int) go filter(ch, ch1, prime) ch = ch1 } }
  14. 14.   例子 - 续 <ul><li>Strace 结果: </li></ul><ul><ul><li>并发手段: </li></ul></ul><ul><ul><ul><li>有 Println :有一次 clone ,占用一个 core </li></ul></ul></ul><ul><ul><ul><ul><li>可以在 write 时继续进行计算 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>需要 futex 做同步 </li></ul></ul></ul></ul><ul><ul><ul><li>没有 Println :没有 clone ,占用一个 core </li></ul></ul></ul><ul><ul><ul><ul><li>在 chan 读写时切换 goroutine </li></ul></ul></ul></ul><ul><ul><ul><ul><li>没有同步信号量 </li></ul></ul></ul></ul>
  15. 15. select <ul><li>同时监听多个 channel </li></ul><ul><li>for { // loop forever </li></ul><ul><li>select { </li></ul><ul><li>case req := <- service: </li></ul><ul><li>… // process the request </li></ul><ul><li>case <- quit: </li></ul><ul><li>return; // quit loop </li></ul><ul><li>} } </li></ul>
  16. 16. RPC <ul><li>远程调用 </li></ul><ul><li>使用 golang 库 gob 作序列化 </li></ul><ul><li>目前只能用 http 做 server </li></ul><ul><ul><li>http 使用长链接 </li></ul></ul><ul><li>限制 </li></ul><ul><ul><li>gob 不能序列化函数和 channel </li></ul></ul>
  17. 17. 例子 type Class struct {} func (p *Class) Function (a *Args, r *Reply) os.Error // server func main() { a := new(module.Class); rpc.Register (a); rpc.HandleHTTP (); l, e := net.Listen(&quot;tcp&quot;, &quot;:1234&quot;); http.Serve(l, nil); } // client func main() { client, err := rpc.DialHTTP (&quot;tcp&quot;, &quot;127.0.0.1:1234&quot;); args := &module.Args{7, 8}; reply := new(module.Reply); err = client.Call (&quot;Class.Function&quot;, args, reply); }
  18. 18. 内存模型 <ul><li>简化并发编程必须有 GC 参与 </li></ul><ul><ul><li>单件如何释放 </li></ul></ul><ul><li>初始化 </li></ul><ul><ul><li>Import package 的 init </li></ul></ul><ul><ul><ul><li>包间顺序不定 </li></ul></ul></ul><ul><ul><li>包里 goroutine 在所有 init 之后才执行 </li></ul></ul><ul><ul><li>Main package 的 main </li></ul></ul>
  19. 19. 内存模型 <ul><li>原子 IO </li></ul><ul><ul><li>对变量的读写都是原子的 </li></ul></ul><ul><ul><ul><li>c/c++ 的变量读写都不是原子的 </li></ul></ul></ul><ul><li>乱序 </li></ul><ul><ul><li>仅保证在 goroutine 内,乱序后执行结果不变 </li></ul></ul><ul><li>once </li></ul><ul><ul><li>安全的初始化手段 </li></ul></ul><ul><li>Lock </li></ul><ul><ul><li>用 channel 更好 </li></ul></ul>
  20. 20. 语法细节 - 原则 <ul><li>简化语法 </li></ul><ul><ul><li>混合了 C 和 Python </li></ul></ul><ul><li>便于解析 </li></ul><ul><ul><li>加快编译速度 </li></ul></ul>
  21. 21. 语法细节 – 值 vs 引用 <ul><li>值类型创建 </li></ul><ul><ul><li>基本类型 </li></ul></ul><ul><ul><ul><li>字面量: 0 , 1.1 , 'c' ,” string” , [3]int{1,2,3}/[...] </li></ul></ul></ul><ul><ul><li>构造 </li></ul></ul><ul><ul><ul><li>Point{1, 1} </li></ul></ul></ul><ul><li>具有引用语义的基本类型: maps , slice , channel </li></ul><ul><ul><li>maps , channel 的值类型必须用 make 创建 </li></ul></ul><ul><li>指针 </li></ul><ul><ul><li>空指针: nil </li></ul></ul><ul><ul><li>没有指针运算 - 需要指针运算时应该用 slice </li></ul></ul><ul><ul><li>创建 </li></ul></ul><ul><ul><ul><li>var pInt *int = &someIntVar; </li></ul></ul></ul><ul><ul><ul><li>var point *Point = &Point{1, 1} </li></ul></ul></ul>
  22. 22. 语法细节 - slice <ul><li>定义方法 </li></ul><ul><ul><li>数组: var array [100]int </li></ul></ul><ul><ul><li>slice : var slice []int </li></ul></ul><ul><li>slice 可以对数组内任意一段做引用 </li></ul><ul><ul><li>slice = array[X:Y] </li></ul></ul><ul><ul><li>len(slice) = Y – X </li></ul></ul><ul><ul><li>cap(slice) : slice 实际占用的内存 </li></ul></ul><ul><li>取代指针,安全的数组引用 </li></ul><ul><ul><li>slice = &array 等同于 slice = array[0:len(array)] </li></ul></ul>
  23. 23. 语法细节 – 类 <ul><li>定义方式类似 C </li></ul><ul><li>type SomeClass struct { … } </li></ul><ul><li>func (self *SomeClass) method(...) { … } </li></ul><ul><li>调用方式类似 C++ </li></ul><ul><li>var class *SomeClass = &SomeClass{ … } </li></ul><ul><li>class.method( … ) </li></ul><ul><li>独特的继承 </li></ul><ul><li>type Base struct { … } </li></ul><ul><li>type Child struct { Base; … } </li></ul><ul><li>func (p *Child) method() { </li></ul><ul><li>p.BaseMethod( … ); } </li></ul>
  24. 24. 语法细节 – 非继承 <ul><li>动态绑定 interface </li></ul><ul><li>type PrintInterface interface { print(); } </li></ul><ul><li>type Printable struct { … } // no inherit here </li></ul><ul><li>func (p *Printable) print() { … } </li></ul><ul><li>var i PrintInterface = &Printable{ … } </li></ul><ul><li>i.print() </li></ul><ul><li>Any </li></ul><ul><ul><li>可以传入任意类型 </li></ul></ul><ul><li>type Any interface {} </li></ul><ul><ul><li>调用方式 </li></ul></ul><ul><li>any.(PrintInterface).print() </li></ul>
  25. 25. 语法细节 - type <ul><li>True typedef </li></ul><ul><ul><li>让错误的代码 显而易见 直接报错 </li></ul></ul><ul><li>—— 《软件随想录》 P189 </li></ul><ul><ul><li>例子: </li></ul></ul><ul><li>type UnsafeString string; </li></ul><ul><li>type SafeString string; </li></ul><ul><li>var input UnsafeString = form.data; </li></ul><ul><li>var valid SafeString; </li></ul><ul><li>valid = input; // compile error. </li></ul><ul><li>valid = SafeString(input); // can convert with cast </li></ul>
  26. 26. 语法细节 – const <ul><li>常量不用定义类型 </li></ul><ul><li>const MAX_NUMBER = 100; </li></ul><ul><li>const DEFAULT_STRING = “string”; </li></ul><ul><li>枚举是特殊的常量,特殊递增符 iota </li></ul><ul><li>const ( </li></ul><ul><li>_ = iota // ignore </li></ul><ul><li>A = iota * 2 // 1 * 2 = 2 </li></ul><ul><li>B // 2 * 2 = 4, inherit from above </li></ul><ul><li>C // 3 * 2 = 6 </li></ul><ul><li>_ // ignore, iota = 4 </li></ul><ul><li>D // 5 * 2 = 10 </li></ul><ul><li>) </li></ul>
  27. 27. 语法细节 - 实现 C++0x <ul><li>Auto </li></ul><ul><li>x := 6; y := make(chan int); </li></ul><ul><li>Concept </li></ul><ul><ul><li>使用 Interface 在运行期实现 </li></ul></ul><ul><li>GC </li></ul><ul><li>Lambda </li></ul><ul><li>someFunc = func ( … ) { … } </li></ul><ul><li>someFunc() </li></ul><ul><li>闭包 </li></ul>
  28. 28. 包管理 <ul><li>首字母大写是 public ,小写是 private </li></ul><ul><li>需要预先编译才能 import </li></ul><ul><li>已有库 </li></ul><ul><ul><li>*nix/c 标准库 - os , rand </li></ul></ul><ul><ul><li>C 互操作 - C </li></ul></ul><ul><ul><li>Container - heap , list , ring , vector , hash </li></ul></ul><ul><ul><li>golang 的词法 / 语法分析库 – ast </li></ul></ul><ul><ul><li>网络库 - websocket , http , json </li></ul></ul>
  29. 29. Q&A http://golang.org
  • raistlinkong

    Mar. 20, 2018
  • bruce_sha

    May. 12, 2017
  • nikeliu

    Jan. 5, 2015
  • jacquesdong

    Oct. 29, 2013
  • weideng1485

    Apr. 26, 2013
  • polarpython

    Feb. 19, 2013
  • lucharse

    Feb. 12, 2013
  • solomonwzs

    Apr. 23, 2012
  • kicool

    Apr. 14, 2012
  • shorll

    Nov. 29, 2011
  • qihangzp

    Sep. 12, 2011
  • 404

    Apr. 24, 2011
  • iamsk7

    Apr. 8, 2011
  • jaxiinofea

    Jan. 20, 2011
  • winglechen

    Jan. 11, 2011
  • foxever

    Dec. 22, 2010
  • interma

    Nov. 26, 2010
  • koolhazz

    Aug. 14, 2010
  • 54miracle

    Jun. 10, 2010
  • dning1

    May. 20, 2010

Go是Google内部开发的一个实验性质的语言,目的是代替C成为网络开发的系统语言。这个语言与C/C++相比有什么优点?对比Python/Erlang这种服务器系统语言又有什么优点?本次演讲将与你一起探讨。

Views

Total views

12,976

On Slideshare

0

From embeds

0

Number of embeds

828

Actions

Downloads

354

Shares

0

Comments

0

Likes

52

×