亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

go語言中關于接口類型的疑惑

go語言中關于接口類型的疑惑

Go
泛舟湖上清波郎朗 2019-04-18 14:15:54
下面是從《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的結構體實例


查看完整回答
反對 回復 2019-05-19
?
暮色呼如

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 實例


查看完整回答
反對 回復 2019-05-19
  • 2 回答
  • 0 關注
  • 654 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號