调用提升函数时出现未定义错误
Undefined error where calling a promoted function
我在 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)
然而,New
是 log.Logger
的升级功能。这里有什么问题?
没有Logger.New()
方法,只有一个log.New()
function that returns a value of *log.Logger
:
func New(out io.Writer, prefix string, flag int) *Logger
生成的 go doc 特意将此类 "constructor" 函数列在它们 return 的类型下,以便您可以轻松找到它们,但这种分组不会使它们成为方法。 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
。
我在 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)
然而,New
是 log.Logger
的升级功能。这里有什么问题?
没有Logger.New()
方法,只有一个log.New()
function that returns a value of *log.Logger
:
func New(out io.Writer, prefix string, flag int) *Logger
生成的 go doc 特意将此类 "constructor" 函数列在它们 return 的类型下,以便您可以轻松找到它们,但这种分组不会使它们成为方法。 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
。