@nigun טעיתי, בקוד הזה באמת שליחת המידע מתבצעת רק אחרי שכל המאזינים נרשמים, אם נעשה את זה כך:
https://play.golang.org/p/hjKVDAq2hLT
לא נראה את המידע השני, אבל זה לא בגלל שאי אפשר להוסיף איברים למערך, אלא בגלל שבזמן שאמור להישלח המידע הקומפיילר עדיין באמצע השינה, וכשהוא מתעורר מהשינה כבר מאוחר כי הפונקציה main כבר מתה.
ניסיתי לעשות את זה עם שרת HTTP וזה נראה עובד בסדר גמור
package main
import (
"fmt"
"net/http"
)
var (
mainChan = make(chan string)
channels = []chan string{}
)
func main() {
go func() {
for {
msg := <-mainChan
for _, c := range channels {
c <- msg
}
}
}()
http.HandleFunc("/a", sendDataToChannel)
http.HandleFunc("/b", someThread)
http.ListenAndServe(":8090", nil)
}
func sendDataToChannel(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "")
mainChan <- "foo"
}
func someThread(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "")
go func() {
c := addListener()
// for {
s := <-c
fmt.Println(s)
// }
}()
}
func addListener() chan string {
newChan := make(chan string)
channels = append(channels, newChan)
return newChan
}