Не удалось получить сообщение с канала Go - PullRequest
0 голосов
/ 11 мая 2019

Я - образец для сбора статистики, в котором я использовал канал 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, то это работает немного

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...