go - 调用提升函数时出现未定义错误
问题描述
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)
但是,New
是log.Logger
. 这里有什么问题?
解决方案
没有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
。
推荐阅读
- python - CountVectorizer 假设将数据集转换为稀疏矩阵,但它没有这样做
- python - 无法安装 pyttsx3
- reactjs - 在考虑性能的同时,是否有更新 UI 和数据库的标准方法?
- linux - 另一个文件 bash 脚本中的“adduser”有什么问题
- php - WordPress会话不断刷新不一致
- c++ - 使用 opencv/c++ 将像素转换为 mm --> 两点之间的距离
- python - 如何在 matplotlib 图中添加点图例?
- c - 比较函数作为稍后使用的参数
- java - Java:当事件实际上丢失时,如何对收集事件消息的类设置时间限制
- php - 在 PHP,laravel 中更改索引数组