[系列] 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 ??
???
?????????????????????