下面是從《Go語言從入門到進階實戰》一書中摘的代碼片段:logger.go中有三個LogWriter,它們有什么區別?第12的LogWriter是不是接口的方法列表的切片?第16行的LogWriter,表示是接口還是結構體實例,因為在main.go中傳入的是結構體實例,這個沒搞明白,比較疑惑,請幫忙解答下,謝謝!??!1.logger.go2.console.gopackage mainimport ( "fmt" "os")// 命令行寫入器type consoleWriter struct {}// 實現LogWriter的Writefunc (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{}}3.main.gopackage mainimport "fmt"// 創建日志器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}func main() { // 準備日志器 l := createLogger() // 寫一個日志 l.Log("hello")}
2 回答

動漫人物
TA貢獻1815條經驗 獲得超10個贊
logger.go中有三個LogWriter,它們有什么區別?
沒什么區別。硬要說有的話,第一個是定義,后兩個是使用
第12的LogWriter是不是接口的方法列表的切片?
是
第16行的LogWriter,表示是接口還是結構體實例,因為在main.go中傳入的是結構體實例
這個就是個形參,調用者可以傳入任何滿足此interface的結構體實例

暮色呼如
TA貢獻1853條經驗 獲得超9個贊
需要好好理解一下,什么是 interface, 是什么實現了 interface
在 go 里面是隱式實現 interface,只要一個 type 實現了 interface 下定義的所有 func ,那么就可以說這個 type 滿足這個 interface 。
第 4 行定義了一個 LogWriter interface,包含 func Write
第 12 行是 []LogWriter 是滿足 LogWriter interface 定義的具體類型的 slice
第 16 行,就是一個滿足 LogWriter interface 的具體類型
往下看,可以發現
type consoleWriter struct {}
實現了 Write func
那么所有需要傳入參數 LogWriter 的地方,都可以傳入 consoleWriter 實例
- 2 回答
- 0 關注
- 654 瀏覽
添加回答
舉報
0/150
提交
取消