关于goroutine和channel的使用和个人见解

    以下是我看完一些博客文章后的个人见解。。。

    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就可以很好的实现多线程和线程同步了。

本文来自:开源中国博客

感谢作者:leaf志良

查看原文:关于goroutine和channel的使用和个人见解

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。