在go里面,并发程序依靠的是goroutine和channel。
goroutine可以理解为线程,当对一个函数调用go,启动一个goroutine的时候,就相当于起来一个线程来执行这个函数。比如:
func getinfo(name string, age int) {
fmt.printf("name: %s,age: %d \n", name, age)
}
func main() {
go getinfo("li", 12)
go getinfo("sun", 45)
fmt.println("start")
time.sleep(1 * 1e10)
}
输出:
start
name: li,age: 12
name: sun,age: 45
当起一个goroutine后,主线程不知道这个goroutine什么时候结束,所以在上面的main函数里设了一个sleep来等待两个goroutine处理完,由此可见,当goroutine结束后必须要通过某种方式来告知主线程自己已经结束。
在go里面则是通过channel来传递这种消息,如:
var c chan int
func getinfo(name string, age int) {
fmt.printf("name: %s,age: %d \n", name, age)
c <- 0
}
func main() {
c = make(chan int)
go getinfo("li", 12)
go getinfo("sun", 45)
fmt.println("start")
<-c
<-c
}
channel只能通过make来创建,指定channel的类型(如int)可以说明这个管道能传什么类型的数据。往channel中插入数据用c<-0,取出则是用<-c,取出两次是为了告知主线程两个子线程都运行完毕。