golang 中g(shù)o函數(shù)可以開(kāi)啟一個(gè)攜程
例如:
func main() {
fmt.Println("main start")
go func() {
fmt.Println("goroutine")
}()
time.Sleep(1 * time.Second)
fmt.Println("main end")
}
輸出:
main start
goroutine
main end
func main() {
str := ""
go func() {
str = "goroutine"
}()
time.Sleep(1*time.Second)
fmt.Println(str)
}
輸出:
goroutine
chan用法
// 聲明不帶緩沖的通道
ch1 := make(chan string)
// 聲明帶10個(gè)緩沖的通道
ch2 := make(chan string, 10)
// 聲明只讀通道
ch3 := make(<-chan string)
// 聲明只寫(xiě)通道
ch4 := make(chan<- string)
func main() {
// 構(gòu)建一個(gè)同步用的通道。
ch := make(chan int)
// 開(kāi)啟一個(gè)并發(fā)匿名函數(shù)
go func() {
fmt.Println("start goroutine")
// 匿名 goroutine 即將結(jié)束時(shí)苏携,通過(guò)通道通知 main 的 goroutine岖瑰,這一句會(huì)一直阻塞直到 main 的 goroutine 接收為止。
ch <- 0
fmt.Println("exit goroutine")
}()
fmt.Println("wait goroutine")
// 開(kāi)啟 goroutine 后艺智,馬上通過(guò)通道等待匿名 goroutine 結(jié)束锡溯。
<-ch //這里會(huì)一直等待寫(xiě)入完成整個(gè)通道才回結(jié)束
fmt.Println("all done")
}
func main() {
// 構(gòu)建一個(gè)通道
ch := make(chan int)
// 開(kāi)啟一個(gè)并發(fā)匿名函數(shù)
go func() {
// 從3循環(huán)到0
for i := 3; i >= 0; i-- {
// 發(fā)送3到0之間的數(shù)值
ch <- i
// 每次發(fā)送完時(shí)等待
time.Sleep(time.Second)
}
}()
// 遍歷接收通道數(shù)據(jù)
for data := range ch {
// 打印通道數(shù)據(jù)
fmt.Println(data)
//當(dāng)接收到數(shù)值 0 時(shí),停止接收互广。如果繼續(xù)發(fā)送,由于接收 goroutine 已經(jīng)退出卧土,沒(méi)有 goroutine 發(fā)送到通道惫皱,因此運(yùn)行時(shí)將會(huì)觸發(fā)宕機(jī)報(bào)錯(cuò)。
if data == 0 {
break
}
}
}
輸出:
3
2
1
0