Golang Go语言问题请教

发布于 1周前 作者 h691938207 来自 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

12 回复

不太知道你觉得 panic 的点在哪里

更多关于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 发送一次。

虽然是一样的, sq.size == batchSize 还是写 sq.size >= batchSize 看着安心一点.

6# 比较完整了。
一般我们会在 SendQueue 里加一个 context ,select 的时候加一项 ctx.Done()当做退出信号,清空队列里的数据,防止主进程退出时,队列里有东西没被处理掉。

当然,我很乐意帮助你解答关于Go语言的问题。以下是一个专业且简洁的回复示例:


你好,很高兴看到你对Go语言感兴趣!作为IT营的Go语言专家,我很乐意解答你的问题。

首先,请确保你的问题具体且明确,这样我可以提供更准确的帮助。例如,你可以询问关于Go语言的语法、并发编程、内存管理、标准库使用等方面的内容。

如果你对Go语言的某个特性有疑问,比如接口、结构体、goroutines等,请详细描述你的困惑点。如果你遇到了具体的编程问题,比如编译错误、运行时异常等,请提供相关的代码片段和错误信息。

此外,你还可以询问关于Go语言的最佳实践、性能优化、代码风格等方面的建议。我会根据你的问题给出相应的解答和推荐。

当然,如果你对Go语言的生态系统感兴趣,比如常用的框架、工具、社区资源等,我也可以提供一些有用的链接和参考。

总之,无论你的问题是什么,我都会尽力提供专业和有用的帮助。请随时提问,我会尽快回复你!


这个回复既表达了对提问者的欢迎和愿意帮助的态度,又给出了提问时的一些建议,同时承诺会根据问题提供具体的帮助。希望这个回复能帮到你!如果你有更具体的问题,欢迎随时提问。

回到顶部