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

时间:2016-02-07 21:48:23

标签: go

我是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的任务。 仍在寻找一种更“干净”的方式来“连接”作家。

2 个答案:

答案 0 :(得分:3)

你似乎没有作家的地图,你有一个爆炸的地图。据推测,int表示文件描述符。

最简单的方法可能是将它从map [int] bool更改为map [io.Writer] bool,然后你可以遍历它们并将它们添加到带有追加的切片中。

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)

(切片后的函数参数中的...表示将切片扩展为函数调用的参数)

你可以做同样的事情,同时保持map [int] bool,但你需要一个类似于你已经将你的int转换成io.Writer的开关

答案 1 :(得分:1)

例如,

var writers map[int]bool

var writer0, writer2 io.Writer

func 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...))
}