【问题标题】:Undefined error where calling a promoted function调用提升函数时出现未定义错误
【发布时间】:2019-01-08 19:43:19
【问题描述】:

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

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 的升级功能。这里有什么问题?

【问题讨论】:

    标签: go logging methods struct embedding


    【解决方案1】:

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

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

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

    您可以使用log.New() 获取*log.Logger 类型的值,如果取消引用,您将获得log.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

    【讨论】:

    • 显然你是对的!如何使用log.New() 来初始化我的logger 结构?
    • 很好解释。谢谢。
    猜你喜欢
    • 2021-10-25
    • 2021-09-10
    • 2011-06-16
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多