go - 无法在给定类型的类型定义上调用方法
问题描述
我正在使用 Google Wire 进行依赖注入,我想要 2 个记录器(错误和信息)。所以我创建了以下提供程序:
type errorLogger *log.Logger
type infoLogger *log.Logger
type Logger struct {
Error errorLogger
Info infoLogger
}
func ProvideLogger() *Logger {
return &Logger{
Error: log.New(os.Stderr, "ERROR\t", log.Ldate|log.Ltime|log.Lshortfile),
Info: log.New(os.Stdout, "INFO\t", log.Ldate|log.Ltime),
}
}
在我的代码中,我这样引用记录器
h.Logger.Error
但是,这并没有让我像我想象的那样访问这些logger
方法(例如Println
,Fatalf
等)
我假设我引用的东西不正确,只是不确定是什么。
解决方案
定义为的新类型type errorLogger *log.Logger
不继承基础类型的方法。
请参阅 Go 规范、类型声明 >类型定义:
定义的类型可能具有与之关联的方法。它不继承绑定到给定类型的任何方法,但接口类型或复合类型元素的方法集保持不变
type Mutex struct { /* Mutex fields */ } func (m *Mutex) Lock() { /* Lock implementation */ } func (m *Mutex) Unlock() { /* Unlock implementation */ } // NewMutex has the same composition as Mutex but its method set is empty. type NewMutex Mutex // The method set of PtrMutex's underlying type *Mutex remains unchanged, // but the method set of PtrMutex is empty. type PtrMutex *Mutex
由此可见Printf
和 其他*log.Logger
方法不在 和的方法集中。errorLogger
infoLogger
您可以使用组合:
type errorLogger struct {
*log.Logger
}
然后你可以初始化它:
&Logger{
Error: errorLogger{
Logger: log.New(os.Stderr, "ERROR\t", log.Ldate|log.Ltime|log.Lshortfile),
},
}
推荐阅读
- amazon-web-services - 如何使用aws中的cloudformation请求api网关中的参数并将其传递给lambda函数?
- python - 编辑 JSON 文件,同时保持其格式正确(例如缩进)
- function - Fortran 90 中的普朗克函数
- java - 没有输入正数时如何显示正确的输出
- twilio - Twilio 测试凭证电话号码未验证
- reactjs - 无法在 Firefox 中更改 Firebase 密码
- python-3.x - Modulenotefounderror; 没有模块名称 cplex
- javascript - 如何在 JavaScript 中获取浏览器复制图像的实际 URL
- android - Android R8 片段实现但实际上匹配扩展
- python - 如何遍历嵌套字典中的一系列给定键