Я - образец для сбора статистики, в котором я использовал канал go внутри структуры, логически мне кажется правильным, но я не могу найти проблему с кодом ниже, он просто не печатает значения, которые я добавили.
package main
import (
"fmt"
"math/rand"
"time"
)
//StatsMessage will hold single stats entry
type StatsMessage struct {
Name string
Value int64
}
//StatsCollector will hold collected stats
type StatsCollector struct {
msgchan chan StatsMessage
messages []StatsMessage
done chan int
}
//Init will start a go routine
func (s StatsCollector) Init() {
s.msgchan = make(chan StatsMessage)
s.done = make(chan int)
s.messages = make([]StatsMessage, 0)
go s.fillMessages()
}
//AddStats adds a single stats in a Messages
func (s StatsCollector) AddStats(name string, value int64) {
msg := StatsMessage{Name: name, Value: value}
s.msgchan <- msg
fmt.Println("Message added")
}
func (s StatsCollector) fillMessages() {
fmt.Println("Filler started...")
for {
s.messages = append(s.messages, <-s.msgchan)
fmt.Println("Added to messages")
}
}
func generateStats(s *StatsCollector) {
for {
select {
case <-time.After(1 * time.Second):
fmt.Println("Generated message...")
s.AddStats("my_first_stats", rand.Int63())
case <-s.done:
fmt.Println("Stop generating")
return
}
}
}
func flushStats(s *StatsCollector) {
for _, stat := range s.messages {
fmt.Println(stat.Name, stat.Value)
}
}
func main() {
s := &StatsCollector{}
s.Init()
go generateStats(s)
time.Sleep(5 * time.Second)
flushStats(s)
}
если я предоставлю поля структуры во время вызова объекта StatsCollector, то это работает немного