【发布时间】:2021-11-12 21:53:39
【问题描述】:
这个想法是创建一个函数,该函数将写入多个写入器并执行返回,以便:
- 将 []byte 切片写入所有写入者
- 返回每个写入器写入的n个字节,索引位置对应于写入器的索引位置。 -如果切片为空返回 ([]int{}) ...等
错误函数:
type Errors []error
func (m Errors) Error() string {
count := 0
for t := 0; t < len(m); t++ {
if m[t] != nil {
count += 1
}
}
errindex := 0
for t := 0; t < len(m); t++ {
if m[t] != nil {
errindex = t
break
}
}
if count == 0 {
return fmt.Sprintf("(0 errors)")
} else {
if count == 1 {
return fmt.Sprintf("%v", m[errindex])
} else if count == 2 {
return fmt.Sprintf("%v (and 1 other error)", m[errindex])
} else {
return fmt.Sprintf("%v (and %d other errors)", m[errindex], count-1)
}
}
}
我的新代码:
func WriteTo(b []byte, writers ...io.Writer) (n []int, errs errors.Errors) {
if len(writers) == 0 {
return []int{}, nil
}
for i := 0; i < len(writers); i++ {
num, err := writers[i].Write(b) // write bytes to a current writer
n = append(n, num) // add bytes written by current write
if err!=nil{
switch err{
case io.ErrShortWrite:
errs = append(errs, err)
default:
errs = append(errs, err)
}
}
}
return n, errs
}
我尝试修复它,但有些测试没有通过。实在看不出来问题。当 count == 1 时不返回,而是在 count == 0 时返回,当 count == 2 时返回 count == 0
[]error{nil, io.ErrShortWrite, nil},
[]error{nil, io.ErrShortWrite, io.ErrShortWrite},
【问题讨论】:
-
你可以使用 MultiWriter (pkg.go.dev/io#MultiWriter)
-
我找到了一些解决方案,但并非所有测试都成功。
-
如果 err 是短写,则将其两次附加到输出切片。
-
@mh-cbon 你能解释更多吗?即使我更改
if err == io.ErrShortWrite { errs = append(errs, err) } else if err != nil { errs = append(errs, err) }它也会返回相同的失败 -
你不能比那个 TBH 更模糊了;你能告诉我们失败的测试吗?堆栈跟踪是什么?预期和产生了什么?