【问题标题】:How can I write from multiple writers in golang?如何在 golang 中从多个作家那里写作?
【发布时间】: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 更模糊了;你能告诉我们失败的测试吗?堆栈跟踪是什么?预期和产生了什么?

标签: go io writer


【解决方案1】:

您可以使用io.MultiWriter(),它接受任意数量的io.Writers 并返回单个io.Writer,它将写入复制到所有提供的写入器。

例如:

buf1 := &bytes.Buffer{}
buf2 := &bytes.Buffer{}

w := io.MultiWriter(buf1, buf2)

if _, err := w.Write([]byte("Hello")); err != nil {
    panic(err)
}

fmt.Println("Buf1:", buf1.String())
fmt.Println("Buf2:", buf2.String())

这将输出(在Go Playground 上尝试):

Buf1: Hello
Buf2: Hello

【讨论】:

  • 是的,但是如果作者的数量未知怎么办?并且 io.MultiWriter() 函数只能返回一个错误,并且无法弄清楚是哪个原始 writer 导致了错误。就我而言,我想知道。
  • 关于return n bytes written by each writer with index position corresponding to the index position of the writer. -if slice is empty return ([]int{}) ... etc可以提到,如果其中一位作者写的数量与其他作者不同,则会返回一些错误。
  • 我创建了一个带有 Err 函数的 Error 接口:接受一个错误片段:func (m Errors) Error() 字符串:如果没有,则返回 0 错误,错误 1,err1 并告诉有 x 个错误
猜你喜欢
  • 2020-10-20
  • 2022-06-16
  • 2013-11-05
  • 2013-01-18
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
相关资源
最近更新 更多