golang接口实现泛性日志接口设计
//have a try, implement a logger system, simple.
package main
import (
"errors"
"fmt"
"os"
)
//Writer.
type Writer interface {
Write(data interface{}) error
}
//Logger.
type Logger struct {
loggerlist []Writer
}
//register method.
func (l *Logger) Register(writer Writer) {
l.loggerlist = append(l.loggerlist, writer)
}
//handLog
func (l *Logger) HandLog(data interface{}) {
for _, writer := range l.loggerlist {
writer.Write(data)
}
}
func newLogger() *Logger {
return &Logger{}
}
//-------------------------------------------------------
//file logger.
type fileWriter struct {
file *os.File
}
//Set file
func (f *fileWriter) SetFile(filename string) (err error) {
if nil != f.file {
f.file.Close()
}
//create file.
f.file, err = os.Create(filename)
return err
}
//fileWriter implements Writer interface.
func (f *fileWriter) Write(data interface{}) error {
if nil == f.file {
return errors.New("logger not ready, or can't open file, please call SetFile.")
}
//
_data := fmt.Sprintf("%v\n", data)
_, err := f.file.Write([]byte(_data))
return err
}
func newfileWriter() *fileWriter {
return &fileWriter{}
}
//-----------------------------------------------------------
type ConsoleWriter struct {
}
func (cw *ConsoleWriter) Write(data interface{}) error {
str := fmt.Sprintf("%v\n", data)
_, err := os.Stdout.Write([]byte(str))
return err
}
func newConsoleWriter() *ConsoleWriter {
return new(ConsoleWriter)
}
//---------------------------------------------------------
//main.
func main() {
var writer Writer
logger := newLogger()
f := newfileWriter()
f.SetFile("gdl.test")
writer = f
logger.Register(writer)
cw := newConsoleWriter()
writer = cw
logger.Register(writer)
logger.HandLog("你好啊, lalallalal")
logger.HandLog("你好啊, lalallalal")
}