-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
88 lines (72 loc) · 2.48 KB
/
main.go
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package main
import (
"fmt"
"regexp"
)
// Message структура для хранения пути и сообщения
type Message struct {
Path string
Content []byte
}
// Route структура для хранения паттернов и каналов для обработки сообщений
type Route struct {
Pattern *regexp.Regexp
Channel chan Message
}
// Router структура для хранения маршрутов
type Router struct {
routes []Route
}
// NewRouter создает новый экземпляр Router
func NewRouter() *Router {
return &Router{}
}
// Register для регистрации канала с паттерном
func (r *Router) Register(pattern string, channel chan Message) {
regex := regexp.MustCompile(pattern)
r.routes = append(r.routes, Route{Pattern: regex, Channel: channel})
}
// Push принимает путь и сообщение и обрабатывает его
func (r *Router) Push(path string, message []byte) {
for _, route := range r.routes {
if route.Pattern.MatchString(path) {
// Отправляем путь и сообщение в канал
route.Channel <- Message{Path: path, Content: message}
}
}
}
// Start запускает обработчики сообщений в отдельных горутинах
func (r *Router) Start() {
for _, route := range r.routes {
go func(ch chan Message) {
for msg := range ch {
fmt.Printf("Received - Path: %s, Message: %s\n", msg.Path, string(msg.Content))
}
}(route.Channel)
}
}
func main() {
router := NewRouter()
// Создание каналов
homeChannel := make(chan Message)
aboutChannel := make(chan Message)
usersChannel := make(chan Message)
// Регистрация каналов на паттерны
router.Register("^/$", homeChannel)
router.Register("^/about$", aboutChannel)
router.Register("^/users/.*$", usersChannel)
// Запуск горутин для обработки сообщений
router.Start()
fmt.Println("Starting server on :8080...")
// Имитация вызовов метода Push
router.Push("/", []byte("Request to Home"))
router.Push("/about", []byte("Request to About"))
router.Push("/users/123", []byte("Request to Users"))
router.Push("/nonexistent", []byte("Request to Nonexistent URL"))
// Закрытие каналов для предотвращения утечки памяти
close(homeChannel)
close(aboutChannel)
close(usersChannel)
// wait ctrl^c
fmt.Scanln()
}