前言
GogoroutinechannelGo
CSPGoroutinechannel
Goroutine
GoroutineGocoroutineGoroutineGo
基本用法
语法:go + 函数/方法
Goroutine
代码示例:
import ( "fmt" "time" ) func printGo() { fmt.Println("具名函数") } type G struct { } func (g G) g() { fmt.Println("方法") } func main() { // 基于具名函数创建 goroutine go printGo() // 基于方法创建 goroutine g := G{} go g.g() // 基于匿名函数创建 goroutine go func() { fmt.Println("匿名函数") }() // 基于闭包创建 goroutine i := 0 go func() { i++ fmt.Println("闭包") }() time.Sleep(time.Second) // 避免 main goroutine 结束后,其创建的 goroutine 来不及运行,因此在此休眠 1 秒 }
执行结果:
闭包
具名函数
方法
匿名函数
Goroutine
gogoroutinegoroutine
GoroutineGoroutineGoroutineGoroutineGoroutine
channel
channelGoroutineGoroutine
channel 的基本操作
channelchannel
声明语法:var ch chan string
stringchannelstringchannelmake
import ( "fmt" ) func main() { var ch chan string ch = make(chan string, 1) // 打印 chan 的地址 fmt.Println(ch) // 向 ch 发送 "Go" 数据 ch <- "Go" // 从 ch 中接收数据 s := <-ch fmt.Println(s) // Go }
ch <- xxxchannelchx := <- chchannelch
带缓冲 channel 与无缓冲 channel
channelchannel
ch := make(chan string)
channelGoroutineGoroutine
import ( "fmt" ) func main() { ch := make(chan int) // 发送数据 ch <- 1 // fatal error: all goroutines are asleep - deadlock! // 接收数据 n := <-ch fmt.Println(n) }
ch <-fatal errorGoroutinechannelGoroutine
import ( "fmt" ) func main() { ch := make(chan int) go func() { // 发送数据 ch <- 1 }() // 接收数据 n := <-ch fmt.Println(n) // 1 }
channelGoroutinedeadlock
channel
ch := make(chan string, 5)
channelchennelchannelGoroutinechannelGoroutine
func main() { ch := make(chan int, 1) // 发送数据 ch <- 1 ch <- 2 // fatal error: all goroutines are asleep - deadlock! }
声明 channel 的只发送类型和只接收类型
channel
ch := make(chan int, 1)
channel
channel
ch := make(<-chan int, 1)
channel
channel
ch := make(chan<- int, 1)
channel
channelchannel
func send(ch chan<- int) { ch <- 1 } func recv(ch <-chan int) { <-ch }
channel 的关闭
close(c chan<- Type)channel
channel
channelchannelpanicchannel
func main() { ch := make(chan int, 5) ch <- 1 close(ch) ch <- 2 // panic: send on closed channel }
channelchannelchannel
import "fmt" func main() { ch := make(chan int, 5) ch <- 1 close(ch) fmt.Println(<-ch) // 1 n, ok := <-ch fmt.Println(n) // 0 fmt.Println(ok) // false }
channelchannelfor-range
小结
Goroutine
channelchannelGoroutineerror
channelchannelchannel
channel