为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 623 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信