Go语言如何实现多io.Writer批量写入并处理多返回错误?
问题排查与修复
根因定位
你遇到的问题核心是WriteTo函数中errs切片的追加逻辑不符合设计预期:
- 你仅在写入返回非
nil错误时才向errs追加元素,写入成功的场景没有追加nil占位,导致最终返回的errs长度和输入writers的长度不一致,无法和writer的索引一一对应。 - 你原代码中的
switch分支完全冗余,两个分支执行逻辑完全一致,没有任何实际作用。
比如测试用例预期errs结构为[]error{nil, io.ErrShortWrite, nil}(长度3,和3个writer一一对应),但你实际返回的errs是[]error{io.ErrShortWrite}(长度1,仅包含错误元素),和预期结构不符,所以测试逻辑判定错误数量为0。
修复代码
修改后的WriteTo函数
func WriteTo(b []byte, writers ...io.Writer) (n []int, errs errors.Errors) { if len(writers) == 0 { return []int{}, nil } // 提前初始化容量,减少运行时内存分配 n = make([]int, 0, len(writers)) errs = make(errors.Errors, 0, len(writers)) for _, w := range writers { num, err := w.Write(b) n = append(n, num) // 无论是否报错都追加对应值,保证索引和writer一一对应 errs = append(errs, err) } return n, errs }
验证效果
修复后,errs切片的长度始终和输入writers的长度一致,每个索引位置的值对应该索引writer的写入错误。测试用例[]error{nil, io.ErrShortWrite, nil}调用Error()方法会正确统计到非nil错误数量为1,[]error{nil, io.ErrShortWrite, io.ErrShortWrite}会统计到错误数量为2,符合预期。
内容的提问来源于stack exchange,提问作者Maria Hussey
相关产品推荐
相关产品推荐

