1
|
channel := make(chan chan string)
|
go에 대해 channel은 대략 알겠지만 chan chan 이란 또 무엇인가..
chan chan은 내가 준비되었다는 것을 알려줄테니, 내가 보낸 채널을 통해 보내줘 라고 한다.
이는 양반향 처리를 할 수 있다. 이해가 어려우니 코드를보자 !
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
|
package main
import (
"fmt"
"time"
)
func main() {
test := make(chan chan string)
go test1(test)
go test2(test)
time.Sleep(time.Second)
}
func test1(channel chan chan string) {
responsechan := make(chan string)
channel <- responsechan
response := <-responsechan
fmt.Printf("Response: %v\n", response)
}
func test2(channel chan chan string) {
responsechan := <-channel
responsechan <- "ang !"
}
|
아ㅏ아ㅏ… 코드를 보는게 더 어렵다.
보통 channel에는 type과 맞는 값을 전송하거나 받는데,
channel안에 channel을 전송하고 받는다고 생각하면 될 것 같다.
이를 통해 간단하게 user별로 여러개의 node를 생성한다고 가정하고 간단하게 작성해보자.
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
|
package main
import (
"fmt"
"time"
)
func main() {
User := make(chan chan string)
User2 := make(chan chan string)
go makenode(User)
go input(User, "user1")
go makenode(User2)
go input(User2, "user2")
go input(User2, "user2")
time.Sleep(time.Second)
}
func makenode(user chan chan string) {
makechannel := make(chan string)
for {
select {
case user <- makechannel:
case channelname := <-makechannel:
fmt.Printf("channelname: %v\n", channelname)
}
}
}
func input(user chan chan string, username string) {
responsechan := <-user
responsechan <- "data " + username
}
|
User 별로 chan chan을 만들고, makenode go 루틴을 user 별로 실행.
data를 input하는 go 루틴 실행.
2번 실행했을때 결과는 다음과 같다.
1
2
3
4
5
6
7
8
9
|
channelname: data user2
channelname: data user2
channelname: data user1
---
channelname: data user1
channelname: data user2
channelname: data user2
|
chan chan을 보고 바로 작성한거라 특성에 맞지 않고 이상할 수 있겠지만 계속 해서 사용하면 괜찮지 않을까 싶다..
go의 chan chan을 비동기 처리에 사용해도 좋겠다는 생각을 가진다.
보통 mq를 사용하는데 간단하게 go는 chan chan을 사용해 비동기 처리에 이용할 수 있다.