//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") }