[系列] Go – chan 通道

  • 2019 年 10 月 3 日
  • 笔记

??

????????????????? chan ??????????

chan ??????????????????

?? chan ????????? go ????

? go ???????????????????????????????????????????

?????

func main() {      fmt.Println("main start")        go func() {          fmt.Println("goroutine")      }()        fmt.Println("main end")  }

???

main start  main end

??????? goroutine ?

??????? Go ??????????????????

???????????????

????????????????????????????

????????????????????????????

???????????

???????????????????????????????????????????????

??????????????????????????????????

??????????????? goroutine ?

main ????????????????????????????????????????

???????? 1 ???????

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

?????

?????????? chan ?

?? chan

// ?????????  ch1 := make(chan string)    // ???10??????  ch2 := make(chan string, 10)    // ??????  ch3 := make(<-chan string)    // ??????  ch4 := make(chan<- string)

???

????????????????

???????????? +1?????? -1????????????????????

?? chan

ch1 := make(chan string, 10)    ch1 <- "a"

?? chan

val, ok := <- ch1  // ?  val := <- ch1

?? chan

close(chan)

???

  • close ????????????? panic
  • ?? close ??? panic
  • ??? chan ?? close
  • close ?????????

??

func main() {      fmt.Println("main start")      ch := make(chan string)      ch <- "a" // ? chan      go func() {          val := <- ch // ? chan          fmt.Println(val)      }()      fmt.Println("main end")  }

???

main start  fatal error: all goroutines are asleep - deadlock!

What ? ???????????????

????????????? chan???????????

??????

???????? chan?

func main() {      fmt.Println("main start")      ch := make(chan string, 1)      ch <- "a" // ? chan      go func() {          val := <- ch // ? chan          fmt.Println(val)      }()      fmt.Println("main end")  }

???

main start  main end

?????? a , ??????????????????? 1 ???????

func main() {      fmt.Println("main start")      ch := make(chan string, 1)      ch <- "a" // ? chan      go func() {          val := <- ch // ? chan          fmt.Println(val)      }()      time.Sleep(1 * time.Second)      fmt.Println("main end")  }

???

main start  a  main end

?????

???????

func main() {      fmt.Println("main start")      ch := make(chan string)      go func() {          ch <- "a" // ? chan      }()      go func() {          val := <- ch // ? chan          fmt.Println(val)      }()      time.Sleep(1 * time.Second)      fmt.Println("main end")  }

???

main start  a  main end

???????

func producer(ch chan string) {      fmt.Println("producer start")      ch <- "a"      ch <- "b"      ch <- "c"      ch <- "d"      fmt.Println("producer end")  }    func main() {      fmt.Println("main start")      ch := make(chan string, 3)      go producer(ch)        time.Sleep(1 * time.Second)      fmt.Println("main end")  }

???

main start  producer start  main end

??????????????????????????

???????

func producer(ch chan string) {      fmt.Println("producer start")      ch <- "a"      ch <- "b"      ch <- "c"      ch <- "d"      fmt.Println("producer end")  }    func customer(ch chan string) {      for {          msg := <- ch          fmt.Println(msg)      }  }    func main() {      fmt.Println("main start")      ch := make(chan string, 3)      go producer(ch)      go customer(ch)        time.Sleep(1 * time.Second)      fmt.Println("main end")  }

???

main start  producer start  producer end  a  b  c  d  main end

?????

????

gRPC

Gin ??

???

?????????????????????