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