定向通道
# 定向通道
# 一、双向通道
通道,channel
,是用于实现goroutine
之间的通信的.一个goroutine
可以向通道中发送数据,另一条goroutine
可以从该通道中获取数据.目前为止的通道,都是既可以发送数据,也可以读取数据,又称这种通道叫双向通道.
data := <- a //read from channel a
a <- data //write to channel a
1
2
2
双向通道,示例代码
package main
import (
"fmt"
)
func main() {
/*
双向:
chan T
chan <- data,发送数据,写出
data <- chan,获取数据,读取
单向: 定向
chan <- T,只支持写
<- chan T,只读
*/
ch6 := make(chan string)
done := make(chan bool)
go sendData3(ch6, done)
data := <-ch6 //读取
fmt.Println("子goroutine传来: ", data)
ch6 <- "我是main" //发送
//time.Sleep(1 * time.Second) // 这里可以延时结束main 的goroutine
<-done
fmt.Println("main...over...")
}
func sendData3(ch6 chan string, done chan bool) {
ch6 <- "我是Bruce" //发送
data := <-ch6 //读取
fmt.Println("main goroutine传来: ", data)
done <- true
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
执行结果
# 二、单向通道
单向通道,也就是定向通道.
之前的通道都是双向通道,可以通过这些通道接收或者发送数据,也可以创建单向通道,这些通道只能发送或者接收数据.
单向通道,示例代码
package main
import (
"fmt"
)
func main() {
/*
双向:
chan T
chan <- data,发送数据,写出
data <- chan,获取数据,读取
单向: 定向
chan <- T,只支持写
<- chan T,只读
定向通道:
创建双向的通道: --->(在函数中)限制: 只读、只写操作
*/
ch7 := make(chan int) //双向,读,写
//ch8 := make(chan<- int) //单向,只能写,不能读
//ch9 := make(<-chan int)
//ch7 <- 100
//data := ch7
//ch8 <- 1000
//data := <-ch8 //invalid operation: cannot receive from send-only channel ch8 (variable of type chan<- int)
//data := <-ch9
//ch9 <- 2000 //invalid operation: cannot send to receive-only channel ch9 (variable of type <-chan int)
go fun1(ch7) //可读,可写(但是到了fun1函数内部只能进行读)
//go fun1(ch8) //只写
data := <-ch7
fmt.Println("fun1函数中写出的数据是: ", data)
go fun2(ch7)
//fun2(ch9)
ch7 <- 200
fmt.Println("main...over...")
}
//该函数,只能操作只写的通道
func fun1(ch chan<- int) {
//在函数内部对于ch7通道,只能写数据不能读取数据.
ch <- 100
fmt.Println("fun1函数结束...")
}
//该函数,只能操作只读的通道
func fun2(ch <-chan int) {
data := <-ch
fmt.Println("fun2函数,从ch中读取的数据是: ", data)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
上次更新: 2024/04/09, 16:48:42
- 01
- AWS NAT-NetWork-Firwalld配置(一)04-09
- 02
- AWS NAT-NetWork-Firwalld配置(二)04-09
- 03
- kubernetes部署minio对象存储01-18