我Logger用這些方法定義了一個接口:type Logger interface { Info(args ...interface{}) Warn(args ...interface{}) Error(args ...interface{})}現(xiàn)在,我想擴展log.Logger類型以符合這個接口。由于log.Logger沒有定義這些方法,我需要實現(xiàn)它們。我試圖通過添加新方法來擴展它:type LoggerImpl log.Loggerfunc (logger *LoggerImpl) Info(v ...interface{}) { logger.Println(v)}func (logger *LoggerImpl) Warn(v ...interface{}) { logger.Println(v)}func (logger *LoggerImpl) Error(v ...interface{}) { logger.Println(v)}但似乎這是錯誤的方法,因為我收到一條錯誤消息logger.Println undefined (type *LoggerImpl has no field or method Println)。我嘗試過的另一個解決方案是嵌入類型,但這也會返回錯誤:type LoggerImpl struct { log.Logger}func (logger *LoggerImpl) Info(v ...interface{}) { logger.Println(v)}func (logger *LoggerImpl) Warn(v ...interface{}) { logger.Println(v)}func (logger *LoggerImpl) Error(v ...interface{}) { logger.Println(v)}func initLogger() *LoggerImpl { logger := log.New(os.Stdout, "", log.Lshortfile) return logger}我在這里得到的錯誤是從initLogger函數(shù)返回記錄器時:cannot use logger (variable of type *log.Logger) as *LoggerImpl value in return statement如何修改log.Logger類型以符合Logger接口?
1 回答

哈士奇WWW
TA貢獻1799條經驗 獲得超6個贊
您不能為在不同包中聲明的類型定義方法。但是,您可以定義一個新類型,將舊類型嵌入到新類型中,并為新類型定義新方法:
type LoggerImpl struct {
*log.Logger
}
func (logger *LoggerImpl) Error(v ...interface{}) {
logger.Logger.Println(v)
}
func initLogger() *LoggerImpl {
logger := &LoggerImpl{Logger:log.New(os.Stdout, "", log.Lshortfile)}
return logger
}
...
上面,LoggerImpl包含為 聲明的所有方法log.Logger,以及您在此包中顯式聲明的方法。
一般來說:如果您將一個類型嵌入到另一個結構中,則封閉結構會獲取為嵌入類型定義的所有方法。如果從另一種類型定義新類型,則新類型不會獲得基類型的任何方法。
- 1 回答
- 0 關注
- 140 瀏覽
添加回答
舉報
0/150
提交
取消