go语言中关于接口类型的疑惑

下面是从《Go语言从入门到进阶实战》一书中摘的代码片段:
logger.go中有三个LogWriter,它们有什么区别?
第12的LogWriter是不是接口的方法列表的切片?
第16行的LogWriter,表示是接口还是结构体实例,因为在main.go中传入的是结构体实例,这个没搞明白,比较疑惑,请帮忙解答下,谢谢!!!

1.logger.go

https://img2.mukewang.com/5ce0cee000013a4105840685.jpg

2.console.go


package main


import (

    "fmt"

    "os"

)


// 命令行写入器

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{}

}

3.main.go


package main


import "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")

}


泛舟湖上清波郎朗
浏览 603回答 2
2回答

动漫人物

logger.go中有三个LogWriter,它们有什么区别?没什么区别。硬要说有的话,第一个是定义,后两个是使用第12的LogWriter是不是接口的方法列表的切片?是第16行的LogWriter,表示是接口还是结构体实例,因为在main.go中传入的是结构体实例这个就是个形参,调用者可以传入任何满足此interface的结构体实例

暮色呼如

需要好好理解一下,什么是 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 实例
打开App,查看更多内容
随时随地看视频慕课网APP