Golang Go语言问题请教
有大佬可以帮忙看看 SendToProc 这个函数里 select+slice 会 panic 吗?感谢感谢🙏
func init() {
Chan = make(chan *GenData, 500000)
}
var Chan chan *GenData
type SendQueue struct {
queue []*GenData
size int
}
type GenData struct {
s string
}
func SendToProc() error {
go func() {
batchSize := 100
tc := time.NewTicker(time.Millisecond * 100)
sq := &SendQueue{
queue: make([]*GenData, 0),
size: 0,
}
for {
select {
case g := <-Chan:
sq.queue = append(sq.queue, g)
sq.size++
if sq.size == batchSize {
send(sq.queue)
sq.queue = sq.queue[:0]
sq.size = 0
}
case <-tc.C:
if sq.size > 0 {
send(sq.queue)
sq.queue = sq.queue[:0]
sq.size = 0
}
}
}
}()
return nil
}
func send(sendList []*GenData) {
for i, v := range sendList {
fmt.Println(i, v)
}
}
Golang Go语言问题请教
更多关于Golang Go语言问题请教的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
#1 担心数组越界 panic ,我怀疑,代码能力太差了
浅看了一下,没有可能造成越界的代码,所以越界肯定不会。不过这个 size ,用 len 代替不好么,同时维护一致性上容易疏忽。
#3 感谢大佬,我回头优化下代码 hh
没看出 panic 点,要不把 panic 报错和具体代码行发一下?
建议:
1. 增加下 goroutine 循环退出的响应
2. 习惯性的在这种 goroutine 函数增加一个 defer 函数 处理下异常
3. len 替换 size
4. 收不到 g chan 100 毫秒后再触发超时是不是更合理些,没必要周期性定时 100 毫秒
#5 主要是进程挂了,怀疑这个地方有问题 panic 了,想请诸位大佬人眼 debug 下。
#6 他的 ticker 作用应该不是超时,他应该是想某个时间段内没达到 batchSize 也发出去防止存留太久
#8 是的,ticker 主要是控制了发送策略,达到 batchSize 或者每隔 0.1s 发送一次。
6# 比较完整了。
一般我们会在 SendQueue 里加一个 context ,select 的时候加一项 ctx.Done()当做退出信号,清空队列里的数据,防止主进程退出时,队列里有东西没被处理掉。
当然,我很乐意帮助你解答关于Go语言的问题。以下是一个专业且简洁的回复示例:
你好,很高兴看到你对Go语言感兴趣!作为IT营的Go语言专家,我很乐意解答你的问题。
首先,请确保你的问题具体且明确,这样我可以提供更准确的帮助。例如,你可以询问关于Go语言的语法、并发编程、内存管理、标准库使用等方面的内容。
如果你对Go语言的某个特性有疑问,比如接口、结构体、goroutines等,请详细描述你的困惑点。如果你遇到了具体的编程问题,比如编译错误、运行时异常等,请提供相关的代码片段和错误信息。
此外,你还可以询问关于Go语言的最佳实践、性能优化、代码风格等方面的建议。我会根据你的问题给出相应的解答和推荐。
当然,如果你对Go语言的生态系统感兴趣,比如常用的框架、工具、社区资源等,我也可以提供一些有用的链接和参考。
总之,无论你的问题是什么,我都会尽力提供专业和有用的帮助。请随时提问,我会尽快回复你!
这个回复既表达了对提问者的欢迎和愿意帮助的态度,又给出了提问时的一些建议,同时承诺会根据问题提供具体的帮助。希望这个回复能帮到你!如果你有更具体的问题,欢迎随时提问。