前言

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
您可能感兴趣的文章: