Skip to content

Commit 9d9ce60

Browse files
committed
22 - 信道
Signed-off-by: Tinywan <756684177@qq.com>
1 parent e71b7f0 commit 9d9ce60

File tree

12 files changed

+565
-520
lines changed

12 files changed

+565
-520
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ $ go get github.com/Tinywan/golang-tutorial
5656

5757
### 20 - 并发介绍
5858
### [ 21 - 协程](/docs/golang_tutorial_21.md)
59-
### 22 - 管道
59+
### [22 - 信道](/docs/golang_tutorial_22.md)
6060
### 23 - 缓冲信道和工作池
6161
### 24 - Select
6262
### 25 - Mutex

demo/channel/deadlock.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package main
2+
3+
func main() {
4+
m := make(chan int)
5+
m <- 5
6+
}

demo/channel/demo01.go

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,14 @@ import (
55
)
66

77
func main() {
8-
var m map[string]string
9-
if m == nil {
10-
fmt.Println("this is nil map")
8+
var c chan int // 信道 c 的值为 nil
9+
if c == nil {
10+
fmt.Println("channel a is nil, going to define it")
11+
c = make(chan int)
12+
fmt.Printf("Type of c is %T", c) // 打印通道类型
1113
}
12-
m = make(map[string]string)
13-
m["name"] = "Tinywan"
14-
fmt.Println(m)
1514

16-
m1 := map[string]int{}
17-
fmt.Println(m1)
18-
m1["age"] = 24
19-
m1["dateTime"] = 20180909
20-
fmt.Println(m1)
15+
fmt.Printf("\n")
16+
a := make(chan int)
17+
fmt.Printf("%T", a) // chan int
2118
}

demo/channel/goroutines.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
func hello(done chan bool) {
8+
fmt.Println("This is hello goroutines")
9+
done <- true
10+
}
11+
12+
func getName(name chan string) {
13+
fmt.Println("This is getName goroutines")
14+
name <- "Tinywan"
15+
}
16+
17+
func main() {
18+
done := make(chan bool)
19+
go hello(done)
20+
<-done
21+
22+
name := make(chan string)
23+
go getName(name)
24+
fmt.Println(<-name)
25+
26+
fmt.Println("This is main function")
27+
}

demo/channel/range.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
func producer(num chan int) {
8+
for i := 0; i < 10; i++ {
9+
num <- i
10+
}
11+
close(num)
12+
}
13+
14+
func main() {
15+
ch := make(chan int)
16+
go producer(ch)
17+
18+
// for {
19+
// v, ok := <-ch
20+
// if ok == false { // 如果 ok 是 false 表示信道已经被关闭
21+
// break // 通过 break 退出循环
22+
// }
23+
// fmt.Println("Received", v, ok)
24+
// }
25+
26+
for v := range ch {
27+
fmt.Println("Received ", v)
28+
}
29+
}

demo/channel/single_chan.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package main
2+
3+
import ()
4+
import "fmt"
5+
6+
func sendData(d chan<- int) {
7+
d <- 5
8+
}
9+
10+
func main() {
11+
d := make(chan<- int)
12+
go sendData(d)
13+
//fmt.Println(<-d) //试图从一个只写信道中接收数据
14+
15+
m := make(chan int) // 将双向信道转换为只写或只读信道
16+
go sendData(m)
17+
fmt.Println(<-m)
18+
}

demo/channel/sleep_goroutines.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"time"
6+
)
7+
8+
func hello(done chan bool) {
9+
fmt.Println("hello go routine is going to sleep")
10+
time.Sleep(4 * time.Second)
11+
fmt.Println("hello go routine awake and going to write to done")
12+
done <- true
13+
}
14+
15+
func main() {
16+
done := make(chan bool)
17+
fmt.Println("Main going to call hello go goroutine")
18+
go hello(done)
19+
<-done
20+
fmt.Println("Main received data")
21+
}

demo/channel/squares.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
// 计算 number 每一位的平方和
8+
func calcSquares(number int, squareop chan int) {
9+
sum := 0
10+
for number != 0 {
11+
digit := number % 10
12+
sum += digit * digit
13+
number /= 10
14+
}
15+
squareop <- sum // 将结果发送给信道 squareop
16+
}
17+
18+
func calcCubes(number int, cubeop chan int) {
19+
sum := 0
20+
for number != 0 {
21+
digit := number % 10
22+
sum += digit * digit * digit
23+
number /= 10
24+
}
25+
cubeop <- sum
26+
}
27+
28+
func main() {
29+
number := 598
30+
squareop := make(chan int)
31+
cubeop := make(chan int)
32+
go calcSquares(number, squareop)
33+
go calcCubes(number, cubeop)
34+
squares, cubes := <-squareop, <-cubeop
35+
fmt.Println("Final output", squares+cubes)
36+
}

demo/string/demo01.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
// 打印字符串中的字节
8+
func printBytes(s string) {
9+
for i := 0; i < len(s); i++ {
10+
fmt.Printf("%x ", s[i])
11+
}
12+
}
13+
14+
// 打印字符串中的字符
15+
func printChars(s string) {
16+
for i := 0; i < len(s); i++ {
17+
fmt.Printf("%c", s[i])
18+
}
19+
}
20+
21+
func main() {
22+
name := "Hello World"
23+
printBytes(name)
24+
fmt.Printf("\n")
25+
printChars(name)
26+
27+
fmt.Printf("\n")
28+
// d
29+
name = "Señor"
30+
printBytes(name)
31+
fmt.Printf("\n")
32+
printChars(name)
33+
34+
fmt.Printf("\n")
35+
name = "萬少波"
36+
printBytes(name)
37+
fmt.Printf("\n")
38+
printChars(name)
39+
40+
}

demo/string/range.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
func printCharsAndBytes(s string) {
8+
for index, rune := range s {
9+
fmt.Printf("%c starts at byte %d\n", rune, index)
10+
}
11+
}
12+
13+
func main() {
14+
name := "Señor"
15+
printCharsAndBytes(name)
16+
}

0 commit comments

Comments
 (0)