package main import ( "errors" "fmt" "os" ) func main() { // 準備日誌器 l := createLogger() // 寫一個日誌 l.Log("hello") } // 建立日誌器 func createLogger() *Logger { // 建立日誌器 l := NewLogger() // 建立命令行寫入器 cw := newConsoleWriter() // 註冊命令行寫入器到日誌器中 l.RegisterWriter(cw) // 建立文件寫入器 fw := newFileWriter() // 設置文件名 if err := fw.SetFile("log.log"); err != nil { fmt.Println(err) } // 註冊文件寫入器到日誌器中 l.RegisterWriter(fw) return l } // 聲明日誌寫入器接口 type LogWriter interface { Write(data interface{}) error } // 日誌器 type Logger struct { // 這個日誌器用到的日誌寫入器 writerList []LogWriter } // 註冊一個日誌寫入器 func (l *Logger) RegisterWriter(writer LogWriter) { l.writerList = append(l.writerList, writer) } // 將一個data類型的數據寫入日誌 func (l *Logger) Log(data interface{}) { // 遍歷全部註冊的寫入器 for _, writer := range l.writerList { // 將日誌輸出到每個寫入器中 writer.Write(data) } } // 建立日誌器的實例 func NewLogger() *Logger { return &Logger{} } // 命令行寫入器 type consoleWriter struct { } // 實現LogWriter的Write()方法 func (f *consoleWriter) Write(data interface{}) error { // 將數據序列化爲字符串 str := fmt.Sprintf("%v\n", data) // 將數據以字節數組寫入命令行中 _, err := os.Stdout.Write([]byte(str)) return err } // 建立命令行寫入器實例 func newConsoleWriter() *consoleWriter { return &consoleWriter{} } // 聲明文件寫入器 type fileWriter struct { file *os.File } // 設置文件寫入器寫入的文件名 func (f *fileWriter) SetFile(filename string) (err error) { // 若是文件已經打開, 關閉前一個文件 if f.file != nil { f.file.Close() } // 建立一個文件並保存文件句柄 f.file, err = os.Create(filename) // 若是建立的過程出現錯誤, 則返回錯誤 return err } // 實現LogWriter的Write()方法 func (f *fileWriter) Write(data interface{}) error { // 日誌文件可能沒有建立成功 if f.file == nil { // 日誌文件沒有準備好 return errors.New("file not created") } // 將數據序列化爲字符串 str := fmt.Sprintf("%v\n", data) // 將數據以字節數組寫入文件中 _, err := f.file.Write([]byte(str)) return err } // 建立文件寫入器實例 func newFileWriter() *fileWriter { return &fileWriter{} }