/**
一个用来进行go routine的函数
*/
func print_something(msg string){
for i:= 0;i < 5;i++{
time.Sleep(1 * time.Second)
fmt.Println(msg)
}
}
/**
异步相加,并将结果放在通道中
*/
func add_async(a int, b int, ch *chan int){
time.Sleep(2 * time.Second)
sum := a+ b
*ch <- sum
}
/**
sleep一会儿
*/
func sleep_sometime(){
fmt.Println("start sleeping.....")
time.Sleep(2 * time.Second)
fmt.Println("end sleeping.....")
}
/**
goroutine的学习
通过go来指定一个goroutime
*/
func goroutine_test() {
print_start_seperator("goroutine_test")
//启动一个go routine
go print_something("hello")
print_something("world")
//执行一个异步加法
var ch = make(chan int)
go add_async(1,2,&ch)
//从通道等待结果,如果不返回,就会一直阻塞着
res := <- ch
fmt.Printf("async add res:%d\n", res)
//通道也可以初始化缓冲区
var ch2 = make(chan int, 2)
ch2 <- 1
ch2 <- 2
fmt.Printf("ch2 first:%d\n", <- ch2)
fmt.Printf("ch2 second:%d\n", <- ch2)
var ch3 = make(chan int, 10)
for i:= 0; i < 10;i++{
ch3 <- i
}
close(ch3)
//如果通道不关闭的话,那么range就会一直卡着,从这里的代码也可以看出来,close掉channel后数据并不会消失,只是会让range
//这种迭代不会一直阻塞而等待新数据
for item := range ch3{
fmt.Printf("%d\t", item)
}
fmt.Println("")
//如果说我们不等待goroutine结束,那么当函数结束后,goroutine会直接被系统结束,不会在继续执行,这点和其他语言的线程不太一样 ,可以通过channel的方式
//来完成同步
go sleep_sometime()
//为了确保我们的goroutine能执行到
time.Sleep(10 * time.Millisecond)
print_end_seperator()
}
func print_start_seperator(key_word string) {
fmt.Printf("**********************************************%s***************************************************\n", key_word)
}
func print_end_seperator() {
fmt.Println("****************************************************************************************************")
}