Goroutine

  • main函数是运行在一个协程内的
  • 无缓冲通道上的发送操作将会被阻塞,直到另一个goroutine在对应的通道上执行接收操作,此时值才传送完成,两个goroutine都继续执行。
  • 无缓冲通道上如果发生了流入无流出,或者流出无流入,就会引起死锁
  • channel可以是单向的
package main

import "fmt"

// 下述例子不会有任何输出
// 因为main函数执行过快,goroutine还未来得及执行
func main() {
    go func() {
        fmt.Println("a simple goroutine")
    }()
}
package main

import (
    "fmt"
    "time"
)

func main() {
    go func() {
        fmt.Println("a simple goroutine")
    }()
    // 加入延时,后有输出
    time.Sleep(time.Second)
}
package main

func main() {
    // 声明一个无缓冲的通道
    c := make(chan int)
    go func() {
        // 将数字塞入通道
        c <- 1
    }()
}
package main

import (
    "fmt"
)

// 下述例子会报错:fatal error: all goroutines are asleep - deadlock!
// main routine通道c未在另一个协程里被写入数据,造成死锁
func main() {
    // 声明一个无缓冲的整型通道
    c := make(chan int)
    c <- 1
    fmt.Println(<-c)
    close(c)
}
package main

import (
    "fmt"
)

// 下述例子无报错,正常输出1
func main() {
    // 声明一个有缓冲的整型通道,长度为1,长度为0时,等同于无缓冲通道
    c := make(chan int, 1)
    c <- 1
    fmt.Println(<-c)
    close(c)
}