前言
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