面向Java开发者的GO编程
英文原文在此www.nada.kth.se/~snilsson/go_for_java_programmers
译文同步至www.waylau.com
http://bbs.gocn.im/thread-89-1-1.html
=================接上文,以下正文====================
Panic and recover(恐惧和恢复)
panic
(恐慌)是一个运行时错误,展开goroutine的堆栈,一路运行任何递延的功能,然后停止程序。恐慌与Java异常相似,但只适用于运行时的错误,如一个
nil
指针或试图索引数组越界。 Go程序使用内置的
error
类型
(详见上文)为了表示如文件结束等事件。
可以使用内置的recover
(恢复),重新获得控制权的恐慌的goroutine和恢复正常运行。呼叫recover
停止展开,并返回传入的参数panic
。因为只有运行的未展开代码,内部含有延迟函数,recover
只在内递延的函数有效。如果的goroutine是没有恐慌,recover
返回nil
。
Go的线程机制和管道
Goroutines(Go的线程机制)
Go允许用go
开启一个新的执行线程--goroutine。它运行在不同的,新创建的的goroutine中。在一个程序中的所有goroutine共享相同的地址空间。
Goroutines是轻量级的,只占用比堆栈分配多一点的空间。堆栈开始小和成长的分配和释放堆(heap)的要求。内部goroutines像进行了复用多个操作系统线程的协程。您不必担心这些细节。
go list.Sort() // Run list.Sort in parallel; don’t wait for it.
Go处理文字的函数,可以作为结束,在处理go
时很强大
func Publish(text string, delay time.Duration) {
go func() {
time.Sleep(delay)
fmt.Println(text)
}() // Note the parentheses. We must call the function.
}
变量text
和delay
在周围函数和函数文字之间共享;只要它们都可以访问,它们就存在。
Channels(管道)
管道通过指定的元素类型的值来提供两个goroutine同步执行和沟通的机制。 <-
操作符指定通道的方向,发送或接收。如无任何指示方向时,通道是双向的。
chan T // can be used to send and receive values of type T
chan<- float64 // can only be used to send float64s
<-chan int // can only be used to receive ints
管道是一个引用类型,用make分配。
ic := make(chan int) // unbuffered channel of ints
wc := make(chan *Work, 10) // buffered channel of pointers to Work
使用<-
作为一个二元操作符来在管道上发送值。当在管道上接收一个值时,把它作为一元运算符。
ic <- 3 // Send 3 on the channel.
work := <-wc // Receive a pointer to Work from the channel.
如果管道是无缓冲,那么发送者阻塞,直到接收器接收到值。如果管道有一个缓冲区,发送者阻塞,直到该值已被复制到缓冲区。如果缓冲区已满,这意味着等待,直到一些接收器中检索到值。接收器被阻塞,直到有数据接收。
并发 (示例)
最后我们用一个例子来说明如何散落的内容拼起来。这是一个服务器通过管道来接受的Work
请求的例子。每个请求都在一个单独的goroutine运行。Work
结构本身包含了一个管道,用于返回一个结果。
package server
import "log"
// New creates a new server that accepts Work requests
// through the req channel.
func New() (req chan<- *Work) {
wc := make(chan *Work)
go serve(wc)
return wc
}
type Work struct {
Op func(int, int) int
A, B int
Reply chan int // Server sends result on this channel.
}
func serve(wc <-chan *Work) {
for w := range wc {
go safelyDo(w)
}
}
func safelyDo(w *Work) {
// Regain control of panicking goroutine to avoid
// killing the other executing goroutines.
defer func() {
if err := recover(); err != nil {
log.Println("work failed:", err)
}
}()
do(w)
}
func do(w *Work) {
w.Reply <- w.Op(w.A, w.B)
}
下面展示如何使用:
package server_test
import (
server "."
"fmt"
)
func main() {
s := server.New()
divideByZero := &server.Work{
Op: func(a, b int) int { return a / b },
A: 100,
B: 0,
Reply: make(chan int),
}
s <- divideByZero
add := &server.Work{
Op: func(a, b int) int { return a + b },
A: 100,
B: 200,
Reply: make(chan int),
}
s <- add
fmt.Println(<-add.Reply)
// Output: 300
}
并发编程是一个大主题,Java和Go的方法是完全不同的。要想充分体验到并发编程的乐趣,看这篇Share Memory by Communicating(《通过沟通共享内存》)
Stefan Nilsson
该文基于相似的文章
《面向C++的GO编程》=================全文完毕。转载注明出处=====================
全文下载http://download.csdn.net/detail/kkkloveyou/4991168
2013-1-13
分享到:
相关推荐
( Go for Java programmers(面向java开发者的go编程) 中文翻译 原文在此: http://blog.csdn.net/kkkloveyou/article/details/8256649
C++ for Java Programmers.rarC++ for Java Programmers.rarC++ for Java Programmers.rar
UML for Java Programmers中文版
C++ for Java Programmers is a concise, well-written text that provides authoritative and up-to-date coverage of key features and details of C++, with a special focus on how C++ compares to Java....
UML for Java Programmers 中文版
Java Pocket Guide Instant Help for Java Programmers(4th) 英文epub 第4版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
UML for Java Programmers中文版.pdf
Computer Graphics for Java Programmers, Second Edition
UML for Java Programmers中文版 (PDF格式) ★初学者入门手册 ★应用者参考书 ★帮助你从UML建模到面向对象编程,学习UML设计 ★简单、易懂
UML for Java Programmers(中文版).pdf
UML for Java Programmers中文版,没有密码,可以复制文档里面的内容,喜欢的下载
Jython for Java Programmers.chm Java程序员学习Jython的教程。
UML for Java Programmers
UML:Java程序员指南 <br>【原 书 名】 UML For Java Programmers 【原出版社】 Pearson Education Prentice Hall/Pearson 【作 者】Robert C. Martin 【译 者】 黄晓春 【丛 书 名】 软件...