go:使用 multiWriter 将编写器添加到 io.writer

我是 Go 的新手。我有一张地图,表明哪些作家是活跃的:


var writers map[int]bool

我想遍历地图,并使用 multiWriter() 创建一个代表所有活动作家的作家


我正在使用以下代码片段:


func setupMultiLoggers() {

var mw io.Writer

for k, v := range writers {

    if v != true {

        continue

    }

    switch k {

    case 0:

        if mw == nil {

            mw = writer0

        } else {

            mw = io.MultiWriter(mw, writer0)

        }

    case 1:

        if mw == nil {

            mw = os.Stdout

        } else {

            mw = io.MultiWriter(mw, os.Stdout)

        }

    case 2:

        if mw == nil {

            mw = writer2

        } else {

            io.MultiWriter(mw, writer2)

        }

    default:

    }

}

log.SetOutput(mw)

}


将映射的所有 3 个值初始化为 true 然后测试 writer2 时,它有时有效,有时无效(情况 2 中的代码始终执行)


如果我只是使用


log.SetOutput(io.MultiWriter(writer0, os.Stdout, writer2))

它总是按预期工作。


我似乎无法理解为什么我的原始代码不能可靠地工作。我有一种感觉有一种更干净的方式来“连接”作家


编辑:我发现了我的(愚蠢的)错误。在第三种情况下缺少对 mw 的分配。仍在寻找一种更干净的方式来“连接”作家。


噜噜哒
浏览 275回答 2
2回答

慕侠2389804

您似乎没有作家地图,而是有整数到布尔值的地图。据推测,整数代表文件描述符。最简单的方法可能是将其从 map[int]bool 更改为 map[io.Writer]bool,然后您可以遍历它们并将它们添加到带有 append 的切片中。ws := make([]io.Writer, 0)for k, v : = range(writers) {    if v != true {        continue    }    ws = append(ws, k)}之后,您可以通过将切片提供给 MultiWriter 调用来直接创建多编写器。w := io.MultiWriter(ws...)log.SetOutput(w)( ...in a function parameter after a slice 意味着将切片扩展为函数调用的参数)您可以在保留 map[int]bool 的同时做同样的事情,但是您需要一个类似于将 int 转换为 io.Writer 的开关

慕容3067478

例如,var writers map[int]boolvar writer0, writer2 io.Writerfunc setupMultiLoggers() {    var mw []io.Writer    for k, v := range writers {        if v == false {            continue        }        switch k {        case 0:            mw = append(mw, writer0)        case 1:            mw = append(mw, os.Stdout)        case 2:            mw = append(mw, writer2)        }    }    log.SetOutput(io.MultiWriter(mw...))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go