接下來要進到 golang 的重點特色之一 goroutine ,江湖傳言,你寫 golang 沒用到 goroutine 以及 channel,就不算寫過 golang。 channel 會在明天的章節介紹,今天先來 goroutine

goroutine

goroutine 的使用也很簡單,不像其他語言 ex java 還要 implement thread interface …. ,才能做到 concurrency ,它只要使用 go 這個 keyword,就可以完成。

package main

import (
	"fmt"
	"time"
)

func Print() {
	for i := 0; i < 10; i++ {
		fmt.Println(i)
		time.Sleep(1 * time.Second)
	}
}

func main() {

	go Print()

	for i := 1000; i < 1010; i++ {
		fmt.Println(i)
		time.Sleep(1 * time.Second)
	}
}

https://play.golang.org/p/Te63URbwM9I

由上面範例可以看到,在 main 裡面的迴圈值跟 Print 裡面迴圈的值,交錯印出來。表示 Print 這個 func 跟 main 裡面,是平行處理的。

這邊另外示範一個例子

package main

import (
	"fmt"
	"time"
)

func Print() {
	for i := 0; i < 10; i++ {
		fmt.Println(i)
		time.Sleep(1 * time.Second)
	}
}

func main() {

	go Print()
	time.Sleep(1 * time.Second)
	fmt.Println("Hello world")

}

https://play.golang.org/p/7AHRUQrU9CL

在這邊可以看到 Print 裡面的值,只印出了幾個就中斷了。原因是,任何情況下,只要 main thread (主線程) 中斷或結束,所有的子線程(goroutine)都會中斷。