使用 oklog/run 的 Go 编译器出现错误“(无值)用作值”

And*_*ith 3 compiler-errors go go-context

我正在研究oklog/run包的一个简单示例,并且在尝试返回错误日志时在 VS Code 中看到此编译错误:

\n
log.Errorf("abnormal termination: %s", err) (no value) used as value\n
Run Code Online (Sandbox Code Playgroud)\n

在 group.Run 的描述中说

\n
\n

“..Run 仅在所有 actor 退出时返回。Run 返回第一个退出的 actor 返回的错误。”

\n
\n

我\xe2\x80\x99m想知道这是否与它有关,比如它可以\xe2\x80\x99t编译当前不存在的错误,因为run.Group尚未全部返回?

\n

感谢您提供的任何帮助。

\n

代码:

\n
package main\n\nimport (\n    "context"\n    "time"\n\n    "github.com/oklog/run"\n    "github.com/pkg/errors"\n    log "github.com/sirupsen/logrus"\n)\n\nfunc logAForever(ctx context.Context) {\n    for {\n        select {\n        case err := <-ctx.Done():\n            log.Error(err)\n            return\n        default:\n            log.Info("A")\n            time.Sleep(1 * time.Second)\n        }\n    }\n}\n\nfunc logBFor10Sec(ctx context.Context) {\n    for i := 1; i < 10; i++ {\n        log.Info("B")\n        time.Sleep(1 * time.Second)\n    }\n}\n\nfunc main() {\n    ctx, testStopFunc := context.WithCancel(context.Background())\n\n    var group run.Group\n\n    group.Add(func() error {\n        log.Info("First actor added to run group. Starting execute function...")\n        logAForever(ctx)\n        return nil\n    }, func(error) {\n        log.Info("The first interrupt function was invoked.")\n        testStopFunc()\n        time.Sleep(100 * time.Millisecond)\n    })\n\n    group.Add(func() error {\n        log.Info("Second actor added to run group. Starting execute function...")\n        logBFor10Sec(ctx)\n        return nil\n    }, func(error) {\n        log.Info("The second interrupt function was invoked.")\n        testStopFunc()\n        time.Sleep(100 * time.Millisecond)\n    })\n\n    if err := group.Run(); !errors.As(err, &run.SignalError{}) {\n        // return\n        return log.Errorf("abnormal termination: %s", err)\n    }\n\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

VSCode 编译器错误:

\n

在此输入图像描述

\n

Cam*_*doc 5

log.Errorf不返回任何值,但您试图通过return关键字返回它。

试试这个代码:

if err := group.Run(); !errors.As(err, &run.SignalError{}) {
  log.Errorf("abnormal termination: %s", err)
  return
}
Run Code Online (Sandbox Code Playgroud)