go - 无法从 go 频道获取消息
问题描述
我是统计数据集合的示例,其中我在结构中使用了 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 对象反应时提供结构字段,那么它确实有点作用
解决方案
推荐阅读
- vue.js - 使用 vue.js 将 24 小时制转换为带 AM 和 PM 的 12 小时制
- c# - 在 ASP.NET Core 应用程序中禁用 Quartz.Net 的调试日志记录
- php - 从 POST 追加后恢复 div 的属性
- postgresql - 2个数据库之间的Postgres中的DBLINK总是给出语法错误
- azure-devops - 在 Azure Devops 中添加新服务挂钩订阅时的 URL
- random - 最近接到一个任务,要求我使用分层随机抽样的方法,选择50个样本记录,覆盖所有圆柱值
- angular - 在 Angular 12 中更改组件的名称
- apache-kafka - 如何防止生产到kafka主题?
- javascript - cropper.js 无法初始化没有显示任何错误
- blockchain - 有交易的测试网吗?我想测试交易我新创建的代币