首页 > 解决方案 > 调用提升函数时出现未定义错误

问题描述

undefined在 GO 中使用提升的函数时出现错误。

import "log"
type logger struct {
    log.Logger
}

logError := logger.New(os.Stderr, "ERROR", log.LstdFlags)
logOut := logger.New(os.Stdout, "INFO", log.LstdFlags)

这会导致编译器错误:

logger.go: logger.New undefined (type logger has no method New)

但是,Newlog.Logger. 这里有什么问题?

标签: gologgingmethodsstructembedding

解决方案


没有Logger.New()方法,只有一个log.New()返回值的函数*log.Logger

func New(out io.Writer, prefix string, flag int) *Logger

生成的 go doc 故意在它们返回的类型下列出此类“构造函数”函数,以便您可以轻松找到它们,但是这种分组不会使它们成为方法。log.New()没有接收器,所以它不能是一个方法,只有一个函数。

您可以使用log.New()来获取 type 的值*log.Logger,如果您取消引用,您将获得 typelog.Logger的值,即您嵌入的值。

但是,如果首先将某些东西作为指针传递给您,则强烈表明您应该将其用作指针(并且不应取消引用它)。所以我会嵌入*log.Logger,方法仍然会得到提升(因为它们有指针接收器)。这是您可以初始化记录器的方式:

type logger struct {
    *log.Logger
}

var logError = logger{
    Logger: log.New(os.Stderr, "ERROR", log.LstdFlags),
}

var logOut = logger{
    Logger: log.New(os.Stdout, "INFO", log.LstdFlags),
}

尽管如果您不向您的类型添加任何其他内容logger,我认为它的存在是不合理的,您也可以使用*log.Logger


推荐阅读