以下是我看完一些博客文章后的个人见解。。。
golang的一个优势是goroutine,类似一个轻量级的线程。goroutinue机制就像是一个线程池,当一个goroutinue线程被阻塞以后,资源会用来调用另外一个已经准备好的goroutinue线程。goroutinue和channel一起可以很优雅地做到程度的线程同步,以下是goroutinue和channel的简单使用。
例子一:主线程向goroutinue线程发送信息
package main import( "fmt" ) func work(stringChan chan string){ fmt.Println(<-stringChan) fmt.Println("test") } func main() { stringChan := make(chan string) go work(stringChan) stringChan<-"ok" }
输出结果如下
ok test finish
通过关键字go 来调用函数work,传入一个channel的参数stringChan,在work函数中监听stringChan的状态,当在main主线程中往stringChan传入一个字符串时候,work会收到信息,然后fmt.Println(<-stringChan)会输出字符串,然后继续执行。
例子二:goroutine往主线程发送信息
package main import( "fmt" ) func work(stringChan chan string){ stringChan<-"ok" fmt.Println("test") } func main() { stringChan := make(chan string) go work(stringChan) fmt.Println(<-stringChan) }
输出结果如下
test ok
在这个例子中,在work函数里面,向stringChan添加字符串,此时并没有立即激活main主线程中的fmt.Println(<-stringChan),而是等work函数执行完了以后才继续main线程,假如在work中的stringChan<-"ok"之后添加一个for死循环的话,运行是没有任何输出的。。
通过goroutine和channel就可以很好的实现多线程和线程同步了。