- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我是 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/
我是 Go 的新手。目前,我正在编写一个工具来捕获所有 stdout 输出,并将它们合并到一个新文件中。 为此,我使用了 io.Multiwriter。但是,我的问题在于试图跨包和子包捕获所有 std
我是 Go 的新手。我有一张 map ,表明哪些作家是活跃的: var writers map[int]bool 我想遍历 map ,并使用 multiWriter() 创建一个代表所有活跃作者的作者
我正在将日志写入文件和程序的标准输入,使用如下内容: type myLogger { log *log.Logger } cmd := exec.Command("logger", "-t"
我想创建一种情况,其中所有内容都设置为特定日志。记录器也附加到特定变量的字符串数组。 变量的类型实现了 io.Writer 接口(interface),因此通过 io.MultiWriter 将其添加
我有这段代码可以运行 zsh 并将其输出记录到输出文件中。 package main import ( "io" "os" "os/exec" ) func main() {
我创建了一堆 *io.PipeWriter 并希望基于一个函数中的所有这些管道编写器创建一个多编写器。所以我调用一个类似的函数 func copyToWriters(reader *bufio.Rea
我是一名优秀的程序员,十分优秀!