gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:29:50 27 4
gpt4 key购买 nike

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

var writers map[int]bool

我想遍历 map ,并使用 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)

当将 map 的所有 3 个值初始化为 true 然后测试 writer2 时,它有时有效有时无效(代码以防 2 始终执行)

如果我只是使用

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

它总是按预期工作。

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

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

最佳答案

你似乎没有作家 map ,你有整数到 bool 的 map 。据推测,整数代表文件描述符。

最简单的方法可能是将其从 map[int]bool 更改为 map[io.Writer]bool,然后您可以遍历它们并使用追加将它们添加到 slice 中。

ws := make([]io.Writer, 0)
for k, v : = range(writers) {
if v != true {
continue
}
ws = append(ws, k)
}

之后,您可以通过将 slice 提供给您的 MultiWriter 调用来直接创建一个 multiwriter。

w := io.MultiWriter(ws...)
log.SetOutput(w)

(函数参数中 slice 后的...表示将 slice 展开为函数调用的参数)

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

关于go:使用 multiWriter 将编写器添加到 io.writer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35259530/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com