From f769f2b57dd8d03c0b94576337a43f9952a60d62 Mon Sep 17 00:00:00 2001 From: xiaowei <403828237@qq.com> Date: Sun, 16 Jan 2022 18:26:27 +0800 Subject: [PATCH] =?UTF-8?q?channel=E7=9A=84=E5=87=A0=E7=A7=8D=E7=94=A8?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + channel/001/main.go | 40 +++++++++++++++++++++++++++++++++++ channel/002/main.go | 50 ++++++++++++++++++++++++++++++++++++++++++++ channel/003/main.go | 51 +++++++++++++++++++++++++++++++++++++++++++++ channel/004/main.go | 46 ++++++++++++++++++++++++++++++++++++++++ go.mod | 3 +++ 6 files changed, 191 insertions(+) create mode 100644 .gitignore create mode 100644 channel/001/main.go create mode 100644 channel/002/main.go create mode 100644 channel/003/main.go create mode 100644 channel/004/main.go create mode 100644 go.mod diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..723ef36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file diff --git a/channel/001/main.go b/channel/001/main.go new file mode 100644 index 0000000..da772bc --- /dev/null +++ b/channel/001/main.go @@ -0,0 +1,40 @@ +package main + +import ( + "fmt" + "math/rand" + "os" + "os/signal" + "time" +) + +// 两个服务一直产生数据 +// 希望有数据产生就拿这些数据做一些处理 + +// 切换着打印,从1到2 +func main() { + m1, m2 := genMsg("service1"), genMsg("service2") + quit := make(chan os.Signal, 1) + go func() { + for { + fmt.Println(<-m1) + fmt.Println(<-m2) + } + }() + signal.Notify(quit, os.Interrupt) + <-quit +} + +func genMsg(name string) <-chan string { + c := make(chan string) + go func() { + i := 0 + for { + time.Sleep(time.Duration(rand.Intn(2000)) * time.Millisecond) + c <- fmt.Sprintf("the service name is %v,the message is %v", + name, i) + i++ + } + }() + return c +} diff --git a/channel/002/main.go b/channel/002/main.go new file mode 100644 index 0000000..2067324 --- /dev/null +++ b/channel/002/main.go @@ -0,0 +1,50 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +// 有两个服务会产生数据 +// 希望有数据就处理 +// 希望不要交替执行,谁有就处理谁 + +// 方案1: 起一个函数,这两个channel有数据,就把这个数据给到另外一个channel,然后读取另外一个channel +func main() { + m1, m2 := genMsg("service1"), genMsg("service2") + m := merge(m1, m2) + for{ + fmt.Println(<-m) + } +} + +func genMsg(name string) chan string { + c := make(chan string) + go func() { + i := 0 + for { + time.Sleep(time.Duration(rand.Intn(2000)) * time.Millisecond) + c <- fmt.Sprintf("the service name is %v,the message is %v", name, i) + i++ + } + }() + return c +} + +// 将两个channel里的数据送到另外一个channel里 +func merge(c1, c2 chan string) chan string { + c := make(chan string) + go func() { + for { + c <- <-c1 + } + }() + + go func() { + for { + c <- <-c2 + } + }() + return c +} diff --git a/channel/003/main.go b/channel/003/main.go new file mode 100644 index 0000000..2ea0d53 --- /dev/null +++ b/channel/003/main.go @@ -0,0 +1,51 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +// select +// 有两个服务都产生数据 +// 有产生数据,就做处理 +// 谁有数据就处理谁 +// 不要用将两个channel里的数据写到新的channel里,然后再读这个channel +func main() { + m1, m2 := genMsg("service1"), genMsg("service2") + + m := useSelect(m1, m2) + for { + fmt.Println(<-m) + } + +} + +func genMsg(name string) chan string { + c := make(chan string) + go func() { + i := 0 + for { + time.Sleep(time.Duration(rand.Intn(2000)) * time.Millisecond) + c <- fmt.Sprintf("the service name is %v,the message is %v", name, i) + i++ + } + }() + return c +} + +// 使用select监控channel +func useSelect(c1, c2 chan string) chan string { + c := make(chan string) + go func() { + for { + select { + case m := <-c1: + c <- m + case m := <-c2: + c <- m + } + } + }() + return c +} diff --git a/channel/004/main.go b/channel/004/main.go new file mode 100644 index 0000000..6442af7 --- /dev/null +++ b/channel/004/main.go @@ -0,0 +1,46 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +// 现在有n个服务,每个服务都产生数据 +// 产生数据就做处理 +// 需要服务里有数据,就打印谁的 + +// 有个可变长度的 chan of string 遍历 +func main() { + m1, m2, m3 := genMsg("service1"), genMsg("service2"), genMsg("service3") + m := merge(m1, m2, m3) + for { + fmt.Println(<-m) + } +} + +func genMsg(name string) chan string { + c := make(chan string) + go func() { + i := 0 + for { + time.Sleep(time.Duration(rand.Intn(2000)) * time.Millisecond) + c <- fmt.Sprintf("the service name is %v,the message is %v", name, i) + i++ + } + }() + return c +} + +func merge(chs ...chan string) chan string { + c := make(chan string) + for _, ch := range chs { + //copy := ch + go func(a chan string) { + for { + c <- <-a + } + }(ch) + } + return c +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..9c37bca --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module golanglearn + +go 1.17