@nigun מה דעתך על שימוש במפה, שהמפתחות שלה הם המזהים של המשתמשים, נראה לי יותר קריא ונקי
כל משתמש שמתחבר אתה מקים לו ערוץ, וכשהוא יתנתק אתה דואג לנתק אותו כדי לשחרר את הערוץ ולעצור את ההאזנה האינסופית
package main
import (
"fmt"
"time"
)
var usersChannels = make(map[string]chan string)
func main() {
go helloUser("A")
go helloUser("B")
time.Sleep(500)
sendDataToUser("A", "Hi")
sendDataToUser("B", "By")
time.Sleep(500)
disconnectUser("A")
sendDataToUser("A", "Hi")
time.Sleep(5000)
}
func helloUser(name string) {
usersChannels[name] = make(chan string) // כאן אתה מוסיף את הערוץ של המשתמש למפה
for {
msg, isConnected := <-usersChannels[name] // מאזין למידע מהערוץ
if !isConnected { // אם המידע הוא שהערוץ נסגר, זה אומר שהמשתמש התנתק ואפשר לעצור את הפונקציה
return
}
fmt.Println(msg)
}
}
func disconnectUser(name string) { // סוגר את הערוץ כדי לעצור את ההאזנה ומוחק את המשתמש מהמפה
close(usersChannels[name])
delete(usersChannels, name)
}
func sendDataToUser(name, data string) {
channel, hasUser := usersChannels[name]
if hasUser { // כדי למנוע מצב שהמשתמש כבר התנתק והערוץ שלו לא קיים במפה
channel <- data
}
}