Go: channel()-go
Go: channel()
1. send-only chan<- & receive-only <-chan channel
package main
import (
"fmt"
"time"
)
func producer(ch chan<- int, exitChan chan struct{}) {
for i := 0; i < 10; i++ {
ch <- i * 2
}
close(ch)
exitChan <- struct{}{}
}
func consumer(ch <-chan int, exitChan chan struct{}) {
for {
v, ok := <-ch
if !ok {
break
}
time.Sleep(time.Second)
fmt.Println("<-chan", v)
}
exitChan <- struct{}{}
}
func main() {
var ch chan int
ch = make(chan int, 3)
var exitChan chan struct{}
exitChan = make(chan struct{}, 2)
go producer(ch, exitChan)
go consumer(ch, exitChan)
// t := 0
// for {
// _ = <-exitChan
// t++
// if t == 2 {
// break
// }
// }
t := 0
for _ = range exitChan {
t++
if t == 2 {
break
}
}
}
2. select
package main
import "fmt"
func main() {
intChan := make(chan int, 5)
stringChan := make(chan string, 3)
for i := 0; i < cap(intChan); i++ {
intChan <- i
}
for i := 0; i < cap(stringChan); i++ {
stringChan <- "infringe " + fmt.Sprintf("%03d", i)
}
label:
for {
select {
case v := <-intChan:
fmt.Println(v)
case v := <-stringChan:
fmt.Println(v)
default:
fmt.Println("default")
break label
}
}
}
————————
1. send-only chan<- & receive-only <-chan channel
package main
import (
"fmt"
"time"
)
func producer(ch chan<- int, exitChan chan struct{}) {
for i := 0; i < 10; i++ {
ch <- i * 2
}
close(ch)
exitChan <- struct{}{}
}
func consumer(ch <-chan int, exitChan chan struct{}) {
for {
v, ok := <-ch
if !ok {
break
}
time.Sleep(time.Second)
fmt.Println("<-chan", v)
}
exitChan <- struct{}{}
}
func main() {
var ch chan int
ch = make(chan int, 3)
var exitChan chan struct{}
exitChan = make(chan struct{}, 2)
go producer(ch, exitChan)
go consumer(ch, exitChan)
// t := 0
// for {
// _ = <-exitChan
// t++
// if t == 2 {
// break
// }
// }
t := 0
for _ = range exitChan {
t++
if t == 2 {
break
}
}
}
2. select
package main
import "fmt"
func main() {
intChan := make(chan int, 5)
stringChan := make(chan string, 3)
for i := 0; i < cap(intChan); i++ {
intChan <- i
}
for i := 0; i < cap(stringChan); i++ {
stringChan <- "infringe " + fmt.Sprintf("%03d", i)
}
label:
for {
select {
case v := <-intChan:
fmt.Println(v)
case v := <-stringChan:
fmt.Println(v)
default:
fmt.Println("default")
break label
}
}
}